agent-device 0.21.23 → 0.21.25

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 (435) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.25.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -13
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +50 -106
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  31. package/dist/src/absence-observation-errors.js +1 -0
  32. package/dist/src/adapter.js +1 -1
  33. package/dist/src/adb-executor.js +2 -2
  34. package/dist/src/adb-failure.js +2 -2
  35. package/dist/src/adb.js +1 -1
  36. package/dist/src/agent-browser-lifecycle.js +1 -1
  37. package/dist/src/agent-browser-process-record.js +1 -1
  38. package/dist/src/agent-browser-provider.js +1 -1
  39. package/dist/src/agent-browser-tool.js +1 -1
  40. package/dist/src/agent-device-client.js +2 -2
  41. package/dist/src/alert.js +1 -1
  42. package/dist/src/android-adb.d.ts +3 -2
  43. package/dist/src/android-adb.js +1 -1
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/android-system-surface-disclosure.js +1 -0
  46. package/dist/src/android-text-entry.js +1 -0
  47. package/dist/src/android.js +1 -1
  48. package/dist/src/app-backend.js +1 -1
  49. package/dist/src/app-helpers.js +1 -1
  50. package/dist/src/app-inventory.d.ts +4 -0
  51. package/dist/src/app-launch.js +1 -1
  52. package/dist/src/app-lifecycle.js +4 -3
  53. package/dist/src/app-lifecycle2.js +2 -2
  54. package/dist/src/app-log-files.js +1 -1
  55. package/dist/src/app-log-reconnect.js +1 -1
  56. package/dist/src/app-log-runtime2.js +3 -3
  57. package/dist/src/app-resolution-facade.js +1 -1
  58. package/dist/src/app-resolution.js +2 -2
  59. package/dist/src/app-state-runtime.d.ts +15 -0
  60. package/dist/src/apple-runner-platform.js +1 -1
  61. package/dist/src/application-lifecycle-interaction.js +1 -1
  62. package/dist/src/artifact-download.js +1 -1
  63. package/dist/src/auth.js +1 -1
  64. package/dist/src/aws-device-farm-connection.js +1 -0
  65. package/dist/src/back-mode.js +1 -1
  66. package/dist/src/backend-snapshot-options.js +1 -1
  67. package/dist/src/boot-diagnostics.js +1 -1
  68. package/dist/src/browserstack-connection.js +1 -0
  69. package/dist/src/capture-disclosure.js +1 -0
  70. package/dist/src/cli-config.js +1 -1
  71. package/dist/src/cli-help.js +36 -17
  72. package/dist/src/cli-output.js +1 -1
  73. package/dist/src/cli-runner.js +3 -1
  74. package/dist/src/cli.js +3 -4
  75. package/dist/src/client-companion-tunnel.js +1 -0
  76. package/dist/src/client-metro.js +1 -1
  77. package/dist/src/client-types.d.ts +15 -7
  78. package/dist/src/cloud-artifacts.d.ts +3 -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-metadata.js +73 -1
  82. package/dist/src/command-policy.js +1 -0
  83. package/dist/src/command-schema.js +3 -3
  84. package/dist/src/command-surface.js +1 -1
  85. package/dist/src/command-tools.js +2 -2
  86. package/dist/src/connection-runtime.js +1 -1
  87. package/dist/src/connection-verification.js +1 -0
  88. package/dist/src/connection.js +5 -5
  89. package/dist/src/contracts.d.ts +1 -1
  90. package/dist/src/contracts.js +1 -1
  91. package/dist/src/daemon-client-lease-beat.js +1 -1
  92. package/dist/src/daemon-client-lifecycle.js +1 -1
  93. package/dist/src/daemon-client-liveness-probe.js +1 -1
  94. package/dist/src/daemon-policy-file.js +1 -1
  95. package/dist/src/daemon-registration-owner.js +1 -1
  96. package/dist/src/daemon-registration.js +1 -1
  97. package/dist/src/daemon-resolution.js +3 -1
  98. package/dist/src/debug-symbols-facade.js +1 -1
  99. package/dist/src/device-claim-inspection.js +1 -1
  100. package/dist/src/device-input-state.d.ts +6 -17
  101. package/dist/src/device-inventory-context.js +1 -1
  102. package/dist/src/device-readiness-runtime.js +1 -1
  103. package/dist/src/device-release.js +1 -1
  104. package/dist/src/device-selection-resolver.js +1 -1
  105. package/dist/src/device-shell.js +1 -1
  106. package/dist/src/device.js +3 -1
  107. package/dist/src/devicectl.js +1 -1
  108. package/dist/src/diagnostics.js +1 -1
  109. package/dist/src/doctor-facade.js +1 -1
  110. package/dist/src/durable-capture-resource.js +1 -1
  111. package/dist/src/durable-resource.js +1 -1
  112. package/dist/src/engine-eval-script.js +1 -1
  113. package/dist/src/error.js +1 -1
  114. package/dist/src/exec.js +1 -1
  115. package/dist/src/expo-dev-client-launch.js +1 -0
  116. package/dist/src/file.js +3 -1
  117. package/dist/src/find.js +1 -1
  118. package/dist/src/finders.js +1 -1
  119. package/dist/src/generic-settle.js +1 -1
  120. package/dist/src/generic.js +1 -1
  121. package/dist/src/gesture-admission.js +1 -1
  122. package/dist/src/gesture-plan-types.d.ts +2 -5
  123. package/dist/src/gesture-plan.js +1 -1
  124. package/dist/src/gesture-runtime.js +1 -1
  125. package/dist/src/harmonyos.js +1 -1
  126. package/dist/src/hdc.js +1 -1
  127. package/dist/src/helper.js +2 -2
  128. package/dist/src/human-control.js +1 -1
  129. package/dist/src/ime-rebind.js +1 -1
  130. package/dist/src/ime-state.js +1 -1
  131. package/dist/src/index.d.ts +4 -4
  132. package/dist/src/index.js +1 -1
  133. package/dist/src/input-actions.js +1 -1
  134. package/dist/src/input-actions2.js +2 -2
  135. package/dist/src/install-source-network-transport.js +1 -1
  136. package/dist/src/install-source2.js +1 -1
  137. package/dist/src/interaction-error.js +1 -0
  138. package/dist/src/interaction-positionals.js +1 -1
  139. package/dist/src/interaction.js +1 -1
  140. package/dist/src/interaction2.js +1 -1
  141. package/dist/src/interactor-operation-catalog.js +1 -1
  142. package/dist/src/interactor.js +5 -5
  143. package/dist/src/interactor2.js +1 -1
  144. package/dist/src/interactors.js +1 -1
  145. package/dist/src/internal/bin.js +1 -1
  146. package/dist/src/internal/daemon.js +5 -1
  147. package/dist/src/internal/png-worker.js +1 -1
  148. package/dist/src/inventory.js +2 -2
  149. package/dist/src/inventory2.js +1 -1
  150. package/dist/src/inventory6.js +1 -1
  151. package/dist/src/io.d.ts +2 -2
  152. package/dist/src/ios-client.js +1 -1
  153. package/dist/src/ios-settings.js +1 -1
  154. package/dist/src/ios-snapshot-acquisition.js +1 -1
  155. package/dist/src/ios-snapshot-adapter.js +1 -1
  156. package/dist/src/ios-snapshot-engine.js +1 -1
  157. package/dist/src/ios-snapshot-runtime.js +1 -1
  158. package/dist/src/keyed-lock.js +1 -1
  159. package/dist/src/launch-confirmation.js +1 -1
  160. package/dist/src/lease.js +1 -1
  161. package/dist/src/limrun-runtime-dependencies.js +1 -1
  162. package/dist/src/limrun.d.ts +5 -564
  163. package/dist/src/limrun.js +1 -1
  164. package/dist/src/linux.js +1 -1
  165. package/dist/src/load.js +1 -1
  166. package/dist/src/local-interactor-operation-set.js +1 -1
  167. package/dist/src/log-stream.js +9 -9
  168. package/dist/src/mechanics.js +16 -16
  169. package/dist/src/metro.js +1 -1
  170. package/dist/src/metro2.js +1 -1
  171. package/dist/src/mobile-snapshot-semantics.js +1 -1
  172. package/dist/src/observability.js +1 -1
  173. package/dist/src/observation.js +1 -2
  174. package/dist/src/open-target-resolution.js +1 -1
  175. package/dist/src/output-path.js +1 -1
  176. package/dist/src/overlay.js +1 -3
  177. package/dist/src/perf-facade.js +1 -1
  178. package/dist/src/perf-runtime-operation-builder.js +1 -1
  179. package/dist/src/perf-runtime.js +1 -1
  180. package/dist/src/perf-target.js +1 -1
  181. package/dist/src/physical-device-control.js +1 -1
  182. package/dist/src/platform-request-scope.js +1 -1
  183. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  184. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  185. package/dist/src/platform-runtime-apple-resources.js +1 -0
  186. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  187. package/dist/src/platform-runtime-daemon-services.js +1 -0
  188. package/dist/src/platform-runtime-host.js +1 -1
  189. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  190. package/dist/src/platform-runtime-open-target.js +1 -1
  191. package/dist/src/platform-runtime-operation-host.js +4 -4
  192. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  193. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  194. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  195. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  196. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  197. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  198. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  199. package/dist/src/platform-runtime-unavailable.js +1 -1
  200. package/dist/src/platform-runtime.js +1 -1
  201. package/dist/src/platform-runtime2.js +1 -1
  202. package/dist/src/plugin.js +1 -0
  203. package/dist/src/plugins/webdriver.d.ts +111 -0
  204. package/dist/src/plugins/webdriver.js +1 -0
  205. package/dist/src/plugins.d.ts +2 -1
  206. package/dist/src/plugins2.js +1 -1
  207. package/dist/src/png-crop-bytes.js +1 -1
  208. package/dist/src/png-resize.js +1 -0
  209. package/dist/src/png-worker-client.js +1 -1
  210. package/dist/src/png-worker-contract.js +1 -1
  211. package/dist/src/process-entry.js +1 -1
  212. package/dist/src/process-exit.js +1 -1
  213. package/dist/src/process.js +1 -1
  214. package/dist/src/provider-credential-fingerprint.js +1 -1
  215. package/dist/src/provider-device-admission.js +1 -1
  216. package/dist/src/provider-device-runtime.d.ts +556 -0
  217. package/dist/src/provider-policy.js +1 -0
  218. package/dist/src/provider-profile-fields.js +1 -1
  219. package/dist/src/provider-webdriver.js +1 -2
  220. package/dist/src/proxy.js +2 -2
  221. package/dist/src/quality-warnings.js +1 -1
  222. package/dist/src/react-devtools.js +2 -0
  223. package/dist/src/react-native-overlay2.js +3 -0
  224. package/dist/src/react-native.js +1 -1
  225. package/dist/src/record-runtime.js +1 -1
  226. package/dist/src/record-trace.js +1 -1
  227. package/dist/src/recording.js +2 -2
  228. package/dist/src/register-builtins.js +1 -1
  229. package/dist/src/remote-bridge.js +1 -0
  230. package/dist/src/remote-config-core.js +1 -0
  231. package/dist/src/remote-config.js +1 -1
  232. package/dist/src/remote-config2.js +1 -1
  233. package/dist/src/replay-backend-registry.js +1 -0
  234. package/dist/src/replay-divergence.js +1 -1
  235. package/dist/src/replay-maestro-backend.js +117 -0
  236. package/dist/src/replay-script-selection.js +1 -0
  237. package/dist/src/replay.js +1 -3
  238. package/dist/src/replay2.js +1 -0
  239. package/dist/src/reporting.js +3 -3
  240. package/dist/src/request-cancel.js +1 -1
  241. package/dist/src/request-providers.js +1 -1
  242. package/dist/src/request-runtime-binding.js +1 -1
  243. package/dist/src/result-serialization.js +1 -1
  244. package/dist/src/retry.js +1 -1
  245. package/dist/src/retry2.js +1 -0
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-retention.js +1 -0
  248. package/dist/src/runner-cache-trim.js +1 -0
  249. package/dist/src/runner-client.js +1 -1
  250. package/dist/src/runner-dev-tools-security.js +1 -1
  251. package/dist/src/runner-device-readiness.js +1 -1
  252. package/dist/src/runner-device-set.js +1 -0
  253. package/dist/src/runner-error-classification.js +3 -3
  254. package/dist/src/runner-exchange.js +1 -1
  255. package/dist/src/runner-lease.js +1 -0
  256. package/dist/src/runner-operations-facade.js +1 -1
  257. package/dist/src/runner-retention.js +1 -0
  258. package/dist/src/runner-start-budget.js +1 -1
  259. package/dist/src/runner-startup-transport.js +1 -0
  260. package/dist/src/runner-toolchain-probe.js +2 -0
  261. package/dist/src/runner.js +2 -1
  262. package/dist/src/runtime-command-surface.js +1 -0
  263. package/dist/src/runtime-deployment.js +1 -0
  264. package/dist/src/runtime-factory.js +1 -0
  265. package/dist/src/runtime-session.js +1 -0
  266. package/dist/src/runtime-transport-hints.js +1 -1
  267. package/dist/src/runtime.js +2 -1
  268. package/dist/src/runtime10.js +2 -2
  269. package/dist/src/runtime2.js +4 -4
  270. package/dist/src/runtime3.js +1 -1
  271. package/dist/src/runtime4.js +5 -5
  272. package/dist/src/runtime5.js +1 -1
  273. package/dist/src/runtime6.js +1 -1
  274. package/dist/src/runtime7.js +1 -1
  275. package/dist/src/runtime8.js +1 -1
  276. package/dist/src/runtime9.js +1 -1
  277. package/dist/src/screen-recording-transport.js +1 -1
  278. package/dist/src/screenshot-density.js +1 -1
  279. package/dist/src/screenshot-image.js +1 -1
  280. package/dist/src/screenshot-runtime.js +1 -1
  281. package/dist/src/screenshot3.js +5 -5
  282. package/dist/src/sdk-batch-runner.js +2 -2
  283. package/dist/src/sdk-batch.js +2 -2
  284. package/dist/src/sdk-contracts.d.ts +20 -29
  285. package/dist/src/sdk-contracts.js +2 -2
  286. package/dist/src/sdk-device.js +1 -1
  287. package/dist/src/sdk-finders.d.ts +1 -1
  288. package/dist/src/sdk-finders.js +1 -1
  289. package/dist/src/sdk-io.d.ts +4 -2
  290. package/dist/src/sdk-remote-config.d.ts +4 -0
  291. package/dist/src/sdk-remote-config.js +1 -1
  292. package/dist/src/sdk-selectors.d.ts +5 -6
  293. package/dist/src/sdk-selectors.js +1 -1
  294. package/dist/src/selection.js +0 -0
  295. package/dist/src/selector-pipeline-policy.js +1 -1
  296. package/dist/src/selector-runtime.js +1 -1
  297. package/dist/src/selectors.js +1 -1
  298. package/dist/src/server.js +2 -2
  299. package/dist/src/session-allocation.js +1 -1
  300. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session.js +1 -1
  303. package/dist/src/session2.js +5 -5
  304. package/dist/src/settings.js +1 -1
  305. package/dist/src/settings2.js +1 -1
  306. package/dist/src/simctl-settings.js +1 -1
  307. package/dist/src/simctl.js +1 -1
  308. package/dist/src/simulator-boot.js +1 -1
  309. package/dist/src/simulator-state.js +1 -1
  310. package/dist/src/simulator.js +1 -1
  311. package/dist/src/snapshot-capture-annotations.js +1 -1
  312. package/dist/src/snapshot-chrome.js +1 -0
  313. package/dist/src/snapshot-desktop-projection.js +1 -1
  314. package/dist/src/snapshot-evidence.js +1 -0
  315. package/dist/src/snapshot-node-lookup.js +1 -0
  316. package/dist/src/snapshot-occlusion.js +1 -0
  317. package/dist/src/snapshot-quality-verdict.js +1 -0
  318. package/dist/src/snapshot-runtime-binding.js +1 -1
  319. package/dist/src/snapshot-runtime.js +1 -1
  320. package/dist/src/snapshot-state.js +1 -1
  321. package/dist/src/snapshot.js +1 -1
  322. package/dist/src/snapshot2.js +1 -1
  323. package/dist/src/snapshot3.js +1 -1
  324. package/dist/src/src.js +5 -1
  325. package/dist/src/src2.js +1 -1
  326. package/dist/src/src3.js +2 -1
  327. package/dist/src/store.js +1 -1
  328. package/dist/src/surface-snapshot2.js +1 -1
  329. package/dist/src/target-evidence-tree.js +1 -0
  330. package/dist/src/target-evidence.js +1 -1
  331. package/dist/src/text-entry-focus.js +1 -1
  332. package/dist/src/tool-provider2.js +1 -1
  333. package/dist/src/touch-runtime.js +1 -1
  334. package/dist/src/touch-runtime2.js +1 -1
  335. package/dist/src/tree.js +1 -1
  336. package/dist/src/tv-remote.js +1 -1
  337. package/dist/src/type-text-runtime.js +1 -1
  338. package/dist/src/undici.js +8 -8
  339. package/dist/src/update-check.js +1 -1
  340. package/dist/src/vars.js +1 -1
  341. package/dist/src/version.js +1 -1
  342. package/dist/src/video.js +2 -2
  343. package/dist/src/wait.js +1 -0
  344. package/dist/src/web.js +1 -1
  345. package/dist/src/web2.js +1 -1
  346. package/package.json +22 -19
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  351. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.manifest.json +0 -16
  352. package/dist/src/adb-transport.js +0 -1
  353. package/dist/src/alert-runtime.js +0 -1
  354. package/dist/src/app-deployment-resolution.js +0 -2
  355. package/dist/src/app-inventory-contract.js +0 -1
  356. package/dist/src/app-log-session-resource.js +0 -1
  357. package/dist/src/application-lifecycle-runtime.js +0 -1
  358. package/dist/src/auth-session.js +0 -1
  359. package/dist/src/cache.js +0 -1
  360. package/dist/src/capabilities.js +0 -1
  361. package/dist/src/capture.js +0 -1
  362. package/dist/src/catalog.js +0 -1
  363. package/dist/src/click-button.js +0 -1
  364. package/dist/src/client-metro-companion.js +0 -1
  365. package/dist/src/client-options.js +0 -3
  366. package/dist/src/compatibility-policy.js +0 -1
  367. package/dist/src/daemon-artifacts.js +0 -1
  368. package/dist/src/daemon-client-transport.js +0 -1
  369. package/dist/src/daemon-http.js +0 -1
  370. package/dist/src/device-claim-rule.js +0 -1
  371. package/dist/src/device-rotation.js +0 -1
  372. package/dist/src/device-session.js +0 -3
  373. package/dist/src/device2.js +0 -1
  374. package/dist/src/device3.js +0 -3
  375. package/dist/src/dispatch-resolve.js +0 -4
  376. package/dist/src/format.js +0 -1
  377. package/dist/src/gesture-plan-types.js +0 -1
  378. package/dist/src/host.js +0 -1
  379. package/dist/src/human-control-contract.js +0 -1
  380. package/dist/src/interaction-ref-policy.js +0 -1
  381. package/dist/src/interactor-operation-binding.js +0 -1
  382. package/dist/src/keyboard-actions.js +0 -1
  383. package/dist/src/lease-context.js +0 -1
  384. package/dist/src/lease-registry-scope.js +0 -1
  385. package/dist/src/lease-scope.js +0 -1
  386. package/dist/src/managed-device-scope.js +0 -1
  387. package/dist/src/observe-until.js +0 -1
  388. package/dist/src/output-common.js +0 -5
  389. package/dist/src/owner-identity.js +0 -3
  390. package/dist/src/path-resolution.js +0 -1
  391. package/dist/src/perf-runtime-plan.js +0 -1
  392. package/dist/src/platform-runtime-app-log-process.js +0 -1
  393. package/dist/src/platform-runtime-managed-owner.js +0 -1
  394. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  395. package/dist/src/png.js +0 -1
  396. package/dist/src/prepare-kind.js +0 -1
  397. package/dist/src/provider-device-runtimes.js +0 -1
  398. package/dist/src/provider-session-ownership.js +0 -2
  399. package/dist/src/providers.js +0 -1
  400. package/dist/src/registry.js +0 -68
  401. package/dist/src/request-admission.js +0 -1
  402. package/dist/src/request-cancellation.js +0 -1
  403. package/dist/src/request-progress-protocol.js +0 -1
  404. package/dist/src/runner-cache-metadata.js +0 -3
  405. package/dist/src/runner-disposal.js +0 -1
  406. package/dist/src/runner-session-types.js +0 -1
  407. package/dist/src/runtime-admission.js +0 -1
  408. package/dist/src/screen-recording-admission-ledger.js +0 -1
  409. package/dist/src/screen-recording-resource-recovery.js +0 -1
  410. package/dist/src/screenshot-result.js +0 -1
  411. package/dist/src/script.js +0 -1
  412. package/dist/src/scroll-command.js +0 -1
  413. package/dist/src/scroll-gesture.js +0 -1
  414. package/dist/src/scroll-indicator.js +0 -1
  415. package/dist/src/session-artifact-paths.js +0 -1
  416. package/dist/src/session-paths.js +0 -1
  417. package/dist/src/session-repair-tombstone.js +0 -1
  418. package/dist/src/session-routing.js +0 -1
  419. package/dist/src/session-snapshot.js +0 -1
  420. package/dist/src/snapshot4.js +0 -1
  421. package/dist/src/src4.js +0 -1
  422. package/dist/src/src5.js +0 -1
  423. package/dist/src/src6.js +0 -1
  424. package/dist/src/src7.js +0 -2
  425. package/dist/src/src8.js +0 -115
  426. package/dist/src/string-enum.js +0 -1
  427. package/dist/src/success-text.js +0 -1
  428. package/dist/src/timeouts.js +0 -1
  429. package/dist/src/touch-reference-frame.js +0 -1
  430. package/dist/src/transport.js +0 -3
  431. package/dist/src/ttl-memo.js +0 -1
  432. package/dist/src/verified-file.js +0 -1
  433. package/dist/src/viewport.js +0 -1
  434. package/dist/src/window-state.js +0 -1
  435. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
package/dist/src/src.js CHANGED
@@ -1 +1,5 @@
1
- import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{$t as n}from"./sdk-batch.js";import{i as r,n as i,o as a,r as o,s,t as c}from"./device2.js";import{i as l,n as u,r as d,t as f}from"./client-options.js";import{a as p,c as m,i as h,l as g,n as _,o as v,r as y,s as b,t as x}from"./device-session.js";import{scryptSync as S}from"node:crypto";function C(e){if(e.runtimeInstance!==void 0){let t=e.runtimeInstance.trim();if(!t)throw TypeError(`Limrun runtimeInstance must be a non-empty string`);return t}let t=JSON.stringify({provider:`limrun`,region:e.region?.trim().toLowerCase()||`default`,apiKey:e.apiKey,attachedIos:e.instances?.ios?.apiUrl,attachedAndroid:e.instances?.android?.apiUrl});return`principal-${S(t,`agent-device:limrun-runtime-owner:v1`,32,{N:16384,r:8,p:1,maxmem:67108864}).toString(`hex`)}`}function w(e,t,r){let a=new T(e,t);if(!r?.includePlatformModule)return a;let o=n(i,C(e));if(o.kind!==`provider-runtime`)throw TypeError(`Invalid Limrun runtime owner`);return Object.freeze({runtime:a,platformModule:Object.freeze({owner:o,loadRuntime:async e=>await E(a,o.instance,e)})})}var T=class{limrun;sessions=new Map;keepAliveTimers=new Map;appAliases=new Map;options;dependencies;provider=i;leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t),release:async e=>await this.release(e)};appCatalog=async(e,t)=>{let{assertLimrunUploadedAppAccess:n,listLimrunAppAssets:r}=await import(`./app-catalog.js`);return n(e.publicNetworkOnly),(await r(this.orgClient(`Listing uploaded apps`,`Run open <bundle-or-package-id> first; apps then lists the apps installed on the instance.`),e.platform,t)).map(e=>e.name)};recoverExpiredLease=async e=>{if(e.leaseProvider!==this.provider||!s(e.backend))throw new t(`UNSUPPORTED_OPERATION`,`Limrun cannot recover this expired lease.`,{leaseId:e.leaseId,leaseProvider:e.leaseProvider,leaseBackend:e.backend});await this.release(e)};deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider||!e.leaseId)return null;let t=this.sessions.get(e.leaseId);return t?e.platform&&e.platform!==t.platform?[]:[t.device]:null};constructor(e,t){if(!e.apiKey&&!e.instances?.ios&&!e.instances?.android)throw TypeError(`Limrun runtime requires an apiKey or instance access`);this.options=e,this.dependencies=t,this.limrun=e.apiKey?new l(u({apiKey:e.apiKey,clientVersion:t.clientVersion})):void 0}ownsDevice(e){return a(e.id)!==void 0}hasLiveSession(e){return this.getSessionForDevice(e)!==void 0}getInteractor(e,t){let n=this.getSessionForDevice(e);if(n)return n.platform===`ios`?_(n):b(n)}getDeviceSession(e){let t=this.getSessionForDevice(e);return t?x(t):void 0}async installApp(e,t,n,r,i,a){return await this.installInstallablePath(e,n,{...r,appIdentifierHint:r?.appIdentifierHint??t,packageNameHint:r?.packageNameHint??t},i,a)}async installInstallablePath(e,t,n,r,i){let a=this.getSessionForDevice(e);if(!a)return;let o=this.orgClient(`Uploading an app`);return a.platform===`ios`?await h(o,a,t,n,r,i):await g(o,a,t,n,r,i)}async configurePortReverse(e){let t=this.requireAndroidPortReverseSession(e.leaseId);if(t)return await v(t,e),D(e)}async shutdown(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(async e=>await this.terminateSession(e))),this.sessions.clear(),this.appAliases.clear()}async allocate(e,t){if(e.leaseProvider!==this.provider)return;let n=s(e.backend);if(!n)return;let{rejectRefusedLimrunProfileFields:r}=await import(`./session-allocation.js`);r(t);let i=this.sessions.get(e.leaseId);if(i)return{limrunInstanceId:i.instanceId,device:i.device};let a=await this.attachSession(n,e)??await this.createSession(n,e,t);return this.sessions.set(e.leaseId,a),this.options.keepAlive&&this.startKeepAlive(e.leaseId,a),{limrunInstanceId:a.instanceId,device:a.device}}async attachSession(e,t){let{ios:n,android:i}=this.options.instances??{},a=n=>{let i=o(n);return{lease:t,instanceId:i,ownership:`attached`,device:r(e,t,i)}};return e===`android`?i&&await m({...a(i.apiUrl),...i},this.dependencies):n&&await y({...a(n.apiUrl),...n},this.dependencies)}async createSession(e,t,n){let{allocateLimrunAndroidSession:r,allocateLimrunIosSession:i,resolvePreinstalledAppId:a,resolveRequestedLimrunAppAsset:o}=await import(`./session-allocation.js`),s=this.orgClient(`Creating an instance`),c=await o(s,e,n),l=this.sessionAllocationParams(s,t,c),u=e===`ios`?await i(l):await r(l);if(c)try{let e=await a(u,c);this.appAliases.set(t.leaseId,{assetName:c.name,installedAppId:e})}catch(e){throw await this.terminateSession(u),e}return u}sessionAllocationParams(e,t,n){return{limrun:e,lease:t,metadata:this.buildInstanceMetadata(t),region:this.options.region,app:n,dependencies:this.dependencies}}buildInstanceMetadata(e){return{displayName:`agent-device-${e.tenantId}-${e.runId}`,labels:{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,provider:e.leaseProvider??`limrun`,source:f}}}async release(e){let t=this.sessions.get(e.leaseId);return t?(await this.terminateSession(t),this.sessions.delete(e.leaseId),this.appAliases.delete(e.leaseId),{limrunInstanceId:t.instanceId}):await this.releaseRecoveredSession(e)}async releaseRecoveredSession(e){let t=s(e.backend),n=this.limrun;if(!t||!n)return;let r=`provider=${i},leaseId=${e.leaseId}`,a=(t===`ios`?await n.iosInstances.list({labelSelector:r}):await n.androidInstances.list({labelSelector:r})).getPaginatedItems().map(e=>e.metadata.id);for(let e of a)t===`ios`?await n.iosInstances.delete(e):await n.androidInstances.delete(e);if(a.length!==0)return{limrunInstanceId:a[0],limrunInstanceCount:a.length}}startKeepAlive(e,t){let n=setInterval(()=>{try{t.client.keepAlive()}catch{}},3e4);n.unref(),this.keepAliveTimers.set(e,n)}async terminateSession(e){let t=e.lease.leaseId;if(clearInterval(this.keepAliveTimers.get(t)),this.keepAliveTimers.delete(t),e.client.disconnect(),e.platform===`android`&&await p(e),e.ownership===`attached`)return;let n=this.orgClient(`Deleting an instance`);e.platform===`ios`?await n.iosInstances.delete(e.instanceId):await n.androidInstances.delete(e.instanceId)}orgClient(e,t){return d(this.limrun,e,t)}getSessionForDevice(e){let t=a(e.id);if(!t)return;let n=this.sessions.get(t.leaseId);return n?.platform===t.platform?n:void 0}resolveAppReference(e,t){let n=a(e.id);if(!n)return t;let r=this.appAliases.get(n.leaseId);return r?.assetName===t?r.installedAppId:t}currentAppLogReader(e){let t=this.getSessionForDevice(e);if(!t)return;let n=x(t);return{platform:t.platform,leaseId:t.lease.leaseId,instanceId:t.instanceId,ownership:t.ownership,readLogs:async(e,t)=>n.platform===`ios`?await n.readLogs(e,t):await n.readLogs(t),[Symbol.asyncDispose]:async()=>void 0}}async reconnectAppLogReader(e,t){let{reconnectLimrunAppLogReader:n}=await import(`./app-log-reconnect.js`);return await n({limrun:this.limrun,instances:this.options.instances,descriptor:e,dependencies:this.dependencies,signal:t})}requireAndroidPortReverseSession(e){let t=this.sessions.get(e);if(!t||t.platform===`android`)return t;throw O(`port reverse`,`Direct Limrun iOS sessions cannot reach local host ports; use a bridge public URL.`)}};async function E(e,n,r){let{createLimrunPlatformRuntimeOwner:i}=await import(`./app-log-runtime2.js`);return i({host:r,runtimeInstance:n,ownsDevice:t=>e.ownsDevice(t),hasLiveSession:t=>e.hasLiveSession(t),getInteractor:(t,n)=>e.getInteractor(t,n),getDeviceSession:t=>e.getDeviceSession(t),resolveAppReference:(t,n)=>e.resolveAppReference(t,n),openCurrent:async t=>e.currentAppLogReader(t),reconnect:async(t,n)=>await e.reconnectAppLogReader(t,n),listApps:async(n,r,i)=>{i.throwIfAborted();let a=e.getDeviceSession(n);if(!a)throw new t(`DEVICE_NOT_FOUND`,`Limrun app inventory session is unavailable`,{deviceId:n.id});return(await a.listApps(r)).map(e=>({id:e.id,name:e.name??e.id}))},getAppState:async(n,r)=>{r.throwIfAborted();let i=e.getDeviceSession(n);if(i?.platform!==`android`)throw new t(`UNSUPPORTED_OPERATION`,`Limrun Android appstate requires an active provider session`);let a=await i.getForegroundApp(r);return r.throwIfAborted(),{package:a?.appId,activity:a?.activity}},deployApp:async(t,n,r,i)=>await e.installApp(t,n.app,n.appPath,{relaunch:n.replaceExisting,appIdentifierHint:n.app,packageNameHint:n.app},r,i),deployMaterializedApp:async(t,n,r,i)=>await e.installInstallablePath(t,n.artifact.installablePath,{appIdentifierHint:n.artifact.bundleId,packageNameHint:n.artifact.packageName},r,i),configurePortReverse:async t=>await e.configurePortReverse(t)})}function D(e){return{leaseId:e.leaseId,devicePort:e.devicePort,hostPort:e.hostPort,name:e.name}}function O(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}async function k(e){let n=await M(e);if(n)return n;if(!e.apiKey)throw new t(`INVALID_ARGS`,`Limrun verification requires an API key or instance access.`);let r=new l({...u({apiKey:e.apiKey,clientVersion:e.clientVersion}),timeout:15e3,maxRetries:0}),i={limit:1,...e.region?{region:e.region}:{}};try{e.platform===`android`?await r.androidInstances.list(i):await r.iosInstances.list(i)}catch(e){let n=A(e);throw n===401||n===403?new t(`UNAUTHORIZED`,`Limrun rejected connection verification.`,{status:n,hint:`Check LIMRUN_API_KEY and its organization access.`}):new t(`COMMAND_FAILED`,`Limrun connection verification failed.`,{hint:`Check Limrun service access, LIMRUN_REGION, and network connectivity, then retry.`},e)}let a=e.platform===`android`?`Android`:`iOS`,o=e.platform===`android`?`emulator`:`simulator`;return{provider:`limrun`,service:`Limrun`,verificationMessage:`Credentials and ${a} instance access verified.`,device:{status:`deferred`,name:`Provider-selected ${a} ${o}`,platform:e.platform},app:{status:`missing`,message:`Run apps to choose an uploaded asset before allocation.`}}}function A(e){if(!e||typeof e!=`object`)return;let t=e.status;return typeof t==`number`?t:void 0}function j(e){let t={logLevel:`none`,maxReconnectAttempts:0},{ios:n,android:r}=e.instances??{};return e.platform===`android`?r&&import(`./instance-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...r})):n&&import(`./ios-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...n}))}async function M(e){let n=j(e);if(!n)return;let r=e.platform===`android`,i=r?`Android`:`iOS`;try{(await n).disconnect()}catch(e){throw new t(`COMMAND_FAILED`,`Limrun ${i} instance access failed.`,{hint:r?`Check LIM_ANDROID_INSTANCE_URL, LIM_ANDROID_INSTANCE_TOKEN, and LIM_ANDROID_INSTANCE_ADB_URL, and that the instance is still running.`:`Check LIM_IOS_INSTANCE_URL and LIM_IOS_INSTANCE_TOKEN, and that the instance is still running.`},e)}return{provider:`limrun`,service:`Limrun`,verificationMessage:`Existing ${i} instance access verified. A daemon started with these variables drives it without creating or deleting it.`,device:{status:`verified`,name:`Existing ${i} ${r?`emulator`:`simulator`}`,platform:e.platform},app:{status:`missing`,message:`Run open <bundle-or-package-id> to use an app installed on the instance.`}}}var N=e({LIMRUN_PROFILE_FIELDS:()=>c,LIMRUN_PROVIDER:()=>i,createLimrunRuntime:()=>w,verifyLimrunConnection:()=>k});export{k as n,w as r,N as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,V as n}from"./sdk-contracts.js";import"./tv-remote.js";import{i as r}from"./sdk-batch-runner.js";import{Zt as i}from"./sdk-batch.js";import{n as a}from"./app-inventory.js";import{A as o,C as s,D as c,E as l,F as u,I as d,L as f,M as p,N as m,O as h,P as g,R as ee,S as te,T as ne,_,b as re,g as ie,j as ae,k as oe,m as se,v as ce,w as le,x as ue,y as de}from"./log-stream.js";import{i as fe,r as pe,t as me}from"./ios-client.js";import{t as he}from"./instance-client.js";import{createHash as ge,scryptSync as _e}from"node:crypto";import v from"node:fs";import ve from"node:os";import y from"node:path";import{promises as ye}from"fs";import"net";import be from"os";import b,{basename as xe}from"path";import Se,{createHash as Ce}from"crypto";import"child_process";import{setTimeout as we}from"node:timers/promises";const x=`limrun`,Te={provider:x,label:`Limrun`,fields:{providerApp:`consumed`,providerOsVersion:`refused`,providerDeviceType:`refused`,providerProject:`refused`,providerBuild:`refused`,providerSessionName:`refused`,providerDeviceOrientation:`refused`,providerGeoLocation:`refused`,providerTimezone:`refused`,providerAppiumVersion:`refused`,providerLanguage:`refused`,providerLocale:`refused`,providerNetworkProfile:`refused`,providerCustomNetwork:`refused`,providerNoResignApp:`refused`,awsProjectArn:`refused`,awsDeviceArn:`refused`,awsAppArn:`refused`,awsRegion:`refused`,awsInteractionMode:`refused`}},Ee=x;function De(e){if(e===`ios-instance`)return`ios`;if(e===`android-instance`)return`android`}function Oe(e,t,n){return{platform:e===`ios`?`apple`:`android`,...e===`ios`?{appleOs:`ios`}:{},id:Ae(e,t.leaseId),name:`Limrun ${e} ${n.slice(0,8)}`,kind:e===`ios`?`simulator`:`emulator`,target:`mobile`,booted:!0}}function ke(e){return`attached-${ge(`sha256`).update(e).digest(`hex`).slice(0,12)}`}function S(e){let[t,n,r]=e.split(`:`);if(t===Ee&&(n===`ios`||n===`android`)&&r)return{platform:n,leaseId:r}}function Ae(e,t){return`${Ee}:${e}:${t}`}function je(e){let t=S(e.id);return!t||e.target!==`mobile`?!1:t.platform===`ios`?Me(e):Ne(e)}function Me(e){return e.platform===`apple`&&e.appleOs===`ios`&&e.kind===`simulator`&&e.iosPhysicalDeviceBackend===void 0}function Ne(e){return e.platform===`android`&&e.appleOs===void 0&&e.kind===`emulator`&&e.iosPhysicalDeviceBackend===void 0}function C(e,t,n,r,i){if(r===`m`)throw TypeError(`Private method is not writable`);if(r===`a`&&!i)throw TypeError(`Private accessor was defined without a setter`);if(typeof t==`function`?e!==t||!i:!t.has(e))throw TypeError(`Cannot write private member to an object whose class did not declare it`);return r===`a`?i.call(e,n):i?i.value=n:t.set(e,n),n}function w(e,t,n,r){if(n===`a`&&!r)throw TypeError(`Private accessor was defined without a getter`);if(typeof t==`function`?e!==t||!r:!t.has(e))throw TypeError(`Cannot read private member from an object whose class did not declare it`);return n===`m`?r:n===`a`?r.call(e):r?r.value:t.get(e)}let Pe=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return Pe=e.randomUUID.bind(e),e.randomUUID();let t=new Uint8Array(1),n=e?()=>e.getRandomValues(t)[0]:()=>Math.random()*255&255;return`10000000-1000-4000-8000-100000000000`.replace(/[018]/g,e=>(e^n()&15>>e/4).toString(16))};const Fe=/^[a-z][a-z0-9+.-]*:/i,Ie=e=>Fe.test(e);let T=e=>(T=Array.isArray,T(e)),Le=T;function Re(e){return typeof e==`object`?e??{}:{}}function ze(e){if(!e)return!0;for(let t in e)return!1;return!0}function Be(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const Ve=(e,t)=>{if(typeof t!=`number`||!Number.isInteger(t))throw new p(`${e} must be an integer`);if(t<0)throw new p(`${e} must be a positive integer`);return t},He=e=>{try{return JSON.parse(e)}catch{return}},E=`0.60.0`;function Ue(){return typeof Deno<`u`&&Deno.build!=null?`deno`:typeof EdgeRuntime<`u`?`edge`:Object.prototype.toString.call(globalThis.process===void 0?0:globalThis.process)===`[object process]`?`node`:`unknown`}const We=()=>{let e=Ue();if(e===`deno`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":qe(Deno.build.os),"X-Stainless-Arch":Ke(Deno.build.arch),"X-Stainless-Runtime":`deno`,"X-Stainless-Runtime-Version":typeof Deno.version==`string`?Deno.version:Deno.version?.deno??`unknown`};if(typeof EdgeRuntime<`u`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`other:${EdgeRuntime}`,"X-Stainless-Runtime":`edge`,"X-Stainless-Runtime-Version":globalThis.process.version};if(e===`node`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":qe(globalThis.process.platform??`unknown`),"X-Stainless-Arch":Ke(globalThis.process.arch??`unknown`),"X-Stainless-Runtime":`node`,"X-Stainless-Runtime-Version":globalThis.process.version??`unknown`};let t=Ge();return t?{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`browser:${t.browser}`,"X-Stainless-Runtime-Version":t.version}:{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":E,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`unknown`,"X-Stainless-Runtime-Version":`unknown`}};function Ge(){if(typeof navigator>`u`||!navigator)return null;for(let{key:e,pattern:t}of[{key:`edge`,pattern:/Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`ie`,pattern:/Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`chrome`,pattern:/Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`firefox`,pattern:/Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/},{key:`safari`,pattern:/(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/}]){let n=t.exec(navigator.userAgent);if(n)return{browser:e,version:`${n[1]||0}.${n[2]||0}.${n[3]||0}`}}return null}const Ke=e=>e===`x32`?`x32`:e===`x86_64`||e===`x64`?`x64`:e===`arm`?`arm`:e===`aarch64`||e===`arm64`?`arm64`:e?`other:${e}`:`unknown`,qe=e=>(e=e.toLowerCase(),e.includes(`ios`)?`iOS`:e===`android`?`Android`:e===`darwin`?`MacOS`:e===`win32`?`Windows`:e===`freebsd`?`FreeBSD`:e===`openbsd`?`OpenBSD`:e===`linux`?`Linux`:e?`Other:${e}`:`Unknown`);let Je;const Ye=()=>Je??=We();function Xe(){if(typeof fetch<`u`)return s.fetch;throw Error("`fetch` is not defined as a global; Either pass `fetch` to the client, `new Limrun({ fetch })` or polyfill the global, `globalThis.fetch = fetch`")}function Ze(...e){let t=globalThis.ReadableStream;if(t===void 0)throw Error("`ReadableStream` is not defined as a global; You will need to polyfill it, `globalThis.ReadableStream = ReadableStream`");return new t(...e)}function Qe(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return Ze({start(){},async pull(e){let{done:n,value:r}=await t.next();n?e.close():e.enqueue(r)},async cancel(){await t.return?.()}})}async function $e(e){if(typeof e!=`object`||!e)return;if(e[Symbol.asyncIterator]){await e[Symbol.asyncIterator]().return?.();return}let t=e.getReader(),n=t.cancel();t.releaseLock(),await n}const et=({headers:e,body:t})=>({bodyHeaders:{"content-type":`application/json`},body:JSON.stringify(t)});function tt(e){return Object.entries(e).filter(([e,t])=>t!==void 0).map(([e,t])=>{if(typeof t==`string`||typeof t==`number`||typeof t==`boolean`)return`${encodeURIComponent(e)}=${encodeURIComponent(t)}`;if(t===null)return`${encodeURIComponent(e)}=`;throw new p(`Cannot stringify type ${typeof t}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`)}).join(`&`)}const D={off:0,error:200,warn:300,info:400,debug:500},nt=(e,t,n)=>{if(e){if(Be(D,e))return e;A(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(D))}`)}};function O(){}function k(e,t,n){return!t||D[e]>D[n]?O:t[e].bind(t)}const rt={error:O,warn:O,info:O,debug:O};let it=new WeakMap;function A(e){let t=e.logger,n=e.logLevel??`off`;if(!t)return rt;let r=it.get(t);if(r&&r[0]===n)return r[1];let i={error:k(`error`,t,n),warn:k(`warn`,t,n),info:k(`info`,t,n),debug:k(`debug`,t,n)};return it.set(t,[n,i]),i}const j=e=>(e.options&&(e.options={...e.options},delete e.options.headers),e.headers&&=Object.fromEntries((e.headers instanceof Headers?[...e.headers]:Object.entries(e.headers)).map(([e,t])=>[e,e.toLowerCase()===`authorization`||e.toLowerCase()===`api-key`||e.toLowerCase()===`x-api-key`||e.toLowerCase()===`cookie`||e.toLowerCase()===`set-cookie`?`***`:t])),`retryOfRequestLogID`in e&&(e.retryOfRequestLogID&&(e.retryOf=e.retryOfRequestLogID),delete e.retryOfRequestLogID),e);async function at(e,t){let{response:n,requestLogID:r,retryOfRequestLogID:i,startTime:a}=t,o=await(async()=>{if(n.status===204)return null;if(t.options.__binaryResponse)return n;let e=n.headers.get(`content-type`)?.split(`;`)[0]?.trim();return e?.includes(`application/json`)||e?.endsWith(`+json`)?n.headers.get(`content-length`)===`0`?void 0:await n.json():await n.text()})();return A(e).debug(`[${r}] response parsed`,j({retryOfRequestLogID:i,url:n.url,status:n.status,body:o,durationMs:Date.now()-a})),o}var M,ot=class e extends Promise{constructor(e,t,n=at){super(e=>{e(null)}),this.responsePromise=t,this.parseResponse=n,M.set(this,void 0),C(this,M,e,`f`)}_thenUnwrap(t){return new e(w(this,M,`f`),this.responsePromise,async(e,n)=>t(await this.parseResponse(e,n),n))}asResponse(){return this.responsePromise.then(e=>e.response)}async withResponse(){let[e,t]=await Promise.all([this.parse(),this.asResponse()]);return{data:e,response:t}}parse(){return this.parsedPromise||=this.responsePromise.then(e=>this.parseResponse(w(this,M,`f`),e)),this.parsedPromise}then(e,t){return this.parse().then(e,t)}catch(e){return this.parse().catch(e)}finally(e){return this.parse().finally(e)}};M=new WeakMap;var N,st=class{constructor(e,t,n,r){N.set(this,void 0),C(this,N,e,`f`),this.options=r,this.response=t,this.body=n}hasNextPage(){return this.getPaginatedItems().length?this.nextPageRequestOptions()!=null:!1}async getNextPage(){let e=this.nextPageRequestOptions();if(!e)throw new p("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await w(this,N,`f`).requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(N=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},ct=class extends ot{constructor(e,t,n){super(e,t,async(e,t)=>new n(e,t.response,await at(e,t),t.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},P=class extends st{constructor(e,t,n,r){super(e,t,n,r),this.items=n||[]}getPaginatedItems(){return this.items??[]}nextPageRequestOptions(){let e=this.getPaginatedItems();if(!(typeof this.options.query==`object`&&`endingBefore`in(this.options.query||{}))){let t=e[e.length-1]?.metadata.id;return t?{...this.options,query:{...Re(this.options.query),startingAfter:t}}:null}let t=e[0]?.metadata.id;return t?{...this.options,query:{...Re(this.options.query),endingBefore:t}}:null}};const lt=()=>{if(typeof File>`u`){let{process:e}=globalThis,t=typeof e?.versions?.node==`string`&&parseInt(e.versions.node.split(`.`))<20;throw Error("`File` is not defined as a global, which is required for file uploads."+(t?" Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`.":``))}};function F(e,t,n){return lt(),new File(e,t??`unknown_file`,n)}function ut(e){return(typeof e==`object`&&!!e&&(`name`in e&&e.name&&String(e.name)||`url`in e&&e.url&&String(e.url)||`filename`in e&&e.filename&&String(e.filename)||`path`in e&&e.path&&String(e.path))||``).split(/[\\/]/).pop()||void 0}const dt=e=>typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`,ft=e=>typeof e==`object`&&!!e&&typeof e.size==`number`&&typeof e.type==`string`&&typeof e.text==`function`&&typeof e.slice==`function`&&typeof e.arrayBuffer==`function`,pt=e=>typeof e==`object`&&!!e&&typeof e.name==`string`&&typeof e.lastModified==`number`&&ft(e),mt=e=>typeof e==`object`&&!!e&&typeof e.url==`string`&&typeof e.blob==`function`;async function ht(e,t,n){if(lt(),e=await e,pt(e))return e instanceof File?e:F([await e.arrayBuffer()],e.name);if(mt(e)){let r=await e.blob();return t||=new URL(e.url).pathname.split(/[\\/]/).pop(),F(await I(r),t,n)}let r=await I(e);if(t||=ut(e),!n?.type){let e=r.find(e=>typeof e==`object`&&`type`in e&&e.type);typeof e==`string`&&(n={...n,type:e})}return F(r,t,n)}async function I(e){let t=[];if(typeof e==`string`||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(ft(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(dt(e))for await(let n of e)t.push(...await I(n));else{let t=e?.constructor?.name;throw Error(`Unexpected data type: ${typeof e}${t?`; constructor: ${t}`:``}${gt(e)}`)}return t}function gt(e){return typeof e!=`object`||!e?``:`; props: [${Object.getOwnPropertyNames(e).map(e=>`"${e}"`).join(`, `)}]`}var L=class{constructor(e){this._client=e}},_t=class extends L{get(e,t){return this._client.get(`/v1/analytics`,{query:vt(e),...t})}getInstances(e,t){return this._client.get(`/v1/analytics/instances`,{query:vt(e),...t})}};function vt(e){let{startedAt:t,stoppedAt:n,...r}=e,i={...r};for(let[e,r]of Object.entries({startedAt:t,stoppedAt:n}))if(r!==void 0)for(let[t,n]of Object.entries(r))n!==void 0&&(i[`${e}[${t}]`]=n);return i}const yt=Symbol(`brand.privateNullableHeaders`);function*bt(e){if(!e)return;if(yt in e){let{values:t,nulls:n}=e;yield*t.entries();for(let e of n)yield[e,null];return}let t=!1,n;e instanceof Headers?n=e.entries():Le(e)?n=e:(t=!0,n=Object.entries(e??{}));for(let e of n){let n=e[0];if(typeof n!=`string`)throw TypeError(`expected header name to be a string`);let r=Le(e[1])?e[1]:[e[1]],i=!1;for(let e of r)e!==void 0&&(t&&!i&&(i=!0,yield[n,null]),yield[n,e])}}const R=e=>{let t=new Headers,n=new Set;for(let r of e){let e=new Set;for(let[i,a]of bt(r)){let r=i.toLowerCase();e.has(r)||(t.delete(i),e.add(r)),a===null?(t.delete(i),n.add(r)):(t.append(i,a),n.delete(r))}}return{[yt]:!0,values:t,nulls:n}};function xt(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}const St=Object.freeze(Object.create(null)),z=((e=xt)=>function(t,...n){if(t.length===1)return t[0];let r=!1,i=[],a=t.reduce((t,a,o)=>{/[?#]/.test(a)&&(r=!0);let s=n[o],c=(r?encodeURIComponent:e)(``+s);return o!==n.length&&(s==null||typeof s==`object`&&s.toString===Object.getPrototypeOf(Object.getPrototypeOf(s.hasOwnProperty??St)??St)?.toString)&&(c=s+``,i.push({start:t.length+a.length,length:c.length,error:`Value of type ${Object.prototype.toString.call(s).slice(8,-1)} is not a valid path parameter`})),t+a+(o===n.length?``:c)},``),o=a.split(/[?#]/,1)[0],s=/(?<=^|\/)(?:\.|%2e){1,2}(?=\/|$)/gi,c;for(;(c=s.exec(o))!==null;)i.push({start:c.index,length:c[0].length,error:`Value "${c[0]}" can\'t be safely passed as a path parameter`});if(i.sort((e,t)=>e.start-t.start),i.length>0){let e=0,t=i.reduce((t,n)=>{let r=` `.repeat(n.start-e),i=`^`.repeat(n.length);return e=n.start+n.length,t+r+i},``);throw new p(`Path parameters result in path with invalid segments:\n${i.map(e=>e.error).join(`
2
+ `)}\n${a}\n${t}`)}return a})(xt);var B=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/gradle_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/gradle_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/gradle_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/gradle_instances/${e}`,t)}},Ct=class extends L{create(e,t){return this._client.post(`/v1/scoped_tokens`,{body:e,...t})}},wt=class extends L{list(e={},t){return this._client.get(`/v1/assets`,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/assets/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t={},n){return this._client.get(z`/v1/assets/${e}`,{query:t,...n})}getOrCreate(e,t){return this._client.put(`/v1/assets`,{body:e,...t})}};function Tt(e,t){if(!t)return{body:e};let n=0;return{body:new ReadableStream({pull(r){if(n>=e.length){r.close();return}let i=e.subarray(n,Math.min(n+262144,e.length));n+=i.length,r.enqueue(i),t(n,e.length)}}),duplex:`half`}}var Et=class extends wt{async getOrUpload(e,t){let n=await this.getOrCreate({name:e.name??xe(e.path),kind:e.kind??`App`,...e.platform&&{platform:e.platform},...e.ttl&&{ttl:e.ttl},...e.uploadOptions},t),r=await ye.readFile(e.path),i=Ce(`md5`).update(r).digest(`hex`);if(n.md5&&n.md5===i)return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,kind:n.kind,...n.platform&&{platform:n.platform},md5:n.md5,...n.expiresAt&&{expiresAt:n.expiresAt}};let a=await s.fetch(n.signedUploadUrl,{headers:{...e.onUploadProgress&&{"Content-Length":r.length.toString()},"Content-Type":`application/octet-stream`},method:`PUT`,...Tt(r,e.onUploadProgress)});if(a.status!==200)throw Error(`Failed to upload asset: ${a.status} ${await a.text()}`);return{id:n.id,name:n.name,signedDownloadUrl:n.signedDownloadUrl,kind:n.kind,...n.platform&&{platform:n.platform},md5:i,...n.expiresAt&&{expiresAt:n.expiresAt}}}},Dt=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/ios_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/ios_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/ios_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/ios_instances/${e}`,t)}},Ot=class extends Dt{listSessionArtifacts(e,t,n){return this._client.get(z`/v1/ios_instances/${e}/session_artifacts`,{query:t?{kind:t}:void 0,...n})}listRecordings(e,t){return this.listSessionArtifacts(e,`recording`,t)}listAppLogs(e,t){return this.listSessionArtifacts(e,`appLog`,t)}listEvents(e,t){return this.listSessionArtifacts(e,`eventLog`,t)}},kt=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/android_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/android_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/android_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/android_instances/${e}`,t)}},At=class extends kt{listSessionArtifacts(e,t,n){return this._client.get(z`/v1/android_instances/${e}/session_artifacts`,{query:t?{kind:t}:void 0,...n})}listRecordings(e,t){return this.listSessionArtifacts(e,`recording`,t)}listAppLogs(e,t){return this.listSessionArtifacts(e,`appLog`,t)}listEvents(e,t){return this.listSessionArtifacts(e,`eventLog`,t)}},jt=class extends L{create(e,t){let{reuseIfExists:n,wait:r,...i}=e;return this._client.post(`/v1/xcode_instances`,{query:{reuseIfExists:n,wait:r},body:i,...t})}list(e={},t){return this._client.getAPIList(`/v1/xcode_instances`,P,{query:e,...t})}delete(e,t){return this._client.delete(z`/v1/xcode_instances/${e}`,{...t,headers:R([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(z`/v1/xcode_instances/${e}`,t)}};function Mt(e){let t=e.status.token;if(!t)throw Error(`Instance ${e.metadata.id} came back without its token: the credential used can read it but not control it.`);return t}var V=class extends Error{constructor(e){super(`Instance ${e} was gone before it reported any cache status`),this.instanceId=e,this.name=`XcodeCacheGoneError`}},H=class extends Error{constructor(e,t,n){super(`Timed out after ${Math.round(t/1e3)}s waiting for the cache ${e} to finish`+(n?` (last phase: ${n[e].phase})`:``)),this.side=e,this.timeoutMs=t,this.cache=n,this.name=`XcodeCacheTimeoutError`}};const Nt={restore:12e5,save:72e4};function Pt(e){return e===`disabled`||e===`unsupported`||e===`restored`||e===`skipped`||e===`failed`}function Ft(e){return e===`disabled`||e===`published`||e===`skipped`||e===`failed`||e===`timed_out`}function It(e,t){return t===`restore`?Pt(e.restore.phase):Ft(e.save.phase)}function Lt(e,t={}){let n=t.side??`restore`,r=t.timeoutMs??Nt[n],i=e.baseURL;for(;i.endsWith(`/`);)i=i.slice(0,-1);let a=`${i}/v1/xcode_instances/${encodeURIComponent(e.instanceId)}/cache`;return new Promise((i,o)=>{let c,l=``,u=!1,d=e=>{if(!u){u=!0,clearTimeout(f),t.signal?.removeEventListener(`abort`,p);try{g.close()}catch{}e()}},f=setTimeout(()=>d(()=>o(new H(n,r,c))),r),p=()=>d(()=>o(t.signal?.reason??Error(`aborted`))),m=!1,h=()=>{m||u||(m=!0,s.fetch(a,{headers:{Authorization:`Bearer ${e.apiKey}`,Accept:`application/json`}}).then(async t=>{if(m=!1,t.status!==404){await t.text().catch(()=>void 0);return}d(()=>c?i({cache:c,gone:!0}):o(new V(e.instanceId)))}).catch(()=>{m=!1}))},g=te({url:a,fetch:async(t,n)=>{let r=await s.fetch(t,n);return r.status===404&&d(()=>c?i({cache:c,gone:!0}):o(new V(e.instanceId))),r},onConnect:()=>t.onOpen?.(),headers:{Authorization:`Bearer ${e.apiKey}`,Accept:`text/event-stream`},onMessage:e=>{if(e.event!==`cache`&&e.event!==`gone`)return;let r;try{r=JSON.parse(typeof e.data==`string`?e.data:String(e.data))}catch(e){d(()=>o(Error(`Cache stream sent unreadable data: ${e}`)));return}if(c=r,e.event===`gone`){h();return}let a=`${r.restore.phase}/${r.restore.reason??``}|${r.save.phase}/${r.save.reason??``}`;a!==l&&(l=a,t.onUpdate?.(r)),It(r,n)&&d(()=>i({cache:r,gone:!1}))}});if(t.signal?.aborted){p();return}t.signal?.addEventListener(`abort`,p,{once:!0})})}var Rt=class extends V{constructor(e){super(e),this.name=`XcodeSnapshotGoneError`,this.message=`Instance ${e} was gone before it reported any disk snapshot status`}},zt=class extends H{constructor(e){super(e.side,e.timeoutMs,e.cache),this.name=`XcodeSnapshotTimeoutError`,this.message=e.message.replace(`the cache `,`the disk snapshot `),this.snapshot=e.cache?U(e.cache):void 0}};function U(e){let{cacheKey:t,...n}=e.save;return{...e,save:{...n,...t===void 0?{}:{snapshotKey:t}}}}async function Bt(e,t={}){let{onUpdate:n,...r}=t;try{let t=await Lt(e,{...r,...n?{onUpdate:e=>n(U(e))}:{}});return{snapshot:U(t.cache),gone:t.gone}}catch(e){throw e instanceof V?new Rt(e.instanceId):e instanceof H?new zt(e):e}}function Vt(e,t){let n=b.resolve(e),r=`limsync-cache-${b.basename(n)}-${Se.createHash(`sha1`).update(n).digest(`hex`).slice(0,8)}`;return{cacheKey:r,basisCacheDir:t??b.join(be.tmpdir(),r)}}function W(e,t,n,r){return e.getOrCreate({name:t,ttl:n||`336h`,...r}).catch(e=>{let n=`Failed to create upload URL for asset '${t}': ${e instanceof Error?e.message:e}`;throw Error(n,{cause:e})})}const Ht=[`none`,`error`,`warn`,`info`,`debug`];function Ut(e,t){let n=Ht.indexOf(t),r=e=>n>=Ht.indexOf(e);return(t,n)=>{r(t)&&(t===`error`||t===`warn`?console[t](e,n):console.log(e,n))}}function Wt(e){return(t,n)=>{if(t.trim()===``)throw Error(`commandLine must not be empty`);if(n?.timeoutSeconds!==void 0&&(!Number.isInteger(n.timeoutSeconds)||n.timeoutSeconds<1||n.timeoutSeconds>21600))throw Error(`timeoutSeconds must be an integer between 1 and 21600`);let r={command:`run`,commandLine:t,cwd:n?.cwd??`.`,...n?.env?.length&&{env:n.env},...n?.timeoutSeconds!==void 0&&{timeoutSeconds:n.timeoutSeconds}};return _(r,e)}}const Gt=/^[A-Z0-9_]+$/,Kt=4096,qt=65536;function Jt(e){let t=Object.entries(e);if(t.length>32)throw Error(`too many build settings: got ${t.length}, max 32`);let n=0;for(let[e,r]of t){if(!Gt.test(e))throw Error(`invalid build setting key "${e}": keys must match ^[A-Z0-9_]+$`);if(typeof r!=`string`)throw Error(`invalid build setting value for "${e}": value must be a string`);let t=Buffer.byteLength(r,`utf8`);if(t>Kt)throw Error(`build setting value for "${e}" is too large: got ${t} bytes, max ${Kt} bytes`);if(n+=Buffer.byteLength(e,`utf8`)+t,n>qt)throw Error(`build settings payload is too large: max ${qt} bytes`)}}const Yt=e=>new Promise(t=>setTimeout(t,e)),Xt=/failed: (?:502|503|504)\b|\bEOF\b|ECONNRESET|ECONNREFUSED|socket hang up|fetch failed/i;function Zt(e){let t=e instanceof Error?e.message:String(e);return Xt.test(t)}async function Qt(e,t={}){let n=t.sleep??Yt,r=t.attempts??5,i=t.retryOn??Zt,a;for(let o=1;o<=r;o++)try{return await e()}catch(e){if(!i(e))throw e;if(a=e,o<r){let r=e instanceof Error?e.message:String(e);t.log?.(`Retrying after error (${r.trim()})...`),await n(2e3*o)}}throw a}function $t(e){if(e===``||e.startsWith(`/`)||e.includes(`\\`)||e.includes(`\0`))throw Error(`invalid sandbox home path from server: ${e}`);let t=e.split(`/`);if(t.some(e=>e===``||e===`.`||e===`..`))throw Error(`invalid sandbox home path from server: ${e}`);return t.join(`/`)}async function en(e,t){let n=await K(await s.fetch(`${e}/info`,{method:`GET`,headers:{Authorization:`Bearer ${t}`}}),`GET /info`);if(!n.homeDir)throw Error(`GET /info response is missing homeDir`);return{homeDir:$t(n.homeDir),...n.xcode?{xcode:n.xcode}:{}}}function tn(e){let t=new URL(e);if(t.protocol===`https:`)t.protocol=`wss:`;else if(t.protocol===`http:`)t.protocol=`ws:`;else throw Error(`Unsupported apiUrl protocol for rbe tunnel: ${t.protocol}`);return t.pathname=`${t.pathname.replace(/\/+$/,``)}/rbe/tunnel`,t.search=``,t.hash=``,t.toString()}var nn=class extends p{constructor(e){super(`Remote build execution is not available on this Xcode instance (${e} returned 404). Its limbuild may predate RBE support, or you may be targeting the wrong environment (for example production instead of staging).`),this.name=`RbeUnsupportedError`}},rn=class extends p{constructor(e){super(`Xcode version selection is not available on this sandbox (${e} returned 404): its daemon predates Xcode selection. Create a new sandbox, or omit the Xcode version to build with its default.`),this.name=`XcodeSelectionUnsupportedError`}};function an(e,t){return on(e,t,e=>new rn(e))}function G(e,t){return on(e,t,e=>new nn(e))}async function on(e,t,n){if(e.status===404)throw await e.text().catch(()=>void 0),n(t);return K(e,t)}async function K(e,t){let n=await e.text();if(!e.ok)throw de(t,e.status,n,e.headers);if(!n.trim())throw Error(`${t} returned an empty response`);return JSON.parse(n)}var sn=class extends jt{listBuildLogs(e,t){return this._client.get(z`/v1/xcode_instances/${e}/build_logs`,t)}listBazelBuildLogs(e,t){return this._client.get(z`/v1/xcode_instances/${e}/bazel_build_logs`,t)}create(e,t){if(e.spec?.snapshot!==void 0){let{snapshot:n,cache:r,...i}=e.spec;if(r!==void 0)throw Error(`Use either spec.snapshot or the legacy spec.cache, not both.`);return super.create({...e,spec:{...i,cache:n}},t)}return super.create(e,t)}getSnapshot(e,t){return this.getCache(e,t)._thenUnwrap(U)}bindSnapshotKey(e,t,n){return this.bindCacheKey(e,t,n)._thenUnwrap(U)}followSnapshot(e,t){let n=this._client.apiKey;if(!n)throw Error(`Following disk snapshot status needs an API key on the client`);return Bt({baseURL:this._client.baseURL,apiKey:n,instanceId:e},t)}getCache(e,t){return this._client.get(z`/v1/xcode_instances/${e}/cache`,t)}bindCacheKey(e,t,n){return this._client.put(z`/v1/xcode_instances/${e}/cache`,{body:{key:t},...n})}followCache(e,t){let n=this._client.apiKey;if(!n)throw Error(`Following cache status needs an API key on the client`);return Lt({baseURL:this._client.baseURL,apiKey:n,instanceId:e},t)}async createClient(e){let t,n;if(`instance`in e){if(!e.instance.status.apiUrl)throw Error(`Instance not ready: apiUrl is not available`);t=e.instance.status.apiUrl,n=Mt(e.instance)}else t=e.apiUrl,n=e.token;let r=Ut(`[XcodeInstance]`,e.logLevel??`info`),i=this._client,a,o=()=>(a??=en(t,n),a),c=async e=>{let r,i;if(`status`in e){if(!e.status.apiUrl)throw Error(`Simulator instance not ready: apiUrl is not available`);r=e.status.apiUrl,i=Mt(e)}else r=e.apiUrl,i=e.token;return K(await s.fetch(`${t}/simulator`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({apiUrl:r,token:i})}),`POST /simulator`)},l=async e=>{try{return await i.iosInstances.delete(e),!0}catch{return!1}};return{async sync(e,i){let{cacheKey:a,basisCacheDir:s}=Vt(e,i?.basisCacheDir),c=i?.additionalFiles&&i.additionalFiles.length>0?await o():void 0,l=i?.additionalFiles?.map(e=>({localPath:e.localPath,remotePath:c&&e.remotePath.startsWith(`~/`)?`${c.homeDir}/${e.remotePath.slice(2)}`:e.remotePath})),u={apiUrl:t,token:n,udid:a,install:i?.install??!0,ignoreFn:await pe(e,{basisCacheDir:s,log:r,xcodeDefaults:!0,...i?.include?{include:i.include}:{},...i?.ignore?{additional:i.ignore}:{}}),basisCacheDir:s,watch:i?.watch??!0,launchMode:`ForegroundIfRunning`,log:r,syncSymlinks:!0,...l?{additionalFiles:l}:{},...i?.onSyncComplete?{onSyncComplete:i.onSyncComplete}:{}},d=await ie(e,u),f={};return d.bytesSent!==void 0&&(f.bytesSent=d.bytesSent),d.stopWatching&&(f.stopWatching=d.stopWatching),f},xcodebuild(e,a){if(a?.reactNative?.devServerURL&&e?.configuration===`Release`)throw Error(`reactNative.devServerURL is only supported for Debug builds`);if(e?.onlyTesting?.length&&e?.skipTesting?.length)throw Error(`onlyTesting and skipTesting are mutually exclusive; pass one`);if((e?.onlyTesting?.length||e?.skipTesting?.length)&&e?.action!==`build-for-testing`)throw Error(`onlyTesting/skipTesting require action: 'build-for-testing'`);if(e?.runTests===!1&&e?.action!==`build-for-testing`)throw Error(`runTests: false requires action: 'build-for-testing'`);if(e?.action===`build-for-testing`&&e.sdk!==void 0&&e.sdk!==`iphonesimulator`)throw Error(`action: 'build-for-testing' requires the iphonesimulator sdk`);a?.buildSettings&&Jt(a.buildSettings);let o={command:`xcodebuild`,...e&&{xcodebuild:e},...a?.xcodegen&&{xcodegen:a.xcodegen},...a?.reactNative&&{reactNative:a.reactNative},...a?.signing&&{signing:a.signing},...a?.cloudSigning&&{cloudSigning:a.cloudSigning},...a?.appstore&&{testflight:a.appstore},...a?.buildSettings&&{buildSettings:a.buildSettings},...a?.env?.length&&{env:a.env},...a?.gitInit!==void 0&&{gitInit:a.gitInit},...a?.logProcessor&&{logProcessor:a.logProcessor},...a?.webhook&&{webhook:a.webhook}},s={apiUrl:t,token:n,log:r,...a?.onXctestEvent&&{onXctestEvent:a.onXctestEvent}};if(a?.upload&&`assetName`in a.upload){let e=W(i.assets,a.upload.assetName,a.upload.ttl,a.upload.uploadOptions).then(e=>(o.signedUploadUrl=e.signedUploadUrl,o.assetId=e.id,o.additionalMetadata={signedDownloadUrl:e.signedDownloadUrl},o));return _(e,s)}return a?.upload&&`signedUploadUrl`in a.upload&&(o.signedUploadUrl=a.upload.signedUploadUrl),_(o,s)},run:Wt({apiUrl:t,token:n,log:r}),observeBuildLogs(e,i){return ce(e,{apiUrl:t,token:n,log:r,...i})},async getSimulator(){return K(await s.fetch(`${t}/simulator`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /simulator`)},attachSimulator:c,attachNewSimulator:async()=>{let e=await i.iosInstances.create({wait:!0});try{await c(e)}catch(t){throw await l(e.metadata.id),t}return{iosInstanceId:e.metadata.id,simulator:e}},deleteSimulator:l,async getXcode(){return an(await s.fetch(`${t}/xcode`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /xcode`)},async setXcode(e){return an(await s.fetch(`${t}/xcode`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({version:e})}),`POST /xcode`)},getInfo:()=>en(t,n),async startRbe(e){return G(await s.fetch(`${t}/rbe`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify(e??{})}),`POST /rbe`)},async getRbe(){return G(await s.fetch(`${t}/rbe`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe`)},async stopRbe(){return G(await s.fetch(`${t}/rbe`,{method:`DELETE`,headers:{Authorization:`Bearer ${n}`}}),`DELETE /rbe`)},async startRbeTunnel(r){return se(tn(t),n,r?.host??`127.0.0.1`,r?.port??8980,{mode:`multiplexed`,logLevel:r?.logLevel??e.logLevel??`info`})},async uploadLatestRbeBuild(e){let r,a;if(e.assetName!==void 0){if(!e.assetName)throw Error(`assetName must not be empty`);let t=await W(i.assets,e.assetName,e.ttl);r=t.signedUploadUrl,a=t.signedDownloadUrl}else r=e.signedUploadUrl;return{...await Qt(async()=>{let e=await s.fetchLongRequest(`${t}/rbe/upload`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({signedUploadUrl:r})});if(e.status===404)throw await e.text().catch(()=>void 0),Error(`POST /rbe/upload returned 404: the instance may no longer exist, or its limbuild predates RBE upload support. Recreate the instance and retry.`);return K(e,`POST /rbe/upload`)},{retryOn:e=>Zt(e)||re(e,400)&&/no successful RBE app build/i.test(e.body)}),...a&&{signedDownloadUrl:a}}},async getActiveRbeBuilds(){return G(await s.fetch(`${t}/rbe/builds/active`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe/builds/active`)},async getRecentRbeBuilds(){return G(await s.fetch(`${t}/rbe/builds/recent`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe/builds/recent`)},waitForRbeBuildEnd(e,r){return new Promise((i,a)=>{if(r?.signal?.aborted){a(Error(`waiting for build ${e} was aborted`));return}let o=!1,c=()=>{f.close(),r?.signal?.removeEventListener(`abort`,d)},l=e=>{o||(o=!0,c(),i(e))},u=e=>{o||(o=!0,c(),a(e))},d=()=>u(Error(`waiting for build ${e} was aborted`)),f=te({url:`${t}/exec/${e}/events`,fetch:ue(s.fetch,t=>u(Error(`build event stream for ${e} is unreachable: ${t instanceof Error?t.message:t}`))),headers:{Authorization:`Bearer ${n}`},onMessage:t=>{if(t.event!==`end`)return;let n;try{n=JSON.parse(t.data)}catch(t){u(Error(`invalid build end event for ${e}: ${t}`));return}l(n)},onDisconnect:()=>{u(Error(`build event stream for ${e} ended without a terminal event (the build may have finished and its live stream been removed)`))}});r?.signal?.addEventListener(`abort`,d,{once:!0})})}}}};function cn(e){let t=e.endsWith(`/`)?e.slice(0,-1):e,n=t.split(`/`);return n[n.length-1]===`local.properties`||n.length===1&&(t===`.gradle`||t===`.kotlin`||t===`build`)}var ln=class extends B{listBuildLogs(e,t){return this._client.get(z`/v1/gradle_instances/${e}/build_logs`,t)}async createClient(e){let t,n;if(`instance`in e){if(!e.instance.status.apiUrl)throw Error(`Instance not ready: apiUrl is not available`);t=e.instance.status.apiUrl,n=Mt(e.instance)}else t=e.apiUrl,n=e.token;let r=Ut(`[GradleInstance]`,e.logLevel??`info`),i=this._client;return{async sync(e,i){let{cacheKey:a,basisCacheDir:o}=Vt(e,i?.basisCacheDir),s=i?.ignore,c={apiUrl:t,token:n,udid:a,install:!1,ignoreFn:await pe(e,{basisCacheDir:o,log:r,xcodeDefaults:!1,nestedGitignore:!0,additional:s?e=>cn(e)||s(e):cn,...i?.include?{include:i.include}:{}}),basisCacheDir:o,watch:i?.watch??!1,launchMode:`ForegroundIfRunning`,log:r,syncSymlinks:!0,...i?.additionalFiles&&{additionalFiles:i.additionalFiles},...i?.onSyncComplete&&{onSyncComplete:i.onSyncComplete}},l=await ie(e,c),u={};return l.bytesSent!==void 0&&(u.bytesSent=l.bytesSent),l.stopWatching&&(u.stopWatching=l.stopWatching),u},run:Wt({apiUrl:t,token:n,log:r}),gradlebuild(e){let a={command:`gradlebuild`,...e?.env?.length&&{env:e.env},...e?.tasks?.length&&{tasks:e.tasks},...e?.projectPath&&{projectPath:e.projectPath},...e?.reactNative&&{reactNative:e.reactNative},...e?.signing&&{signing:e.signing},...e?.webhook&&{webhook:e.webhook},...e?.playstore&&{playstore:e.playstore}};if(e?.upload&&`assetName`in e.upload){let o=W(i.assets,e.upload.assetName,e.upload.ttl).then(e=>(a.signedUploadUrl=e.signedUploadUrl,a.additionalMetadata={signedDownloadUrl:e.signedDownloadUrl},a));return _(o,{apiUrl:t,token:n,log:r})}return e?.upload&&`signedUploadUrl`in e.upload&&(a.signedUploadUrl=e.upload.signedUploadUrl),_(a,{apiUrl:t,token:n,log:r})},observeBuildLogs(e,i){return ce(e,{apiUrl:t,token:n,log:r,...i})}}}};B.prototype.listBuildLogs=ln.prototype.listBuildLogs,B.prototype.createClient=ln.prototype.createClient;const q=e=>{if(globalThis.process!==void 0)return globalThis.process.env?.[e]?.trim()||void 0;if(globalThis.Deno!==void 0)return globalThis.Deno.env?.get?.(e)?.trim()||void 0};var J,Y,X,un,Z=class{constructor({baseURL:e=q(`LIMRUN_BASE_URL`),apiKey:t=q(`LIM_API_KEY`)??null,...n}={}){J.add(this),X.set(this,void 0),this.androidInstances=new At(this),this.assets=new Et(this),this.iosInstances=new Ot(this),this.xcodeInstances=new sn(this),this.gradleInstances=new B(this),this.analytics=new _t(this),this.scopedTokens=new Ct(this);let r={apiKey:t,...n,baseURL:e||`https://api.limrun.com`};this.baseURL=r.baseURL,this.timeout=r.timeout??Y.DEFAULT_TIMEOUT,this.logger=r.logger??console;let i=`warn`;this.logLevel=i,this.logLevel=nt(r.logLevel,`ClientOptions.logLevel`,this)??nt(q(`LIMRUN_LOG`),`process.env['LIMRUN_LOG']`,this)??i,this.fetchOptions=r.fetchOptions,this.maxRetries=r.maxRetries??2,this.fetch=r.fetch??Xe(),C(this,X,et,`f`);let a=q(`LIMRUN_CUSTOM_HEADERS`);if(a){let e={};for(let t of a.split(`
3
+ `)){let n=t.indexOf(`:`);n>=0&&(e[t.substring(0,n).trim()]=t.substring(n+1).trim())}r.defaultHeaders={...e,...r.defaultHeaders}}this._options=r,this.apiKey=t}withOptions(e){return new this.constructor({...this._options,baseURL:this.baseURL,maxRetries:this.maxRetries,timeout:this.timeout,logger:this.logger,logLevel:this.logLevel,fetch:this.fetch,fetchOptions:this.fetchOptions,apiKey:this.apiKey,...e})}defaultQuery(){return this._options.defaultQuery}validateHeaders({values:e,nulls:t}){if(!(this.apiKey&&e.get(`authorization`))&&!t.has(`authorization`))throw Error(`Could not resolve authentication method. Expected the apiKey to be set. Or for the "Authorization" headers to be explicitly omitted`)}async authHeaders(e){if(this.apiKey!=null)return R([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return tt(e)}getUserAgent(){return`${this.constructor.name}/JS ${E}`}defaultIdempotencyKey(){return`stainless-node-retry-${Pe()}`}makeStatusError(e,t,n,r){return l.generate(e,t,n,r)}buildURL(e,t,n){let r=!w(this,J,`m`,un).call(this)&&n||this.baseURL,i=Ie(e)?new URL(e):new URL(r+(r.endsWith(`/`)&&e.startsWith(`/`)?e.slice(1):e)),a=this.defaultQuery(),o=Object.fromEntries(i.searchParams);return(!ze(a)||!ze(o))&&(t={...o,...a,...t}),typeof t==`object`&&t&&!Array.isArray(t)&&(i.search=this.stringifyQuery(t)),i.toString()}async prepareOptions(e){}async prepareRequest(e,{url:t,options:n}){}get(e,t){return this.methodRequest(`get`,e,t)}post(e,t){return this.methodRequest(`post`,e,t)}patch(e,t){return this.methodRequest(`patch`,e,t)}put(e,t){return this.methodRequest(`put`,e,t)}delete(e,t){return this.methodRequest(`delete`,e,t)}methodRequest(e,t,n){return this.request(Promise.resolve(n).then(n=>({method:e,path:t,...n})))}request(e,t=null){return new ot(this,this.makeRequest(e,t,void 0))}async makeRequest(e,t,n){let r=await e,i=r.maxRetries??this.maxRetries;t??=i,await this.prepareOptions(r);let{req:a,url:o,timeout:s}=await this.buildRequest(r,{retryCount:i-t});await this.prepareRequest(a,{url:o,options:r});let l=`log_`+(Math.random()*(1<<24)|0).toString(16).padStart(6,`0`),u=n===void 0?``:`, retryOf: ${n}`,d=Date.now();if(A(this).debug(`[${l}] sending request`,j({retryOfRequestLogID:n,method:r.method,url:o,options:r,headers:a.headers})),r.signal?.aborted)throw new c;let p=new AbortController,m=await this.fetchWithTimeout(o,a,s,p).catch(f),h=Date.now();if(m instanceof globalThis.Error){let e=`retrying, ${t} attempts remaining`;if(r.signal?.aborted)throw new c;let i=ee(m)||/timed? ?out/i.test(String(m)+(`cause`in m?String(m.cause):``));if(t)return A(this).info(`[${l}] connection ${i?`timed out`:`failed`} - ${e}`),A(this).debug(`[${l}] connection ${i?`timed out`:`failed`} (${e})`,j({retryOfRequestLogID:n,url:o,durationMs:h-d,message:m.message})),this.retryRequest(r,t,n??l);throw A(this).info(`[${l}] connection ${i?`timed out`:`failed`} - error; no more retries left`),A(this).debug(`[${l}] connection ${i?`timed out`:`failed`} (error; no more retries left)`,j({retryOfRequestLogID:n,url:o,durationMs:h-d,message:m.message})),i?new ne:new le({cause:m})}let g=`[${l}${u}] ${a.method} ${o} ${m.ok?`succeeded`:`failed`} with status ${m.status} in ${h-d}ms`;if(!m.ok){let e=await this.shouldRetry(m);if(t&&e){let e=`retrying, ${t} attempts remaining`;return await $e(m.body),A(this).info(`${g} - ${e}`),A(this).debug(`[${l}] response error (${e})`,j({retryOfRequestLogID:n,url:m.url,status:m.status,headers:m.headers,durationMs:h-d})),this.retryRequest(r,t,n??l,m.headers)}let i=e?`error; no more retries left`:`error; not retryable`;A(this).info(`${g} - ${i}`);let a=await m.text().catch(e=>f(e).message),o=He(a),s=o?void 0:a;throw A(this).debug(`[${l}] response error (${i})`,j({retryOfRequestLogID:n,url:m.url,status:m.status,headers:m.headers,message:s,durationMs:Date.now()-d})),this.makeStatusError(m.status,o,s,m.headers)}return A(this).info(g),A(this).debug(`[${l}] response start`,j({retryOfRequestLogID:n,url:m.url,status:m.status,headers:m.headers,durationMs:h-d})),{response:m,options:r,controller:p,requestLogID:l,retryOfRequestLogID:n,startTime:d}}getAPIList(e,t,n){return this.requestAPIList(t,n&&`then`in n?n.then(t=>({method:`get`,path:e,...t})):{method:`get`,path:e,...n})}requestAPIList(e,t){let n=this.makeRequest(t,null,void 0);return new ct(this,n,e)}async fetchWithTimeout(e,t,n,r){let{signal:i,method:a,...o}=t||{},s=this._makeAbort(r);i&&i.addEventListener(`abort`,s,{once:!0});let c=setTimeout(s,n),l=globalThis.ReadableStream&&o.body instanceof globalThis.ReadableStream||typeof o.body==`object`&&o.body!==null&&Symbol.asyncIterator in o.body,u={signal:r.signal,...l?{duplex:`half`}:{},method:`GET`,...o};a&&(u.method=a.toUpperCase());try{return await this.fetch.call(void 0,e,u)}finally{clearTimeout(c)}}async shouldRetry(e){let t=e.headers.get(`x-should-retry`);return t===`true`?!0:t===`false`?!1:e.status===408||e.status===409||e.status===429||e.status>=500}async retryRequest(e,t,n,r){let i,a=r?.get(`retry-after-ms`);if(a){let e=parseFloat(a);Number.isNaN(e)||(i=e)}let o=r?.get(`retry-after`);if(o&&!i){let e=parseFloat(o);i=Number.isNaN(e)?Date.parse(o)-Date.now():e*1e3}if(i===void 0){let n=e.maxRetries??this.maxRetries;i=this.calculateDefaultRetryTimeoutMillis(t,n)}return await fe(i),this.makeRequest(e,t-1,n)}calculateDefaultRetryTimeoutMillis(e,t){let n=t-e;return Math.min(.5*2**n,8)*(1-Math.random()*.25)*1e3}async buildRequest(e,{retryCount:t=0}={}){let n={...e},{method:r,path:i,query:a,defaultBaseURL:o}=n,s=this.buildURL(i,a,o);`timeout`in n&&Ve(`timeout`,n.timeout),n.timeout=n.timeout??this.timeout;let{bodyHeaders:c,body:l}=this.buildBody({options:n});return{req:{method:r,headers:await this.buildHeaders({options:e,method:r,bodyHeaders:c,retryCount:t}),...n.signal&&{signal:n.signal},...globalThis.ReadableStream&&l instanceof globalThis.ReadableStream&&{duplex:`half`},...l&&{body:l},...this.fetchOptions??{},...n.fetchOptions??{}},url:s,timeout:n.timeout}}async buildHeaders({options:e,method:t,bodyHeaders:n,retryCount:r}){let i={};this.idempotencyHeader&&t!==`get`&&(e.idempotencyKey||=this.defaultIdempotencyKey(),i[this.idempotencyHeader]=e.idempotencyKey);let a=R([i,{Accept:`application/json`,"User-Agent":this.getUserAgent(),"X-Stainless-Retry-Count":String(r),...e.timeout?{"X-Stainless-Timeout":String(Math.trunc(e.timeout/1e3))}:{},...Ye()},await this.authHeaders(e),this._options.defaultHeaders,n,e.headers]);return this.validateHeaders(a),a.values}_makeAbort(e){return()=>e.abort()}buildBody({options:e}){let{body:t,headers:n}=e;if(!t)return t==null&&`body`in e?w(this,X,`f`).call(this,{body:t,headers:R([n])}):{bodyHeaders:void 0,body:void 0};let r=R([n]);return ArrayBuffer.isView(t)||t instanceof ArrayBuffer||t instanceof DataView||typeof t==`string`&&r.values.has(`content-type`)||globalThis.Blob&&t instanceof globalThis.Blob||t instanceof FormData||t instanceof URLSearchParams||globalThis.ReadableStream&&t instanceof globalThis.ReadableStream?{bodyHeaders:void 0,body:t}:typeof t==`object`&&(Symbol.asyncIterator in t||Symbol.iterator in t&&`next`in t&&typeof t.next==`function`)?{bodyHeaders:void 0,body:Qe(t)}:typeof t==`object`&&r.values.get(`content-type`)===`application/x-www-form-urlencoded`?{bodyHeaders:{"content-type":`application/x-www-form-urlencoded`},body:this.stringifyQuery(t)}:w(this,X,`f`).call(this,{body:t,headers:r})}};Y=Z,X=new WeakMap,J=new WeakSet,un=function(){return this.baseURL!==`https://api.limrun.com`},Z.Limrun=Y,Z.DEFAULT_TIMEOUT=3e5,Z.LimrunError=p,Z.APIError=l,Z.APIConnectionError=le,Z.APIConnectionTimeoutError=ne,Z.APIUserAbortError=c,Z.NotFoundError=m,Z.ConflictError=o,Z.RateLimitError=u,Z.BadRequestError=oe,Z.AuthenticationError=h,Z.InternalServerError=ae,Z.PermissionDeniedError=g,Z.UnprocessableEntityError=d,Z.toFile=ht,Z.AndroidInstances=At,Z.Assets=Et,Z.IosInstances=Ot,Z.XcodeInstances=sn,Z.GradleInstances=B,Z.Analytics=_t,Z.ScopedTokens=Ct,process.platform;function dn(e){return e?.trim()||void 0}async function fn(e,t,n=`Limrun provider operation aborted`,r){if(!t)try{return await e}finally{r?.()}return await new Promise((i,a)=>{let o=()=>a(t.reason??Error(n));if(t.aborted){e.then(e=>{r?.(),i(e)},e=>{r?.(),a(e)}),o();return}t.addEventListener(`abort`,o,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,o),r?.(),i(e)},e=>{t.removeEventListener(`abort`,o),r?.(),a(e)})})}function pn(){let e=new Set;return{wait:async(t,n,r)=>{let i,a=new Promise(t=>{i=()=>{e.delete(a),t()}});return e.add(a),await fn(t,n,r,i)},[Symbol.asyncDispose]:async()=>{for(;e.size>0;)await Promise.all(e)}}}async function Q(e,t,n,r){return await(e?e.wait(t,n,r):fn(t,n,r))}async function mn(e,t){let n=await he({apiUrl:e.apiUrl,adbUrl:e.adbUrl,token:e.token,logLevel:`warn`}),r={platform:`android`,lease:e.lease,instanceId:e.instanceId,ownership:e.ownership,device:e.device,client:n,token:e.token,dependencies:t},i={exec:async(e,t)=>await bn(r,e,t),text:async e=>{let{createLimrunAndroidTextInjector:t}=await import(`./android-text-entry.js`);await t(n)(e)}};return i.reverse=await t.android.createPortReverse(i.exec,{noRebind:e.ownership===`attached`}),Object.assign(r,{adbProvider:i})}function hn(e){return e.dependencies.android.createInteractor(e.device,e.adbProvider)}async function gn(e,t,n,r,i,a){i?.throwIfAborted();let o=dn(r?.packageNameHint);r?.relaunch&&o&&await t.dependencies.android.forceStopApp(async(e,n)=>await bn(t,e,n),o,i);let s=await Q(a,e.assets.getOrUpload({path:n,name:En(o,n)},{signal:i}),i);await Q(a,t.client.sendAsset(s.signedDownloadUrl),i),i?.throwIfAborted();let c=o?await t.dependencies.android.inferAppName(o):void 0;return{...o?{packageName:o,launchTarget:o}:{},...c?{appName:c}:{}}}async function _n(e,t){await e.adbProvider.reverse?.ensure({local:Tn(t.devicePort),remote:Tn(t.hostPort),ownerId:t.name})}async function vn(e){await e.adbTunnelPromise?.catch(()=>{});let t=e.adbSerial;t&&(await yn(e),await e.dependencies.host.runAdb(e.dependencies.android.hostAdbInvocation([`disconnect`,t]),{allowFailure:!0,timeoutMs:1e4}).catch(()=>{})),e.adbTunnel?.close(),e.adbTunnel=void 0,e.adbSerial=void 0,e.adbTunnelPromise=void 0}async function yn(e){let t=e.adbProvider.reverse;if(!t?.list)return;let n=await t.list().catch(()=>[]),r=new Set,i=[],a=e.ownership===`attached`;for(let e of n)e.ownerId?r.add(e.ownerId):a||i.push(e.local);await Promise.allSettled([...[...r].map(async e=>await t.removeAllOwned(e)),...i.map(async e=>await t.remove(e))])}async function bn(e,t,n){let{invocation:r,result:i}=await xn(e,t,n);return await Sn(r,i,n?.allowFailure,e.dependencies)}async function xn(e,t,n){let r=await Cn(e),i=e.dependencies.android.deviceAdbInvocation(r,t);return{invocation:i,result:await e.dependencies.host.runAdb(i,{allowFailure:n?.allowFailure,binaryStdout:n?.binaryStdout,stdin:n?.stdin,timeoutMs:n?.timeoutMs??3e4,signal:n?.signal})}}async function Sn(e,t,n,r){if(t.exitCode!==0&&n!==!0)throw await r.android.adbError(`Limrun Android ADB command failed`,t,e);return t}async function Cn(e){if(e.adbSerial)return e.adbSerial;let t=e.adbTunnelPromise??wn(e);e.adbTunnelPromise=t;try{return await t}catch(n){throw e.adbTunnelPromise===t&&(e.adbTunnelPromise=void 0),n}}async function wn(e){let t=await e.client.startAdbTunnel(),n=`${t.address.address}:${t.address.port}`;return e.adbTunnel=t,e.adbSerial=n,n}function Tn(e){if(!Number.isInteger(e)||e<1||e>65535)throw new t(`INVALID_ARGS`,`Invalid Android tcp reverse port: ${e}`);return`tcp:${e}`}function En(e,t){let n=y.extname(t)||`.apk`;return`${e?.replaceAll(/[^a-zA-Z0-9_.-]+/g,`-`)||`android-app`}${n}`}function Dn(e){let t=Array.isArray(e)?e:[e],n=[],r=(e,t,i)=>{let a=n.length;n.push(On(e,{index:a,depth:t,parentIndex:i}));for(let n of Fn(e))r(n,t+1,a)};for(let e of t)r(e,0);return n}function On(e,t){return{index:t.index,type:kn(e),role:An(e),label:jn(e),value:Mn(e),identifier:Nn(e),rect:Pn(e),enabled:e.enabled,selected:e.selected,hittable:e.hittable,depth:t.depth,parentIndex:t.parentIndex}}function kn(e){return e.elementType??e.type}function An(e){return e.role??kn(e)}function jn(e){return e.label??e.AXLabel??void 0}function Mn(e){return e.value??e.AXValue??void 0}function Nn(e){return e.identifier??e.AXUniqueId??void 0}function Pn(e){let t=e.rect??e.frame;if(!(!t||typeof t.x!=`number`||typeof t.y!=`number`||typeof t.width!=`number`||typeof t.height!=`number`))return{x:t.x,y:t.y,width:t.width,height:t.height}}function Fn(e){return e.children??e.nodes??e.elements??[]}function In(e){return e.key===`id`?{AXUniqueId:e.value}:e.key===`value`?{AXValue:e.value}:{AXLabel:e.value}}async function Ln(e,t){let n=await me({apiUrl:e.apiUrl,token:e.token,logLevel:`warn`});return{platform:`ios`,lease:e.lease,instanceId:e.instanceId,ownership:e.ownership,device:e.device,client:n,token:e.token,dependencies:t}}async function Rn(e,t,n,r,i,a){i?.throwIfAborted();let o=await Hn(n,t.dependencies);try{i?.throwIfAborted();let n=await Q(a,e.assets.getOrUpload({path:o.uploadPath,name:o.assetName},{signal:i}),i),s=(await zn(t,n.signedDownloadUrl,{md5:n.md5,relaunch:r?.relaunch,appIdentifierHint:r?.appIdentifierHint},i,a)).appId;return{...s?{bundleId:s,launchTarget:s}:{},...o.appName?{appName:o.appName}:{}}}finally{await o.cleanup()}}async function zn(e,n,r,i,a){i?.throwIfAborted();let o=await Q(a,e.client.listApps(),i).catch(e=>{if(i?.aborted)throw e}),s=dn((await Q(a,e.client.installApp(n,{md5:r?.md5,launchMode:r?.relaunch?`RelaunchIfRunning`:`ForegroundIfRunning`}),i)).bundleId),c=dn(r?.appIdentifierHint),l=[];for(let t of Wn){t>0&&await we(t,void 0,{signal:i}),l=await Q(a,e.client.listApps(),i);let n=qn({resultBundleId:s,requestedBundleId:c,beforeInstallApps:o,afterInstallApps:l});if(n)return{appId:n}}throw new t(`COMMAND_FAILED`,`Limrun iOS app installation could not be verified.`,{resultBundleId:s,requestedBundleId:c,installedUserApps:l.filter(Yn).map(e=>e.bundleId).sort()})}function Bn(e){return new Vn(e)}var Vn=class{session;constructor(e){this.session=e}async open(e,t){if(t?.url){await this.launch(e,t.launchArgs),await this.session.client.openUrl(t.url);return}if(r(e)){await this.session.client.openUrl(e);return}await this.launch(e,t?.launchArgs)}async launch(e,n=[]){let r=await this.session.dependencies.ios.resolveAppAlias(e);if(n.length===0){await this.session.client.launchApp(r);return}let i=await this.session.client.simctl([`launch`,`--terminate-running-process`,`booted`,r,...n]).wait();if(i.code!==0)throw new t(`COMMAND_FAILED`,`Limrun iOS could not launch ${r} with arguments.`,{bundleId:r,exitCode:i.code,stderr:i.stderr.trim()})}async openDevice(){}async close(e){e&&await this.session.client.terminateApp(await this.session.dependencies.ios.resolveAppAlias(e)).catch(()=>{})}async tap(e,t){await this.session.client.tap(e,t)}async tapElementSelector(e){await this.session.client.tapElement(In(e))}async doubleTap(e,t){await this.session.client.performActions([{type:`tap`,x:e,y:t},{type:`wait`,durationMs:Kn},{type:`tap`,x:e,y:t}])}async longPress(e,t,n=Gn){await this.session.client.performActions([{type:`touchDown`,x:e,y:t},{type:`wait`,durationMs:n},{type:`touchUp`,x:e,y:t}])}async focus(e,t){await this.tap(e,t)}async type(e,t){await this.enterText(e,t)}async fill(e,t,n,r){let{awaitLimrunTextEntryFocus:i,readLimrunUnambiguousTapTargets:a,readLimrunTextEntryFocus:o}=await import(`./text-entry-focus.js`),s=a(await this.session.client.elementTree(),e,t);await this.tap(e,t);let c=await i({targetsAtPoint:s,readFocus:async()=>o(await this.session.client.elementTree()),sleep:e=>we(e),x:e,y:t});return await this.session.client.pressKey(`a`,[`command`]),n.length===0?(await this.session.client.pressKey(`delete`),{textEntryReadiness:c}):(await this.enterText(n,r),{textEntryReadiness:c})}async enterText(e,t){if(t&&t>0){let r=0;try{for(let n of Array.from(e))await this.session.client.typeText(n,!1,{requireFocus:!1}),r+=1,await we(t)}catch(e){throw n(e,r)}return}await this.session.client.typeText(e,!1,{requireFocus:!1})}async scroll(e,t){await this.session.client.scroll(e,t?.pixels??300)}async screenshot(e){let{transcodeScreenshotToPngAsync:t}=await import(`./png-worker-client.js`).then(e=>e.s),n=await this.session.client.screenshot(),r=await t(Buffer.from(n.base64,`base64`),`Limrun iOS screenshot`);v.mkdirSync(y.dirname(e),{recursive:!0}),await v.promises.writeFile(e,r)}async snapshot(){let{captureLimrunIosSnapshot:e}=await import(`./ios-snapshot-adapter.js`);return await e(this.session)}async back(){await this.session.client.pressKey(`escape`)}async home(){await this.session.client.performActions([{type:`buttonDown`,button:`home`},{type:`buttonUp`,button:`home`}])}async readClipboard(){return(await this.pasteboard([`pbpaste`,`booted`])).stdout.replaceAll(`\r
4
+ `,`
5
+ `).replace(/\n$/,``)}async writeClipboard(e){await this.pasteboard([`pbcopy`,`booted`],e)}async pasteboard(e,n){let r=await this.session.client.simctl(e,n===void 0?void 0:{stdin:n}).wait();if(r.code!==0)throw new t(`COMMAND_FAILED`,`Limrun iOS could not access the clipboard.`,{command:e[0],exitCode:r.code,stderr:r.stderr.trim()});return r}async setOrientation(e){if(e===`portrait-upside-down`)throw Xn(`orientation`,`Limrun iOS direct sessions support portrait and landscape orientation, not portrait upside-down.`);await this.session.client.setOrientation(e===`portrait`?`Portrait`:`Landscape`)}async setSetting(e,t,n,r){let{setLimrunIosSetting:i}=await import(`./ios-settings.js`);return await i(this.session,e,t,n,r)}};async function Hn(e,t){if(!(await v.promises.stat(e)).isDirectory())return{uploadPath:e,assetName:y.basename(e),appName:Un(e),cleanup:async()=>{}};let n=await v.promises.mkdtemp(y.join(ve.tmpdir(),`agent-device-limrun-ios-app-`)),r=y.join(n,`${y.basename(e)}.zip`);try{await t.host.archiveDirectory({sourceDirectory:y.dirname(e),entryName:y.basename(e),archivePath:r})}catch(e){throw await v.promises.rm(n,{recursive:!0,force:!0}),e}return{uploadPath:r,assetName:y.basename(r),appName:await t.ios.readBundleAppName(e)??Un(e),cleanup:async()=>{await v.promises.rm(n,{recursive:!0,force:!0})}}}function Un(e){return y.basename(e).replace(/\.(?:app|ipa|apk|aab|zip)$/i,``)||void 0}const Wn=[0,250],Gn=800,Kn=80;function qn(e){let t=new Set(e.afterInstallApps.map(e=>e.bundleId));return(e.resultBundleId&&t.has(e.resultBundleId)?e.resultBundleId:void 0)??(e.requestedBundleId&&t.has(e.requestedBundleId)?e.requestedBundleId:void 0)??Jn(e.beforeInstallApps,e.afterInstallApps)}function Jn(e,t){if(!e)return;let n=new Set(e.map(e=>e.bundleId)),r=t.filter(e=>Yn(e)&&!n.has(e.bundleId));return r.length===1?r[0]?.bundleId:void 0}function Yn(e){return!e.bundleId.startsWith(`com.apple.`)&&!e.installType.toLowerCase().includes(`system`)}function Xn(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}function $(e){return e.platform===`android`?Zn(e):Qn(e)}function Zn(e){let t=e.adbProvider.exec;return{platform:`android`,device:e.device,interactor:hn(e),adb:e.adbProvider,listApps:async n=>await e.dependencies.android.listApps(t,a(n)),getForegroundApp:async n=>await e.dependencies.android.getForegroundApp(e.device,t,n),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},getKeyboardState:async()=>await e.dependencies.android.getKeyboardState(t),dismissKeyboard:async()=>await e.dependencies.android.dismissKeyboard(t),readLogs:async n=>await e.dependencies.android.readLogs(t,n),...$n(e.client,e.token,e.dependencies.host),installRemoteApp:async t=>{await e.client.sendAsset(t)}}}function Qn(e){return{platform:`ios`,device:e.device,interactor:Bn(e),viewport:{width:e.client.deviceInfo.screenWidth,height:e.client.deviceInfo.screenHeight},listApps:async t=>(await e.client.listApps()).filter(e=>a(t)===`all`||Yn(e)).map(e=>({id:e.bundleId,name:e.name,installType:e.installType})).sort((e,t)=>e.id.localeCompare(t.id)),pressKey:async(t,n)=>{await e.client.pressKey(t,n)},readLogs:async(t,n)=>await e.client.appLogTail(t,n),...$n(e.client,e.token,e.dependencies.host),installRemoteApp:async(t,n)=>await zn(e,t,n),runSimctl:t=>e.client.simctl(t)}}function $n(e,t,n){return{startRecording:async t=>{await e.startRecording(t)},stopRecording:async()=>({downloadUrl:await e.stopRecording({})}),downloadRecording:async e=>{await n.downloadFile({url:e.downloadUrl,headers:{Authorization:`Bearer ${t}`},destinationPath:e.outPath,timeoutMs:6e4})}}}const er=`agent-device-cli`;function tr(e){return{apiKey:e.apiKey,defaultHeaders:{"x-agent-device-client":er,"x-agent-device-version":e.clientVersion}}}function nr(e,n,r=`This daemon drives an existing Limrun instance with its own token. Set LIMRUN_API_KEY, or ask the instance owner to do this.`){if(e)return e;throw new t(`UNSUPPORTED_OPERATION`,`${n} requires a Limrun API key.`,{hint:r})}function rr(e){if(e.runtimeInstance!==void 0){let t=e.runtimeInstance.trim();if(!t)throw TypeError(`Limrun runtimeInstance must be a non-empty string`);return t}let t=JSON.stringify({provider:`limrun`,region:e.region?.trim().toLowerCase()||`default`,apiKey:e.apiKey,attachedIos:e.instances?.ios?.apiUrl,attachedAndroid:e.instances?.android?.apiUrl});return`principal-${_e(t,`agent-device:limrun-runtime-owner:v1`,32,{N:16384,r:8,p:1,maxmem:67108864}).toString(`hex`)}`}function ir(e,t,n){let r=new ar(e,t);if(!n?.includePlatformModule)return r;let a=i(x,rr(e));if(a.kind!==`provider-runtime`)throw TypeError(`Invalid Limrun runtime owner`);return Object.freeze({runtime:r,platformModule:Object.freeze({owner:a,loadRuntime:async e=>await or(r,a.instance,e)})})}var ar=class{limrun;sessions=new Map;keepAliveTimers=new Map;appAliases=new Map;options;dependencies;provider=x;leaseLifecycle={allocate:async(e,t)=>await this.allocate(e,t),release:async e=>await this.release(e)};appCatalog=async(e,t)=>{let{assertLimrunUploadedAppAccess:n,listLimrunAppAssets:r}=await import(`./app-catalog.js`);return n(e.publicNetworkOnly),(await r(this.orgClient(`Listing uploaded apps`,`Run open <bundle-or-package-id> first; apps then lists the apps installed on the instance.`),e.platform,t)).map(e=>e.name)};recoverExpiredLease=async e=>{if(e.leaseProvider!==this.provider||!De(e.backend))throw new t(`UNSUPPORTED_OPERATION`,`Limrun cannot recover this expired lease.`,{leaseId:e.leaseId,leaseProvider:e.leaseProvider,leaseBackend:e.backend});await this.release(e)};deviceInventoryProvider=async e=>{if(e.leaseProvider!==this.provider||!e.leaseId)return null;let t=this.sessions.get(e.leaseId);return t?e.platform&&e.platform!==t.platform?[]:[t.device]:null};constructor(e,t){if(!e.apiKey&&!e.instances?.ios&&!e.instances?.android)throw TypeError(`Limrun runtime requires an apiKey or instance access`);this.options=e,this.dependencies=t,this.limrun=e.apiKey?new Z(tr({apiKey:e.apiKey,clientVersion:t.clientVersion})):void 0}ownsDevice(e){return S(e.id)!==void 0}hasLiveSession(e){return this.getSessionForDevice(e)!==void 0}getInteractor(e,t){let n=this.getSessionForDevice(e);if(n)return n.platform===`ios`?Bn(n):hn(n)}getDeviceSession(e){let t=this.getSessionForDevice(e);return t?$(t):void 0}async installApp(e,t,n,r,i,a){return await this.installInstallablePath(e,n,{...r,appIdentifierHint:r?.appIdentifierHint??t,packageNameHint:r?.packageNameHint??t},i,a)}async installInstallablePath(e,t,n,r,i){let a=this.getSessionForDevice(e);if(!a)return;let o=this.orgClient(`Uploading an app`);return a.platform===`ios`?await Rn(o,a,t,n,r,i):await gn(o,a,t,n,r,i)}async configurePortReverse(e){let t=this.requireAndroidPortReverseSession(e.leaseId);if(t)return await _n(t,e),sr(e)}async shutdown(){let e=[...this.sessions.values()];await Promise.allSettled(e.map(async e=>await this.terminateSession(e))),this.sessions.clear(),this.appAliases.clear()}async allocate(e,t){if(e.leaseProvider!==this.provider)return;let n=De(e.backend);if(!n)return;let{rejectRefusedLimrunProfileFields:r}=await import(`./session-allocation.js`);r(t);let i=this.sessions.get(e.leaseId);if(i)return{limrunInstanceId:i.instanceId,device:i.device};let a=await this.attachSession(n,e)??await this.createSession(n,e,t);return this.sessions.set(e.leaseId,a),this.options.keepAlive&&this.startKeepAlive(e.leaseId,a),{limrunInstanceId:a.instanceId,device:a.device}}async attachSession(e,t){let{ios:n,android:r}=this.options.instances??{},i=n=>{let r=ke(n);return{lease:t,instanceId:r,ownership:`attached`,device:Oe(e,t,r)}};return e===`android`?r&&await mn({...i(r.apiUrl),...r},this.dependencies):n&&await Ln({...i(n.apiUrl),...n},this.dependencies)}async createSession(e,t,n){let{allocateLimrunAndroidSession:r,allocateLimrunIosSession:i,resolvePreinstalledAppId:a,resolveRequestedLimrunAppAsset:o}=await import(`./session-allocation.js`),s=this.orgClient(`Creating an instance`),c=await o(s,e,n),l=this.sessionAllocationParams(s,t,c),u=e===`ios`?await i(l):await r(l);if(c)try{let e=await a(u,c);this.appAliases.set(t.leaseId,{assetName:c.name,installedAppId:e})}catch(e){throw await this.terminateSession(u),e}return u}sessionAllocationParams(e,t,n){return{limrun:e,lease:t,metadata:this.buildInstanceMetadata(t),region:this.options.region,app:n,dependencies:this.dependencies}}buildInstanceMetadata(e){return{displayName:`agent-device-${e.tenantId}-${e.runId}`,labels:{tenantId:e.tenantId,runId:e.runId,leaseId:e.leaseId,provider:e.leaseProvider??`limrun`,source:er}}}async release(e){let t=this.sessions.get(e.leaseId);return t?(await this.terminateSession(t),this.sessions.delete(e.leaseId),this.appAliases.delete(e.leaseId),{limrunInstanceId:t.instanceId}):await this.releaseRecoveredSession(e)}async releaseRecoveredSession(e){let t=De(e.backend),n=this.limrun;if(!t||!n)return;let r=`provider=${x},leaseId=${e.leaseId}`,i=(t===`ios`?await n.iosInstances.list({labelSelector:r}):await n.androidInstances.list({labelSelector:r})).getPaginatedItems().map(e=>e.metadata.id);for(let e of i)t===`ios`?await n.iosInstances.delete(e):await n.androidInstances.delete(e);if(i.length!==0)return{limrunInstanceId:i[0],limrunInstanceCount:i.length}}startKeepAlive(e,t){let n=setInterval(()=>{try{t.client.keepAlive()}catch{}},3e4);n.unref(),this.keepAliveTimers.set(e,n)}async terminateSession(e){let t=e.lease.leaseId;if(clearInterval(this.keepAliveTimers.get(t)),this.keepAliveTimers.delete(t),e.client.disconnect(),e.platform===`android`&&await vn(e),e.ownership===`attached`)return;let n=this.orgClient(`Deleting an instance`);e.platform===`ios`?await n.iosInstances.delete(e.instanceId):await n.androidInstances.delete(e.instanceId)}orgClient(e,t){return nr(this.limrun,e,t)}getSessionForDevice(e){let t=S(e.id);if(!t)return;let n=this.sessions.get(t.leaseId);return n?.platform===t.platform?n:void 0}resolveAppReference(e,t){let n=S(e.id);if(!n)return t;let r=this.appAliases.get(n.leaseId);return r?.assetName===t?r.installedAppId:t}currentAppLogReader(e){let t=this.getSessionForDevice(e);if(!t)return;let n=$(t);return{platform:t.platform,leaseId:t.lease.leaseId,instanceId:t.instanceId,ownership:t.ownership,readLogs:async(e,t)=>n.platform===`ios`?await n.readLogs(e,t):await n.readLogs(t),[Symbol.asyncDispose]:async()=>void 0}}async reconnectAppLogReader(e,t){let{reconnectLimrunAppLogReader:n}=await import(`./app-log-reconnect.js`);return await n({limrun:this.limrun,instances:this.options.instances,descriptor:e,dependencies:this.dependencies,signal:t})}requireAndroidPortReverseSession(e){let t=this.sessions.get(e);if(!t||t.platform===`android`)return t;throw cr(`port reverse`,`Direct Limrun iOS sessions cannot reach local host ports; use a bridge public URL.`)}};async function or(e,n,r){let{createLimrunPlatformRuntimeOwner:i}=await import(`./app-log-runtime2.js`);return i({host:r,runtimeInstance:n,ownsDevice:t=>e.ownsDevice(t),hasLiveSession:t=>e.hasLiveSession(t),getInteractor:(t,n)=>e.getInteractor(t,n),getDeviceSession:t=>e.getDeviceSession(t),resolveAppReference:(t,n)=>e.resolveAppReference(t,n),openCurrent:async t=>e.currentAppLogReader(t),reconnect:async(t,n)=>await e.reconnectAppLogReader(t,n),listApps:async(n,r,i)=>{i.throwIfAborted();let a=e.getDeviceSession(n);if(!a)throw new t(`DEVICE_NOT_FOUND`,`Limrun app inventory session is unavailable`,{deviceId:n.id});return(await a.listApps(r)).map(e=>({id:e.id,name:e.name??e.id}))},getAppState:async(n,r)=>{r.throwIfAborted();let i=e.getDeviceSession(n);if(i?.platform!==`android`)throw new t(`UNSUPPORTED_OPERATION`,`Limrun Android appstate requires an active provider session`);let a=await i.getForegroundApp(r);return r.throwIfAborted(),{package:a?.appId,activity:a?.activity}},deployApp:async(t,n,r,i)=>await e.installApp(t,n.app,n.appPath,{relaunch:n.replaceExisting,appIdentifierHint:n.app,packageNameHint:n.app},r,i),deployMaterializedApp:async(t,n,r,i)=>await e.installInstallablePath(t,n.artifact.installablePath,{appIdentifierHint:n.artifact.bundleId,packageNameHint:n.artifact.packageName},r,i),configurePortReverse:async t=>await e.configurePortReverse(t)})}function sr(e){return{leaseId:e.leaseId,devicePort:e.devicePort,hostPort:e.hostPort,name:e.name}}function cr(e,n){throw new t(`UNSUPPORTED_OPERATION`,n,{command:e})}async function lr(e){let n=await fr(e);if(n)return n;if(!e.apiKey)throw new t(`INVALID_ARGS`,`Limrun verification requires an API key or instance access.`);let r=new Z({...tr({apiKey:e.apiKey,clientVersion:e.clientVersion}),timeout:15e3,maxRetries:0}),i={limit:1,...e.region?{region:e.region}:{}};try{e.platform===`android`?await r.androidInstances.list(i):await r.iosInstances.list(i)}catch(e){let n=ur(e);throw n===401||n===403?new t(`UNAUTHORIZED`,`Limrun rejected connection verification.`,{status:n,hint:`Check LIMRUN_API_KEY and its organization access.`}):new t(`COMMAND_FAILED`,`Limrun connection verification failed.`,{hint:`Check Limrun service access, LIMRUN_REGION, and network connectivity, then retry.`},e)}let a=e.platform===`android`?`Android`:`iOS`,o=e.platform===`android`?`emulator`:`simulator`;return{provider:`limrun`,service:`Limrun`,verificationMessage:`Credentials and ${a} instance access verified.`,device:{status:`deferred`,name:`Provider-selected ${a} ${o}`,platform:e.platform},app:{status:`missing`,message:`Run apps to choose an uploaded asset before allocation.`}}}function ur(e){if(!e||typeof e!=`object`)return;let t=e.status;return typeof t==`number`?t:void 0}function dr(e){let t={logLevel:`none`,maxReconnectAttempts:0},{ios:n,android:r}=e.instances??{};return e.platform===`android`?r&&import(`./instance-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...r})):n&&import(`./ios-client.js`).then(e=>e.n).then(({createInstanceClient:e})=>e({...t,...n}))}async function fr(e){let n=dr(e);if(!n)return;let r=e.platform===`android`,i=r?`Android`:`iOS`;try{(await n).disconnect()}catch(e){throw new t(`COMMAND_FAILED`,`Limrun ${i} instance access failed.`,{hint:r?`Check LIM_ANDROID_INSTANCE_URL, LIM_ANDROID_INSTANCE_TOKEN, and LIM_ANDROID_INSTANCE_ADB_URL, and that the instance is still running.`:`Check LIM_IOS_INSTANCE_URL and LIM_IOS_INSTANCE_TOKEN, and that the instance is still running.`},e)}return{provider:`limrun`,service:`Limrun`,verificationMessage:`Existing ${i} instance access verified. A daemon started with these variables drives it without creating or deleting it.`,device:{status:`verified`,name:`Existing ${i} ${r?`emulator`:`simulator`}`,platform:e.platform},app:{status:`missing`,message:`Run open <bundle-or-package-id> to use an app installed on the instance.`}}}var pr=e({LIMRUN_PROFILE_FIELDS:()=>Te,LIMRUN_PROVIDER:()=>x,createLimrunRuntime:()=>ir,verifyLimrunConnection:()=>lr});export{je as _,$ as a,Fn as c,fn as d,pn as f,Oe as g,ke as h,nr as i,Pn as l,x as m,lr as n,Ln as o,Te as p,ir as r,Dn as s,pr as t,mn as u,S as v};
package/dist/src/src2.js CHANGED
@@ -1 +1 @@
1
- const e=Object.freeze({family:`apple`}),t=Object.freeze({...e,loadRuntime:async e=>{let{createApplePlatformRuntime:t}=await import(`./runtime4.js`);return t(e)}}),n=Object.freeze({...e,loadInventory:async e=>{let{createAppleInventorySource:t}=await import(`./inventory2.js`);return t(e)}});async function r(e){let{createAppleShutdownRuntime:t}=await import(`./runtime5.js`);return t(e)}const i={id:`apple`,platforms:[`apple`],familySelector:`apple`,providers:{platformGatedResolvers:[`appleRunnerProvider`,`appleToolProvider`]},createInteractor:async(e,t)=>{let{createAppleInteractor:n}=await import(`./interactor.js`);return n(e,t)}};export{t as i,n,r,i as t};
1
+ import{r as e}from"./rolldown-runtime.js";var t=e({AGENT_BROWSER_TIMEOUT_MS:()=>AGENT_BROWSER_TIMEOUT_MS,cleanupManagedAgentBrowserOrphans:()=>u,createAgentBrowserWebProvider:()=>o,doctorManagedAgentBrowser:()=>l,getManagedAgentBrowserStatus:()=>s,hasScopedWebProvider:()=>p,inventoryModule:()=>a,resolveWebProvider:()=>f,runtimeModule:()=>i,setupManagedAgentBrowser:()=>c,webBrowserLifecycleCheck:()=>d,withWebProvider:()=>m});function n(e){return(async(...t)=>await(await e())(...t))}const r=Object.freeze({family:`web`}),i=Object.freeze({...r,loadRuntime:async e=>{let{createWebPlatformRuntime:t}=await import(`./runtime9.js`);return t(e)}}),a=Object.freeze({...r,loadInventory:async()=>{let{createWebInventory:e}=await import(`./inventory6.js`);return e()}}),o=n(async()=>(await import(`./agent-browser-provider.js`)).createAgentBrowserWebProvider),s=n(async()=>(await import(`./agent-browser-tool.js`).then(e=>e.t)).getManagedAgentBrowserStatus),c=n(async()=>(await import(`./agent-browser-tool.js`).then(e=>e.t)).setupManagedAgentBrowser),l=n(async()=>(await import(`./agent-browser-tool.js`).then(e=>e.t)).doctorManagedAgentBrowser),u=n(async()=>(await import(`./agent-browser-lifecycle.js`).then(e=>e.t)).cleanupManagedAgentBrowserOrphans),d=n(async()=>(await import(`./doctor3.js`)).webBrowserLifecycleCheck),f=n(async()=>(await import(`./provider.js`)).resolveWebProvider),p=n(async()=>(await import(`./provider.js`)).hasScopedWebProvider);async function m(e,t){let{withWebProvider:n}=await import(`./provider.js`);return await n(e,t)}export{t as i,f as n,i as r,a as t};
package/dist/src/src3.js CHANGED
@@ -1 +1,2 @@
1
- import{r as e}from"./rolldown-runtime.js";var t=e({inventoryModule:()=>a,runtimeModule:()=>i,vegaPlugin:()=>o,vegaToolchainCheck:()=>s,withVegaToolProvider:()=>c});function n(e){return(async(...t)=>await(await e())(...t))}const r=Object.freeze({family:`vega`}),i=Object.freeze({...r,loadRuntime:async e=>{let{createVegaPlatformRuntime:t}=await import(`./runtime8.js`);return t(e)}}),a=Object.freeze({...r,loadInventory:async e=>{let{createVegaInventory:t}=await import(`./inventory5.js`);return t(e)}}),o={id:`vega`,platforms:[`vega`],providers:{platformGatedResolvers:[`vegaToolProvider`]},createInteractor:async(e,t)=>{let{createVegaInteractor:n}=await import(`./interactor2.js`);return n(e,t)}},s=n(async()=>(await import(`./doctor2.js`)).vegaToolchainCheck);async function c(e,t){let{withVegaToolProvider:n}=await import(`./tool-provider3.js`).then(e=>e.n);return await n(e,t)}export{o as i,i as n,t as r,a as t};
1
+ import{P as e}from"./sdk-contracts.js";import{N as t}from"./sdk-device.js";import{$t as n,Yt as r}from"./sdk-batch.js";import{t as i}from"./audio-probe-runtime.js";import{a,n as o,t as s}from"./durable-resource.js";import{n as c}from"./async-lifecycle.js";import{n as l,t as u}from"./audio-probe-result.js";import d from"node:fs/promises";function f(e,t){if(e.resourceKind!==t.resourceKind)return{status:`unreattachable`,reason:`descriptor-invalid`,message:`Durable resource kind ${e.resourceKind} does not match ${t.resourceKind}`};if(e.descriptor.version!==t.version)return{status:`unreattachable`,reason:`descriptor-version-unsupported`,message:`Unsupported ${t.resourceKind} descriptor version: ${e.descriptor.version}`,version:e.descriptor.version};try{let n=t.decode(e.descriptor.body);return n.status===`decoded`?n:{status:`unreattachable`,reason:`descriptor-invalid`,message:n.message}}catch(e){return{status:`unreattachable`,reason:`descriptor-invalid`,message:e instanceof Error?e.message:`Descriptor codec rejected the body`}}}function p(e,t){return Object.freeze({pendingHandle:new c(e),envelope:t})}function m(e){return Object.freeze({appLogReattach:async({envelope:t})=>{let n=f(t,e.codec);return n.status===`unreattachable`?n:await e.reattach(n.descriptor,h(t))},appLogCleanup:async({envelope:t})=>{let n=f(t,e.codec);return n.status===`decoded`?await e.cleanup(n.descriptor,h(t)):{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message}}})}function h(e){return Object.freeze({sessionId:e.sessionId,fence:e.fence})}function g(e){if(typeof e!=`object`||!e||Array.isArray(e))return{status:`invalid`,message:`App-log process marker must be an object`};let t=e;return!Number.isInteger(t.pid)||Number(t.pid)<=0?{status:`invalid`,message:`App-log process marker pid must be a positive integer`}:typeof t.startTime!=`string`||t.startTime.trim().length===0?{status:`invalid`,message:`App-log process marker startTime must be a non-empty string`}:typeof t.command!=`string`||t.command.trim().length===0?{status:`invalid`,message:`App-log process marker command must be a non-empty string`}:{status:`decoded`,marker:Object.freeze({pid:Number(t.pid),startTime:t.startTime,command:t.command})}}function _(e){let t,n,r,i=()=>n??=e.forceCleanup();return Object.freeze({inspect:()=>e.inspect(),finish:()=>t??=e.finish(),forceCleanup:i,[Symbol.asyncDispose]:async()=>{r??=i().then(ee),await r}})}function v(e){return _({inspect:e.inspect,finish:e.finish,forceCleanup:async()=>{let t=await e.finish();return t.status===`completed`?{status:`cleaned`}:{status:`cleanup-pending`,reason:t.reason,message:t.message}}})}function ee(t){if(!s(t))throw new e(`COMMAND_FAILED`,t.message??`Durable resource cleanup could not be confirmed`,{reason:t.reason,retriable:t.reason!==`ownership-fence-lost`,hint:t.reason===`ownership-fence-lost`?`Use the current resource owner or recovery record before retrying cleanup.`:`Keep the recovery record and retry cleanup through the exact runtime owner.`})}const te=e=>b(e.backend)&&(e.source===`system-audio`||e.source===`media-elements`)&&x(e.sourceCount,0)&&re(e.notes)&&b(e.statusPath)&&x(e.startedAt,1)&&x(e.durationMs,1)&&x(e.bucketMs,1),y=Object.freeze({resourceKind:i,version:1,encode:e=>({...e,notes:[...e.notes],marker:{...e.marker}}),decode:e=>{let t=te(e)?ne(e.marker):`invalid`;if(t===`invalid`)return{status:`invalid`,message:`Audio probe descriptor body is invalid`};let n=e;return{status:`decoded`,descriptor:Object.freeze({backend:n.backend,source:n.source,sourceCount:n.sourceCount,notes:Object.freeze([...n.notes]),statusPath:n.statusPath,startedAt:n.startedAt,durationMs:n.durationMs,bucketMs:n.bucketMs,marker:t})}}});function ne(e){if(typeof e!=`object`||!e)return`invalid`;let t=e;return!x(t.pid,1)||!b(t.startTime)||!b(t.command)?`invalid`:Object.freeze({pid:t.pid,startTime:t.startTime,command:t.command})}function b(e){return typeof e==`string`&&e.length>0}function x(e,t){return typeof e==`number`&&Number.isInteger(e)&&e>=t}function re(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}async function S(e){try{let t=await d.readFile(e.statusPath,`utf8`);return l(JSON.parse(t),{source:e.source,backend:e.backend,durationMs:e.durationMs,elapsedMs:Date.now()-e.startedAt,bucketMs:e.bucketMs,activeFallback:!0,sourceCount:e.sourceCount,notes:[...e.notes]})}catch(e){if(e.code===`ENOENT`)return;throw e}}function C(e,t,n){let r=Math.min(e.durationMs,Math.max(0,Date.now()-e.startedAt));return{...t??u({source:e.source,backend:e.backend,durationMs:e.durationMs,bucketMs:e.bucketMs,sourceCount:e.sourceCount,notes:[...e.notes]}),state:`stopped`,active:!1,elapsedMs:r,stoppedAt:new Date().toISOString(),reason:n}}function ie(e){let{host:t}=e;return Object.freeze({audioProbeReattach:async e=>{let n=f(e.envelope,y);if(n.status!==`decoded`)return n;let r=n.descriptor,i=await t.inspectProcess(r.marker);if(i===`owned-alive`)return{status:`unreattachable`,reason:`transport-not-reattachable`};if(i===`ownership-lost`)return{status:`unreattachable`,reason:`ownership-fence-lost`};let a=await S(r);return a===void 0||a.state!==`stopped`?{status:`missing`}:{status:`completed`,result:C(r,a,`daemon-recovery`)}},audioProbeCleanup:async e=>{let n=f(e.envelope,y);if(n.status!==`decoded`)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message};let r=n.descriptor,i=await t.inspectProcess(r.marker);if(i===`ownership-lost`)return{status:`cleanup-pending`,reason:`ownership-fence-lost`};if(i===`missing`)return{status:`already-missing`};let a=await t.terminateProcess(r.marker);return a===`ownership-lost`?{status:`cleanup-pending`,reason:`ownership-fence-lost`}:{status:a===`terminated`?`cleaned`:`already-missing`}}})}async function ae(n){let{host:r,device:s,owner:l,input:u}=n,f=Date.now(),p=r.info,m=Object.freeze([...p.notes(s)]),h=Object.freeze({source:p.source,backend:p.backend,sourceCount:p.sourceCount,notes:m,statusPath:u.statusPath,startedAt:f,durationMs:u.durationMs,bucketMs:u.bucketMs});await d.rm(u.statusPath,{force:!0});let g=await r.start({durationMs:u.durationMs,bucketMs:u.bucketMs,statusPath:u.statusPath});g.wait.catch(()=>{});let _=g.marker;try{if(_===void 0)throw new e(`COMMAND_FAILED`,`failed to start host audio probe: the helper process exposed no exact identity, so the capture could not be recovered after daemon loss and was terminated`);await ue(h,g)}catch(e){throw await g.terminate().catch(()=>{}),e}return Object.freeze({pendingHandle:new c(oe(h,g)),envelope:o({resourceKind:i,sessionId:u.sessionId,device:t(s),owner:l,fence:u.fence,lifecycle:`open`,descriptor:a(y,{backend:p.backend,source:p.source,sourceCount:p.sourceCount,notes:m,statusPath:u.statusPath,startedAt:f,durationMs:u.durationMs,bucketMs:u.bucketMs,marker:_})})})}function oe(e,t){let n,r,i,a;t.wait.then(e=>{a={message:se(e)}},e=>{a={message:e instanceof Error?e.message:`audio probe helper wait failed`}});let o=()=>n??=(async()=>{let n=await S(e);if(n?.state!==`stopped`&&a)throw w(a);return await t.terminate().catch(()=>{}),await t.wait.catch(()=>{}),{status:`completed`,result:C(e,n,`stopped`)}})(),s=()=>r??=n?n.then(async()=>({status:`cleaned`}),async()=>await T(t)):T(t);return Object.freeze({inspect:()=>e,status:async()=>{let t=await S(e);if(t?.state===`stopped`)return t;if(a)throw w(a);return t??C(e,void 0,`not-started`)},finish:o,forceCleanup:s,[Symbol.asyncDispose]:async()=>{i??=s().then(ce),await i}})}function se(e){return e.stderr?.trim()||e.stdout?.trim()||`audio probe helper exited with code ${e.exitCode??1}`}function w(t){return new e(`COMMAND_FAILED`,`host audio probe helper exited before completing the capture: ${t.message}`,{hint:`Keep audio-probe.resource.json; stop resolves the record through descriptor cleanup.`})}async function T(e){try{return await e.terminate(),await e.wait.catch(()=>{}),{status:`cleaned`}}catch(e){return{status:`cleanup-pending`,reason:`cleanup-unconfirmed`,message:e instanceof Error?e.message:`Audio probe termination failed`}}}function ce(t){if(!s(t))throw new e(`COMMAND_FAILED`,t.message??`Audio probe cleanup could not be confirmed`,{reason:t.reason,retriable:t.reason!==`ownership-fence-lost`,hint:`Keep audio-probe.resource.json and retry stop through its exact runtime owner.`})}function le(e){let{host:t,device:n,owner:r}=e,i=ie({host:t});return Object.freeze({audioProbeStart:async e=>await ae({host:t,device:n,owner:r,input:e}),audioProbeReattach:i.audioProbeReattach,audioProbeCleanup:i.audioProbeCleanup})}async function ue(t,n){let r=Date.now()+5e3;for(;Date.now()<r;){if(await S(t))return;let r=await Promise.race([n.wait.then(e=>e,e=>e),de(100).then(()=>void 0)]);if(r instanceof Error)throw r;if(r){let t=r,n=t.stderr?.trim()||t.stdout?.trim()||`host audio probe helper exited with code ${t.exitCode??1}`;throw new e(`COMMAND_FAILED`,`failed to start host audio probe: ${n}`)}}throw new e(`COMMAND_FAILED`,`failed to start host audio probe`)}function de(e){return new Promise(t=>setTimeout(t,e))}async function E(e,t){let n=await O(e,t);if(n.status===`missing`)return{status:`missing`};if(n.status===`invalid`)return{status:`unreattachable`,reason:`ownership-fence-lost`,message:n.message};let r=await e.processes.inspect(n.marker);return r===`missing`?(t&&await e.processes.clearMarker(t),{status:`missing`}):r===`ownership-lost`?{status:`unreattachable`,reason:`ownership-fence-lost`}:{status:`unreattachable`,reason:`transport-not-reattachable`}}async function D(e,t){if(!t)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:`App-log process marker path is missing`};let n=await O(e,t);if(n.status===`missing`)return{status:`already-missing`};if(n.status===`invalid`)return{status:`cleanup-pending`,reason:`manual-recovery-required`,message:n.message};let r=await e.processes.inspect(n.marker);if(r===`ownership-lost`)return k();if(r===`missing`)return await e.processes.clearMarker(t),{status:`already-missing`};let i=await e.processes.terminate(n.marker);return i===`ownership-lost`?k():(await e.processes.clearMarker(t),{status:i===`terminated`?`cleaned`:`already-missing`})}async function O(e,t){return t?await e.processes.readMarker(t):{status:`invalid`,message:`App-log process marker path is missing`}}function k(){return{status:`cleanup-pending`,reason:`ownership-fence-lost`}}async function fe(e){let t=e.initialProcess;for(;!e.stopped();){if(t){await pe(e,t),t=void 0,await be(e);continue}let n=await xe(e);if(n.status===`stopped`)return;n.status!==`waiting`&&(t=n.process)}}async function pe(e,t){let{process:n}=t;e.setActive(n);try{e.setState(`active`),await me(e,t)}finally{await A(e,n)}}async function me(e,t){let n=he(t.process);try{await ge(e,t,n),await ve(e,t.process,n),await ye(n.outcome)}finally{n.controller.abort()}}function he(e){let t=new AbortController,n=!1,r=()=>{n=!0,t.abort()};return{controller:t,outcome:e.wait.then(()=>(r(),{status:`exited`}),e=>(r(),{status:`failed`,error:e})),settled:()=>n}}async function ge(e,t,n){for(;!e.stopped()&&!n.settled();){if(!await _e(e,n))return;let r=await e.resolvePid();if(e.stopped())return;if(r!==t.pid){await t.process.terminate();return}}}async function _e(e,t){try{await e.sleep(500,t.controller.signal)}catch(e){if(!t.settled())throw e}return!t.settled()}async function ve(e,t,n){e.stopped()&&!n.settled()&&await t.terminate()}async function ye(e){let t=await e;if(t.status===`failed`)throw t.error}async function be(e){e.stopped()||(e.setState(`recovering`),await e.sleep(500))}async function xe(e){let t=await e.resolvePid();if(e.stopped())return{status:`stopped`};if(!t)return e.setState(`recovering`),await e.sleep(1e3),{status:`waiting`};let n=await e.startProcess(t);return e.setActive(n),e.stopped()?(await Se(e,n),{status:`stopped`}):{status:`started`,process:{pid:t,process:n}}}async function Se(e,t){try{await t.terminate(),await t.wait}finally{await A(e,t)}}async function A(e,t){try{await t[Symbol.asyncDispose]()}finally{e.setActive(void 0)}}async function Ce(e){let t=await e.resolvePid(e.setupSignal);e.setupSignal.throwIfAborted();let n=await e.host.outputs.openAppend(e.outputPath),r=`recovering`,i=!1,a;try{if(e.setupSignal.throwIfAborted(),t){e.setupSignal.throwIfAborted();let i=new AbortController,o=()=>i.abort(e.setupSignal.reason);e.setupSignal.addEventListener(`abort`,o,{once:!0});try{a=await e.processStart({command:e.command(t),output:n,markerPath:e.pidPath},i.signal)}finally{e.setupSignal.removeEventListener(`abort`,o)}e.setupSignal.throwIfAborted(),r=`active`}}catch(e){throw await j([async()=>await a?.terminate(),async()=>{await a?.wait},async()=>await a?.[Symbol.asyncDispose](),async()=>await n[Symbol.asyncDispose]()]),e}let o=fe({initialProcess:a&&t?{pid:t,process:a}:void 0,stopped:()=>i,setActive:e=>{a=e},setState:e=>{r=e},resolvePid:async()=>await e.resolvePid(),startProcess:async t=>await e.processStart({command:e.command(t),output:n,markerPath:e.pidPath}),sleep:async(t,n)=>await e.host.clock.sleep(t,n)}).catch(()=>{r=`failed`}),s,c=async()=>s??=we({options:e,monitor:o,active:()=>a,stop:()=>{i=!0},setState:e=>{r=e},output:n}),l=e.host.clock.now();return v({inspect:()=>({backend:e.backend,state:r,startedAt:l}),finish:c})}async function we(e){return e.stop(),(await j([async()=>await e.active()?.terminate(),async()=>await e.monitor,async()=>await e.output[Symbol.asyncDispose]()])).length>0?(e.setState(`failed`),{status:`cleanup-pending`,reason:`transport-failed`,message:e.options.cleanupFailureMessage}):(e.setState(`ended`),{status:`completed`,result:{backend:e.options.backend,outputPath:e.options.outputPath,completedAt:e.options.host.clock.now()}})}async function j(e){let t=[];for(let n of e)try{await n()}catch(e){t.push(e)}return t}function M(e,t,n){let r=e.artifacts.resolveSession(t);return n.outputPath===r.outputPath&&(n.pidPath===void 0||n.pidPath===r.pidPath)}function N(t,n){if(!M(t,n.sessionId,n))throw new e(`INVALID_ARGS`,`App-log paths do not match the owning session`)}const P=Object.freeze({available:!0});async function Te(e,t,n){let r=(await e.commands.run(t,n)).stdout.trim().split(/\s+/)[0]??``;return/^\d+$/.test(r)?r:``}function Ee(t,i){let a=r(i.family);return Object.freeze({owner:a,ownsDevice:e=>e.platform===i.family,inspectFacts:async e=>F(e,await t.processTransports.resolve(e),i),bind:async r=>{if(r.intent.kind===`exact-owner`&&!n(r.intent.owner,a))throw new e(`UNSUPPORTED_OPERATION`,`${i.label} app-log owner identity does not match`);if(r.device.platform!==i.family)throw new e(`UNSUPPORTED_PLATFORM`,`${i.label} app-log owner cannot bind ${r.device.platform}`);let o=await t.processTransports.resolve(r.device);return De(t,r.device,r.scope.signal,o,a,i)},shutdown:async()=>void 0})}function De(e,t,n,r,i,a){let o=m({codec:a.codec,reattach:async(t,n)=>M(e,n.sessionId,t)?await E(e,t.pidPath):{status:`unreattachable`,reason:`descriptor-invalid`,message:`${a.label} app-log descriptor paths do not match the owning session`},cleanup:async(t,n)=>M(e,n.sessionId,t)?await D(e,t.pidPath):{status:`cleanup-pending`,reason:`ownership-fence-lost`,message:`${a.label} app-log descriptor paths do not match the owning session`}}),s=Object.freeze({appLogInspect:async()=>({backend:a.backend}),appLogDoctor:async({appBundleId:r})=>await a.doctor({host:e,device:t,signal:n},r),...r.start?{appLogStart:async o=>await Oe(e,t,n,r,i,o,a)}:{},...o});return Object.freeze({device:t,owner:i,facts:F(t,r,a),operations:s,[Symbol.asyncDispose]:async()=>void 0})}function F(e,t,n){let r=t.start?P:{available:!1,reason:`owner-capability-missing`,hint:n.startUnavailableHint};return Object.freeze({device:{family:n.family,kind:e.kind,...e.target===void 0?{}:{target:e.target},providerMode:t.mode},operations:{appLogInspect:P,appLogDoctor:P,appLogStart:r,appLogReattach:P,appLogCleanup:P}})}async function Oe(t,n,r,i,a,o,s){if(!i.start)throw new e(`UNSUPPORTED_OPERATION`,s.startUnavailableHint);N(t,o);let c=t.artifacts.resolveSession(o.sessionId),l={host:t,device:n,signal:r,input:o,artifacts:c,transport:i};s.validateStart?.(l),r.throwIfAborted();let u=await s.process(l);r.throwIfAborted();let d=await Ce({host:t,backend:s.backend,outputPath:c.outputPath,pidPath:c.pidPath,processStart:i.start,setupSignal:r,resolvePid:u.resolvePid,command:u.command,cleanupFailureMessage:s.cleanupFailureMessage}),f=s.descriptor({artifacts:c,transport:i});return p(d,s.envelope({input:o,device:n,owner:a,descriptor:f}))}function I(e){for(let t of[/\bstatus(?:Code)?["'=: ]+([1-5]\d{2})\b/i,/\bresponse(?:\s+code)?["'=: ]+([1-5]\d{2})\b/i,/\bHTTP\/[0-9.]+\s+([1-5]\d{2})\b/i]){let n=t.exec(e);if(!n)continue;let r=Number.parseInt(n[1]??``,10);if(Number.isInteger(r))return r}return null}function L(e){return/\b\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z)?\b/.exec(e)?.[0]??/\b\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+\b/.exec(e)?.[0]}function ke(e){let t=e.indexOf(`{`),n=e.lastIndexOf(`}`);if(t<0||n<=t)return null;try{let r=JSON.parse(e.slice(t,n+1));return r&&typeof r==`object`&&!Array.isArray(r)?r:null}catch{return null}}function R(e,t){for(let n of t){let t=e?.[n];if(typeof t==`string`&&t.trim())return t.trim()}}function Ae(e,t){for(let n of t){let t=e?.[n];if(typeof t==`number`&&Number.isInteger(t))return t;if(typeof t==`string`&&/^\d{3}$/.test(t.trim()))return Number.parseInt(t,10)}return null}function je(e,t){let n=t?.headers??t?.requestHeaders??t?.responseHeaders;return n===void 0?/\bheaders?["'=: ]+(\{.*\})/i.exec(e)?.[1]?.trim():B(n)}function z(e,t,n){for(let r of n){if(t?.[r]!==void 0)return B(t[r]);let n=r.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`),i=RegExp(`\\b${n}["'=: ]+(.+)$`,`i`).exec(e);if(i?.[1])return i[1].trim()}}function B(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)}catch{return String(e)}}function Me(e,t,n){let r=U(t,n,5),i=e.packetId??r.map(V).find(e=>typeof e==`string`&&e.length>0);i&&(e.packetId=i);let a=i?U(t,n,12).filter(e=>V(e)===i):r;e.timestamp??=a.map(L).find(e=>typeof e==`string`&&e.length>0),e.status??=a.map(I).find(e=>typeof e==`number`)??void 0,e.durationMs??=a.map(H).find(e=>typeof e==`number`)??void 0}function V(e){return/\bpacket id (\d+)\b/i.exec(e)?.[1]??null}function H(e){let t=/\b(?:duration|elapsed request\/response time, ms)[:= ]+(\d+)\b/i.exec(e);return t?Number.parseInt(t[1]??``,10):null}function U(e,t,n){return e.slice(Math.max(0,t-n),Math.min(e.length,t+n+1)).map(e=>e.trim()).filter(Boolean)}const Ne=RegExp(`\\b(${[`GET`,`POST`,`PUT`,`PATCH`,`DELETE`,`HEAD`,`OPTIONS`].join(`|`)})\\b\\s+https?:\\/\\/`,`i`),Pe=/https?:\/\/[^\s"'<>\])]+/i,Fe=/\[C(\d+)\b[^\]]*?\burl:\s*([^\s,\]]+)/,W=/\bsummary for task (?:success|failure)\s*\{([^}]*)\}/,Ie=/\bTask\s+<([0-9A-Fa-f-]+)>\.<(\d+)>/,G=/(?:^|\s)(\S+)\[(\d+):[0-9a-f]+\]/,Le=/\burl:\s*(https?:\/\/[^\s,\]]+)/i;function Re(e,t,n=e.dump.limits.maxEntries){let r=[...e.dump.entries],i=new Set(r.map(K));for(let e of t.dump.entries){let t=K(e);if(!i.has(t)&&(i.add(t),r.push(e),r.length>=n))break}let a=new Set([...e.dump.entries,...t.dump.entries].map(e=>e.packetId).filter(e=>e!==void 0)),o=[...new Set([...e.unnamedRequestIds,...t.unnamedRequestIds])].filter(e=>!a.has(e));return Object.freeze({dump:Object.freeze({...e.dump,matchedLines:r.length,entries:Object.freeze(r),unnamedRequests:o.length}),unnamedRequestIds:Object.freeze(o)})}function ze(e,t){let n=J(t.maxEntries,25,1,200),r=t.include??`summary`,i=J(t.maxPayloadChars,2048,64,16384),a=J(t.maxScanLines,4e3,100,2e4),o=Ve(t.lineNumberOffset);if(!t.exists)return Object.freeze({dump:Object.freeze({path:t.path,exists:!1,scannedLines:0,matchedLines:0,entries:Object.freeze([]),unnamedRequests:0,include:r,limits:Object.freeze({maxEntries:n,maxPayloadChars:i,maxScanLines:a})}),unnamedRequestIds:Object.freeze([])});let s=e.split(`
2
+ `),c=Math.max(0,s.length-a),l=s.slice(c),u=[],d=Be(t.backend)?Qe(l):void 0,f=d?et(l,d):[];for(let e=l.length-1;e>=0&&u.length<n;--e){if(!l[e]?.trim())continue;let n=He(l,e,o+c+e+1,t.backend,r,i,d);n&&u.push(n)}return Object.freeze({dump:Object.freeze({path:t.path,exists:!0,scannedLines:l.length,matchedLines:u.length,entries:Object.freeze(u),unnamedRequests:f.length,include:r,limits:Object.freeze({maxEntries:n,maxPayloadChars:i,maxScanLines:a})}),unnamedRequestIds:Object.freeze(f)})}function Be(e){return e===`ios-simulator`||e===`ios-device`||e===`macos`}function Ve(e){if(e===void 0)return 0;if(!Number.isInteger(e)||e<0)throw TypeError(`Network line number offset must be a non-negative integer`);return e}function He(e,t,n,r,i,a,o){let s=e[t]?.trim();if(!s)return null;let c=ke(s),l=Ue(s,c)??(o?$e(s,o,t):null);if(!l)return null;let u=Je(s,n,l,a);return r===`android`&&Me(u,e,t),Ye(u,s,c,i,a),u}function Ue(e,t){let n=We(e,t),r=Ge(e,t);if(!r)return null;let i=Ke(e,t);return qe(e,n.explicit,i)?{method:n.value,url:r,status:i}:null}function We(e,t){let n=R(t,[`method`,`httpMethod`]),r=/\bmethod["'=: ]+([A-Z]+)\b/i.exec(e)?.[1],i=Ne.exec(e)?.[1],a=n??r??i;return{value:a?.toUpperCase(),explicit:!!a}}function Ge(e,t){return R(t,[`url`,`requestUrl`])||(Le.exec(e)?.[1]??Pe.exec(e)?.[0])}function Ke(e,t){return Ae(t,[`status`,`statusCode`,`responseCode`])??I(e)??void 0}function qe(e,t,n){return t||n!==void 0||/\bURL["'=: ]+https?:\/\//i.test(e)||/\bheaders?["'=: ]+/i.test(e)||/\b(?:requestBody|responseBody|payload|request|response)["'=: ]+/i.test(e)}function Je(e,t,n,r){return{...n,timestamp:L(e),packetId:n.packetId??V(e)??void 0,durationMs:n.durationMs??H(e)??void 0,raw:q(e,r),line:t}}function Ye(e,t,n,r,i){if(Xe(r)){let r=je(t,n);r&&(e.headers=q(r,i))}if(Ze(r)){let r=z(t,n,[`requestBody`,`body`,`payload`,`request`]),a=z(t,n,[`responseBody`,`response`]);r&&(e.requestBody=q(r,i)),a&&(e.responseBody=q(a,i))}}function Xe(e){return e===`headers`||e===`all`}function Ze(e){return e===`body`||e===`all`}function K(e){return`${e.timestamp??``}|${e.method??``}|${e.url}|${e.status??``}|${e.raw}`}function q(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}function J(e,t,n,r){return e===void 0||!Number.isInteger(e)?t:Math.max(n,Math.min(r,e))}function Qe(e){let t=new Map;for(let[n,r]of e.entries()){let e=Fe.exec(r);if(!e)continue;let i=Y(r,e[1]),a=i===void 0?void 0:nt(e[2]);if(!a||i===void 0)continue;let o=t.get(i);o?o.push({lineIndex:n,origin:a}):t.set(i,[{lineIndex:n,origin:a}])}return t}function Y(e,t){let n=G.exec(e);if(n)return`${n[1]}[${n[2]}]#${t}`}function $e(e,t,n){let r=W.exec(e);if(!r)return null;let i=Q(r[1]);if(i.get(`reused`)!==`1`)return null;let a=i.get(`connection`),o=a===void 0?void 0:Y(e,a),s=o===void 0?void 0:Z(t,o,n);return s?{url:s,status:rt(i.get(`response_status`)),durationMs:$(i.get(`transaction_duration_ms`)),pathUnavailable:!0,packetId:X(e)}:null}function et(e,t){let n=new Set;for(let[r,i]of e.entries()){let e=tt(i,t,r);e!==void 0&&n.add(e)}return[...n]}function tt(e,t,n){if(!e.includes(`summary for task`))return;let r=W.exec(e);if(!r)return;let i=Q(r[1]);if(i.get(`reused`)!==`1`)return;let a=i.get(`connection`),o=a===void 0?void 0:Y(e,a);if(!(o!==void 0&&Z(t,o,n)))return X(e)}function X(e){let t=Ie.exec(e);if(!t)return;let n=G.exec(e);return`${n?`${n[1]}[${n[2]}]`:``}#${t[1]}.${t[2]}`}function Z(e,t,n){let r=e.get(t);if(!r)return;let i;for(let e of r){if(e.lineIndex>n)break;i=e.origin}return i}function Q(e){let t=new Map;for(let n of e.split(`,`)){let e=n.indexOf(`=`);e!==-1&&t.set(n.slice(0,e).trim(),n.slice(e+1).trim())}return t}function nt(e){try{return new URL(e).origin}catch{return}}function rt(e){let t=$(e);return t!==void 0&&t>0?t:void 0}function $(e){if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}export{M as a,E as c,m as d,p as f,Te as i,le as l,f as m,ze as n,N as o,g as p,Ee as r,D as s,Re as t,v as u};
package/dist/src/store.js CHANGED
@@ -1 +1 @@
1
- import{J as e,P as t}from"./sdk-contracts.js";import{v as n}from"./sdk-batch-runner.js";import{j as r,o as i}from"./owner-identity.js";import{l as a}from"./exec.js";import{t as o}from"./file.js";import"./command.js";import"./process.js";import{n as s}from"./cli-config.js";import c from"node:crypto";import l from"node:fs";import u from"node:path";function d(e,n){let r=new Set(n);for(let n of e){let e=n.agentDevicePlugin.provider;if(r.has(e))throw new t(`INVALID_ARGS`,`Duplicate provider plugin: ${e}`);r.add(e)}}function f(e){let n;try{let t=u.join(e,`package.json`);n=JSON.parse(l.readFileSync(t,`utf8`))}catch(n){throw new t(`INVALID_ARGS`,`Cannot read plugin manifest: ${e}`,{},n)}let r=n?.agentDevicePlugin;if(typeof n?.name!=`string`||typeof n?.version!=`string`||!r||r.apiVersion!==1||typeof r.provider!=`string`||!/^[a-z][a-z0-9-]*$/.test(r.provider)||typeof r.entry!=`string`||!r.entry.startsWith(`./`))throw new t(`INVALID_ARGS`,`Package does not declare a compatible provider plugin`,{reason:`incompatible_plugin`,apiVersion:1,hint:`Install a plugin release supporting agentDevicePlugin.apiVersion 1.`});return p(e,r.entry),n}function p(e,n){try{let t=l.realpathSync(e),r=l.realpathSync(u.resolve(e,n));if(r.startsWith(`${t}${u.sep}`)&&l.statSync(r).isFile())return r}catch{}throw new t(`INVALID_ARGS`,`Plugin entry must be a readable file inside its package`,{directory:e,entry:n})}function m(e){let r=s(e);try{let e=JSON.parse(l.readFileSync(r,`utf8`));if(!n(e)||e.plugins!==void 0&&!n(e.plugins))throw new t(`INVALID_ARGS`,`Plugin config must contain an object`);return e}catch(e){if(e.code===`ENOENT`)return{};throw e instanceof SyntaxError?new t(`INVALID_ARGS`,`Invalid plugin JSON: ${r}`,{},e):e}}function h(e,r){if(!S(e)||!n(r)||typeof r.installation!=`string`||!/^[a-f0-9-]{36}$/.test(r.installation)||r.version!==void 0&&!C(r.version)||r.options!==void 0&&!n(r.options))throw new t(`INVALID_ARGS`,`Invalid plugin selection: ${e}`)}function g(e){let t=u.dirname(s(e));return Object.entries(m(e).plugins??{}).map(([e,n])=>_(t,e,n))}function _(e,n,r){h(n,r);let i=u.join(e,`plugins`,r.installation,`node_modules`,n),a=f(i);if(a.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{...a,directory:i,selection:r}}function v(t){let n=u.dirname(s(t));return Object.entries(m(t).plugins??{}).map(([t,r])=>{try{let e=_(n,t,r);return{name:t,version:e.version,provider:e.agentDevicePlugin.provider,compatible:!0}}catch(n){return{name:t,compatible:!1,error:e(n)}}})}function y(e,n){if(e===`remove`)return{name:n,version:void 0};let r=/^(@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)(?:@(.+))?$/.exec(n);if(!r||!r[1]||r[2]!==void 0&&!C(r[2]))throw new t(`INVALID_ARGS`,`Expected an npm package name, optionally followed by @version or @tag`);if(e===`update`&&r[2]!==void 0)throw new t(`INVALID_ARGS`,`update accepts a package name without a version`);return{name:r[1],version:r[2]}}async function b(e,n,r,i){let o=c.randomUUID(),s=u.join(e,`plugins`,o);l.mkdirSync(s,{recursive:!0,mode:448});try{l.writeFileSync(u.join(s,`package.json`),JSON.stringify({private:!0,dependencies:{[n]:r??`latest`}})),await a(`npm`,[`install`,`--ignore-scripts`,`--no-audit`,`--no-fund`,`--global=false`,`--prefix`,s,`--workspaces=false`,`--package-lock=true`],{cwd:s,env:i,timeoutMs:12e4});let e=f(u.join(s,`node_modules`,n));if(e.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{installation:o,project:s,manifest:e}}catch(e){throw l.rmSync(s,{recursive:!0,force:!0}),e}}async function x(e,a,c=process.env,f=[]){let{name:p,version:h}=y(e,a),g=s(c),v=u.dirname(g);l.mkdirSync(v,{recursive:!0,mode:448});let x=await o({lockDirPath:u.join(v,`plugins.lock`),owner:{...i(),acquiredAtMs:Date.now()},description:`plugin installation`}),S;try{let i=m(c),a={...i.plugins},o=Object.hasOwn(a,p)?a[p]:void 0;if(e!==`add`&&!Object.hasOwn(a,p))throw new t(`INVALID_ARGS`,`Plugin is not installed: ${p}`);if(e===`remove`)delete a[p];else{let t=e===`update`&&C(o?.version)?o.version:h;S=await b(v,p,t,c),d([...Object.entries(a).filter(([e])=>e!==p).flatMap(([e,t])=>{try{return[_(v,e,t)]}catch{return[]}}),S.manifest],f),a[p]={installation:S.installation,version:t,...n(o?.options)?{options:o.options}:{}}}r({destination:g,contents:`${JSON.stringify({...i,plugins:a},null,2)}\n`,mode:384})}catch(e){throw S&&l.rmSync(S.project,{recursive:!0,force:!0}),e}finally{await x()}}function S(e){return/^(@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(e)}function C(e){return typeof e==`string`&&/^[a-zA-Z0-9*^~<>=| .+-]+$/.test(e)&&e.trim().length>0}export{p as a,d as i,g as n,v as r,x as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,Y as n}from"./sdk-contracts.js";import{v as r}from"./sdk-batch-runner.js";import{I as i,d as a,t as o,z as s}from"./file.js";import{l as c}from"./exec.js";import"./command.js";import"./process.js";import l from"node:crypto";import u from"node:fs";import d from"node:path";const f={browserStack:`browserstack`,awsDeviceFarm:`aws-device-farm`},p={username:`BROWSERSTACK_USERNAME`,accessKey:`BROWSERSTACK_ACCESS_KEY`},m={leaseKind:`direct-device-provider`,requiresAppAttachment:!1,requiresRemoteDaemon:!1,supportsArtifacts:!0,supportsDeferredAppSelection:!1,supportsDirectPortReverse:!1,usesCloudWebDriverLease:!0},h=Object.freeze([{provider:f.browserStack,connection:m,credentialVariables:Object.values(p)},{provider:f.awsDeviceFarm,connection:{...m,requiresAppAttachment:!0}}]);function g(e){return h.find(t=>t.provider===e)}function _(e,t){if(e.slice(0,t.length).toLowerCase()===t)return`${t}${e.slice(t.length)}`}function v(e){return _(e,`bs://`)}function y(e){return/^bs:\/\/[\w.-]+$/.test(e)}var b=e({RESERVED_PLUGIN_PROVIDERS:()=>x,assertUniquePluginProviders:()=>S,readPluginManifest:()=>C,resolvePluginEntry:()=>E});const x=[`cloud`,`proxy`,...Object.values(f),`limrun`];function S(e,n){let r=new Set(n);for(let n of e){let e=n.agentDevicePlugin.provider;if(r.has(e))throw new t(`INVALID_ARGS`,`Duplicate provider plugin: ${e}`);r.add(e)}}function C(e){let n;try{let t=d.join(e,`package.json`);n=JSON.parse(u.readFileSync(t,`utf8`))}catch(n){throw new t(`INVALID_ARGS`,`Cannot read plugin manifest: ${e}`,{},n)}let r=n?.agentDevicePlugin;if(typeof n?.name!=`string`||typeof n?.version!=`string`||!r||r.apiVersion!==1||typeof r.provider!=`string`||!/^[a-z][a-z0-9-]*$/.test(r.provider)||typeof r.entry!=`string`||!r.entry.startsWith(`./`))throw new t(`INVALID_ARGS`,`Package does not declare a compatible provider plugin`,{reason:`incompatible_plugin`,apiVersion:1,hint:`Install a plugin release supporting agentDevicePlugin.apiVersion 1.`});return E(e,r.entry),w(r.connection),T(r.credentialVariables),n}function w(e){if(e!==void 0&&(!e||typeof e!=`object`||e.leaseKind!==`direct-device-provider`||[`requiresAppAttachment`,`requiresRemoteDaemon`,`supportsArtifacts`,`supportsDeferredAppSelection`,`supportsDirectPortReverse`,`usesCloudWebDriverLease`].some(t=>typeof e[t]!=`boolean`)||e.requiresRemoteDaemon))throw new t(`INVALID_ARGS`,`Plugin connection must declare local provider capabilities`)}function T(e){if(e!==void 0&&(!Array.isArray(e)||!e.every(e=>typeof e==`string`&&/^[A-Z_][A-Z0-9_]*$/.test(e))))throw new t(`INVALID_ARGS`,`Plugin credentialVariables must list environment variable names`)}function E(e,n){try{let t=u.realpathSync(e),r=u.realpathSync(d.resolve(e,n));if(r.startsWith(`${t}${d.sep}`)&&u.statSync(r).isFile())return r}catch{}throw new t(`INVALID_ARGS`,`Plugin entry must be a readable file inside its package`,{directory:e,entry:n})}function D(e){let n=i(e);try{let e=JSON.parse(u.readFileSync(n,`utf8`));if(!r(e)||e.plugins!==void 0&&!r(e.plugins))throw new t(`INVALID_ARGS`,`Plugin config must contain an object`);return e}catch(e){if(e.code===`ENOENT`)return{};throw e instanceof SyntaxError?new t(`INVALID_ARGS`,`Invalid plugin JSON: ${n}`,{},e):e}}function O(e,n){if(!F(e)||!r(n)||typeof n.installation!=`string`||!/^[a-f0-9-]{36}$/.test(n.installation)||n.version!==void 0&&!I(n.version)||n.options!==void 0&&!r(n.options))throw new t(`INVALID_ARGS`,`Invalid plugin selection: ${e}`)}function k(e){let t=d.dirname(i(e));return Object.entries(D(e).plugins??{}).map(([e,n])=>A(t,e,n))}function A(e,n,r){O(n,r);let i=d.join(e,`plugins`,r.installation,`node_modules`,n),a=C(i);if(a.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{...a,directory:i,selection:r}}function j(e){let t=d.dirname(i(e));return Object.entries(D(e).plugins??{}).map(([e,r])=>{try{let n=A(t,e,r);return{name:e,version:n.version,provider:n.agentDevicePlugin.provider,compatible:!0}}catch(t){return{name:e,compatible:!1,error:n(t)}}})}function M(e,n){if(e===`remove`)return{name:n,version:void 0};let r=/^(@[a-z0-9][a-z0-9._-]*\/[a-z0-9][a-z0-9._-]*|[a-z0-9][a-z0-9._-]*)(?:@(.+))?$/.exec(n);if(!r||!r[1]||r[2]!==void 0&&!I(r[2]))throw new t(`INVALID_ARGS`,`Expected an npm package name, optionally followed by @version or @tag`);if(e===`update`&&r[2]!==void 0)throw new t(`INVALID_ARGS`,`update accepts a package name without a version`);return{name:r[1],version:r[2]}}async function N(e,n,r,i){let a=l.randomUUID(),o=d.join(e,`plugins`,a);u.mkdirSync(o,{recursive:!0,mode:448});try{u.writeFileSync(d.join(o,`package.json`),JSON.stringify({private:!0,dependencies:{[n]:r??`latest`}})),await c(`npm`,[`install`,`--ignore-scripts`,`--no-audit`,`--no-fund`,`--global=false`,`--prefix`,o,`--workspaces=false`,`--package-lock=true`],{cwd:o,env:i,timeoutMs:12e4});let e=C(d.join(o,`node_modules`,n));if(e.name!==n)throw new t(`INVALID_ARGS`,`Plugin package identity mismatch: ${n}`);return{installation:a,project:o,manifest:e}}catch(e){throw u.rmSync(o,{recursive:!0,force:!0}),e}}async function P(e,n,c=process.env,l=x){let{name:f,version:p}=M(e,n),m=i(c),h=d.dirname(m);u.mkdirSync(h,{recursive:!0,mode:448});let g=await o({lockDirPath:d.join(h,`plugins.lock`),owner:{...a(),acquiredAtMs:Date.now()},description:`plugin installation`}),_;try{let n=D(c),i={...n.plugins},a=Object.hasOwn(i,f)?i[f]:void 0;if(e!==`add`&&!Object.hasOwn(i,f))throw new t(`INVALID_ARGS`,`Plugin is not installed: ${f}`);if(e===`remove`)delete i[f];else{let t=e===`update`&&I(a?.version)?a.version:p;_=await N(h,f,t,c),S([...Object.entries(i).filter(([e])=>e!==f).flatMap(([e,t])=>{try{return[A(h,e,t)]}catch{return[]}}),_.manifest],l),i[f]={installation:_.installation,version:t,...r(a?.options)?{options:a.options}:{}}}s({destination:m,contents:`${JSON.stringify({...n,plugins:i},null,2)}\n`,mode:384})}catch(e){throw _&&u.rmSync(_.project,{recursive:!0,force:!0}),e}finally{await g()}}function F(e){return/^(@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(e)}function I(e){return typeof e==`string`&&/^[a-zA-Z0-9*^~<>=| .+-]+$/.test(e)&&e.trim().length>0}export{S as a,p as c,g as d,y as f,x as i,f as l,k as n,b as o,j as r,E as s,P as t,v as u};
@@ -1 +1 @@
1
- import{n as e}from"./snapshot-desktop-projection.js";async function t(t,n){let{snapshotLinux:r}=await import(`./snapshot3.js`),i=await r(t?.surface,n);return e({nodes:i.nodes,truncated:i.truncated,backend:`linux-atspi`,producer:`linux-atspi`},t??{})}export{t as captureLinuxSurfaceSnapshot};
1
+ import{n as e}from"./snapshot-desktop-projection.js";async function t(t,n){let{snapshotLinux:r}=await import(`./snapshot2.js`),i=await r(t?.surface,n);return e({nodes:i.nodes,truncated:i.truncated,backend:`linux-atspi`,producer:`linux-atspi`},t??{})}export{t as captureLinuxSurfaceSnapshot};
@@ -0,0 +1 @@
1
+ import{Gn as e,Kn as t,qn as n}from"./sdk-batch.js";function r(e){let t=new Map;for(let n of e)t.set(n.index,n);return t}function i(e,t,r){let i=[],a=new Set([e.index]),o=e;for(;i.length<r;){if(typeof o.parentIndex!=`number`)return{chain:i,broken:!1};let e=t.get(o.parentIndex);if(!e||a.has(e.index))return{chain:i,broken:!0};a.add(e.index);let r=n(e);i.push({role:r.role,...r.label===void 0?{}:{label:r.label}}),o=e}return{chain:i,broken:!1}}function a(r,a,o,s){return r.filter(r=>{if(!t(n(r),o))return!1;let c=i(r,a,Math.max(s.length,1));return!c.broken&&e(c.chain,s)})}export{r as n,a as r,i as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{Hn as t,Jn as n,Qn as r,Xn as i,ar as a,qn as o,rr as s}from"./sdk-batch.js";import{F as c,N as l,P as u,T as d,k as f,n as p}from"./runtime.js";import{i as m}from"./rect-center.js";import{n as h}from"./ios-system-surface.js";import{s as g}from"./tree.js";import{t as _}from"./ios-target-activation.js";function v(e){return e.matchedRefs.length===0?{path:2,outcome:`unverifiable`,reason:`selector-miss`}:e.identitySetRefs.length===0?{path:3,outcome:`unverifiable`,reason:`identity-set-empty`}:e.identitySetRefs.length===1?e.identitySetRefs[0]===e.winnerRef?{path:4,outcome:`verified`}:{path:5,outcome:`unverifiable`,reason:`unique-but-wrong`}:e.siblingMatchRefs.length===1?e.siblingMatchRefs[0]===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:e.regionMemberRefs!==void 0&&e.regionMemberRefs.length>0&&e.viewportCandidateRef!==void 0?e.viewportCandidateRef===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:{path:6,outcome:`unverifiable`,reason:`no-signal-isolation`}}function y(t,n={}){let r=n.plural===!0?`do`:`does`;return{resolveInput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not resolve input artifacts`)},reserveOutput:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not reserve output artifacts`)},createTempFile:async()=>{throw new e(`UNSUPPORTED_OPERATION`,`${t} ${r} not create temporary files`)}}}function b(e,t={}){return{artifacts:y(e,t),policy:d()}}function x(e,t){return e===void 0?t:(e.targetActivation??=t.targetActivation,e.postGestureOutcome??=t.postGestureOutcome,t)}function S(e,t){let n=t?.iosSystemSurfaceBundleId?h(t.iosSystemSurfaceBundleId):p(t);return n?E(e,n,`warning`):e}function C(e,t,n,r){if(!n)return e;let i=E(e,r(n),`warnings`);return i.ok?{...i,data:{...i.data,[t]:n}}:{...i,error:{...i.error,details:{...i.error.details,[t]:n}}}}function w(e,t){return C(e,`targetActivation`,t?.targetActivation,_)}function T(e){let{response:t,consumedTree:n,captureProof:r}=e;return w(C(S(t,n),`postGestureOutcome`,n?.postGestureOutcome,f),r)}function E(e,t,n){if(D(e,t))return e;if(!e.ok){let n=e.error.hint??e.error.details?.hint;return{...e,error:{...e.error,hint:O(n,t)}}}return n===`warnings`?{...e,data:{...e.data,warnings:[...k(e.data?.warnings),t]}}:{...e,data:{...e.data,warning:O(e.data?.warning,t)}}}function D(e,t){return(e.ok?[e.data?.warning,...k(e.data?.warnings)]:[e.error.hint]).some(e=>typeof e==`string`&&e.includes(t))}function O(e,t){return typeof e==`string`&&e.trim()!==``?`${e}\n${t}`:t}function k(e){return Array.isArray(e)?e.filter(e=>e!==void 0):[]}function A(e,n={}){let r=n.mode??`action`,{node:i,preActionNodes:a}=e;if(typeof i.index!=`number`)return;let o=u(a),s=t(P(i),a);if(r===`landmark`&&s.id===void 0&&s.label===void 0)return;let c=l(i,o,8),d=c.chain,f=F(a,i),p=I(i,o),m=R(i),h=+(d.length>0),g=e=>{let t=d.slice(0,e),n=z({nodes:a,byIndex:o,node:i,identity:s,ancestry:t,sibling:f,scrollRegion:p});return{candidate:{...s,ancestry:t,sibling:f,viewportOrder:n.viewportOrder,...p?{scrollRegion:p}:{},...m?{rect:m}:{},verification:`verified`},domain:n}};for(let e=d.length;e>=h;--e){let{candidate:t,domain:n}=g(e);if(M(t))return t.verification=j({node:i,domain:n,mode:r,brokenWalk:c.broken}),t;if(e===h)return N(t)}}function j(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:V({node:e.node,domain:e.domain})}function M(e){return a(s({...e,verification:`unverifiable`}))<=r}function N(e){return e.verification=`unverifiable`,a(s(e))>4096&&delete e.rect,e}const P=n;function F(e,t){return i(e,t)}function I(e,t){let n=g(e,t);if(!n)return;let r=P(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function L(e,t){return!e&&!t?!0:!e||!t?!1:o(e,t)}function R(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function z(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,l=c(t,n,i,a),u=l.filter(e=>F(t,e)===o),d=l.length>0?l.filter(e=>L(I(e,n),s)):void 0,f=d?B(d):[];return{identitySet:l,siblingMatches:u,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function B(e){return e.map((e,t)=>({node:e,documentOrder:t,center:m(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function V(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return v({winnerRef:r,matchedRefs:i,identitySetRefs:i,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{B as a,T as c,v as d,A as i,w as l,I as n,L as o,F as r,x as s,P as t,b as u};
1
+ import{Kn as e,Vn as t,Yn as n,Zn as r,ir as i,nr as a,qn as o}from"./sdk-batch.js";import{n as s,r as c,t as l}from"./target-evidence-tree.js";import{i as u}from"./rect-center.js";import{s as d}from"./tree.js";function f(e){return e.matchedRefs.length===0?{path:2,outcome:`unverifiable`,reason:`selector-miss`}:e.identitySetRefs.length===0?{path:3,outcome:`unverifiable`,reason:`identity-set-empty`}:e.identitySetRefs.length===1?e.identitySetRefs[0]===e.winnerRef?{path:4,outcome:`verified`}:{path:5,outcome:`unverifiable`,reason:`unique-but-wrong`}:e.siblingMatchRefs.length===1?e.siblingMatchRefs[0]===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:e.regionMemberRefs!==void 0&&e.regionMemberRefs.length>0&&e.viewportCandidateRef!==void 0?e.viewportCandidateRef===e.winnerRef?{path:6,outcome:`verified`}:{path:6,outcome:`unverifiable`,reason:`signal-isolated-wrong`}:{path:6,outcome:`unverifiable`,reason:`no-signal-isolation`}}function p(e,n={}){let r=n.mode??`action`,{node:i,preActionNodes:a}=e;if(typeof i.index!=`number`)return;let o=s(a),c=t(_(i),a);if(r===`landmark`&&c.id===void 0&&c.label===void 0)return;let u=l(i,o,8),d=u.chain,f=v(a,i),p=y(i,o),b=x(i),C=+(d.length>0),w=e=>{let t=d.slice(0,e),n=S({nodes:a,byIndex:o,node:i,identity:c,ancestry:t,sibling:f,scrollRegion:p});return{candidate:{...c,ancestry:t,sibling:f,viewportOrder:n.viewportOrder,...p?{scrollRegion:p}:{},...b?{rect:b}:{},verification:`verified`},domain:n}};for(let e=d.length;e>=C;--e){let{candidate:t,domain:n}=w(e);if(h(t))return t.verification=m({node:i,domain:n,mode:r,brokenWalk:u.broken}),t;if(e===C)return g(t)}}function m(e){return e.brokenWalk?`unverifiable`:e.mode===`landmark`?`verified`:w({node:e.node,domain:e.domain})}function h(e){return i(a({...e,verification:`unverifiable`}))<=r}function g(e){return e.verification=`unverifiable`,i(a(e))>4096&&delete e.rect,e}const _=o;function v(e,t){return n(e,t)}function y(e,t){let n=d(e,t);if(!n)return;let r=_(n);return{role:r.role,...r.id===void 0?r.label===void 0?{}:{label:r.label}:{id:r.id}}}function b(t,n){return!t&&!n?!0:!t||!n?!1:e(t,n)}function x(e){let t=e.rect;if(t)return{x:t.x,y:t.y,width:t.width,height:t.height}}function S(e){let{nodes:t,byIndex:n,node:r,identity:i,ancestry:a,sibling:o,scrollRegion:s}=e,l=c(t,n,i,a),u=l.filter(e=>v(t,e)===o),d=l.length>0?l.filter(e=>b(y(e,n),s)):void 0,f=d?C(d):[];return{identitySet:l,siblingMatches:u,regionMembers:d,orderedRegion:f,viewportOrder:Math.max(f.findIndex(e=>e.index===r.index),0)}}function C(e){return e.map((e,t)=>({node:e,documentOrder:t,center:u(e.rect)})).sort((e,t)=>!e.center&&!t.center?e.documentOrder-t.documentOrder:e.center?t.center?e.center.y===t.center.y?e.center.x===t.center.x?e.documentOrder-t.documentOrder:e.center.x-t.center.x:e.center.y-t.center.y:-1:1).map(e=>e.node)}function w(e){let{node:t,domain:n}=e,r=t.ref,i=n.identitySet.map(e=>e.ref);return f({winnerRef:r,matchedRefs:i,identitySetRefs:i,siblingMatchRefs:n.siblingMatches.map(e=>e.ref),regionMemberRefs:n.regionMembers?.map(e=>e.ref),viewportCandidateRef:n.orderedRegion[n.viewportOrder]?.ref}).outcome}export{C as a,p as i,y as n,b as o,v as r,f as s,_ as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{$r as t,Yr as n,qr as r}from"./sdk-batch.js";import{n as i,r as a}from"./snapshot.js";function o(t,n,r,i){return new e(`COMMAND_FAILED`,`fill tapped (${t}, ${n}) but ${r}`,{reason:`text_entry_focus_not_observed`,x:t,y:n,...i,hint:`The tap most likely missed the field. Re-check the target with snapshot -i and fill the element it reports, rather than retrying the same coordinates.`})}function s(e){let t=[];for(let r of p(e)){let e=a(r);n(e)&&t.push({node:r,identity:m(r),rect:e})}return t}function c(e){let t=new Map;for(let n of e)t.set(n.identity,(t.get(n.identity)??0)+1);return t}function l(e){let n=s(e),r=c(n),i=null,a=1/0;for(let e of n){if(!e.node.traits?.includes(`IsEditing`))continue;let n=t(e.rect);n>=a||(i=r.get(e.identity)===1?{identity:e.identity,rect:e.rect}:{rect:e.rect},a=n)}return i}function u(e,t,n){let i=s(e),a=c(i),o=new Set;for(let e of i)a.get(e.identity)===1&&r(e.rect,t,n)&&o.add(e.identity);return o}async function d(e){let t=Date.now()+(e.timeoutMs??3e3),n=0,r=!1;for(;;){let i=await e.readFocus();if(n+=1,i&&(r=!0,f(i,e.targetsAtPoint,e.x,e.y)))return`focused-element`;if(Date.now()>=t)break;await e.sleep(150)}throw o(e.x,e.y,`nothing there took text-entry focus, so the text was not sent`,{samples:n,editingElementObserved:r})}function f(e,t,n,i){return r(e.rect,n,i)?!0:e.identity!==void 0&&t.has(e.identity)}function p(e){let t=[],n=e=>{t.push(e);for(let t of i(e))n(t)};for(let t of Array.isArray(e)?e:[e])n(t);return t}function m(e){return[e.pid??``,e.type??e.elementType??``,e.AXUniqueId??e.identifier??``,e.AXLabel??e.label??``].join(`\0`)}export{d as awaitLimrunTextEntryFocus,l as readLimrunTextEntryFocus,u as readLimrunUnambiguousTapTargets};
1
+ import{P as e}from"./sdk-contracts.js";import{Jr as t,Kr as n,Qr as r}from"./sdk-batch.js";import{c as i,l as a}from"./src.js";function o(t,n,r,i){return new e(`COMMAND_FAILED`,`fill tapped (${t}, ${n}) but ${r}`,{reason:`text_entry_focus_not_observed`,x:t,y:n,...i,hint:`The tap most likely missed the field. Re-check the target with snapshot -i and fill the element it reports, rather than retrying the same coordinates.`})}function s(e){let n=[];for(let r of p(e)){let e=a(r);t(e)&&n.push({node:r,identity:m(r),rect:e})}return n}function c(e){let t=new Map;for(let n of e)t.set(n.identity,(t.get(n.identity)??0)+1);return t}function l(e){let t=s(e),n=c(t),i=null,a=1/0;for(let e of t){if(!e.node.traits?.includes(`IsEditing`))continue;let t=r(e.rect);t>=a||(i=n.get(e.identity)===1?{identity:e.identity,rect:e.rect}:{rect:e.rect},a=t)}return i}function u(e,t,r){let i=s(e),a=c(i),o=new Set;for(let e of i)a.get(e.identity)===1&&n(e.rect,t,r)&&o.add(e.identity);return o}async function d(e){let t=Date.now()+(e.timeoutMs??3e3),n=0,r=!1;for(;;){let i=await e.readFocus();if(n+=1,i&&(r=!0,f(i,e.targetsAtPoint,e.x,e.y)))return`focused-element`;if(Date.now()>=t)break;await e.sleep(150)}throw o(e.x,e.y,`nothing there took text-entry focus, so the text was not sent`,{samples:n,editingElementObserved:r})}function f(e,t,r,i){return n(e.rect,r,i)?!0:e.identity!==void 0&&t.has(e.identity)}function p(e){let t=[],n=e=>{t.push(e);for(let t of i(e))n(t)};for(let t of Array.isArray(e)?e:[e])n(t);return t}function m(e){return[e.pid??``,e.type??e.elementType??``,e.AXUniqueId??e.identifier??``,e.AXLabel??e.label??``].join(`\0`)}export{d as awaitLimrunTextEntryFocus,l as readLimrunTextEntryFocus,u as readLimrunUnambiguousTapTargets};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import"./diagnostics2.js";import{l as r}from"./owner-identity.js";import{g as i,l as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./command.js";import"./process.js";import"./retry.js";import{t as s}from"./scoped-provider.js";var c=e({createLocalLinuxToolProvider:()=>d,resolveLinuxToolProvider:()=>f,runLinuxToolCommand:()=>m,withLinuxToolProvider:()=>p});const l={runCommand:a,whichCommand:i,desktop:h(a,i),clipboard:g(a,i),screenshot:_(a,i)},u=s(l,d);function d(e={}){let t={...l,...e};return{...t,desktop:e.desktop??h(t.runCommand,t.whichCommand),clipboard:e.clipboard??g(t.runCommand,t.whichCommand),screenshot:e.screenshot??_(t.runCommand,t.whichCommand)}}function f(e){return u.resolve(e)}async function p(e,t){return await u.run(e,t)}async function m(e,t,n){return await f().runCommand(e,t,n)}function h(e,t){return{async openTarget(r){if(r.includes(`://`)||r.startsWith(`/`)){await e(`xdg-open`,[r]);return}if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{n({level:`warn`,phase:`linux_app_launch`,data:{app:r,error:String(e)}})}),await o(500);return}await e(`xdg-open`,[r],{allowFailure:!0})},async closeApp(n){if(await t(`wmctrl`)){await e(`wmctrl`,[`-c`,n],{allowFailure:!0});return}await e(`pkill`,[`-x`,n],{allowFailure:!0})}}}function g(e,t){return{async readText(){let n=await w(t,y),r=x[n];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(n){let r=await w(t,y),i=S[r](n);await e(i.cmd,i.args,i.options)}}}function _(e,t){return{async capture(n){let r=await w(t,b),i=C[r](n);await e(i.cmd,i.args,i.options)}}}const v=5e3,y={wayland:[{tool:`wl-clipboard`,command:`wl-paste`}],x11:[{tool:`xclip`,command:`xclip`},{tool:`xsel`,command:`xsel`}],waylandError:`wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.`,x11Error:`xclip or xsel is required for clipboard access on X11. Install via your package manager.`},b={wayland:[{tool:`grim`,command:`grim`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],x11:[{tool:`scrot`,command:`scrot`},{tool:`import`,command:`import`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],waylandError:`grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.`,x11Error:`scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager.`},x={"wl-clipboard":{cmd:`wl-paste`,args:[`--no-newline`],options:{allowFailure:!0,timeoutMs:v}},xclip:{cmd:`xclip`,args:[`-selection`,`clipboard`,`-o`],options:{allowFailure:!0,timeoutMs:v}},xsel:{cmd:`xsel`,args:[`--clipboard`,`--output`],options:{allowFailure:!0,timeoutMs:v}}},S={"wl-clipboard":e=>({cmd:`wl-copy`,args:[`--`,e],options:{allowFailure:!1,timeoutMs:v}}),xclip:e=>({cmd:`xclip`,args:[`-selection`,`clipboard`],options:{allowFailure:!1,timeoutMs:v,stdin:e}}),xsel:e=>({cmd:`xsel`,args:[`--clipboard`,`--input`],options:{allowFailure:!1,timeoutMs:v,stdin:e}})},C={grim:e=>({cmd:`grim`,args:[e]}),scrot:e=>({cmd:`scrot`,args:[e]}),import:e=>({cmd:`import`,args:[`-window`,`root`,e]}),"gnome-screenshot":e=>({cmd:`gnome-screenshot`,args:[`-f`,e]})};async function w(e,n){let r=T()?`wayland`:`x11`;for(let t of n[r])if(await e(t.command))return t.tool;throw new t(`TOOL_MISSING`,r===`wayland`?n.waylandError:n.x11Error)}function T(){let e=r();return!!e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`}export{m as n,c as r,f as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t}from"./sdk-contracts.js";import{r as n}from"./diagnostics.js";import"./diagnostics2.js";import{m as r}from"./file.js";import{g as i,l as a}from"./exec.js";import{i as o}from"./retry.js";import"./command.js";import"./process.js";import"./retry2.js";import{t as s}from"./scoped-provider.js";var c=e({createLocalLinuxToolProvider:()=>d,resolveLinuxToolProvider:()=>f,runLinuxToolCommand:()=>m,withLinuxToolProvider:()=>p});const l={runCommand:a,whichCommand:i,desktop:h(a,i),clipboard:g(a,i),screenshot:_(a,i)},u=s(l,d);function d(e={}){let t={...l,...e};return{...t,desktop:e.desktop??h(t.runCommand,t.whichCommand),clipboard:e.clipboard??g(t.runCommand,t.whichCommand),screenshot:e.screenshot??_(t.runCommand,t.whichCommand)}}function f(e){return u.resolve(e)}async function p(e,t){return await u.run(e,t)}async function m(e,t,n){return await f().runCommand(e,t,n)}function h(e,t){return{async openTarget(r){if(r.includes(`://`)||r.startsWith(`/`)){await e(`xdg-open`,[r]);return}if(await t(r)){e(r,[],{allowFailure:!0}).catch(e=>{n({level:`warn`,phase:`linux_app_launch`,data:{app:r,error:String(e)}})}),await o(500);return}await e(`xdg-open`,[r],{allowFailure:!0})},async closeApp(n){if(await t(`wmctrl`)){await e(`wmctrl`,[`-c`,n],{allowFailure:!0});return}await e(`pkill`,[`-x`,n],{allowFailure:!0})}}}function g(e,t){return{async readText(){let n=await w(t,y),r=x[n];return(await e(r.cmd,r.args,r.options)).stdout},async writeText(n){let r=await w(t,y),i=S[r](n);await e(i.cmd,i.args,i.options)}}}function _(e,t){return{async capture(n){let r=await w(t,b),i=C[r](n);await e(i.cmd,i.args,i.options)}}}const v=5e3,y={wayland:[{tool:`wl-clipboard`,command:`wl-paste`}],x11:[{tool:`xclip`,command:`xclip`},{tool:`xsel`,command:`xsel`}],waylandError:`wl-paste (wl-clipboard) is required for clipboard access on Wayland. Install via your package manager.`,x11Error:`xclip or xsel is required for clipboard access on X11. Install via your package manager.`},b={wayland:[{tool:`grim`,command:`grim`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],x11:[{tool:`scrot`,command:`scrot`},{tool:`import`,command:`import`},{tool:`gnome-screenshot`,command:`gnome-screenshot`}],waylandError:`grim or gnome-screenshot is required for screenshots on Wayland. Install via your package manager.`,x11Error:`scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager.`},x={"wl-clipboard":{cmd:`wl-paste`,args:[`--no-newline`],options:{allowFailure:!0,timeoutMs:v}},xclip:{cmd:`xclip`,args:[`-selection`,`clipboard`,`-o`],options:{allowFailure:!0,timeoutMs:v}},xsel:{cmd:`xsel`,args:[`--clipboard`,`--output`],options:{allowFailure:!0,timeoutMs:v}}},S={"wl-clipboard":e=>({cmd:`wl-copy`,args:[`--`,e],options:{allowFailure:!1,timeoutMs:v}}),xclip:e=>({cmd:`xclip`,args:[`-selection`,`clipboard`],options:{allowFailure:!1,timeoutMs:v,stdin:e}}),xsel:e=>({cmd:`xsel`,args:[`--clipboard`,`--input`],options:{allowFailure:!1,timeoutMs:v,stdin:e}})},C={grim:e=>({cmd:`grim`,args:[e]}),scrot:e=>({cmd:`scrot`,args:[e]}),import:e=>({cmd:`import`,args:[`-window`,`root`,e]}),"gnome-screenshot":e=>({cmd:`gnome-screenshot`,args:[`-f`,e]})};async function w(e,n){let r=T()?`wayland`:`x11`;for(let t of n[r])if(await e(t.command))return t.tool;throw new t(`TOOL_MISSING`,r===`wayland`?n.waylandError:n.x11Error)}function T(){let e=r();return!!e.WAYLAND_DISPLAY||e.XDG_SESSION_TYPE===`wayland`}export{m as n,c as r,f as t};
@@ -1 +1 @@
1
- import{B as e,P as t}from"./sdk-contracts.js";import{n,r}from"./interactor-operation-binding.js";function i(e){let t=t=>t??e.unsupported;return Object.freeze({tapPoint:e.tap,tapRef:t(e.tapRef),longPressPoint:e.longPress,hoverPoint:a(t(e.hover)),hoverRef:a(t(e.hoverRef)),fillPoint:e.fill,fillRef:t(e.fillRef),tapElementSelector:t(e.tapElementSelector)})}function a(e){return e.available?e:Object.freeze({...e,hint:e.hint??`hover raises pointer hover state and is available on web targets only. On touch platforms use longpress for hold gestures.`})}function o(e,t){return{...e.execution,appBundleId:e.appBundleId,signal:t}}function s(e,n,r,i){let a=async t=>(e.throwIfAborted(),await n(o(t,e))),s=async t=>{e.throwIfAborted(),l(t.options,r.longPressPoint);let n=await a(t);return t.options.button!==`primary`&&n.alternateClick?await n.alternateClick(t.point,t.options.button):n.pressPoint?await n.pressPoint(t.point,t.options):await d(n,t.point,t.options,i)},u=async e=>{let n=await a(e);if(!n.hover)throw new t(`UNSUPPORTED_OPERATION`,`Bound runtime advertised hover without an interactor.`);return await n.hover(e.point.x,e.point.y)},f=async e=>await(await a(e)).fill(e.point.x,e.point.y,e.text,e.delayMs,{allowNonHittableCoordinateFallback:e.allowNonHittableCoordinateFallback});return Object.freeze({...r.tapPoint.available?{tapPoint:s}:{},...r.tapRef.available?{tapRef:async e=>{let t=await a(e);return t.tapRef?await t.tapRef(e.ref):c(`tapRef`)}}:{},...r.longPressPoint.available?{longPressPoint:async e=>await(await a(e)).longPress(e.point.x,e.point.y,e.durationMs)}:{},...r.hoverPoint.available?{hoverPoint:u}:{},...r.hoverRef.available?{hoverRef:async e=>{let t=await a(e);return t.hoverRef?await t.hoverRef(e.ref):c(`hoverRef`)}}:{},...r.fillPoint.available?{fillPoint:f}:{},...r.fillRef.available?{fillRef:async e=>{let t=await a(e);return t.fillRef?await t.fillRef(e.ref,e.text,e.delayMs):c(`fillRef`)}}:{},...r.tapElementSelector.available?{tapElementSelector:async e=>{let t=await a(e);return t.tapElementSelector?await t.tapElementSelector(e.selector):c(`tapElementSelector`)}}:{}})}function c(e){throw new t(`UNSUPPORTED_OPERATION`,`Bound runtime advertised ${e} without an interactor.`)}function l(e,n){if(!(e.holdMs<=0||n.available))throw new t(`UNSUPPORTED_OPERATION`,`press-and-hold is not supported by this runtime.`,{reason:n.reason,...n.hint===void 0?{}:{hint:n.hint}})}function u(e){if(e.doubleTap)return e.doubleTap;throw new t(`UNSUPPORTED_OPERATION`,`double-tap is not supported by this runtime.`,{reason:`owner-capability-missing`,hint:`This runtime drives single presses; use --count to repeat them.`})}async function d(n,r,i,a){if(i.button!==`primary`)throw new t(`UNSUPPORTED_OPERATION`,`Bound runtime does not implement ${i.button} click.`);let o=i.doubleTap?u(n):void 0,s,c=0;try{for(let e=0;e<i.count;e+=1){let[t,l]=m(e,i.jitterPx),u=await f(n,o,r.x+t,r.y+l,i);c+=1,s??=u,e<i.count-1&&i.intervalMs>0&&await a(i.intervalMs)}}catch(t){throw e(t,c)}return s}async function f(e,t,n,r,i){return t?await t.call(e,n,r):i.holdMs>0?await e.longPress(n,r,i.holdMs):await e.tap(n,r)}const p=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function m(e,t){if(t<=0)return[0,0];let[n,r]=p[e%p.length];return[n*t,r*t]}function h(e){return s(e.signal,n(e),e.facts,e.pause)}function g(e){return s(e.signal,r({...e,operation:`touch`}),e.facts,e.pause)}export{i,g as n,m as r,h as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{P as t,V as n}from"./sdk-contracts.js";var r=e({localInteractorSource:()=>a,providerInteractorSource:()=>o,requireInteractorMethod:()=>i});function i(e,n){if(e)return e;throw new t(`COMMAND_FAILED`,`${n} was admitted but its bound interactor has no implementation.`,{reason:`interactor-method-missing`})}function a(e){return async t=>await e.resolveInteractor(e.device,t)}function o(e){return async n=>{let r=e.resolveInteractor(n);if(r)return r;throw new t(`UNSUPPORTED_OPERATION`,`Provider-owned ${e.operation} operation has no bound provider interactor.`,{reason:`provider-runtime-interactor-missing`,deviceId:e.device.id})}}function s(e){let t=t=>t??e.unsupported;return Object.freeze({tapPoint:e.tap,tapRef:t(e.tapRef),longPressPoint:e.longPress,hoverPoint:c(t(e.hover)),hoverRef:c(t(e.hoverRef)),fillPoint:e.fill,fillRef:t(e.fillRef),tapElementSelector:t(e.tapElementSelector)})}function c(e){return e.available?e:Object.freeze({...e,hint:e.hint??`hover raises pointer hover state and is available on web targets only. On touch platforms use longpress for hold gestures.`})}function l(e,t){return{...e.execution,appBundleId:e.appBundleId,signal:t}}function u(e,n,r,i){let a=async t=>(e.throwIfAborted(),await n(l(t,e))),o=async t=>{e.throwIfAborted(),f(t.options,r.longPressPoint);let n=await a(t);return t.options.button!==`primary`&&n.alternateClick?await n.alternateClick(t.point,t.options.button):n.pressPoint?await n.pressPoint(t.point,t.options):await m(n,t.point,t.options,i)},s=async e=>{let n=await a(e);if(!n.hover)throw new t(`UNSUPPORTED_OPERATION`,`Bound runtime advertised hover without an interactor.`);return await n.hover(e.point.x,e.point.y)},c=async e=>await(await a(e)).fill(e.point.x,e.point.y,e.text,e.delayMs,{allowNonHittableCoordinateFallback:e.allowNonHittableCoordinateFallback});return Object.freeze({...r.tapPoint.available?{tapPoint:o}:{},...r.tapRef.available?{tapRef:async e=>{let t=await a(e);return t.tapRef?await t.tapRef(e.ref):d(`tapRef`)}}:{},...r.longPressPoint.available?{longPressPoint:async e=>await(await a(e)).longPress(e.point.x,e.point.y,e.durationMs)}:{},...r.hoverPoint.available?{hoverPoint:s}:{},...r.hoverRef.available?{hoverRef:async e=>{let t=await a(e);return t.hoverRef?await t.hoverRef(e.ref):d(`hoverRef`)}}:{},...r.fillPoint.available?{fillPoint:c}:{},...r.fillRef.available?{fillRef:async e=>{let t=await a(e);return t.fillRef?await t.fillRef(e.ref,e.text,e.delayMs):d(`fillRef`)}}:{},...r.tapElementSelector.available?{tapElementSelector:async e=>{let t=await a(e);return t.tapElementSelector?await t.tapElementSelector(e.selector):d(`tapElementSelector`)}}:{}})}function d(e){throw new t(`UNSUPPORTED_OPERATION`,`Bound runtime advertised ${e} without an interactor.`)}function f(e,n){if(!(e.holdMs<=0||n.available))throw new t(`UNSUPPORTED_OPERATION`,`press-and-hold is not supported by this runtime.`,{reason:n.reason,...n.hint===void 0?{}:{hint:n.hint}})}function p(e){if(e.doubleTap)return e.doubleTap;throw new t(`UNSUPPORTED_OPERATION`,`double-tap is not supported by this runtime.`,{reason:`owner-capability-missing`,hint:`This runtime drives single presses; use --count to repeat them.`})}async function m(e,r,i,a){if(i.button!==`primary`)throw new t(`UNSUPPORTED_OPERATION`,`Bound runtime does not implement ${i.button} click.`);let o=i.doubleTap?p(e):void 0,s,c=0;try{for(let t=0;t<i.count;t+=1){let[n,l]=_(t,i.jitterPx),u=await h(e,o,r.x+n,r.y+l,i);c+=1,s??=u,t<i.count-1&&i.intervalMs>0&&await a(i.intervalMs)}}catch(e){throw n(e,c)}return s}async function h(e,t,n,r,i){return t?await t.call(e,n,r):i.holdMs>0?await e.longPress(n,r,i.holdMs):await e.tap(n,r)}const g=[[0,0],[1,0],[0,1],[-1,0],[0,-1],[1,1],[-1,1],[1,-1],[-1,-1]];function _(e,t){if(t<=0)return[0,0];let[n,r]=g[e%g.length];return[n*t,r*t]}function v(e){return u(e.signal,a(e),e.facts,e.pause)}function y(e){return u(e.signal,o({...e,operation:`touch`}),e.facts,e.pause)}export{r as a,i as c,s as i,y as n,a as o,_ as r,o as s,v as t};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{Et as t,Gt as n,St as r,Vt as i,dt as a,ft as o,gt as s,lt as c,ut as l}from"./sdk-batch.js";import{O as u}from"./runtime.js";import{r as d}from"./success-text.js";import{i as f}from"./click-button.js";import{m as p}from"./session-snapshot.js";import{t as m}from"./runtime-admission.js";import{t as h}from"./interactor-types.js";function g(e){let t=e?e.textEntryReadiness:void 0,n=x(t)?{textEntryReadiness:t}:{},r=_(e);return r?{...n,...r}:n}function _(e){if(!v(e))return null;let t=y(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function v(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&S(e.before)&&S(e.after))}function y(e){if(!w(e)||!b(e))return null;let t=C(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function b(e){return S(e.resourceId)&&S(e.className)&&S(e.packageName)}function x(e){return typeof e==`string`&&h.includes(e)}function S(e){return e===null||typeof e==`string`}function C(e){return!w(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function w(e){return!!e&&typeof e==`object`}async function T(e){let u={device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},d=i(e.command,e.requiresCapture),f=await m({command:e.command,required:d.use.required,...e.unavailableResponse?{unavailableResponse:e.unavailableResponse}:{},...u});if(f.type===`response`)return{ok:!1,response:f.response};let p=f.bind;switch(d.kind){case`tap-point`:return{ok:!0,runtime:{kind:`tap`,captured:!1,runtime:await p(e.device,n)}};case`captured-tap`:return{ok:!0,runtime:{kind:`tap`,captured:!0,runtime:await p(e.device,o)}};case`long-press-point`:return{ok:!0,runtime:{kind:`long-press`,captured:!1,runtime:await p(e.device,t)}};case`captured-long-press`:return{ok:!0,runtime:{kind:`long-press`,captured:!0,runtime:await p(e.device,a)}};case`hover-point`:return{ok:!0,runtime:{kind:`hover`,captured:!1,runtime:await p(e.device,r)}};case`captured-hover`:return{ok:!0,runtime:{kind:`hover`,captured:!0,runtime:await p(e.device,l)}};case`fill-point`:return{ok:!0,runtime:{kind:`fill`,captured:!1,runtime:await p(e.device,s)}};case`captured-fill`:return{ok:!0,runtime:{kind:`fill`,captured:!0,runtime:await p(e.device,c)}}}}function E(e,t){let n={execution:p(t),appBundleId:t.appBundleId},r=e.captured?M(e.runtime):void 0;switch(e.kind){case`tap`:return D(e,t,n,r);case`long-press`:return O(e,n,r);case`hover`:return k(e,n,r);case`fill`:return A(e,t,n,r)}}function D(e,t,n,r){let i=e.captured?e.runtime.operations.tapRef:void 0,a=e.captured?e.runtime.operations.tapElementSelector:void 0;return Object.freeze({captureSnapshot:r,tapPoint:async(r,i={})=>{let a=N(i,t),o=await e.runtime.operations.tapPoint({point:r,options:a,...n});return{x:r.x,y:r.y,count:a.count,intervalMs:a.intervalMs,holdMs:a.holdMs,jitterPx:a.jitterPx,doubleTap:a.doubleTap,...a.button===`primary`?{}:{button:a.button},...o??{},...d(L(r,a.button))}},tapRef:i?async e=>await i({ref:e,...n}):void 0,tapElementSelector:e.captured&&a?async t=>{let r=await e.runtime.operations.tapElementSelector?.({selector:t,...n}),i=r?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:t.raw,...r??{},...d(i?`tapped via non-hittable coordinate fallback`:`Tapped ${t.raw}`)}}:void 0})}function O(e,t,n){return Object.freeze({captureSnapshot:n,longPressPoint:async(n,r)=>{let i=await e.runtime.operations.longPressPoint({point:n,durationMs:r,...t});return{x:n.x,y:n.y,durationMs:r,...i??{},...d(`Long pressed (${n.x}, ${n.y})`)}}})}function k(e,t,n){let r=e.captured?e.runtime.operations.hoverRef:void 0;return Object.freeze({captureSnapshot:n,hoverPoint:async n=>{let r=await e.runtime.operations.hoverPoint({point:n,...t});return{x:n.x,y:n.y,...r??{},...d(`Hovered (${n.x}, ${n.y})`)}},hoverRef:r?async e=>await r({ref:e,...t}):void 0})}function A(e,t,n,r){let i=e.captured?e.runtime.operations.fillRef:void 0,a=e=>u(e??t.delayMs??0,`delay-ms`,0,1e4);return Object.freeze({captureSnapshot:r,fillPoint:async(t,r,i={})=>{let o=a(i.delayMs),s=await e.runtime.operations.fillPoint({point:t,text:r,delayMs:o,allowNonHittableCoordinateFallback:i.allowNonHittableCoordinateFallback===!0,...n});return{x:t.x,y:t.y,text:r,delayMs:o,...j(s)?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...g(s),...d(`Filled ${Array.from(r).length} chars`)}},fillRef:i?async(e,t,r={})=>await i({ref:e,text:t,delayMs:a(r.delayMs),...n}):void 0})}function j(e){return typeof e==`object`&&!!e&&`maestroNonHittableCoordinateFallbackUsed`in e&&e.maestroNonHittableCoordinateFallbackUsed===!0}function M(e){return async t=>await e.operations.captureSnapshot(t)}function N(e,t){let n=P(e,t);return I(n),{button:e.button??f(t),...n,surface:e.surface??t.surface}}function P(e,t){return{count:F(e.count,t.count,1,`count`,1,200),intervalMs:F(e.intervalMs,t.intervalMs,0,`interval-ms`,0,1e4),holdMs:F(e.holdMs,t.holdMs,0,`hold-ms`,0,1e4),jitterPx:F(e.jitterPx,t.jitterPx,0,`jitter-px`,0,100),doubleTap:e.doubleTap??t.doubleTap??!1}}function F(e,t,n,r,i,a){return u(e??t??n,r,i,a)}function I(t){if(t.doubleTap&&t.holdMs>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t.doubleTap&&t.jitterPx>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}function L(e,t){return t===`primary`?`Pressed (${e.x}, ${e.y})`:`${t===`secondary`?`Right`:`Middle`} clicked (${e.x}, ${e.y})`}export{T as n,E as t};
1
+ import{P as e}from"./sdk-contracts.js";import{H as t}from"./tv-remote.js";import{a as n}from"./back-mode.js";import{Et as r,Gt as i,St as a,Vt as o,dt as s,ft as c,gt as l,lt as u,ut as d}from"./sdk-batch.js";import{g as f}from"./selector-pipeline-policy.js";import{a as p,o as m}from"./internal/daemon.js";import{t as h}from"./interactor-types.js";function g(e){let t=e?e.textEntryReadiness:void 0,n=x(t)?{textEntryReadiness:t}:{},r=_(e);return r?{...n,...r}:n}function _(e){if(!v(e))return null;let t=y(e.target);return t?{verification:`unconfirmed`,requested:e.requested,before:e.before,after:e.after,target:t}:null}function v(e){return!!(e&&e.verification===`unconfirmed`&&typeof e.requested==`string`&&S(e.before)&&S(e.after))}function y(e){if(!w(e)||!b(e))return null;let t=C(e.rect);return t?{resourceId:e.resourceId,className:e.className,packageName:e.packageName,rect:t}:null}function b(e){return S(e.resourceId)&&S(e.className)&&S(e.packageName)}function x(e){return typeof e==`string`&&h.includes(e)}function S(e){return e===null||typeof e==`string`}function C(e){return!w(e)||![e.x,e.y,e.width,e.height].every(e=>typeof e==`number`)?null:e}function w(e){return!!e&&typeof e==`object`}async function T(e){let t={device:e.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},n=o(e.command,e.requiresCapture),f=await m({command:e.command,required:n.use.required,...e.unavailableResponse?{unavailableResponse:e.unavailableResponse}:{},...t});if(f.type===`response`)return{ok:!1,response:f.response};let p=f.bind;switch(n.kind){case`tap-point`:return{ok:!0,runtime:{kind:`tap`,captured:!1,runtime:await p(e.device,i)}};case`captured-tap`:return{ok:!0,runtime:{kind:`tap`,captured:!0,runtime:await p(e.device,c)}};case`long-press-point`:return{ok:!0,runtime:{kind:`long-press`,captured:!1,runtime:await p(e.device,r)}};case`captured-long-press`:return{ok:!0,runtime:{kind:`long-press`,captured:!0,runtime:await p(e.device,s)}};case`hover-point`:return{ok:!0,runtime:{kind:`hover`,captured:!1,runtime:await p(e.device,a)}};case`captured-hover`:return{ok:!0,runtime:{kind:`hover`,captured:!0,runtime:await p(e.device,d)}};case`fill-point`:return{ok:!0,runtime:{kind:`fill`,captured:!1,runtime:await p(e.device,l)}};case`captured-fill`:return{ok:!0,runtime:{kind:`fill`,captured:!0,runtime:await p(e.device,u)}}}}function E(e,t){let n={execution:p(t),appBundleId:t.appBundleId},r=e.captured?M(e.runtime):void 0;switch(e.kind){case`tap`:return D(e,t,n,r);case`long-press`:return O(e,n,r);case`hover`:return k(e,n,r);case`fill`:return A(e,t,n,r)}}function D(e,n,r,i){let a=e.captured?e.runtime.operations.tapRef:void 0,o=e.captured?e.runtime.operations.tapElementSelector:void 0;return Object.freeze({captureSnapshot:i,tapPoint:async(i,a={})=>{let o=N(a,n),s=await e.runtime.operations.tapPoint({point:i,options:o,...r});return{x:i.x,y:i.y,count:o.count,intervalMs:o.intervalMs,holdMs:o.holdMs,jitterPx:o.jitterPx,doubleTap:o.doubleTap,...o.button===`primary`?{}:{button:o.button},...s??{},...t(L(i,o.button))}},tapRef:a?async e=>await a({ref:e,...r}):void 0,tapElementSelector:e.captured&&o?async n=>{let i=await e.runtime.operations.tapElementSelector?.({selector:n,...r}),a=i?.maestroNonHittableCoordinateFallbackUsed===!0;return{selector:n.raw,...i??{},...t(a?`tapped via non-hittable coordinate fallback`:`Tapped ${n.raw}`)}}:void 0})}function O(e,n,r){return Object.freeze({captureSnapshot:r,longPressPoint:async(r,i)=>{let a=await e.runtime.operations.longPressPoint({point:r,durationMs:i,...n});return{x:r.x,y:r.y,durationMs:i,...a??{},...t(`Long pressed (${r.x}, ${r.y})`)}}})}function k(e,n,r){let i=e.captured?e.runtime.operations.hoverRef:void 0;return Object.freeze({captureSnapshot:r,hoverPoint:async r=>{let i=await e.runtime.operations.hoverPoint({point:r,...n});return{x:r.x,y:r.y,...i??{},...t(`Hovered (${r.x}, ${r.y})`)}},hoverRef:i?async e=>await i({ref:e,...n}):void 0})}function A(e,n,r,i){let a=e.captured?e.runtime.operations.fillRef:void 0,o=e=>f(e??n.delayMs??0,`delay-ms`,0,1e4);return Object.freeze({captureSnapshot:i,fillPoint:async(n,i,a={})=>{let s=o(a.delayMs),c=await e.runtime.operations.fillPoint({point:n,text:i,delayMs:s,allowNonHittableCoordinateFallback:a.allowNonHittableCoordinateFallback===!0,...r});return{x:n.x,y:n.y,text:i,delayMs:s,...j(c)?{maestroNonHittableCoordinateFallbackUsed:!0}:{},...g(c),...t(`Filled ${Array.from(i).length} chars`)}},fillRef:a?async(e,t,n={})=>await a({ref:e,text:t,delayMs:o(n.delayMs),...r}):void 0})}function j(e){return typeof e==`object`&&!!e&&`maestroNonHittableCoordinateFallbackUsed`in e&&e.maestroNonHittableCoordinateFallbackUsed===!0}function M(e){return async t=>await e.operations.captureSnapshot(t)}function N(e,t){let r=P(e,t);return I(r),{button:e.button??n(t),...r,surface:e.surface??t.surface}}function P(e,t){return{count:F(e.count,t.count,1,`count`,1,200),intervalMs:F(e.intervalMs,t.intervalMs,0,`interval-ms`,0,1e4),holdMs:F(e.holdMs,t.holdMs,0,`hold-ms`,0,1e4),jitterPx:F(e.jitterPx,t.jitterPx,0,`jitter-px`,0,100),doubleTap:e.doubleTap??t.doubleTap??!1}}function F(e,t,n,r,i,a){return f(e??t??n,r,i,a)}function I(t){if(t.doubleTap&&t.holdMs>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with hold-ms`);if(t.doubleTap&&t.jitterPx>0)throw new e(`INVALID_ARGS`,`double-tap cannot be combined with jitter-px`)}function L(e,t){return t===`primary`?`Pressed (${e.x}, ${e.y})`:`${t===`secondary`?`Right`:`Middle`} clicked (${e.x}, ${e.y})`}export{T as n,E as t};
package/dist/src/tree.js CHANGED
@@ -1 +1 @@
1
- import{Lr as e}from"./sdk-batch.js";import"./rect-center.js";function t(e){let t=new Map;for(let n of e){if(typeof n.parentIndex!=`number`)continue;let e=t.get(n.parentIndex)??[];e.push(n),t.set(n.parentIndex,e)}return t}function n(e,t){let n=[],r=new Set([e.index]),i=[...t.get(e.index)??[]];for(;i.length>0;){let e=i.pop();if(!e||r.has(e.index))continue;r.add(e.index),n.push(e);let a=t.get(e.index);a&&i.push(...a)}return n}const r=new WeakMap;function i(e,t){if(!e[t])return[];let n=s(e)[t]??t+1;return e.slice(t+1,n)}function a(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];if(t&&n(t))return t}}function o(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];t&&n(t)}}function s(e){let t=r.get(e);if(t)return t;let n=Array(e.length),i=[];for(let[t,r]of e.entries()){let e=r?.depth??0;for(;i.length>0&&e<=i.at(-1).depth;){let e=i.pop();n[e.position]=t}i.push({depth:e,position:t})}for(let t of i)n[t.position]=e.length;return r.set(e,n),n}function c(e,t){let n=[],r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),n.push(r),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0;return n}function l(e,t,n){for(let r of c(e,t))if(n(r))return r;return null}function u(e,t,n={}){return(n.includeSelf===!0&&m(e.type)?e:null)??l(e,t,e=>m(e.type))}function d(t,n){let r=e(t.type??``),i=t.label?.trim();return!!(p(t)||r===`other`&&!i&&!t.value||(r===`other`||r===`statictext`)&&i&&n.includes(i)||r===`image`)}function f(t){let n=e(t.type??``);return n===`button`||n===`link`||n===`switch`||n===`searchfield`||n===`textfield`}function p(t){return e(t.type??``)===`button`&&t.label?.trim()===`chevron`&&t.enabled===!1}function m(t){let n=e(t??``);return n===`collectionview`||n===`table`||n===`scrollview`||n===`scrollarea`}function h(t,n){let r=t.label?.trim();if(!r||r!==n)return!1;let i=e(t.type??``);return i===`other`||i===`statictext`||i===`link`}function g(e,t,n){e.set(t.index,v(y(e,t),n))}function _(e,t,n){let r=y(e,t);e.set(t.index,v(r,n(r)))}function v(e,t){let n={...e,...t};for(let[e,r]of Object.entries(t))r===void 0&&delete n[e];return n}function y(e,t){return e.get(t.index)??t}function b(t){let n;for(let r of t){let t=e(r.type??``);(t===`application`||t===`window`)&&S(r.rect,n)&&(n=r.rect)}return n}function x(e,t,n=.8){let r=C(e),i=C(t);return r>0&&i>0&&r/i>=n}function S(e,t){return!!(e&&(!t||C(e)>C(t)))}function C(e){return e?e.width*e.height:0}function w(e,t,n){let r=new Map(n.map(e=>[e.index,e])),i=new Map;for(let[t,n]of e.entries())i.set(n.index,t);return e.map((e,n)=>{let a=typeof e.parentIndex==`number`?i.get(e.parentIndex):void 0;return a===void 0&&typeof e.parentIndex==`number`&&(a=T(e.parentIndex,t,r,i)),{...e,index:n,parentIndex:a}})}function T(e,t,n,r){let i=e,a=new Set;for(;typeof i==`number`&&!a.has(i);){if(a.add(i),!t.has(i))return r.get(i);i=n.get(i)?.parentIndex}}export{_,b as a,o as c,h as d,m as f,d as g,w as h,a as i,p as l,g as m,i as n,l as o,f as p,n as r,u as s,t,x as u};
1
+ import{Ir as e}from"./sdk-batch.js";import"./rect-center.js";function t(e){let t=new Map;for(let n of e){if(typeof n.parentIndex!=`number`)continue;let e=t.get(n.parentIndex)??[];e.push(n),t.set(n.parentIndex,e)}return t}function n(e,t){let n=[],r=new Set([e.index]),i=[...t.get(e.index)??[]];for(;i.length>0;){let e=i.pop();if(!e||r.has(e.index))continue;r.add(e.index),n.push(e);let a=t.get(e.index);a&&i.push(...a)}return n}const r=new WeakMap;function i(e,t){if(!e[t])return[];let n=s(e)[t]??t+1;return e.slice(t+1,n)}function a(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];if(t&&n(t))return t}}function o(e,t,n){let r=s(e)[t]??t+1;for(let i=t+1;i<r;i+=1){let t=e[i];t&&n(t)}}function s(e){let t=r.get(e);if(t)return t;let n=Array(e.length),i=[];for(let[t,r]of e.entries()){let e=r?.depth??0;for(;i.length>0&&e<=i.at(-1).depth;){let e=i.pop();n[e.position]=t}i.push({depth:e,position:t})}for(let t of i)n[t.position]=e.length;return r.set(e,n),n}function c(e,t){let n=[],r=typeof e.parentIndex==`number`?t.get(e.parentIndex):void 0,i=new Set;for(;r&&!i.has(r.index);)i.add(r.index),n.push(r),r=typeof r.parentIndex==`number`?t.get(r.parentIndex):void 0;return n}function l(e,t,n){for(let r of c(e,t))if(n(r))return r;return null}function u(e,t,n={}){return(n.includeSelf===!0&&m(e.type)?e:null)??l(e,t,e=>m(e.type))}function d(t,n){let r=e(t.type??``),i=t.label?.trim();return!!(p(t)||r===`other`&&!i&&!t.value||(r===`other`||r===`statictext`)&&i&&n.includes(i)||r===`image`)}function f(t){let n=e(t.type??``);return n===`button`||n===`link`||n===`switch`||n===`searchfield`||n===`textfield`}function p(t){return e(t.type??``)===`button`&&t.label?.trim()===`chevron`&&t.enabled===!1}function m(t){let n=e(t??``);return n===`collectionview`||n===`table`||n===`scrollview`||n===`scrollarea`}function h(t,n){let r=t.label?.trim();if(!r||r!==n)return!1;let i=e(t.type??``);return i===`other`||i===`statictext`||i===`link`}function g(e,t,n){e.set(t.index,v(y(e,t),n))}function _(e,t,n){let r=y(e,t);e.set(t.index,v(r,n(r)))}function v(e,t){let n={...e,...t};for(let[e,r]of Object.entries(t))r===void 0&&delete n[e];return n}function y(e,t){return e.get(t.index)??t}function b(t){let n;for(let r of t){let t=e(r.type??``);(t===`application`||t===`window`)&&S(r.rect,n)&&(n=r.rect)}return n}function x(e,t,n=.8){let r=C(e),i=C(t);return r>0&&i>0&&r/i>=n}function S(e,t){return!!(e&&(!t||C(e)>C(t)))}function C(e){return e?e.width*e.height:0}function w(e,t,n){let r=new Map(n.map(e=>[e.index,e])),i=new Map;for(let[t,n]of e.entries())i.set(n.index,t);return e.map((e,n)=>{let a=typeof e.parentIndex==`number`?i.get(e.parentIndex):void 0;return a===void 0&&typeof e.parentIndex==`number`&&(a=T(e.parentIndex,t,r,i)),{...e,index:n,parentIndex:a}})}function T(e,t,n,r){let i=e,a=new Set;for(;typeof i==`number`&&!a.has(i);){if(a.add(i),!t.has(i))return r.get(i);i=n.get(i)?.parentIndex}}export{_,b as a,o as c,h as d,m as f,d as g,w as h,a as i,p as l,g as m,i as n,l as o,f as p,n as r,u as s,t,x as u};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";const t={android:`longpress`,apple:`exact`,vega:`exact`},n={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},r=Object.keys(n),i=`<${r.join(`|`)}>`;function a(t){let n=t?.toLowerCase();if(o(n))return n;let i=n?d.get(n):void 0;if(i)return i;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${r.join(`, `)}.`)}function o(e){return typeof e==`string`&&r.includes(e)}function s(e){return n[e].appleRemoteButton}function c(e){return n[e].androidKeyevent}function l(e){return n[e].vegaKey}function u(e){return t[e]}const d=new Map(r.flatMap(e=>n[e].aliases.map(t=>[t,e])));export{s as a,c as i,i as n,l as o,a as r,u as s,r as t};
1
+ import{P as e}from"./sdk-contracts.js";import{g as t,h as n,w as r}from"./sdk-device.js";import{Ar as i}from"./sdk-batch.js";const a={min:.01,max:1},o={flagKey:`screenshotMaxSize`,cliToken:`--max-size`,envVar:`AGENT_DEVICE_SCREENSHOT_MAX_SIZE`,publicOptionKey:`maxSize`,migration:{screenshot:`screenshot --max-size was removed; use --scale <0.01-1> (or AGENT_DEVICE_SCREENSHOT_SCALE) to downscale proportionally`,record:`record --max-size was removed; recordings capture at native resolution`}};function s(e,t){return t&&Object.hasOwn(t,o.flagKey)?o.migration[e]:void 0}function c(t,n){if(Object.hasOwn(n,o.publicOptionKey)||Object.hasOwn(n,o.flagKey))throw new e(`INVALID_ARGS`,o.migration[t])}const l={selectorInvalid:`CROP_SELECTOR_INVALID`,targetNotFound:`CROP_TARGET_NOT_FOUND`,targetAmbiguous:`CROP_TARGET_AMBIGUOUS`,captureUnreadable:`CROP_CAPTURE_UNREADABLE`,captureIncomplete:`CROP_CAPTURE_INCOMPLETE`,emptyIntersection:`CROP_EMPTY_INTERSECTION`,partialIntersection:`CROP_PARTIAL_INTERSECTION`,targetNotAccepted:`CROP_TARGET_NOT_ACCEPTED`,frameMismatch:`CROP_FRAME_MISMATCH`,pendingPixelIdentityEvidence:`PENDING_PIXEL_IDENTITY_EVIDENCE`},u={macOsHelperSurfaceFixedFrame:`SCREENSHOT_FULLSCREEN_MACOS_HELPER_SURFACE_FIXED_FRAME`},d=[`out`,`overlayRefs`,`screenshotCropOn`,`screenshotPixelDensity`,`screenshotFullscreen`,`screenshotScale`,`screenshotNoStabilize`,`screenshotNormalizeStatusBar`],f=[{key:`screenshotCropOn`,names:[`--crop-on`],type:`string`,usageLabel:`--crop-on <selector-expression>`,usageDescription:`Screenshot: crop the capture to the frame of the selector resolved on the same screen`,projectConfig:!1,recorded:!0},{key:`screenshotPixelDensity`,names:[`--pixel-density`],type:`int`,min:1,usageLabel:`--pixel-density <n>`,usageDescription:`Screenshot: output PNG pixel density in pixels per logical point (currently supported on iOS simulators)`,projectConfig:!0,recorded:!0},{key:`screenshotFullscreen`,names:[`--fullscreen`,`--full`,`-f`],type:`boolean`,usageLabel:`--fullscreen, --full, -f`,usageDescription:`Screenshot: on web capture the full page; on macOS app sessions capture the full desktop instead of the app window`,projectConfig:!0,recorded:!0},{key:`screenshotScale`,names:[`--scale`],type:`number`,min:a.min,max:a.max,usageLabel:`--scale <0.01-1>`,usageDescription:`Screenshot: resize both dimensions by this factor (or use AGENT_DEVICE_SCREENSHOT_SCALE)`,projectConfig:!0,recorded:!0},{key:`screenshotNoStabilize`,names:[`--no-stabilize`],type:`boolean`,usageLabel:`--no-stabilize`,usageDescription:`Screenshot: skip Android demo-mode/status-bar stabilization and settle delay for low-latency capture loops`,projectConfig:!0,recorded:!0},{key:`screenshotNormalizeStatusBar`,names:[`--normalize-status-bar`],type:`boolean`,usageLabel:`--normalize-status-bar`,usageDescription:`Screenshot: on iOS simulators temporarily normalize status-bar chrome for deterministic screenshot diffs`,projectConfig:!0,recorded:!0}],p=[{tokens:[`--fullscreen`,`--full`,`-f`],key:`screenshotFullscreen`},{tokens:[`--no-stabilize`],key:`screenshotNoStabilize`},{tokens:[`--normalize-status-bar`],key:`screenshotNormalizeStatusBar`}],ee=[{token:`--pixel-density`,key:`screenshotPixelDensity`,label:`screenshot --pixel-density`}],te=[{token:`--scale`,key:`screenshotScale`,label:`screenshot --scale`,min:a.min,max:a.max}],ne=[{token:`--crop-on`,key:`screenshotCropOn`,label:`screenshot --crop-on`}];function m(e){return b({overlayRefs:e?.overlayRefs,cropOn:e?.screenshotCropOn,pixelDensity:e?.screenshotPixelDensity,fullscreen:e?.screenshotFullscreen,scale:e?.screenshotScale,stabilize:!e?.screenshotNoStabilize&&void 0,normalizeStatusBar:e?.screenshotNormalizeStatusBar})}function h(e={}){return b({overlayRefs:e.overlayRefs,screenshotCropOn:e.screenshotCropOn??e.cropOn,screenshotPixelDensity:e.screenshotPixelDensity??e.pixelDensity,screenshotFullscreen:e.screenshotFullscreen??e.fullscreen,screenshotScale:e.screenshotScale,screenshotNoStabilize:e.screenshotNoStabilize??(e.stabilize===!1||void 0),screenshotNormalizeStatusBar:e.screenshotNormalizeStatusBar??e.normalizeStatusBar})}function g(e={}){return h({...e,screenshotScale:e.screenshotScale??e.scale})}function _(t){let{min:n,max:r}=a;if(t.scale!==void 0&&(!Number.isFinite(t.scale)||t.scale<n||t.scale>r))throw new e(`INVALID_ARGS`,`screenshot scale must be between ${n} and ${r}`)}function v(e,t){typeof t?.screenshotPixelDensity==`number`&&e.push(`--pixel-density`,String(t.screenshotPixelDensity)),t?.screenshotFullscreen&&e.push(`--fullscreen`),typeof t?.screenshotScale==`number`&&e.push(`--scale`,String(t.screenshotScale)),t?.screenshotNoStabilize&&e.push(`--no-stabilize`),t?.screenshotNormalizeStatusBar&&e.push(`--normalize-status-bar`)}function y(t){let{args:n,flags:r,index:i}=t,a=n[i];if(a===o.cliToken)throw new e(`INVALID_ARGS`,o.migration.screenshot);return x(a,r,i)??S({args:n,index:i,flags:r,token:a})??re({args:n,index:i,flags:r,token:a})??ie({args:n,index:i,flags:r,token:a})??{handled:!1}}function b(e){return Object.fromEntries(Object.entries(e).filter(e=>e[1]!==void 0))}function x(e,t,n){let r=p.find(t=>t.tokens.some(t=>t===e));if(r)return t[r.key]=!0,{handled:!0,nextIndex:n}}function S(t){let n=ee.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isInteger(r)||r<1)throw new e(`INVALID_ARGS`,`${n.label} requires a positive integer`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function re(t){let n=te.find(e=>e.token===t.token);if(!n)return;let r=Number(t.args[t.index+1]);if(!Number.isFinite(r)||r<n.min||r>n.max)throw new e(`INVALID_ARGS`,`${n.label} requires a number from ${n.min} to ${n.max}`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function ie(t){let n=ne.find(e=>e.token===t.token);if(!n)return;let r=t.args[t.index+1];if(typeof r!=`string`||r.length===0)throw new e(`INVALID_ARGS`,`${n.label} requires a selector expression`);return t.flags[n.key]=r,{handled:!0,nextIndex:t.index+1}}function C(t,n={message:e=>`Invalid value: ${e}`}){let r=new Set(t),i=n.normalize??(e=>e);return{is:e=>typeof e==`string`&&r.has(e),parse:t=>{let a=i(t??``);if(r.has(a))return a;throw new e(`INVALID_ARGS`,n.message(t??``))}}}const ae=[`up`,`down`,`left`,`right`,`top`,`bottom`],w=[`up`,`down`,`left`,`right`],oe=[`left`,`right`,`left-edge`,`right-edge`],se=[`one-way`,`ping-pong`],ce=1e4,le=6e4,ue=C(w,{message:e=>`Unknown direction: ${e}`}),T=.6;function de(e){let t=e.direction,n=t===`up`||t===`down`?e.referenceHeight:e.referenceWidth,r=I(e.amount),i=e.pixels===void 0?Math.round(n*r):L(e.pixels),a=Math.max(1,Math.round(n*.1)),o=Math.max(1,n-a*2),s=Math.max(1,Math.min(i,o)),c=Math.round(s/2),l=Math.round(e.referenceWidth/2),u=Math.round(e.referenceHeight/2),d=(n,r,i,a)=>({direction:t,x1:n,y1:r,x2:i,y2:a,referenceWidth:e.referenceWidth,referenceHeight:e.referenceHeight,amount:e.amount,pixels:s});switch(t){case`up`:return d(l,u-c,l,u+c);case`down`:return d(l,u+c,l,u-c);case`left`:return d(l-c,u,l+c,u);case`right`:return d(l+c,u,l-c,u)}}function E(e){I(e.amount),e.pixels!==void 0&&L(e.pixels)}function D(e,t){if(e===`left`||e===`right`){let n=k(e,t);return{preset:e,x1:n.x1,y1:n.y1,x2:n.x2,y2:n.y2,referenceWidth:n.referenceWidth,referenceHeight:n.referenceHeight}}let[n,r]=e===`left-edge`?[99,15]:[1,85],i=M(j(t,n,50),t,8),a=M(j(t,r,50),t,8);return{preset:e,x1:i.x,y1:i.y,x2:a.x,y2:a.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function O(e,t){switch(e){case`up`:return{x:0,y:-t};case`down`:return{x:0,y:t};case`left`:return{x:-t,y:0};case`right`:return{x:t,y:0}}}function k(e,t){let n=e===`left`||e===`up`,r=n?85:15,i=n?15:85,a=e===`up`||e===`down`,o=M(j(t,a?50:r,a?r:50),t,8),s=M(j(t,a?50:i,a?i:50),t,8);return{direction:e,x1:o.x,y1:o.y,x2:s.x,y2:s.y,referenceWidth:t.referenceWidth,referenceHeight:t.referenceHeight}}function A(e){let t=P(e);if(t)return{referenceWidth:t.width,referenceHeight:t.height}}function j(e,t,n){let r=Math.trunc(e.referenceWidth*t/100),i=Math.trunc(e.referenceHeight*n/100);return{x:Number.isFinite(r)?r:0,y:Number.isFinite(i)?i:0}}function M(e,t,n){return{x:R(e.x,n,t.referenceWidth),y:R(e.y,n,t.referenceHeight)}}function N(e){return ue.parse(e)}function P(e){let t=e.filter(e=>i(e)&&F(e.rect)).map(e=>e.rect).sort((e,t)=>(t?.width??0)*(t?.height??0)-(e?.width??0)*(e?.height??0))[0];if(t)return t;let n=e.map(e=>e.rect).filter(F);if(n.length===0)return;let r=Math.max(...n.map(e=>e.x+e.width)),a=Math.max(...n.map(e=>e.y+e.height));if(!(r<=0||a<=0))return{x:0,y:0,width:r,height:a}}function F(e){return!!e&&e.width>0&&e.height>0}function I(t){if(t===void 0)return T;if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll amount must be a positive number`);return t}function L(t){if(!Number.isFinite(t)||t<=0)throw new e(`INVALID_ARGS`,`scroll pixels must be a positive integer`);return Math.max(1,Math.round(t))}function R(e,t,n){let r=Math.round(t);if(!Number.isFinite(r))return 0;let i=Math.max(r,Math.round(n-t));return!Number.isFinite(i)||!Number.isFinite(e)?r:Math.min(i,Math.max(r,Math.round(e)))}const z=Object.freeze({reason:`scroll_keyboard_occludes_surface`,hint:"The on-screen keyboard covers the surface this scroll would swipe, so it cannot reach it. Run `keyboard dismiss` and retry, accepting that it drops focus (re-tap the field to keep typing), or scroll before focusing the field."});function B(e,t){if(!H(e)||!H(t))return{kind:`unobstructed`};let n=e.x+e.width/2;if(n<t.x||n>=t.x+t.width)return{kind:`unobstructed`};let r=t.y;if(r>=e.y+e.height||t.y+t.height<=e.y)return{kind:`unobstructed`};let i=Math.max(0,r-12-e.y);return i<.15*e.height?{kind:`occluded`,keyboardMinY:r,visibleHeight:i}:{kind:`avoided`,viewport:{...e,height:i},keyboardMinY:r}}function V(t,n){return new e(`COMMAND_FAILED`,`scroll ${t} refused: the keyboard leaves ${n.visibleHeight}px of ${n.viewportHeight}px visible, below the 15% needed for a swipe`,{keyboardMinY:n.keyboardMinY,visibleHeight:n.visibleHeight,viewportHeight:n.viewportHeight,minVisibleFraction:.15,...z})}function H(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}const fe=1e4;function pe(e){return e?{message:e}:{}}function me(e,t){return t?{...e,message:t}:e}function he(e){return typeof e?.message==`string`&&e.message.length>0?e.message:null}function ge(e){let t=e?.warnings;return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}function _e(e){let t=e.trim().toLowerCase();return t?/^(vertical|horizontal)\s+scroll\s+bar(?:,?\s*\d+\s+pages?)?$/.test(t):!1}function ve(e,t){if(!(e?.trim().toLowerCase()??``).includes(`vertical scroll bar`))return null;let n=ye(t);return n===null?null:n<=1?{above:!1,below:!0}:n>=99?{above:!0,below:!1}:{above:!0,below:!0}}function ye(e){if(!e)return null;let t=/^(\d{1,3})%$/.exec(e.trim());if(!t)return null;let n=Number(t[1]);return Number.isFinite(n)?Math.max(0,Math.min(100,n)):null}const be=1e4,xe=.65;function Se(e,t){return{...e,releaseBehavior:t===void 0?`controlled`:`inertial`}}function Ce(t,n=`scroll accepts either a relative amount or --pixels, not both`){if(t.amount!==void 0&&t.pixels!==void 0)throw new e(`INVALID_ARGS`,n)}function we(t){if(t.until!==void 0&&t.edge!==void 0)throw new e(`INVALID_ARGS`,`scroll ${t.edge} already scrolls to the ${t.edge} edge and cannot take --until`,{hint:`Use scroll ${t.edge===`bottom`?`down`:`up`} --until <selector> to stop at the target, or scroll ${t.edge} to reach the edge.`})}function Te(t,n={}){if(t===void 0)return;let r=n.field??`scroll durationMs`,i=n.max??1e4,a=n.invalidMessage??`${r} must be a non-negative integer`;if(!Number.isFinite(t)||!Number.isInteger(t)||t<0)throw new e(`INVALID_ARGS`,a);if(t>i)throw new e(`INVALID_ARGS`,`${r} must be a non-negative integer at most ${i}`);return t}function Ee(e){return typeof e?.pixels==`number`?e.pixels:void 0}function De(e){return typeof e?.durationMs==`number`?e.durationMs:void 0}function Oe(e){let t=U(e?.x1),n=U(e?.y1),r=U(e?.x2),i=U(e?.y2);if(t!==void 0&&n!==void 0&&r!==void 0&&i!==void 0)return{x:(t+r)/2,y:(n+i)/2}}function U(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const ke=[`android`,`harmonyos`,`apple`,`vega`,`linux`];function Ae(e){let{booted:t,kind:n,...r}=e;return r}const je={platform:`web`,id:`agent-browser-chrome`,name:`Agent Browser Chrome`,kind:`device`,target:`desktop`,booted:!0};function Me(e){let t=Pe();for(let n of e){let e=Fe(n);t[e].available+=1,n.booted===!0&&(t[e].booted+=1)}return t}function Ne(e,t){return e.filter(e=>r(e,t.platform)&&(t.target===void 0||(e.target??`mobile`)===t.target)&&(t.kind===void 0||e.kind===t.kind)&&(t.booted===void 0||e.booted===t.booted))}function Pe(){return{android:{available:0,booted:0},harmonyos:{available:0,booted:0},apple:{available:0,booted:0},vega:{available:0,booted:0},linux:{available:0,booted:0},web:{available:0,booted:0}}}function Fe(e){return n(e)||t(e)?`apple`:e.platform}const Ie=new Set([`DEVICE_CLAIM_LIVE_OWNER`,`DEVICE_CLAIM_RECOVERY_PENDING`,`DEVICE_CLAIM_OWNER_UNCERTAIN`]);function Le(e){return Ie.has(e)}const Re=`native-panel`,W=[`portrait`,`portrait-upside-down`,`landscape-left`,`landscape-right`],G={portrait:0,"landscape-left":1,"portrait-upside-down":2,"landscape-right":3};function ze(e){return W.find(t=>G[t]===e)}function Be(e){return typeof e==`string`&&W.includes(e)}function Ve(e){return G[e]*90}function He(e){return G[e]%2==0?`PORTRAIT`:`LANDSCAPE`}function Ue(t){if(t===void 0)throw new e(`INVALID_ARGS`,`orientation requires an orientation argument. Use portrait|portrait-upside-down|landscape-left|landscape-right.`);switch(t?.trim().toLowerCase()){case`portrait`:return`portrait`;case`portrait-upside-down`:case`upside-down`:return`portrait-upside-down`;case`landscape-left`:case`left`:return`landscape-left`;case`landscape-right`:case`right`:return`landscape-right`;default:throw new e(`INVALID_ARGS`,`Invalid rotation: ${t}. Use portrait|portrait-upside-down|landscape-left|landscape-right.`)}}const We=[`closed`,`half-open`,`open`],K=`closed|half-open|open`;function Ge(e){if(Number.isFinite(e))return e<=Ke?`closed`:e>=qe?`open`:`half-open`}const Ke=1,qe=179;function q(t){if(t===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose argument. Use ${K}.`);switch(t.trim().toLowerCase()){case`closed`:case`close`:case`fold`:case`folded`:return`closed`;case`half-open`:case`half`:case`half-unfolded`:case`partially-open`:case`book`:return`half-open`;case`open`:case`unfold`:case`unfolded`:case`fully-open`:case`flat`:return`open`;default:throw new e(`INVALID_ARGS`,`Invalid fold pose: ${t}. Use ${K}.`)}}const J=6e4;function Je(t){if(t.keyframes===void 0){if(t.pose===void 0)throw new e(`INVALID_ARGS`,`fold requires a pose or keyframes`);if(typeof t.pose!=`string`)throw new e(`INVALID_ARGS`,`fold pose must be a string`);return{pose:q(t.pose)}}if(t.pose!==void 0)throw new e(`INVALID_ARGS`,`fold accepts either pose or keyframes`);return{keyframes:Y(t.keyframes)}}function Y(t){if(!Array.isArray(t)||t.length<2||t.length>64)throw new e(`INVALID_ARGS`,`fold requires 2–64 keyframes`);let n=t.map(Ye);if(n[0].atMs!==0||n.some((e,t)=>t>0&&e.atMs<=n[t-1].atMs))throw new e(`INVALID_ARGS`,`Fold keyframes must start at 0ms and increase strictly`);return n}function X(e,t){return typeof e==`number`&&Number.isFinite(e)&&e>=0&&e<=t}function Ye(t){if(!t||typeof t!=`object`||Array.isArray(t))throw new e(`INVALID_ARGS`,`Each fold keyframe requires atMs and angle`);let{atMs:n,angle:r}=t;if(Object.keys(t).some(e=>e!==`atMs`&&e!==`angle`))throw new e(`INVALID_ARGS`,`Fold keyframes only accept atMs and angle`);if(!X(n,6e4)||!Number.isSafeInteger(n))throw new e(`INVALID_ARGS`,`Fold keyframe times must be integers from 0 to ${J}ms`);if(!X(r,180))throw new e(`INVALID_ARGS`,`Fold keyframe angles must be finite numbers from 0 to 180`);return{atMs:n,angle:r}}function Xe(t){let n;try{n=JSON.parse(t)}catch{throw new e(`INVALID_ARGS`,`--keyframes requires a JSON array of {atMs, angle} objects`)}return Y(n)}const Ze={android:`longpress`,apple:`exact`,vega:`exact`},Z={up:{aliases:[],androidKeyevent:`KEYCODE_DPAD_UP`,appleRemoteButton:`up`,vegaKey:`KEY_UP`},down:{aliases:[],androidKeyevent:`KEYCODE_DPAD_DOWN`,appleRemoteButton:`down`,vegaKey:`KEY_DOWN`},left:{aliases:[],androidKeyevent:`KEYCODE_DPAD_LEFT`,appleRemoteButton:`left`,vegaKey:`KEY_LEFT`},right:{aliases:[],androidKeyevent:`KEYCODE_DPAD_RIGHT`,appleRemoteButton:`right`,vegaKey:`KEY_RIGHT`},select:{aliases:[`ok`,`center`,`enter`],androidKeyevent:`KEYCODE_DPAD_CENTER`,appleRemoteButton:`select`,vegaKey:`KEY_ENTER`},menu:{aliases:[],androidKeyevent:`KEYCODE_MENU`,appleRemoteButton:`menu`,vegaKey:`KEY_MENU`},home:{aliases:[],androidKeyevent:`KEYCODE_HOME`,appleRemoteButton:`home`,vegaKey:`KEY_HOMEPAGE`},back:{aliases:[],androidKeyevent:`KEYCODE_BACK`,appleRemoteButton:`menu`,vegaKey:`KEY_BACK`}},Q=Object.keys(Z),$=`<${Q.join(`|`)}>`;function Qe(t){let n=t?.toLowerCase();if($e(n))return n;let r=n?it.get(n):void 0;if(r)return r;throw new e(`INVALID_ARGS`,`tv-remote button must be one of: ${Q.join(`, `)}.`)}function $e(e){return typeof e==`string`&&Q.includes(e)}function et(e){return Z[e].appleRemoteButton}function tt(e){return Z[e].androidKeyevent}function nt(e){return Z[e].vegaKey}function rt(e){return Ze[e]}const it=new Map(Q.flatMap(e=>Z[e].aliases.map(t=>[t,e])));export{E as $,be as A,he as B,ke as C,Le as D,Ne as E,Oe as F,T as G,pe as H,Te as I,z as J,w as K,Se as L,we as M,De as N,Ae as O,Ee as P,le as Q,ve as R,q as S,_ as St,Me as T,me as U,ge as V,fe as W,ce as X,se as Y,oe as Z,Ge as _,s as _t,et as a,A as at,Je as b,m as bt,W as c,C as ct,K as d,l as dt,k as et,Re as f,u as ft,Ve as g,y as gt,He as h,v as ht,tt as i,O as it,Ce as j,xe as k,G as l,o as lt,ze as m,f as mt,$ as n,D as nt,nt as o,N as ot,J as p,a as pt,ae as q,Qe as r,B as rt,rt as s,V as st,Q as t,de as tt,We as u,d as ut,Be as v,h as vt,je as w,Xe as x,c as xt,Ue as y,g as yt,_e as z};
@@ -1 +1 @@
1
- import{P as e}from"./sdk-contracts.js";import{qt as t}from"./sdk-batch.js";import{O as n}from"./runtime.js";import{r}from"./success-text.js";import{m as i}from"./session-snapshot.js";import{n as a}from"./runtime-admission.js";function o(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}async function s(e){let n=await a({command:`type`,device:e.device,use:t,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,typeText:async(e,t)=>await c(r,e,t)}}async function c(t,i,a){let s=o(i[0]);if(s)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${s}"`,{hint:`Use fill ${s} "text" to target that field, or press ${s} then type "text" to append.`});let c=i.join(` `);if(!c)throw new e(`INVALID_ARGS`,`type requires text`);let u=n(a.delayMs??0,`delay-ms`,0,1e4),d=(await t.operations.typeText(l(c,u,a)))?.textEntryRoute;return{...d===void 0?{}:{textEntryRoute:d},text:c,delayMs:u,...r(`Typed ${Array.from(c).length} chars`)}}function l(e,t,n){return{text:e,delayMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:i(n)}}export{s as n,c as t};
1
+ import{P as e}from"./sdk-contracts.js";import{H as t}from"./tv-remote.js";import{qt as n}from"./sdk-batch.js";import{g as r}from"./selector-pipeline-policy.js";import{a as i,s as a}from"./internal/daemon.js";function o(e){let t=e?.trim().split(/\s+/,1)[0];if(!t||!t.startsWith(`@`)||t.length<3)return null;let n=t.slice(1);return/^[A-Za-z_-]*\d[\w-]*$/i.test(n)||/^(?:ref|node|element|el)[\w-]*$/i.test(n)?t:null}async function s(e){let t=await a({command:`type`,device:e.device,use:n,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});if(t.type===`response`)return{ok:!1,response:t.response};let r=t.runtime;return{ok:!0,typeText:async(e,t)=>await c(r,e,t)}}async function c(n,i,a){let s=o(i[0]);if(s)throw new e(`INVALID_ARGS`,`type does not accept a target ref like "${s}"`,{hint:`Use fill ${s} "text" to target that field, or press ${s} then type "text" to append.`});let c=i.join(` `);if(!c)throw new e(`INVALID_ARGS`,`type requires text`);let u=r(a.delayMs??0,`delay-ms`,0,1e4),d=(await n.operations.typeText(l(c,u,a)))?.textEntryRoute;return{...d===void 0?{}:{textEntryRoute:d},text:c,delayMs:u,...t(`Typed ${Array.from(c).length} chars`)}}function l(e,t,n){return{text:e,delayMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:i(n)}}export{s as n,c as t};