agent-device 0.21.20 → 0.21.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.apk → agent-device-android-ime-helper-0.21.22.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.22.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.manifest.json → agent-device-android-ime-helper-0.21.22.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.20.manifest.json → agent-device-android-snapshot-helper-0.21.22.manifest.json} +6 -6
  7. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AppWindowScreenshot.swift +73 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/BackgroundInteraction.swift +557 -0
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/GhostCursor.swift +141 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +107 -3
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +136 -22
  12. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/BackgroundInteractionTests.swift +88 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +121 -4
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +10 -2
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +36 -9
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +28 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +27 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
  29. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
  30. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
  31. package/dist/src/adapter.js +1 -1
  32. package/dist/src/adb-executor.js +2 -2
  33. package/dist/src/adb-failure.js +1 -1
  34. package/dist/src/adb-transport.js +1 -1
  35. package/dist/src/agent-browser-lifecycle.js +1 -1
  36. package/dist/src/agent-browser-process-record.js +1 -1
  37. package/dist/src/agent-browser-provider.js +1 -1
  38. package/dist/src/agent-browser-tool.js +1 -1
  39. package/dist/src/agent-device-client.js +2 -2
  40. package/dist/src/ai-sdk.js +1 -1
  41. package/dist/src/alert-runtime.js +1 -1
  42. package/dist/src/alert.js +1 -1
  43. package/dist/src/android-adb.d.ts +12 -0
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/app-backend.js +1 -0
  46. package/dist/src/app-catalog.js +1 -1
  47. package/dist/src/app-deployment-resolution.js +1 -1
  48. package/dist/src/app-inventory.js +1 -1
  49. package/dist/src/app-launch.js +1 -1
  50. package/dist/src/app-lifecycle.js +2 -2
  51. package/dist/src/app-lifecycle2.js +1 -1
  52. package/dist/src/app-log-files.js +1 -1
  53. package/dist/src/app-log-reconnect.js +1 -1
  54. package/dist/src/app-log-runtime2.js +3 -3
  55. package/dist/src/app-log-session-resource.js +1 -0
  56. package/dist/src/app-resolution.js +2 -2
  57. package/dist/src/apple-runner-platform.js +1 -1
  58. package/dist/src/application-lifecycle-interaction.js +1 -1
  59. package/dist/src/archive.js +2 -2
  60. package/dist/src/artifact-download.js +1 -1
  61. package/dist/src/auth-session.js +1 -1
  62. package/dist/src/auth.js +1 -1
  63. package/dist/src/back-mode.js +1 -1
  64. package/dist/src/backend-snapshot-options.js +1 -1
  65. package/dist/src/boot-diagnostics.js +1 -1
  66. package/dist/src/cache.js +1 -1
  67. package/dist/src/capabilities.js +1 -1
  68. package/dist/src/capture.js +1 -1
  69. package/dist/src/cli-config.js +1 -1
  70. package/dist/src/cli-help.js +13 -5
  71. package/dist/src/cli.js +4 -4
  72. package/dist/src/click-button.js +1 -1
  73. package/dist/src/client-metro-companion.js +1 -1
  74. package/dist/src/client-metro.js +1 -1
  75. package/dist/src/client-options.js +3 -0
  76. package/dist/src/client-types.d.ts +88 -5
  77. package/dist/src/clipboard-shell-response.js +1 -1
  78. package/dist/src/cloud-artifacts.d.ts +7 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-schema.js +1 -1
  82. package/dist/src/command-tools.js +2 -2
  83. package/dist/src/connection-runtime.js +1 -1
  84. package/dist/src/connection.js +5 -5
  85. package/dist/src/contracts.d.ts +1 -1
  86. package/dist/src/contracts.js +1 -1
  87. package/dist/src/daemon-artifacts.js +1 -0
  88. package/dist/src/daemon-client-lease-beat.js +1 -1
  89. package/dist/src/daemon-client-lifecycle.js +1 -1
  90. package/dist/src/daemon-client-liveness-probe.js +1 -0
  91. package/dist/src/daemon-client-transport.js +1 -1
  92. package/dist/src/daemon-http.js +1 -0
  93. package/dist/src/daemon-policy-file.js +1 -1
  94. package/dist/src/daemon-registration-owner.js +1 -0
  95. package/dist/src/daemon-registration.js +1 -1
  96. package/dist/src/daemon-resolution.js +1 -1
  97. package/dist/src/daemon-shutdown-report.js +1 -1
  98. package/dist/src/daemon.js +2 -2
  99. package/dist/src/debug-symbols-facade.js +1 -1
  100. package/dist/src/device-claim-inspection.js +1 -1
  101. package/dist/src/device-claim-rule.js +1 -1
  102. package/dist/src/device-inventory-context.js +1 -1
  103. package/dist/src/device-readiness-runtime.js +1 -1
  104. package/dist/src/device-release.js +1 -1
  105. package/dist/src/device-rotation.js +1 -1
  106. package/dist/src/device-selection-resolver.js +1 -1
  107. package/dist/src/device-session.js +1 -1
  108. package/dist/src/device-shell.js +1 -1
  109. package/dist/src/device.js +1 -1
  110. package/dist/src/device2.js +1 -3
  111. package/dist/src/device3.js +3 -0
  112. package/dist/src/devicectl.js +1 -1
  113. package/dist/src/diagnostics.js +3 -3
  114. package/dist/src/dispatch-resolve.js +4 -1
  115. package/dist/src/display-inventory.js +1 -1
  116. package/dist/src/doctor-facade.js +1 -1
  117. package/dist/src/doctor2.js +1 -1
  118. package/dist/src/durable-capture-resource.js +1 -0
  119. package/dist/src/engine-eval-script.js +1 -1
  120. package/dist/src/error.js +1 -1
  121. package/dist/src/exec.js +1 -1
  122. package/dist/src/file.js +1 -1
  123. package/dist/src/find.js +1 -1
  124. package/dist/src/generic-settle.js +1 -1
  125. package/dist/src/generic.js +1 -1
  126. package/dist/src/gesture-admission.js +1 -1
  127. package/dist/src/gesture-plan.js +1 -1
  128. package/dist/src/gesture-runtime.js +1 -1
  129. package/dist/src/harmonyos.js +1 -1
  130. package/dist/src/hdc.js +1 -1
  131. package/dist/src/helper.js +2 -2
  132. package/dist/src/host-file.js +1 -1
  133. package/dist/src/host.js +1 -1
  134. package/dist/src/human-control-contract.js +1 -1
  135. package/dist/src/human-control.js +1 -1
  136. package/dist/src/index.d.ts +1 -1
  137. package/dist/src/index.js +1 -1
  138. package/dist/src/input-actions.js +1 -1
  139. package/dist/src/input-actions2.js +2 -2
  140. package/dist/src/install-artifact-facade.js +1 -1
  141. package/dist/src/install-source-network-transport.js +1 -1
  142. package/dist/src/install-source.d.ts +5 -0
  143. package/dist/src/install-source2.js +1 -1
  144. package/dist/src/instance-client.js +1 -0
  145. package/dist/src/interaction-positionals.js +1 -1
  146. package/dist/src/interaction-ref-policy.js +1 -1
  147. package/dist/src/interaction.js +1 -1
  148. package/dist/src/interaction2.js +1 -1
  149. package/dist/src/interactor-operation-binding.js +1 -1
  150. package/dist/src/interactor.js +5 -5
  151. package/dist/src/interactor2.js +1 -1
  152. package/dist/src/interactors.js +1 -1
  153. package/dist/src/internal/bin.js +1 -1
  154. package/dist/src/internal/daemon.js +1 -2
  155. package/dist/src/internal/png-worker.js +1 -1
  156. package/dist/src/internal/run-script-http-child.js +1 -1
  157. package/dist/src/inventory.js +4 -4
  158. package/dist/src/inventory2.js +1 -1
  159. package/dist/src/inventory3.js +1 -1
  160. package/dist/src/inventory5.js +1 -1
  161. package/dist/src/ios-client.js +4 -30
  162. package/dist/src/ios-settings.js +1 -0
  163. package/dist/src/ios-snapshot-engine.js +1 -1
  164. package/dist/src/ios-snapshot-runtime.js +1 -1
  165. package/dist/src/launch-confirmation.js +1 -1
  166. package/dist/src/lease-context.js +1 -1
  167. package/dist/src/lease-registry-scope.js +1 -0
  168. package/dist/src/lease-scope.js +1 -1
  169. package/dist/src/lease.js +1 -1
  170. package/dist/src/legacy-xctest-device-set.js +1 -1
  171. package/dist/src/limrun-download-file.js +1 -1
  172. package/dist/src/limrun-runtime-dependencies.js +1 -1
  173. package/dist/src/limrun.d.ts +28 -2
  174. package/dist/src/limrun.js +1 -1
  175. package/dist/src/linux.js +1 -1
  176. package/dist/src/load.js +1 -0
  177. package/dist/src/location-coordinates.js +1 -1
  178. package/dist/src/macos-facade.js +1 -1
  179. package/dist/src/managed-device-scope.js +1 -1
  180. package/dist/src/mechanics.js +16 -16
  181. package/dist/src/observation.js +1 -1
  182. package/dist/src/observe-until.js +1 -1
  183. package/dist/src/overlay.js +2 -2
  184. package/dist/src/owner-identity.js +3 -3
  185. package/dist/src/path-resolution.js +1 -1
  186. package/dist/src/perf-facade.js +1 -1
  187. package/dist/src/perf-runtime-operation-builder.js +1 -1
  188. package/dist/src/perf-runtime-plan.js +1 -1
  189. package/dist/src/perf-target.js +1 -1
  190. package/dist/src/perf.js +1 -1
  191. package/dist/src/physical-device-control.js +1 -1
  192. package/dist/src/platform-request-scope.js +1 -1
  193. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  194. package/dist/src/platform-runtime-app-log-process.js +1 -1
  195. package/dist/src/platform-runtime-host.js +1 -1
  196. package/dist/src/platform-runtime-managed-owner.js +1 -1
  197. package/dist/src/platform-runtime-open-target.js +1 -1
  198. package/dist/src/platform-runtime-operation-host.js +2 -2
  199. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  200. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  201. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  202. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  203. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  204. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
  205. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  206. package/dist/src/platform-runtime-unavailable.js +1 -1
  207. package/dist/src/platform-runtime.js +1 -1
  208. package/dist/src/platform-runtime2.js +1 -1
  209. package/dist/src/plugins.d.ts +9 -0
  210. package/dist/src/plugins.js +1 -0
  211. package/dist/src/plugins2.js +2 -0
  212. package/dist/src/png-crop-bytes.js +1 -1
  213. package/dist/src/png-size.js +1 -1
  214. package/dist/src/png-worker-client.js +1 -1
  215. package/dist/src/png.js +1 -1
  216. package/dist/src/prepare-kind.js +1 -1
  217. package/dist/src/process.js +1 -1
  218. package/dist/src/project-runtime.js +1 -1
  219. package/dist/src/provider-credential-fingerprint.js +1 -0
  220. package/dist/src/provider-device-admission.js +1 -1
  221. package/dist/src/provider-device-runtimes.js +1 -0
  222. package/dist/src/provider-limrun-credentials.js +1 -0
  223. package/dist/src/provider-profile-fields.js +1 -0
  224. package/dist/src/provider-session-ownership.js +2 -2
  225. package/dist/src/provider-webdriver.js +2 -1
  226. package/dist/src/providers.js +1 -1
  227. package/dist/src/proxy.js +1 -1
  228. package/dist/src/quality-warnings.js +1 -1
  229. package/dist/src/react-native.js +1 -1
  230. package/dist/src/record-runtime.js +1 -1
  231. package/dist/src/record-trace.js +1 -1
  232. package/dist/src/recording.js +1 -1
  233. package/dist/src/rect-center.js +1 -1
  234. package/dist/src/register-builtins.js +1 -1
  235. package/dist/src/registry.js +39 -39
  236. package/dist/src/remote-config2.js +1 -1
  237. package/dist/src/replay-divergence.js +1 -1
  238. package/dist/src/replay.js +2 -2
  239. package/dist/src/reporting.js +5 -5
  240. package/dist/src/request-admission.js +1 -1
  241. package/dist/src/request-cancel.js +1 -1
  242. package/dist/src/request-cancellation.js +1 -1
  243. package/dist/src/request-runtime-binding.js +1 -1
  244. package/dist/src/result-serialization.js +1 -1
  245. package/dist/src/retry.js +1 -1
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-metadata.js +3 -3
  248. package/dist/src/runner-client.js +1 -1
  249. package/dist/src/runner-dev-tools-security.js +1 -1
  250. package/dist/src/runner-device-readiness.js +1 -1
  251. package/dist/src/runner-disposal.js +1 -1
  252. package/dist/src/runner-error-classification.js +2 -2
  253. package/dist/src/runner-exchange.js +1 -1
  254. package/dist/src/runner-operations-facade.js +1 -1
  255. package/dist/src/runner-session-types.js +1 -1
  256. package/dist/src/runner-start-budget.js +1 -1
  257. package/dist/src/runner.js +1 -1
  258. package/dist/src/runtime-admission.js +1 -1
  259. package/dist/src/runtime-transport-hints.js +1 -1
  260. package/dist/src/runtime.js +1 -1
  261. package/dist/src/runtime10.js +2 -2
  262. package/dist/src/runtime2.js +3 -3
  263. package/dist/src/runtime3.js +1 -1
  264. package/dist/src/runtime4.js +5 -5
  265. package/dist/src/runtime5.js +1 -1
  266. package/dist/src/runtime6.js +1 -1
  267. package/dist/src/runtime7.js +1 -1
  268. package/dist/src/runtime8.js +1 -1
  269. package/dist/src/runtime9.js +1 -1
  270. package/dist/src/screen-recording-admission-ledger.js +1 -1
  271. package/dist/src/screen-recording-completion.js +1 -1
  272. package/dist/src/screen-recording-options.js +1 -1
  273. package/dist/src/screen-recording-resource-recovery.js +1 -1
  274. package/dist/src/screen-recording-transport.js +1 -1
  275. package/dist/src/screenshot-density.js +1 -1
  276. package/dist/src/screenshot-image.js +1 -1
  277. package/dist/src/screenshot-result.js +1 -1
  278. package/dist/src/screenshot-runtime.js +1 -1
  279. package/dist/src/screenshot.js +1 -1
  280. package/dist/src/screenshot3.js +1 -1
  281. package/dist/src/script.js +1 -1
  282. package/dist/src/scroll-command.js +1 -1
  283. package/dist/src/scroll-gesture.js +1 -1
  284. package/dist/src/sdk-batch-runner.js +2 -2
  285. package/dist/src/sdk-batch.js +2 -2
  286. package/dist/src/sdk-contracts.d.ts +45 -2
  287. package/dist/src/sdk-contracts.js +2 -2
  288. package/dist/src/sdk-device.js +1 -1
  289. package/dist/src/sdk-io.js +1 -1
  290. package/dist/src/sdk-remote-config.js +1 -1
  291. package/dist/src/sdk-selectors.d.ts +33 -4
  292. package/dist/src/selection.js +0 -0
  293. package/dist/src/selector-runtime.js +1 -1
  294. package/dist/src/selectors.d.ts +2 -2
  295. package/dist/src/selectors.js +1 -1
  296. package/dist/src/server.js +1 -1
  297. package/dist/src/session-allocation.js +1 -1
  298. package/dist/src/session-artifact-paths.js +1 -1
  299. package/dist/src/session-repair-tombstone.js +1 -1
  300. package/dist/src/session-routing.js +1 -1
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session-snapshot.js +1 -1
  303. package/dist/src/session-stream.js +27 -0
  304. package/dist/src/session.js +1 -1
  305. package/dist/src/session2.js +5 -5
  306. package/dist/src/settings.js +1 -1
  307. package/dist/src/settings2.js +1 -1
  308. package/dist/src/simctl-settings-facade.js +1 -0
  309. package/dist/src/simctl-settings.js +1 -0
  310. package/dist/src/simctl.js +1 -1
  311. package/dist/src/simulator.js +1 -1
  312. package/dist/src/snapshot-diagnostics.js +1 -1
  313. package/dist/src/snapshot-runtime-binding.js +1 -1
  314. package/dist/src/snapshot-runtime.js +1 -1
  315. package/dist/src/snapshot-state.js +1 -1
  316. package/dist/src/snapshot2.js +1 -1
  317. package/dist/src/snapshot3.js +1 -1
  318. package/dist/src/snapshot4.js +1 -1
  319. package/dist/src/src.js +1 -1
  320. package/dist/src/src7.js +1 -1
  321. package/dist/src/src8.js +2 -2
  322. package/dist/src/store.js +1 -0
  323. package/dist/src/string-enum.js +1 -1
  324. package/dist/src/surface-snapshot.js +1 -1
  325. package/dist/src/takeover.js +1 -1
  326. package/dist/src/target-evidence.js +1 -1
  327. package/dist/src/telemetry.js +1 -1
  328. package/dist/src/text-entry-focus.js +1 -1
  329. package/dist/src/tool-provider.js +1 -1
  330. package/dist/src/tool-provider2.js +1 -1
  331. package/dist/src/toolchain-probe.js +2 -2
  332. package/dist/src/touch-runtime.js +1 -1
  333. package/dist/src/touch-runtime2.js +1 -1
  334. package/dist/src/transport.js +2 -2
  335. package/dist/src/tv-remote.js +1 -1
  336. package/dist/src/type-text-runtime.js +1 -1
  337. package/dist/src/update-check.js +1 -1
  338. package/dist/src/vars.js +1 -1
  339. package/dist/src/verified-file.js +1 -1
  340. package/dist/src/version.js +1 -1
  341. package/dist/src/video.js +1 -1
  342. package/dist/src/viewport.js +1 -1
  343. package/dist/src/web.js +1 -1
  344. package/dist/src/web2.js +1 -1
  345. package/dist/src/webdriver-source.js +1 -1
  346. package/package.json +5 -1
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.20.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk.sha256 +0 -1
  351. package/dist/src/api.js +0 -3
  352. package/dist/src/daemon-process.js +0 -1
  353. package/dist/src/multitouch-support.js +0 -1
  354. package/dist/src/parameterized-recorded-fill.js +0 -1
  355. package/dist/src/runner-startup-transport.js +0 -1
  356. package/dist/src/runner-xctestrun.js +0 -1
  357. package/dist/src/session-store.js +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-device",
3
- "version": "0.21.20",
3
+ "version": "0.21.22",
4
4
  "description": "Mobile app automation and verification for AI coding agents. CLI, MCP server, and typed Node.js API for iOS, Android, HarmonyOS, TV, web, macOS, and Linux.",
5
5
  "mcpName": "io.github.callstack/agent-device",
6
6
  "license": "MIT",
@@ -69,6 +69,10 @@
69
69
  "./ai-sdk": {
70
70
  "types": "./dist/src/ai-sdk.d.ts",
71
71
  "import": "./dist/src/ai-sdk.js"
72
+ },
73
+ "./plugins": {
74
+ "types": "./dist/src/plugins.d.ts",
75
+ "import": "./dist/src/plugins.js"
72
76
  }
73
77
  },
74
78
  "engines": {
package/server.json CHANGED
@@ -7,12 +7,12 @@
7
7
  "url": "https://github.com/callstack/agent-device",
8
8
  "source": "github"
9
9
  },
10
- "version": "0.21.20",
10
+ "version": "0.21.22",
11
11
  "packages": [
12
12
  {
13
13
  "registryType": "npm",
14
14
  "identifier": "agent-device",
15
- "version": "0.21.20",
15
+ "version": "0.21.22",
16
16
  "transport": {
17
17
  "type": "stdio"
18
18
  },
@@ -1 +0,0 @@
1
- 232a1d7a3c39d9acf586ea07bf6c17edc382313a568272f6bab2ef3458d2b420 agent-device-android-ime-helper-0.21.20.apk
@@ -1 +0,0 @@
1
- 4fa070b457f9b178e7c05706ff95c79cbb171da08dd5bd28dbb375f6293efc12 agent-device-android-snapshot-helper-0.21.20.apk
package/dist/src/api.js DELETED
@@ -1,3 +0,0 @@
1
- import{C as e,D as t,E as n,S as r,T as i,_ as a,a as o,b as s,c,d as l,f as u,g as d,h as f,i as p,l as m,m as h,o as g,p as ee,r as _,s as v,u as y,v as te,w as ne,x as b,y as re}from"./ios-client.js";import{promises as ie}from"fs";import"net";import ae from"os";import x,{basename as oe}from"path";import se,{createHash as ce}from"crypto";import"child_process";function S(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 C(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 w=function(){let{crypto:e}=globalThis;if(e?.randomUUID)return w=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 le=/^[a-z][a-z0-9+.-]*:/i,ue=e=>le.test(e);let T=e=>(T=Array.isArray,T(e)),E=T;function D(e){return typeof e==`object`?e??{}:{}}function de(e){if(!e)return!0;for(let t in e)return!1;return!0}function fe(e,t){return Object.prototype.hasOwnProperty.call(e,t)}const pe=(e,t)=>{if(typeof t!=`number`||!Number.isInteger(t))throw new b(`${e} must be an integer`);if(t<0)throw new b(`${e} must be a positive integer`);return t},me=e=>{try{return JSON.parse(e)}catch{return}},O=`0.49.3`;function he(){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 ge=()=>{let e=he();if(e===`deno`)return{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":O,"X-Stainless-OS":ye(Deno.build.os),"X-Stainless-Arch":ve(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":O,"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":O,"X-Stainless-OS":ye(globalThis.process.platform??`unknown`),"X-Stainless-Arch":ve(globalThis.process.arch??`unknown`),"X-Stainless-Runtime":`node`,"X-Stainless-Runtime-Version":globalThis.process.version??`unknown`};let t=_e();return t?{"X-Stainless-Lang":`js`,"X-Stainless-Package-Version":O,"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":O,"X-Stainless-OS":`Unknown`,"X-Stainless-Arch":`unknown`,"X-Stainless-Runtime":`unknown`,"X-Stainless-Runtime-Version":`unknown`}};function _e(){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 ve=e=>e===`x32`?`x32`:e===`x86_64`||e===`x64`?`x64`:e===`arm`?`arm`:e===`aarch64`||e===`arm64`?`arm64`:e?`other:${e}`:`unknown`,ye=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 be;const xe=()=>be??=ge();function Se(){if(typeof fetch<`u`)return l.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 Ce(...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 we(e){let t=Symbol.asyncIterator in e?e[Symbol.asyncIterator]():e[Symbol.iterator]();return Ce({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 Te(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 Ee=({headers:e,body:t})=>({bodyHeaders:{"content-type":`application/json`},body:JSON.stringify(t)});function De(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 b(`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 k={off:0,error:200,warn:300,info:400,debug:500},A=(e,t,n)=>{if(e){if(fe(k,e))return e;P(n).warn(`${t} was set to ${JSON.stringify(e)}, expected one of ${JSON.stringify(Object.keys(k))}`)}};function j(){}function M(e,t,n){return!t||k[e]>k[n]?j:t[e].bind(t)}const Oe={error:j,warn:j,info:j,debug:j};let N=new WeakMap;function P(e){let t=e.logger,n=e.logLevel??`off`;if(!t)return Oe;let r=N.get(t);if(r&&r[0]===n)return r[1];let i={error:M(`error`,t,n),warn:M(`warn`,t,n),info:M(`info`,t,n),debug:M(`debug`,t,n)};return N.set(t,[n,i]),i}const F=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 I(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 P(e).debug(`[${r}] response parsed`,F({retryOfRequestLogID:i,url:n.url,status:n.status,body:o,durationMs:Date.now()-a})),o}var L,ke=class e extends Promise{constructor(e,t,n=I){super(e=>{e(null)}),this.responsePromise=t,this.parseResponse=n,L.set(this,void 0),S(this,L,e,`f`)}_thenUnwrap(t){return new e(C(this,L,`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(C(this,L,`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)}};L=new WeakMap;var R,Ae=class{constructor(e,t,n,r){R.set(this,void 0),S(this,R,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 b("No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.");return await C(this,R,`f`).requestAPIList(this.constructor,e)}async*iterPages(){let e=this;for(yield e;e.hasNextPage();)e=await e.getNextPage(),yield e}async*[(R=new WeakMap,Symbol.asyncIterator)](){for await(let e of this.iterPages())for(let t of e.getPaginatedItems())yield t}},je=class extends ke{constructor(e,t,n){super(e,t,async(e,t)=>new n(e,t.response,await I(e,t),t.options))}async*[Symbol.asyncIterator](){let e=await this;for await(let t of e)yield t}},z=class extends Ae{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:{...D(this.options.query),startingAfter:t}}:null}let t=e[0]?.metadata.id;return t?{...this.options,query:{...D(this.options.query),endingBefore:t}}:null}};const Me=()=>{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 B(e,t,n){return Me(),new File(e,t??`unknown_file`,n)}function Ne(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 Pe=e=>typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`,Fe=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`,Ie=e=>typeof e==`object`&&!!e&&typeof e.name==`string`&&typeof e.lastModified==`number`&&Fe(e),Le=e=>typeof e==`object`&&!!e&&typeof e.url==`string`&&typeof e.blob==`function`;async function Re(e,t,n){if(Me(),e=await e,Ie(e))return e instanceof File?e:B([await e.arrayBuffer()],e.name);if(Le(e)){let r=await e.blob();return t||=new URL(e.url).pathname.split(/[\\/]/).pop(),B(await V(r),t,n)}let r=await V(e);if(t||=Ne(e),!n?.type){let e=r.find(e=>typeof e==`object`&&`type`in e&&e.type);typeof e==`string`&&(n={...n,type:e})}return B(r,t,n)}async function V(e){let t=[];if(typeof e==`string`||ArrayBuffer.isView(e)||e instanceof ArrayBuffer)t.push(e);else if(Fe(e))t.push(e instanceof Blob?e:await e.arrayBuffer());else if(Pe(e))for await(let n of e)t.push(...await V(n));else{let t=e?.constructor?.name;throw Error(`Unexpected data type: ${typeof e}${t?`; constructor: ${t}`:``}${ze(e)}`)}return t}function ze(e){return typeof e!=`object`||!e?``:`; props: [${Object.getOwnPropertyNames(e).map(e=>`"${e}"`).join(`, `)}]`}var H=class{constructor(e){this._client=e}},Be=class extends H{get(e,t){return this._client.get(`/v1/analytics`,{query:e,...t})}getInstances(e,t){return this._client.get(`/v1/analytics/instances`,{query:e,...t})}};const Ve=Symbol(`brand.privateNullableHeaders`);function*He(e){if(!e)return;if(Ve 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():E(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=E(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 U=e=>{let t=new Headers,n=new Set;for(let r of e){let e=new Set;for(let[i,a]of He(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{[Ve]:!0,values:t,nulls:n}};function Ue(e){return e.replace(/[^A-Za-z0-9\-._~!$&'()*+,;=:@]+/g,encodeURIComponent)}const We=Object.freeze(Object.create(null)),W=((e=Ue)=>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??We)??We)?.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 b(`Path parameters result in path with invalid segments:\n${i.map(e=>e.error).join(`
2
- `)}\n${a}\n${t}`)}return a})(Ue);var G=class extends H{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`,z,{query:e,...t})}delete(e,t){return this._client.delete(W`/v1/gradle_instances/${e}`,{...t,headers:U([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(W`/v1/gradle_instances/${e}`,t)}},Ge=class extends H{create(e,t){return this._client.post(`/v1/scoped_tokens`,{body:e,...t})}},Ke=class extends H{list(e={},t){return this._client.get(`/v1/assets`,{query:e,...t})}delete(e,t){return this._client.delete(W`/v1/assets/${e}`,{...t,headers:U([{Accept:`*/*`},t?.headers])})}get(e,t={},n){return this._client.get(W`/v1/assets/${e}`,{query:t,...n})}getOrCreate(e,t){return this._client.put(`/v1/assets`,{body:e,...t})}};function qe(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 Je=class extends Ke{async getOrUpload(e,t){let n=await this.getOrCreate({name:e.name??oe(e.path),kind:e.kind??`App`,...e.platform&&{platform:e.platform},...e.ttl&&{ttl:e.ttl},...e.uploadOptions},t),r=await ie.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 l.fetch(n.signedUploadUrl,{headers:{...e.onUploadProgress&&{"Content-Length":r.length.toString()},"Content-Type":`application/octet-stream`},method:`PUT`,...qe(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}}}},Ye=class extends H{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`,z,{query:e,...t})}delete(e,t){return this._client.delete(W`/v1/ios_instances/${e}`,{...t,headers:U([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(W`/v1/ios_instances/${e}`,t)}},Xe=class extends Ye{listSessionArtifacts(e,t,n){return this._client.get(W`/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)}},Ze=class extends H{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`,z,{query:e,...t})}delete(e,t){return this._client.delete(W`/v1/android_instances/${e}`,{...t,headers:U([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(W`/v1/android_instances/${e}`,t)}},Qe=class extends Ze{listSessionArtifacts(e,t,n){return this._client.get(W`/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)}},$e=class extends H{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`,z,{query:e,...t})}delete(e,t){return this._client.delete(W`/v1/xcode_instances/${e}`,{...t,headers:U([{Accept:`*/*`},t?.headers])})}get(e,t){return this._client.get(W`/v1/xcode_instances/${e}`,t)}},et=class extends Error{constructor(e){super(`Instance ${e} was gone before it reported any cache status`),this.instanceId=e,this.name=`XcodeCacheGoneError`}},tt=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 rt(e){return e===`disabled`||e===`unsupported`||e===`restored`||e===`skipped`||e===`failed`}function it(e){return e===`disabled`||e===`published`||e===`skipped`||e===`failed`||e===`timed_out`}function at(e,t){return t===`restore`?rt(e.restore.phase):it(e.save.phase)}function ot(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 s,c=``,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 tt(n,r,s))),r),p=()=>d(()=>o(t.signal?.reason??Error(`aborted`))),m=!1,h=()=>{m||u||(m=!0,l.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(()=>s?i({cache:s,gone:!0}):o(new et(e.instanceId)))}).catch(()=>{m=!1}))},g=y({url:a,fetch:async(t,n)=>{let r=await l.fetch(t,n);return r.status===404&&d(()=>s?i({cache:s,gone:!0}):o(new et(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(s=r,e.event===`gone`){h();return}let a=`${r.restore.phase}/${r.restore.reason??``}|${r.save.phase}/${r.save.reason??``}`;a!==c&&(c=a,t.onUpdate?.(r)),at(r,n)&&d(()=>i({cache:r,gone:!1}))}});if(t.signal?.aborted){p();return}t.signal?.addEventListener(`abort`,p,{once:!0})})}function st(e,t){let n=x.resolve(e),r=`limsync-cache-${x.basename(n)}-${se.createHash(`sha1`).update(n).digest(`hex`).slice(0,8)}`;return{cacheKey:r,basisCacheDir:t??x.join(ae.tmpdir(),r)}}function K(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 ct=[`none`,`error`,`warn`,`info`,`debug`];function lt(e,t){let n=ct.indexOf(t),r=e=>n>=ct.indexOf(e);return(t,n)=>{r(t)&&(t===`error`||t===`warn`?console[t](e,n):console.log(e,n))}}const ut=/^[A-Z0-9_]+$/,dt=4096,ft=65536;function pt(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(!ut.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>dt)throw Error(`build setting value for "${e}" is too large: got ${t} bytes, max ${dt} bytes`);if(n+=Buffer.byteLength(e,`utf8`)+t,n>ft)throw Error(`build settings payload is too large: max ${ft} bytes`)}}const mt=e=>new Promise(t=>setTimeout(t,e)),ht=/failed: (?:502|503|504)\b|\bEOF\b|ECONNRESET|ECONNREFUSED|socket hang up|fetch failed/i;function gt(e){let t=e instanceof Error?e.message:String(e);return ht.test(t)}async function _t(e,t={}){let n=t.sleep??mt,r=t.attempts??5,i=t.retryOn??gt,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 vt(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 yt(e,t){let n=await J(await l.fetch(`${e}/info`,{method:`GET`,headers:{Authorization:`Bearer ${t}`}}),`GET /info`);if(!n.homeDir)throw Error(`GET /info response is missing homeDir`);return{homeDir:vt(n.homeDir),...n.xcode?{xcode:n.xcode}:{}}}function bt(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 xt=class extends b{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`}},St=class extends b{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 Ct(e,t){return wt(e,t,e=>new St(e))}function q(e,t){return wt(e,t,e=>new xt(e))}async function wt(e,t,n){if(e.status===404)throw await e.text().catch(()=>void 0),n(t);return J(e,t)}async function J(e,t){let n=await e.text();if(!e.ok)throw g(t,e.status,n,e.headers);if(!n.trim())throw Error(`${t} returned an empty response`);return JSON.parse(n)}var Tt=class extends $e{listBuildLogs(e,t){return this._client.get(W`/v1/xcode_instances/${e}/build_logs`,t)}listBazelBuildLogs(e,t){return this._client.get(W`/v1/xcode_instances/${e}/bazel_build_logs`,t)}create(e,t){return super.create(e,t)}getCache(e,t){return this._client.get(W`/v1/xcode_instances/${e}/cache`,t)}bindCacheKey(e,t,n){return this._client.put(W`/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 ot({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=e.instance.status.token}else t=e.apiUrl,n=e.token;let r=lt(`[XcodeInstance]`,e.logLevel??`info`),i=this._client,a,s=()=>(a??=yt(t,n),a),u=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=e.status.token}else r=e.apiUrl,i=e.token;return J(await l.fetch(`${t}/simulator`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({apiUrl:r,token:i})}),`POST /simulator`)},d=async e=>{try{return await i.iosInstances.delete(e),!0}catch{return!1}};return{async sync(e,i){let{cacheKey:a,basisCacheDir:c}=st(e,i?.basisCacheDir),l=i?.additionalFiles&&i.additionalFiles.length>0?await s():void 0,u=i?.additionalFiles?.map(e=>({localPath:e.localPath,remotePath:l&&e.remotePath.startsWith(`~/`)?`${l.homeDir}/${e.remotePath.slice(2)}`:e.remotePath})),d={apiUrl:t,token:n,udid:a,install:i?.install??!0,ignoreFn:await p(e,{basisCacheDir:c,log:r,xcodeDefaults:!0,...i?.include?{include:i.include}:{},...i?.ignore?{additional:i.ignore}:{}}),basisCacheDir:c,watch:i?.watch??!0,launchMode:`ForegroundIfRunning`,log:r,syncSymlinks:!0,...u?{additionalFiles:u}:{},...i?.onSyncComplete?{onSyncComplete:i.onSyncComplete}:{}},f=await o(e,d),m={};return f.bytesSent!==void 0&&(m.bytesSent=f.bytesSent),f.stopWatching&&(m.stopWatching=f.stopWatching),m},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&&pt(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=K(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 c(e,s)}return a?.upload&&`signedUploadUrl`in a.upload&&(o.signedUploadUrl=a.upload.signedUploadUrl),c(o,s)},run(e,i){if(e.trim()===``)throw Error(`commandLine must not be empty`);if(i?.timeoutSeconds!==void 0&&(!Number.isInteger(i.timeoutSeconds)||i.timeoutSeconds<1||i.timeoutSeconds>21600))throw Error(`timeoutSeconds must be an integer between 1 and 21600`);let a={command:`run`,commandLine:e,cwd:i?.cwd??`.`,...i?.env&&{env:i.env},...i?.timeoutSeconds!==void 0&&{timeoutSeconds:i.timeoutSeconds}};return c(a,{apiUrl:t,token:n,log:r})},async getSimulator(){return J(await l.fetch(`${t}/simulator`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /simulator`)},attachSimulator:u,attachNewSimulator:async()=>{let e=await i.iosInstances.create({wait:!0});try{await u(e)}catch(t){throw await d(e.metadata.id),t}return{iosInstanceId:e.metadata.id,simulator:e}},deleteSimulator:d,async getXcode(){return Ct(await l.fetch(`${t}/xcode`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /xcode`)},async setXcode(e){return Ct(await l.fetch(`${t}/xcode`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify({version:e})}),`POST /xcode`)},getInfo:()=>yt(t,n),async startRbe(e){return q(await l.fetch(`${t}/rbe`,{method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${n}`},body:JSON.stringify(e??{})}),`POST /rbe`)},async getRbe(){return q(await l.fetch(`${t}/rbe`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe`)},async stopRbe(){return q(await l.fetch(`${t}/rbe`,{method:`DELETE`,headers:{Authorization:`Bearer ${n}`}}),`DELETE /rbe`)},async startRbeTunnel(r){return _(bt(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 K(i.assets,e.assetName,e.ttl);r=t.signedUploadUrl,a=t.signedDownloadUrl}else r=e.signedUploadUrl;return{...await _t(async()=>{let e=await l.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 J(e,`POST /rbe/upload`)},{retryOn:e=>gt(e)||v(e,400)&&/no successful RBE app build/i.test(e.body)}),...a&&{signedDownloadUrl:a}}},async getActiveRbeBuilds(){return q(await l.fetch(`${t}/rbe/builds/active`,{method:`GET`,headers:{Authorization:`Bearer ${n}`}}),`GET /rbe/builds/active`)},async getRecentRbeBuilds(){return q(await l.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,s=()=>{f.close(),r?.signal?.removeEventListener(`abort`,d)},c=e=>{o||(o=!0,s(),i(e))},u=e=>{o||(o=!0,s(),a(e))},d=()=>u(Error(`waiting for build ${e} was aborted`)),f=y({url:`${t}/exec/${e}/events`,fetch:m(l.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}c(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 Et(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 Dt=class extends G{listBuildLogs(e,t){return this._client.get(W`/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=e.instance.status.token}else t=e.apiUrl,n=e.token;let r=lt(`[GradleInstance]`,e.logLevel??`info`),i=this._client;return{async sync(e,i){let{cacheKey:a,basisCacheDir:s}=st(e,i?.basisCacheDir),c=i?.ignore,l={apiUrl:t,token:n,udid:a,install:!1,ignoreFn:await p(e,{basisCacheDir:s,log:r,xcodeDefaults:!1,nestedGitignore:!0,additional:c?e=>Et(e)||c(e):Et,...i?.include?{include:i.include}:{}}),basisCacheDir:s,watch:!1,launchMode:`ForegroundIfRunning`,log:r,syncSymlinks:!0},u=await o(e,l),d={};return u.bytesSent!==void 0&&(d.bytesSent=u.bytesSent),d},gradlebuild(e){let a={command:`gradlebuild`,...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=K(i.assets,e.upload.assetName,e.upload.ttl).then(e=>(a.signedUploadUrl=e.signedUploadUrl,a.additionalMetadata={signedDownloadUrl:e.signedDownloadUrl},a));return c(o,{apiUrl:t,token:n,log:r})}return e?.upload&&`signedUploadUrl`in e.upload&&(a.signedUploadUrl=e.upload.signedUploadUrl),c(a,{apiUrl:t,token:n,log:r})}}}};G.prototype.listBuildLogs=Dt.prototype.listBuildLogs,G.prototype.createClient=Dt.prototype.createClient;const Y=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 X,Z,Q,Ot,$=class{constructor({baseURL:e=Y(`LIMRUN_BASE_URL`),apiKey:t=Y(`LIM_API_KEY`)??null,...n}={}){X.add(this),Q.set(this,void 0),this.androidInstances=new Qe(this),this.assets=new Je(this),this.iosInstances=new Xe(this),this.xcodeInstances=new Tt(this),this.gradleInstances=new G(this),this.analytics=new Be(this),this.scopedTokens=new Ge(this);let r={apiKey:t,...n,baseURL:e||`https://api.limrun.com`};this.baseURL=r.baseURL,this.timeout=r.timeout??Z.DEFAULT_TIMEOUT,this.logger=r.logger??console;let i=`warn`;this.logLevel=i,this.logLevel=A(r.logLevel,`ClientOptions.logLevel`,this)??A(Y(`LIMRUN_LOG`),`process.env['LIMRUN_LOG']`,this)??i,this.fetchOptions=r.fetchOptions,this.maxRetries=r.maxRetries??2,this.fetch=r.fetch??Se(),S(this,Q,Ee,`f`);let a=Y(`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 U([{Authorization:`Bearer ${this.apiKey}`}])}stringifyQuery(e){return De(e)}getUserAgent(){return`${this.constructor.name}/JS ${O}`}defaultIdempotencyKey(){return`stainless-node-retry-${w()}`}makeStatusError(e,t,n,r){return f.generate(e,t,n,r)}buildURL(e,t,n){let r=!C(this,X,`m`,Ot).call(this)&&n||this.baseURL,i=ue(e)?new URL(e):new URL(r+(r.endsWith(`/`)&&e.startsWith(`/`)?e.slice(1):e)),a=this.defaultQuery(),o=Object.fromEntries(i.searchParams);return(!de(a)||!de(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 ke(this,this.makeRequest(e,t,void 0))}async makeRequest(e,r,i){let a=await e,o=a.maxRetries??this.maxRetries;r??=o,await this.prepareOptions(a);let{req:s,url:c,timeout:l}=await this.buildRequest(a,{retryCount:o-r});await this.prepareRequest(s,{url:c,options:a});let u=`log_`+(Math.random()*(1<<24)|0).toString(16).padStart(6,`0`),f=i===void 0?``:`, retryOf: ${i}`,p=Date.now();if(P(this).debug(`[${u}] sending request`,F({retryOfRequestLogID:i,method:a.method,url:c,options:a,headers:s.headers})),a.signal?.aborted)throw new d;let m=new AbortController,g=await this.fetchWithTimeout(c,s,l,m).catch(n),_=Date.now();if(g instanceof globalThis.Error){let e=`retrying, ${r} attempts remaining`;if(a.signal?.aborted)throw new d;let n=t(g)||/timed? ?out/i.test(String(g)+(`cause`in g?String(g.cause):``));if(r)return P(this).info(`[${u}] connection ${n?`timed out`:`failed`} - ${e}`),P(this).debug(`[${u}] connection ${n?`timed out`:`failed`} (${e})`,F({retryOfRequestLogID:i,url:c,durationMs:_-p,message:g.message})),this.retryRequest(a,r,i??u);throw P(this).info(`[${u}] connection ${n?`timed out`:`failed`} - error; no more retries left`),P(this).debug(`[${u}] connection ${n?`timed out`:`failed`} (error; no more retries left)`,F({retryOfRequestLogID:i,url:c,durationMs:_-p,message:g.message})),n?new h:new ee({cause:g})}let v=`[${u}${f}] ${s.method} ${c} ${g.ok?`succeeded`:`failed`} with status ${g.status} in ${_-p}ms`;if(!g.ok){let e=await this.shouldRetry(g);if(r&&e){let e=`retrying, ${r} attempts remaining`;return await Te(g.body),P(this).info(`${v} - ${e}`),P(this).debug(`[${u}] response error (${e})`,F({retryOfRequestLogID:i,url:g.url,status:g.status,headers:g.headers,durationMs:_-p})),this.retryRequest(a,r,i??u,g.headers)}let t=e?`error; no more retries left`:`error; not retryable`;P(this).info(`${v} - ${t}`);let o=await g.text().catch(e=>n(e).message),s=me(o),c=s?void 0:o;throw P(this).debug(`[${u}] response error (${t})`,F({retryOfRequestLogID:i,url:g.url,status:g.status,headers:g.headers,message:c,durationMs:Date.now()-p})),this.makeStatusError(g.status,s,c,g.headers)}return P(this).info(v),P(this).debug(`[${u}] response start`,F({retryOfRequestLogID:i,url:g.url,status:g.status,headers:g.headers,durationMs:_-p})),{response:g,options:a,controller:m,requestLogID:u,retryOfRequestLogID:i,startTime:p}}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 je(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 u(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&&pe(`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=U([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))}:{},...xe()},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?C(this,Q,`f`).call(this,{body:t,headers:U([n])}):{bodyHeaders:void 0,body:void 0};let r=U([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:we(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)}:C(this,Q,`f`).call(this,{body:t,headers:r})}};Z=$,Q=new WeakMap,X=new WeakSet,Ot=function(){return this.baseURL!==`https://api.limrun.com`},$.Limrun=Z,$.DEFAULT_TIMEOUT=3e5,$.LimrunError=b,$.APIError=f,$.APIConnectionError=ee,$.APIConnectionTimeoutError=h,$.APIUserAbortError=d,$.NotFoundError=r,$.ConflictError=re,$.RateLimitError=ne,$.BadRequestError=te,$.AuthenticationError=a,$.InternalServerError=s,$.PermissionDeniedError=e,$.UnprocessableEntityError=i,$.toFile=Re,$.AndroidInstances=Qe,$.Assets=Je,$.IosInstances=Xe,$.XcodeInstances=Tt,$.GradleInstances=G,$.Analytics=Be,$.ScopedTokens=Ge,process.platform;export{$ as t};
@@ -1 +0,0 @@
1
- import{C as e,b as t,p as n,x as r}from"./owner-identity.js";import{t as i}from"./timeouts.js";import"./process.js";import"./retry.js";const a=[/\/dist\/src\/daemon\.js($|[\s"'])/,/\/dist\/src\/internal\/daemon\.js($|[\s"'])/,/\/src\/daemon\.ts($|[\s"'])/];function o(e){let t=e.toLowerCase().replaceAll(`\\`,`/`);return a.some(e=>e.test(t))}function s(t,i){if(!i||!n(t))return!1;let a=e(t);if(!a||a!==i)return!1;let s=r(t);return s?o(s):!1}function c(e,t){try{return process.kill(e,t),!0}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return!1;throw e}}function l(e){if(!n(e.pid))return`released`;let i=t([e.pid]).get(e.pid);if(!i||i.state.startsWith(`Z`))return`exiting`;if(i.startTime!==e.startTime)return`recycled`;let a=r(e.pid);return a?o(a)?`ours`:`recycled`:`exiting`}async function u(e,t){let n=Date.now(),r=n+t.timeoutMs,a=t.pollMs??100,o=()=>{let t=l(e);return t===`released`||t===`recycled`},s=o();for(;!s&&Date.now()<r;)await i(a),s=o();return{exited:s,elapsedMs:Date.now()-n}}function d(e,t){return s(e.pid,e.startTime)?c(e.pid,t):!1}async function f(e,t){if(!t.expectedStartTime)return;let n={pid:e,startTime:t.expectedStartTime};d(n,`SIGTERM`)&&((await u(n,{timeoutMs:t.termTimeoutMs})).exited||d(n,`SIGKILL`)&&await u(n,{timeoutMs:t.killTimeoutMs}))}export{u as i,f as n,c as r,s as t};
@@ -1 +0,0 @@
1
- import{N as e}from"./sdk-contracts.js";import{D as t,d as n}from"./sdk-device.js";import{n as r}from"./gesture-admission.js";const i={visionos:`visionOS uses spatial input and does not support two-finger touch synthesis.`,tvos:`tvOS has no touch input — this gesture is supported on Android and the iOS simulator only.`,macos:`macOS automation has no multi-touch input — this gesture is supported on Android and the iOS simulator only.`};function a(a,s){if(!n(a.platform))throw o(s,a.platform);let c=t(a);if(c!==`ios`&&c!==`ipados`||a.kind!==`simulator`)throw c===`ios`||c===`ipados`?new e(`UNSUPPORTED_OPERATION`,`gesture ${s} is not supported on physical iOS devices`,{hint:`Two-finger gesture synthesis is iOS-simulator only — not available on physical iOS devices.`}):o(s,r[c],i[c])}function o(t,n,r){return new e(`UNSUPPORTED_OPERATION`,`gesture ${t} is not supported on ${n}`,r===void 0?void 0:{hint:r})}export{a as n,i as t};
@@ -1 +0,0 @@
1
- import{N as e}from"./sdk-contracts.js";import{mn as t}from"./sdk-batch.js";import{t as n}from"./script.js";import{t as r}from"./session-paths.js";const i=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function a(t){if(t!==t.trim()||!n.test(t))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(t.startsWith(`AD_`))throw new e(`INVALID_ARGS`,`Invalid --record-as variable "${t}": the AD_* namespace is reserved for built-in replay variables.`);return t}function o(e){return`\${${e}}`}function ee(e){let t=i.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}function s(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}const c={kind:`none`};function l(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function te(e){return e.kind===`repair`?{...e,status:`armed`}:e}function u(e){return e.kind===`none`?void 0:e.target}function d(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function f(e){return e.kind===`authoring`&&e.status===`aborted`}function p(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function m(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function h(e){return{kind:`authoring`,status:`armed`,target:l(void 0,e)}}function g(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function _(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function v(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:l(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function y(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function b(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function ne(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function re(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function ie(e){return e.kind===`repair`?e.boundary:void 0}function x(e){return e.kind===`repair`?e.sourcePath:void 0}function S(e){return e.kind===`repair`&&e.status!==`committed`}function C(e){let t=u(e);return t?.kind===`explicit`?t.path:void 0}function w(e){return u(e)?.force===!0}function T(e){return e?.scriptPublication??c}function E(e){let t=T(e);return t.kind===`authoring`&&t.status===`armed`}function D(e,t){e.scriptPublication=h({path:t.path===void 0?void 0:r(t.path),force:t.force===!0})}function O(e){e.scriptPublication=g(T(e))}function k(e){return p(T(e))}function A(e,t){if(!t.saveScript||f(T(e)))return;let n={path:typeof t.saveScript==`string`?r(t.saveScript):void 0,force:t.force===!0},i=T(e);if(i.kind===`repair`){e.scriptPublication=v(i,{requested:n,boundary:i.boundary,sourcePath:i.sourcePath});return}if(i.kind===`authoring`){e.scriptPublication={...i,target:l(i.target,n)};return}e.scriptPublication=h(n)}function j(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:l(n.target,{path:t.explicitPath===void 0?void 0:r(t.explicitPath),force:t.liveForce===!0})})}function M(e,t){e.scriptPublication=_(T(e),t)}function N(e,t){let n=T(e);n.kind===`authoring`&&(e.scriptPublication=_(n,t))}function P(e,t){return t===!0||w(T(e))}function F(e){return m(T(e))}const ae=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),I=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),L=new Set([`cost`,`evidence`,`resolution`,`settle`]),R=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),z=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function B(e,t,n){if(!e)return e;let r=le(e.selectorChain),i=e=>q(e,t);return{...J(e,e=>ce(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function V(e,t){if(!e)return e;let n=Z(t);return J(e,e=>Q(e,n),e=>G(e,t))}function H(e,t){if(!e)return e;let n=Z(t);return{...e,...e.label===void 0?{}:{label:Q(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:Q(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:Q(e.scrollRegion.label,n)}}}:{}}}function U(e,t){return!!(e.label!==void 0&&W(e.label,t)||e.ancestry.some(e=>e.label&&W(e.label,t))||e.scrollRegion?.label&&W(e.scrollRegion.label,t))}function W(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function G(e,t){for(let n of t.keys())if(q(e,n))return!0;return!1}function K(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function q(e,n){return t(e,n)}function J(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[ae.has(e)?e:t(e),oe(r,e,t,n)]))}function oe(e,t,n,r){return typeof e==`string`&&I.has(t)?e:t===`selectorChain`&&$(e)?se(e,r):Y(e,n,r,L.has(t)?t:void 0)}function Y(e,t,n,r){if(typeof e==`string`)return r&&z.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>Y(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?R.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),Y(a,t,n,o?`${r}.${e}`:void 0)]}))}function se(e,t){return e.filter(e=>!t(e))}function ce(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?e:t.trim()?r.map(e=>e.replaceAll(t,n)).join(n):n}const X=/\$\{[A-Z_][A-Z0-9_]*\}/y;function Z(e){return[...e].sort(([e],[t])=>t.length-e.length)}function Q(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){X.lastIndex=r;let t=X.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function $(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function le(e){return $(e)?e:void 0}export{s as A,S as C,x as D,ie as E,o as M,a as N,w as O,d as S,b as T,re as _,U as a,te as b,D as c,k as d,F as f,c as g,j as h,H as i,ee as j,C as k,P as l,N as m,K as n,O as o,M as p,V as r,A as s,B as t,E as u,v,y as w,p as x,ne as y};
@@ -1 +0,0 @@
1
- import{B as e,F as t,G as n,N as r,R as i}from"./sdk-contracts.js";import{n as a}from"./entities.js";import{t as o}from"./parser.js";import{A as s,I as c,a as l,i as u,j as d,k as f,o as p,t as m}from"./host.js";import{f as h,u as g}from"./runner-session-types.js";import{d as _,i as v,m as y,r as ee,s as te,t as ne,v as b}from"./runner-error-classification.js";import re from"node:net";import x from"node:http";const S=new Map;function C(e,t){let n,r=!1;return{markUsbmuxUnattached:()=>{r=!0},resolveRoute:async(i,a=!1)=>{if(e.kind!==`device`)return T(e,t,null,!1);let o=s(e);if(o.backend===`xctest`||!r)return ie(e,t);if(!a){let r=ae(e.id);if(r)return T(e,t,r,!0);if(n!==void 0)return T(e,t,n,!1)}let{tunnelIp:c}=await o.resolveTunnel(e,i);return n=c,c&&oe(e.id,c),T(e,t,c,!1)}}}function w(e){S.delete(e)}function ie(e,t){return{kind:`usbmux`,endpoints:[`usbmux://${e.id}:${t}/command`],cachedTunnelIp:!1}}function T(e,t,n,r){let i=[`http://127.0.0.1:${t}/command`];return e.kind===`device`&&n&&i.unshift(`http://[${n}]:${t}/command`),{kind:`network`,endpoints:i,cachedTunnelIp:r}}function ae(e){let t=S.get(e);return t?t.expiresAt<=Date.now()?(S.delete(e),null):t.ip:null}function oe(e,t){S.set(e,{ip:t,expiresAt:Date.now()+3e4})}const E=`Connect the device by cable, trust this Mac, keep it unlocked, and retry.`;async function D(e,t,n,r,i){let a=m.fromTimeoutMs(r);return await se(e,t,await O(e,t,a.remainingMs(),i),n,a.remainingMs(),i)}async function O(e,t,n,i){let a=await k(e,n,i);try{await A(a,1,M(`ListDevices`));let e=ce((await j(a,n,i)).payload.toString(`utf8`),t);if(e!==void 0)return e;throw new r(`DEVICE_NOT_FOUND`,`iOS device is not available through usbmux`,{deviceId:t,backend:`xctest`,usbmuxDeviceAttached:!1,hint:E})}finally{a.destroy()}}async function se(e,t,n,r,i,a){let o=await k(e,i,a);try{await A(o,2,M(`Connect`,{DeviceID:n,PortNumber:I(r)}));let e=ue((await j(o,i,a)).payload.toString(`utf8`),`Number`);if(e!==0)throw F({result:e,udid:t,deviceId:n,port:r});return o}catch(e){throw o.destroy(),e}}async function k(e,n,i){if(L(n,`connect to usbmuxd`),i?.aborted)throw t();return await new Promise((a,o)=>{let s=re.createConnection(e),c=!1,l=setTimeout(()=>{p(new r(`COMMAND_FAILED`,`Timed out connecting to usbmuxd`,{backend:`xctest`,socketPath:e,timeoutMs:n}))},n),u=()=>p(),d=e=>p(e),f=()=>p(t()),p=e=>{c||(c=!0,clearTimeout(l),s.off(`connect`,u),s.off(`error`,d),i?.removeEventListener(`abort`,f),e?(s.destroy(),o(e)):a(s))};s.once(`connect`,u),s.once(`error`,d),i?.addEventListener(`abort`,f,{once:!0})})}async function A(e,t,n){let r=Buffer.from(n,`utf8`),i=Buffer.alloc(16+r.length);i.writeUInt32LE(i.length,0),i.writeUInt32LE(1,4),i.writeUInt32LE(8,8),i.writeUInt32LE(t,12),r.copy(i,16),!e.write(i)&&await new Promise((t,n)=>{e.once(`drain`,t),e.once(`error`,n)})}async function j(e,n,i){if(L(n,`read usbmuxd response`),i?.aborted)throw t();return await new Promise((a,o)=>{let s=Buffer.alloc(0),c=!1,l=setTimeout(()=>m(new r(`COMMAND_FAILED`,`Timed out reading usbmuxd response`,{backend:`xctest`,timeoutMs:n})),n),u=e=>{if(s=Buffer.concat([s,e]),s.length<16)return;let t=s.readUInt32LE(0);if(t<16||t>4194304){m(new r(`COMMAND_FAILED`,`Invalid usbmuxd response length`));return}s.length<t||m(void 0,{payload:s.subarray(16,t)})},d=e=>m(e),f=()=>m(new r(`COMMAND_FAILED`,`usbmuxd closed the connection unexpectedly`)),p=()=>m(t()),m=(t,n)=>{c||(c=!0,clearTimeout(l),e.off(`data`,u),e.off(`error`,d),e.off(`close`,f),i?.removeEventListener(`abort`,p),e.pause(),t?o(t):a(n))};e.on(`data`,u),e.once(`error`,d),e.once(`close`,f),i?.addEventListener(`abort`,p,{once:!0}),e.resume()})}function M(e,t={}){return`<?xml version="1.0" encoding="UTF-8"?><plist version="1.0"><dict>${[[`BundleID`,`com.callstack.agent-device`],[`ClientVersionString`,`agent-device`],[`MessageType`,e],[`ProgName`,`agent-device`],[`kLibUSBMuxVersion`,3],...Object.entries(t)].map(([e,t])=>typeof t==`number`?`<key>${a(e)}</key><integer>${t}</integer>`:`<key>${a(e)}</key><string>${a(t)}</string>`).join(``)}</dict></plist>`}function ce(e,t){for(let n of P(o(e))){let e=le(n);if(e?.udid===t)return e.id}}function le(e){if(e.name!==`dict`)return;let t=N(e,`Properties`);if(t?.name!==`dict`)return;let n=N(t,`SerialNumber`)?.text,r=Number(N(e,`DeviceID`)?.text);if(!(!n||!Number.isSafeInteger(r)||r<=0))return{udid:n,id:r}}function ue(e,t){for(let n of P(o(e))){if(n.name!==`dict`)continue;let e=N(n,t);if(e?.name!==`integer`)continue;let r=Number(e.text);if(Number.isSafeInteger(r))return r}}function N(e,t){for(let n=0;n<e.children.length-1;n+=1){let r=e.children[n];if(r?.name===`key`&&r.text===t)return e.children[n+1]}}function*P(e){for(let t of e)yield t,yield*P(t.children)}function F(e){let{result:t,udid:n,deviceId:i,port:a}=e;return t===2?new r(`DEVICE_NOT_FOUND`,`iOS device is no longer available through usbmux`,{deviceId:n,backend:`xctest`,usbmuxDeviceAttached:!1,usbmuxResult:t,hint:E}):t===3?new r(`COMMAND_FAILED`,`XCTest runner is not listening on the device port`,{backend:`xctest`,deviceId:i,port:a,usbmuxResult:t,hint:`The device is reachable but nothing is bound to the runner port yet; this resolves once the runner finishes starting.`}):new r(`COMMAND_FAILED`,`Failed to connect to XCTest runner through usbmux`,{backend:`xctest`,deviceId:i,port:a,usbmuxResult:t,hint:`Keep the device connected by cable and unlocked, then retry.`})}function I(e){return(e&255)<<8|e>>>8&255}function L(e,t){if(!(e>0))throw new r(`COMMAND_FAILED`,`No time remaining to ${t}`,{backend:`xctest`,timeoutMs:e})}function R(e){return{postCommand:async(t,n,a,o,s)=>{let c=m.fromTimeoutMs(o),l=await D(e,t,n,c.remainingMs(),s).catch(e=>{throw e instanceof r?i(e,`no`):e});try{return await B(l,a,c.remainingMs(),s)}catch(e){throw l.destroy(),e}}}}const z=R(`/var/run/usbmuxd`);async function B(e,n,i,a){if(de(i),a?.aborted)throw t();let o=Buffer.from(JSON.stringify(n),`utf8`),s=AbortSignal.timeout(i),c=a?AbortSignal.any([a,s]):s,l=new x.Agent;l.createConnection=(t,n)=>(n?.(null,e),e);try{let t=await V(l,e,o,c);return new Response((await H(t)).toString(`utf8`),{status:t.statusCode??500})}catch(e){throw a?.aborted?t():s.aborted?new r(`COMMAND_FAILED`,`Timed out waiting for XCTest runner over usbmux`,{backend:`xctest`,timeoutMs:i}):e}finally{l.destroy(),e.destroy()}}async function V(e,t,n,r){return await new Promise((i,a)=>{let o=x.request({method:`POST`,host:`127.0.0.1`,path:`/command`,headers:{"Content-Type":`application/json`,"Content-Length":n.length,Connection:`close`},agent:e,signal:r},i);o.once(`error`,a),t.resume(),o.end(n)})}async function H(e){let t=[],n=0;for await(let i of e){let e=Buffer.isBuffer(i)?i:Buffer.from(i);if(n+=e.length,n>67108864)throw new r(`COMMAND_FAILED`,`XCTest runner response exceeded size limit`);t.push(e)}return Buffer.concat(t)}function de(e){if(!(e>0))throw new r(`COMMAND_FAILED`,`No time remaining to send XCTest runner command`,{backend:`xctest`,timeoutMs:e})}const U=45e3;async function fe(e,n,i,a=U,o){if(o?.aborted)throw t();let s=m.fromTimeoutMs(a),c=C(e,n),l=await c.resolveRoute(s.remainingMs());if(l.kind===`usbmux`)try{return await pe(e,n,i,s,o)}catch(t){if(!W(e,t))throw t;c.markUsbmuxUnattached(),l=await c.resolveRoute(s.remainingMs())}let u=s.remainingMs();if(u<=0)throw new r(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:a});let d=l.endpoints[0];if(!d)throw new r(`COMMAND_FAILED`,`Runner command endpoint not available`,{port:n,endpoints:l.endpoints});return await G(d,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i)},u,o)}async function pe(e,t,n,i,a){let o=i.remainingMs();if(o<=0)throw new r(`COMMAND_FAILED`,`Runner command deadline exceeded`,{port:t,timeoutMs:o});return await z.postCommand(e.id,t,n,o,a)}function W(e,t){return _(t)?s(e).backend!==`xctest`:!1}async function G(e,t,n,i){let a=AbortSignal.timeout(n),o=i?AbortSignal.any([i,a]):a;try{return await fetch(e,{...t,signal:o})}catch(e){throw e===a.reason?new r(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:n},e):e}}const K=45e3,q=2e4;async function me(e,r,i,a,o=K,s,c){let l=m.fromTimeoutMs(o),{resolveRoute:u,markUsbmuxUnattached:f}=C(e,r),p=await u(l.remainingMs()),h=null,g=!1,v=Math.max(1,Math.ceil(o/250));try{return await d(async({deadline:t})=>{let n=await he({device:e,port:r,command:i,timeoutMs:o,logPath:a,session:s,route:p,resolveRoute:u,markUsbmuxUnattached:f,signal:c,attemptDeadline:t,setRoute:e=>{p=e},setLastError:e=>{h=e,te(e)||(g=!0)}});if(n)return n;throw ye({port:r,endpoints:p.endpoints,lastError:h,signal:c})},{maxAttempts:v,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:b},{deadline:l,phase:`ios_runner_connect`,signal:c,retryWakeSignal:e.kind===`simulator`?s?.startupRetryWake:void 0})}catch(e){if(c?.aborted||n(e))throw t();if(_(e))throw e;h||=e}if(c?.aborted)throw t();if(e.kind===`simulator`){let t=l.remainingMs();if(t<=0)throw J(Q({port:r,endpoints:p.endpoints,logPath:a,lastError:h}),g);let n=await Z(e,r,i,t,c).catch(e=>{throw J(e,g)});return new Response(n.body,{status:n.status})}throw s?.child.exitCode!==null&&s?.child.exitCode!==void 0?J(await $({session:s,port:r,logPath:a}),g):J(Q({port:r,endpoints:p.endpoints,logPath:a,lastError:h,deviceStates:s?.startupDeviceStates}),g)}function J(t,n){return t instanceof r?n?i(t,`unknown`):e(t,`no`):t}async function he(e){await ge(e);let t=await _e(e);return t.response?t.response:await ve(e)||await Y(e,t.usedCachedTunnelIp)}async function ge(e){if(e.attemptDeadline?.isExpired())throw new r(`COMMAND_FAILED`,`Runner connection deadline exceeded`,{port:e.port,timeoutMs:e.timeoutMs});if(e.session?.child.exitCode!==null&&e.session?.child.exitCode!==void 0)throw await $({session:e.session,port:e.port,logPath:e.logPath})}async function _e(e){let t=e.route,n=!1;e.device.kind===`device`&&(t=await e.resolveRoute(e.attemptDeadline?.remainingMs()),n=t.cachedTunnelIp,e.setRoute(t));let r=async t=>{let n=t.cachedTunnelIp?t.endpoints[0]:null;return await X(e.device,t,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onUsbmuxUnattached:e.markUsbmuxUnattached,onError:(t,r)=>{e.setLastError(r),e.device.kind===`device`&&t===n&&w(e.device.id)}})},i=await r(t);if(i||t.kind!==`usbmux`)return{response:i,usedCachedTunnelIp:n};let a=await e.resolveRoute(e.attemptDeadline?.remainingMs());return a.kind===`usbmux`?{response:null,usedCachedTunnelIp:n}:(e.setRoute(a),{response:await r(a),usedCachedTunnelIp:a.cachedTunnelIp})}async function ve(e){return e.device.kind!==`simulator`||e.session?.state!==`ready`?null:await xe(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError})}async function Y(e,t){if(e.device.kind!==`device`||!t)return null;w(e.device.id);let n=await e.resolveRoute(e.attemptDeadline?.remainingMs(),!0);return e.setRoute(n),await X(e.device,n,{command:e.command,port:e.port,timeoutMs:e.timeoutMs,signal:e.signal,attemptDeadline:e.attemptDeadline,onError:(t,n)=>{e.setLastError(n)}})}function ye(e){if(e.signal?.aborted)throw t();return new r(`COMMAND_FAILED`,`Runner endpoint probe failed`,{port:e.port,endpoints:e.endpoints,lastError:e.lastError?String(e.lastError):void 0,...y(`runner_endpoint_probe_exhausted`)})}async function X(e,a,o){if(a.kind===`network`)return await be(a.endpoints,o);let s=a.endpoints[0];try{let t=o.attemptDeadline?.remainingMs()??o.timeoutMs;if(t<=0)throw i(new r(`COMMAND_FAILED`,`Runner connection deadline exceeded`,{port:o.port,timeoutMs:o.timeoutMs}),`no`);return await z.postCommand(e.id,o.port,o.command,Math.min(q,t),o.signal)}catch(r){if(o.signal?.aborted||n(r))throw t();if(_(r)){if(!W(e,r))throw r;return o.onUsbmuxUnattached?.(),null}return o.onError(s,r),null}}async function be(e,a){let{command:o,port:s,timeoutMs:c,signal:l,attemptDeadline:u,onError:d}=a;for(let a of e)try{let e=u?.remainingMs()??c;if(e<=0)throw i(new r(`COMMAND_FAILED`,`Runner connection deadline exceeded`,{port:s,timeoutMs:c}),`no`);return await G(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(o)},Math.min(q,e),l)}catch(e){if(l?.aborted||n(e))throw t();d(a,e)}return null}async function xe(e,r,i,a){let{signal:o,attemptDeadline:s,onError:c}=a,l=s?.remainingMs()??45e3;if(l<=0)return null;try{let t=await Z(e,r,i,l,o);return new Response(t.body,{status:t.status})}catch(e){if(o?.aborted||n(e))throw t();return c(e),null}}async function Z(e,t,n,r,i){let a=JSON.stringify(n),o=l(e,[`spawn`,e.id,`/usr/bin/curl`,`-s`,`-X`,`POST`,`-H`,`Content-Type: application/json`,`--data`,a,`http://127.0.0.1:${t}/command`]);return{status:200,body:f(await c(o,{allowFailure:!0,timeoutMs:r,signal:i}),`Runner did not accept connection (simctl spawn)`,e=>{let n=p({message:`Runner did not accept connection (simctl spawn)`,stdout:e.stdout,stderr:e.stderr,context:{platform:`ios`,phase:`connect`}});return{port:t,reason:n,hint:u(n),...y(`runner_connect_refused`),dispatched:e.exitCode===7?`no`:`unknown`}}).stdout}}function Se(e,t,n,r){let i=`${e}\n${t}\n${n}`.toLowerCase();if(i.includes(`device is busy`)&&i.includes(`connecting`))return`Target iOS device is still connecting. Keep it unlocked, wait for device trust/connection to settle, then retry.`;let a=r??`IOS_RUNNER_CONNECT_TIMEOUT`;return a===`IOS_RUNNER_DEVICE_NOT_PROVISIONED`?u(a):`${u(a)} ${ne}`}function Q(e){let{port:t,endpoints:n,logPath:i,lastError:a,deviceStates:o}=e,s=`Runner did not accept connection`,c=new r(`COMMAND_FAILED`,s,{port:t,endpoints:n,logPath:i,lastError:a?String(a):void 0,reason:p({error:a,message:s,context:{platform:`ios`,phase:`connect`}}),hint:u(`IOS_RUNNER_CONNECT_TIMEOUT`),...y(`runner_connect_refused`)});return v(c,o)}async function $(e){let{session:t,port:n,logPath:i}=e,a=await t.testPromise,o=`Runner did not accept connection (xcodebuild exited early)`,s=t.readLogTail?.(65536)??``,c=p({message:o,stdout:s,stderr:s,context:{platform:`ios`,phase:`connect`}}),l=g(t.device),u=ee(new r(`COMMAND_FAILED`,o,{stderr:s,...l})),d=u.reason===`simulator_set_destination_not_found`,f=new r(`COMMAND_FAILED`,d?h(o,t.device,l):o,{port:n,logPath:t.runnerLogPath??i,xcodebuild:{exitCode:a.exitCode,stderr:s},reason:d?u.reason:c,hint:d?u.hint:Se(o,s,s,c),...l,...y(`xcodebuild_exited_early`)});return v(f,t.startupDeviceStates)}export{fe as i,me as n,U as r,K as t};
@@ -1 +0,0 @@
1
- import{G as e,N as t,P as n}from"./sdk-contracts.js";import{m as r}from"./sdk-device.js";import{t as i}from"./parser.js";import{D as a,M as o,P as s,U as c,V as l,W as u,d,f,g as p,h as m,k as h,n as ee,u as te,w as g,y as _}from"./host.js";import{d as ne,r as re}from"./apple-runner-platform.js";import{_ as ie,a as ae,b as oe,c as se,d as ce,f as le,g as ue,h as de,l as v,m as y,n as b,p as x,r as S,v as fe,y as C}from"./runner-cache-metadata.js";import{f as pe,p as me,u as he,v as w}from"./runner-session-types.js";import{r as ge}from"./runner-error-classification.js";import T from"node:path";import E from"node:fs";import _e from"node:crypto";import ve from"node:os";const D=new Set;function O(e){return T.join(e,b)}function ye(e,t){E.mkdirSync(e,{recursive:!0}),E.writeFileSync(O(e),`${JSON.stringify(t,null,2)}\n`)}async function be(e,t){if(e.cache===`external`){F(`preserve`,`external_bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});return}D.add(e.derived),await u({acquire:()=>k(e.derived),task:async()=>{F(`clean`,`bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),N(e.derived),M(e.derived)}})}async function k(e){return await ee({lockDirPath:xe(e),owner:{pid:process.pid,startTime:a(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,pollMs:100,ownerGraceMs:5e3,description:`iOS runner cache lock`})}function xe(e){return T.join(T.dirname(e),`${T.basename(e)}.lock`)}function Se(e,t){!De()&&!t&&!D.has(e)||(F(`clean`,t?`forced_rebuild`:`forced_clean`,{derived:e}),N(e),M(e),D.delete(e))}async function A(e,t,n,r){let{buildRunnerCacheArtifactManifest:i}=await import(`./runner-artifact-manifest.js`),a=i(e,n,r);return ye(e,a.ok?{...t,artifacts:a.artifacts}:t),a.ok?null:(F(`preserve`,`uncertifiable_products`,{derived:e,xctestrunPath:n,...a.refusal?{refusal:a.refusal}:{}}),a.refusal)}function j(e,n){if(e)throw new t(`COMMAND_FAILED`,`The Apple runner products cannot be certified for cache reuse`,{reason:`runner_cache_uncertifiable`,refusalReason:e.reason,refusingPath:e.path??n,...e.reason===`root_unusable`?{}:{resolvesTo:e.target},derived:n,hint:`Inspect ${e.path??n} under ${n}. A symlinked or unreadable product tree must be replaced; run pnpm build:xcuitest with a clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH.`})}function M(e){try{if(!E.existsSync(e))return;if(T.basename(e)!==`derived`){E.rmSync(e,{recursive:!0,force:!0});return}for(let t of E.readdirSync(e,{withFileTypes:!0}))we(t.name)&&E.rmSync(T.join(e,t.name),{recursive:!0,force:!0})}catch{}}const Ce=new Set([b,`Build`,`BuildCache.noindex`,`Index.noindex`,`Logs`,`ModuleCache.noindex`,`SDKStatCaches.noindex`,`SourcePackages`,`TextBasedInstallAPI`,`info.plist`]);function we(e){return Ce.has(e)}function Te(e){try{let t=JSON.parse(E.readFileSync(O(e),`utf8`));return!t||typeof t!=`object`||Array.isArray(t)?null:t}catch{return null}}function Ee(e,t){let n=Te(e);return n?C(S(n))===C(S(t))?{ok:!0,metadata:n}:{ok:!1,reason:`cache_metadata_mismatch`,differences:ae(t,n)}:{ok:!1,reason:`cache_metadata_missing`}}function De(){return p(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)}function N(e,n=process.env){if(n.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()&&!Oe(e))throw new t(`COMMAND_FAILED`,`Refusing to clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH automatically`,{derivedPath:e,hint:`Unset AGENT_DEVICE_IOS_CLEAN_DERIVED, or move AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH under a subdirectory of ${T.join(f(),`.tmp`)}.`})}function Oe(e){let t=T.resolve(f(),`.tmp`),n=T.relative(t,T.resolve(e));return n!==``&&!n.startsWith(`..`)&&!T.isAbsolute(n)}async function P(e){let t=Ee(e.derived,e.expectedCacheMetadata);if(!t.ok)return t.reason===`cache_metadata_mismatch`?{reason:t.reason,xctestrunPath:null,productPaths:[],metadataDifferences:t.differences}:{reason:t.reason,xctestrunPath:null,productPaths:[]};let{validateRunnerCacheArtifactManifest:n}=await import(`./runner-artifact-manifest.js`),r=n(e.derived,t.metadata);return r.ok?{reason:`reuse_ready`,xctestrunPath:r.xctestrunPath,productPaths:r.productPaths}:r.mismatch?{reason:`artifact_content_mismatch`,xctestrunPath:null,productPaths:[],mismatch:r.mismatch}:{reason:`artifact_manifest_missing`,xctestrunPath:null,productPaths:[]}}function ke(e,t){F(`rebuild`,e.reason,{derived:t,...e.reason===`cache_metadata_mismatch`?{metadataDifferences:e.metadataDifferences}:{},...e.reason===`artifact_content_mismatch`?{mismatch:e.mismatch}:{}})}function F(e,t,n){te({level:e===`rebuild`||e===`preserve`?`warn`:`info`,phase:`runner_xctestrun_cache`,data:{action:e,reason:t,...n}})}const Ae=new Set([`RUNNER_PRODUCT_MISSING`,`RUNNER_PRODUCT_REPAIR_FAILED`]),I=[`--force`,`--preserve-metadata=identifier,entitlements,flags,runtime`,`--sign`,`-`];async function L(e,n,i){if(!r(e))return;if(n.length===0)throw new t(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,xctestrunPath:i});let a=Array.from(new Set(n)).sort((e,t)=>t.length-e.length);for(let e of a)if(!E.existsSync(e))throw new t(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,productPath:e,xctestrunPath:i});for(let e of a)await z(e)||await je(e,i)}async function je(e,t){try{let t=T.join(e,`Contents`,`Frameworks`),n=E.existsSync(t)?E.readdirSync(t).sort().map(e=>T.join(t,e)):[];for(let e of n)await o(`codesign`,[...I,e]);await o(`codesign`,[...I,e])}catch(r){let i=n(r,`COMMAND_FAILED`);throw R(e,t,i.message,i.details)}if(!await z(e))throw R(e,t,`Product still fails code signature verification after re-signing`)}function R(e,n,r,i){return new t(`COMMAND_FAILED`,`Failed to repair macOS runner product signature`,{reason:`RUNNER_PRODUCT_REPAIR_FAILED`,productPath:e,xctestrunPath:n,error:r,details:i})}function Me(e){if(!(e instanceof t))return!1;let n=e.details&&typeof e.details==`object`?e.details.reason:void 0;return typeof n==`string`&&Ae.has(n)}async function z(e){return(await o(`codesign`,[`--verify`,`--deep`,`--strict`,e],{allowFailure:!0})).exitCode===0}const B=new Set([`ProductPaths`,`DependentProductPaths`,`TestHostPath`,`TestBundlePath`,`UITargetAppPath`]);async function V(e){let t=await Fe(e);if(!t||t.length===0)return null;let n=T.dirname(e),r=new Set,i=Ne(t,n);for(let e of i.testRootPaths){if(!E.existsSync(e))return null;r.add(e)}for(let e of Pe(i)){if(!e)return null;r.add(e)}return Array.from(r)}function Ne(e,t){let n=[],r=new Set,i=[];for(let a of e){if(a.startsWith(`__TESTHOST__/`)){i.push(a.slice(13));continue}if(!a.startsWith(`__TESTROOT__/`))continue;let e=a.slice(13);n.push(T.join(t,e));let o=He(e);o&&r.add(T.join(t,o))}return{testRootPaths:n,hostRoots:Array.from(r),hostRelativePaths:i}}function Pe(e){return e.hostRelativePaths.map(t=>{let n=e.hostRoots.find(e=>E.existsSync(T.join(e,t)));return n?T.join(n,t):null})}async function Fe(e){let t=await g(e);if(t)return Ie(t);if(process.platform===`darwin`)return null;try{return Be(E.readFileSync(e,`utf8`))}catch{return null}}function Ie(e){let t=new Set;for(let n of[e,...Le(e),...Re(e)])for(let e of ze(n))t.add(e);return Array.from(t)}function Le(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!_(e))continue;let t=e.TestTargets;Array.isArray(t)&&n.push(...t.filter(_))}return n}function Re(e){return Object.values(e).filter(e=>_(e)&&`TestBundlePath`in e)}function ze(e){let t=new Set;for(let[n,r]of Object.entries(e))if(B.has(n)){if(typeof r==`string`){t.add(r);continue}if(Array.isArray(r))for(let e of r)typeof e==`string`&&t.add(e)}return Array.from(t)}function Be(e){return Ve(i(e))}function Ve(e){let t=new Set;return l(e,(e,n)=>{if(B.has(e)){if(n.name===`string`&&n.text){t.add(n.text);return}if(n.name===`array`)for(let e of n.children)e.name===`string`&&e.text&&t.add(e.text)}}),Array.from(t)}function He(e){let t=/\.app(?:\/|$)/.exec(e);return!t||t.index===void 0?null:e.slice(0,t.index+4)}const Ue=[`CFBundleIcons`,`CFBundleIcons~ipad`];async function We(e){await H(nt(e))}async function H(e){let t=e.filter(tt);if(t.length===0)return;let n=e.filter(e=>W(e)&&!U(e));for(let e of t){let t=et(e,n);t&&await Ge(t,e)}}async function Ge(e,t){let n=Ke(e,t),r=await qe(e,t);(n||r)&&(await Xe(t),$e(t))}function Ke(e,t){let n=!1;for(let r of E.readdirSync(e,{withFileTypes:!0}))!r.isFile()||!Qe(r.name)||Ze(T.join(e,r.name),T.join(t,r.name))&&(n=!0);return n}async function qe(e,t){let n=T.join(e,`Info.plist`),r=T.join(t,`Info.plist`),i=await g(n),a=await g(r);if(!i||!a)return!1;let o=Je(i,a);if(o.length===0)return!1;for(let e of o)await Ye(r,e.key,e.value,e.shouldInsert);return!0}function Je(e,t){return Ue.flatMap(n=>{let r=e[n];return r===void 0||JSON.stringify(t[n])===JSON.stringify(r)?[]:[{key:n,value:r,shouldInsert:t[n]===void 0}]})}async function Ye(e,t,n,r){h(await o(`plutil`,[r?`-insert`:`-replace`,t,`-json`,JSON.stringify(n),e],{allowFailure:!0}),`Failed to update XCTest runner icon plist`,{key:t,plistPath:e})}async function Xe(e){h(await o(`codesign`,[`--force`,`--sign`,`-`,`--timestamp=none`,`--generate-entitlement-der`,e],{allowFailure:!0}),`Failed to sign XCTest runner app after icon update`,{runnerAppPath:e})}function Ze(e,t){if(E.existsSync(t)){let n=E.readFileSync(e),r=E.readFileSync(t);return!n.equals(r)&&(E.copyFileSync(e,t),!0)}return E.copyFileSync(e,t),!0}function Qe(e){return/^AppIcon.*\.png$/.test(e)||e===`Assets.car`}function $e(e){let t=new Date;E.utimesSync(e,t,t)}function et(e,t){let n=T.dirname(e);return t.find(e=>T.dirname(e)===n&&T.basename(e)===`AgentDeviceRunner.app`)??t.find(t=>T.dirname(t)===n&&t!==e)??null}function tt(e){return W(e)&&U(e)&&(e.includes(`Debug-iphonesimulator`)||e.includes(`Release-iphonesimulator`)||e.includes(`Debug-appletvsimulator`)||e.includes(`Release-appletvsimulator`))}function U(e){return T.basename(e).endsWith(`-Runner.app`)}function W(e){return T.basename(e).endsWith(`.app`)}function nt(e){if(!E.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let r of E.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let i=T.join(e,r.name);if(W(i)){t.push(i);continue}n.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}const G=`AgentDeviceRunner.env`,K=`session`,rt=`${J(`${G}.${K}`)}-`;function it(e){return q(`${K}-${e.deviceId}-${e.ownerToken}-${e.port}`)}function at(e){return`${rt}${J(q(e))}-[0-9]`}function ot(e){let t=e?T.basename(e):``;if(t.startsWith(`${G}.`))return J(t)}function q(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}function J(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const st={PreferredScreenCaptureFormat:`screenshots`,SystemAttachmentLifetime:`keepNever`,UserAttachmentLifetime:`keepNever`};async function ct(e,t,n,r={}){let i=r.iosXctestEnvDir?.trim(),a=i?T.resolve(i):T.dirname(e);E.mkdirSync(a,{recursive:!0});let o=q(n),s=T.join(a,`${G}.${o}.json`),c=T.join(a,`${G}.${o}.xctestrun`),l=await lt(e);return Y(l,e=>dt(e,t)),ft(l),await ut(l,s,c),{xctestrunPath:c,jsonPath:s}}async function lt(e){let n=await o(`plutil`,[`-convert`,`json`,`-o`,`-`,e],{allowFailure:!0});if(n.exitCode!==0||!n.stdout.trim())throw new t(`COMMAND_FAILED`,`Failed to read xctestrun plist`,{xctestrunPath:e,stderr:n.stderr});try{let e=JSON.parse(n.stdout);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Root must be an object`);return e}catch(n){throw new t(`COMMAND_FAILED`,`Failed to parse xctestrun JSON`,{xctestrunPath:e,error:String(n)})}}async function ut(e,t,n){E.writeFileSync(t,JSON.stringify(e,null,2)),h(await o(`plutil`,[`-convert`,`xml1`,`-o`,n,t],{allowFailure:!0}),`Failed to write xctestrun plist`,{tmpXctestrunPath:n})}function dt(e,t){e.EnvironmentVariables={...e.EnvironmentVariables??{},...t},e.UITestEnvironmentVariables={...e.UITestEnvironmentVariables??{},...t},e.UITargetAppEnvironmentVariables={...e.UITargetAppEnvironmentVariables??{},...t},e.TestingEnvironmentVariables={...e.TestingEnvironmentVariables??{},...t}}function ft(e){Y(e,e=>Object.assign(e,st),{requireTestBundlePath:!0})}function Y(e,t,n={}){let r=e.TestConfigurations;if(Array.isArray(r))for(let e of r)!e||typeof e!=`object`||pt(e.TestTargets,t,n);for(let n of Object.values(e)){let e=X(n,{requireTestBundlePath:!0});e&&t(e)}}function pt(e,t,n){if(Array.isArray(e))for(let r of e){let e=X(r,n);e&&t(e)}}function X(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;return t.requireTestBundlePath&&!n.TestBundlePath?null:n}const mt=new Map,Z=new Set;async function ht(e,t){let n=gt(t);if(n)return n;let r=f(),i=v(e,r,t.budget),a=y(e,i);return await c(mt,a,async()=>await u({acquire:()=>k(a),task:()=>vt({device:e,options:t,projectRoot:r,expectedCacheMetadata:i,derived:a,forceRebuild:t.forceRunnerXctestrunRebuild===!0})}))}function gt(e){let n=e.iosXctestrunFile?.trim();if(!n)return null;let r=T.resolve(n);if(!E.existsSync(r))throw new t(`COMMAND_FAILED`,`Configured iOS XCTest runner .xctestrun file not found`,{configKey:`iosXctestrunFile`,xctestrunPath:r});let i=e.iosXctestDerivedDataPath?.trim(),a=i?T.resolve(i):_t(r);return F(`reuse`,`external_xctestrun`,{derived:a,xctestrunPath:r}),{xctestrunPath:r,derived:a,cache:`external`,artifact:`valid`,buildMs:0,xctestrunPathSource:`external`}}function _t(e){let t=_e.createHash(`sha1`);t.update(e);let n=t.digest(`hex`).slice(0,12);return T.join(ve.tmpdir(),`agent-device-ios-xctest-derived`,n)}async function vt(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a}=e;Se(a,e.forceRebuild);let o=await P({derived:a,expectedCacheMetadata:i}),s=o.reason===`reuse_ready`?`exact`:`miss`;return await yt({device:t,derived:a,expectedCacheMetadata:i,existing:o,cache:s})||(o.reason!==`reuse_ready`&&ke(o,a),o.reason!==`cache_metadata_missing`&&(N(a),M(a)),await bt({device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a,cache:s,reason:o.reason}))}async function yt(e){let{device:t,derived:n,expectedCacheMetadata:r,existing:i,cache:a}=e;if(i.reason!==`reuse_ready`)return null;let o=await xt(t,n,r,i);return o?{xctestrunPath:o,derived:n,cache:a,cacheKey:x(r),artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`}:null}async function bt(e){let{device:n,options:r,projectRoot:i,expectedCacheMetadata:a,derived:o,cache:s,reason:c}=e,l=oe(i);if(!E.existsSync(l))throw new t(`COMMAND_FAILED`,`iOS runner project not found`,{projectPath:l});let u=se(r.budget,`runner_xctestrun_build`),f=Date.now();d({type:`command`,status:`progress`,message:`Building Apple runner...`}),await Tt(n,l,o,r,u);let p=Math.max(0,Date.now()-f),m=Q(o,n);if(!m)throw new t(`COMMAND_FAILED`,`Failed to locate .xctestrun after build`);let h=await V(m);if(!h)throw new t(`COMMAND_FAILED`,`Runner build is missing expected products`,{xctestrunPath:m});return await L(n,h,m),await H(h),j(await A(o,a,m,h),o),F(`build`,`built_new`,{derived:o,xctestrunPath:m}),{xctestrunPath:m,derived:o,cache:s,cacheKey:x(a),artifact:`rebuilt`,buildMs:p,xctestrunPathSource:`build`,reason:c}}async function xt(e,t,n,r){try{return await L(e,r.productPaths,r.xctestrunPath),j(await A(t,n,r.xctestrunPath,r.productPaths),t),F(`reuse`,`reuse_ready`,{derived:t,xctestrunPath:r.xctestrunPath}),r.xctestrunPath}catch(e){if(!Me(e))throw e;return F(`rebuild`,`repair_failed`,{derived:t,xctestrunPath:r.xctestrunPath}),null}}async function St(e){try{let t=f(),n=v(e,t);return(await P({derived:y(e,n),expectedCacheMetadata:n})).reason===`reuse_ready`}catch{return!1}}function Q(e,t){let n=Ct(e);return n.length===0?null:(n.sort((e,n)=>wt(e,n,t)),n[0]?.path??null)}function Ct(e){if(!E.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop(),r=E.readdirSync(e,{withFileTypes:!0});for(let i of r){let r=T.join(e,i.name);if(i.isDirectory()){n.push(r);continue}if(i.isFile()&&i.name.endsWith(`.xctestrun`))try{let e=E.statSync(r);t.push({path:r,mtimeMs:e.mtimeMs})}catch{}}}return t}function wt(e,t,n){if(n){let r=$(t.path,n)-$(e.path,n);if(r!==0)return r}return t.mtimeMs-e.mtimeMs||e.path.localeCompare(t.path)}function $(e,t){let n=0,r=e.toLowerCase();T.basename(r).startsWith(`agentdevicerunner.env.`)&&(n-=1e3),r.includes(`${T.sep}macos${T.sep}`)&&(n-=5e3);let i=ne(t);return i.preferred.length>0&&(i.preferred.some(e=>r.includes(e))?n+=2e3:n-=500),i.disallowed.some(e=>r.includes(e))&&(n-=2500),n}async function Tt(n,r,i,a,o){let c=le(process.env),l=fe(process.env,n.kind===`device`,n),u=n.kind===`device`?[`-allowProvisioningUpdates`]:[],d=ue(),f=ce(process.env),p=ie();try{await s(`xcodebuild`,[`build-for-testing`,`-project`,r,`-scheme`,`AgentDeviceRunner`,`-parallel-testing-enabled`,`NO`,de(n),`1`,...me(n,re(n)),`-derivedDataPath`,i,...d,...f,...p,...c,...u,...l],{detached:!0,timeoutMs:o,signal:a.budget?.signal,onSpawn:e=>{Z.add(e),e.on(`close`,()=>{Z.delete(e)})},onStdoutChunk:e=>{w(e,a.logPath,a.traceLogPath,a.verbose)},onStderrChunk:e=>{w(e,a.logPath,a.traceLogPath,a.verbose)}})}catch(r){if(e(r))throw r;let i=r instanceof t?r:new t(`COMMAND_FAILED`,String(r)),o=he(n),{reason:s,hint:c,matched:l}=ge(new t(i.code,i.message,{...i.details,...o})),u=m(i),d=`xcodebuild build-for-testing failed`;throw new t(`COMMAND_FAILED`,s===`simulator_set_destination_not_found`?pe(d,n,o):d,{reason:s,error:i.message,details:i.details,logPath:a.logPath,hint:c,startupRuleMatched:l,startupHostDeadlineHit:u,...o})}}export{at as a,ct as c,be as d,j as f,Z as i,We as l,Q as n,ot as o,A as p,St as r,it as s,ht as t,V as u};
@@ -1,4 +0,0 @@
1
- import{N as e,tt as t}from"./sdk-contracts.js";import{_ as n}from"./sdk-batch-runner.js";import{C as r,a as i,i as a,n as o}from"./sdk-device.js";import{$n as s,S as c,er as l,ln as u,m as ee,sn as te}from"./sdk-batch.js";import{t as ne}from"./recording-scope.js";import{a as re}from"./scroll-gesture.js";import{_ as d,c as ie,d as ae,g as oe,h as se,i as ce,l as le,m as ue,o as de,p as f,s as fe,u as p,y as pe}from"./script.js";import{A as m,C as me,D as he,E as ge,M as _e,N as ve,S as ye,T as be,_ as xe,a as Se,b as Ce,g as h,i as we,k as Te,l as Ee,n as De,r as Oe,s as ke,t as Ae,v as je,w as Me,x as Ne,y as Pe}from"./parameterized-recorded-fill.js";import{n as g,t as Fe}from"./catalog.js";import{o as Ie,t as _}from"./back-mode.js";import{t as Le}from"./session.js";import{r as Re}from"./success-text.js";import{t as ze}from"./click-button.js";import"./device.js";import{r as Be,t as Ve}from"./device-rotation.js";import{a as v,r as y}from"./diagnostics.js";import{k as He}from"./owner-identity.js";import"./file.js";import{t as Ue}from"./tv-remote.js";import"./diagnostics2.js";import{n as We,r as Ge}from"./session-repair-tombstone.js";import{n as Ke,r as b,t as x}from"./session-paths.js";import{t as qe}from"./keyboard-actions.js";import S from"node:path";import C from"node:fs";import{createHash as Je}from"node:crypto";import{StringDecoder as Ye}from"node:string_decoder";function Xe(e,t={}){let n=[e.command];return e.command===`snapshot`?ae(n,e):e.command===`open`?ce(n,e):e.command===`runtime`?ie(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?fe(n,e):e.command===`screenshot`?le(n,e):de(n,e),n.join(` `)}function Ze(e){return e.targetEvidences?[s(e.targetEvidences)]:e.targetEvidence?[l(e.targetEvidence)]:[]}function w(e){return e?.scriptPublication??h}function Qe(e,t){let n=w(e),r=typeof t.saveScript==`string`?x(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath;e.scriptPublication=je(n,{requested:{path:r,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function $e(e){e.scriptPublication=Ce(w(e))}function et(e){e.scriptPublication=Me(w(e))}function tt(e,t){e.scriptPublication=be(w(e),t)}function nt(e){e.scriptPublication=xe(w(e))}function rt(e,t){let n=w(e);return n.kind===`repair`&&n.closeReceipt===t}function it(e){return w(e).kind===`repair`}function at(e){return me(w(e))}function T(e){return ge(w(e))}function ot(e){return he(w(e))}function st(e,t){if(t.flags?.noRecord||_t(e,t))return;t.flags&&ke(e,t.flags);let n=lt(t),r=ft(e,ut(t,n));n&&dt(e,n);let i={ts:Date.now(),command:r.command,positionals:r.positionals,runtime:r.runtime,flags:yt(r.flags),result:r.result,...r.targetEvidence?{targetEvidence:r.targetEvidence}:{},...r.targetEvidences?{targetEvidences:r.targetEvidences}:{}};return e.actions.push(i),y({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),i}function ct(e,t,n,r,i,a){t&&e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}function lt(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return;let t=ve(e.flags.recordAs),n=_e(t);return{literal:m({ts:0,command:e.command,positionals:e.positionals,flags:e.flags}),placeholder:n}}function ut(e,t){if(!t)return e;let{literal:n,placeholder:r}=t;return{...e,positionals:mt(e.positionals,r),result:Ae(e.result,n,r),targetEvidence:De(e.targetEvidence,n,r)}}function dt(e,t){t.literal.trim()&&(e.recordedFillLiterals??=new Map,!e.recordedFillLiterals.has(t.literal)&&e.recordedFillLiterals.set(t.literal,t.placeholder))}function ft(e,t){let n=e.recordedFillLiterals;if(!n||n.size===0)return t;let r=Oe(t.result,n),i=(t.targetEvidenceMode??`action`)===`landmark`?pt(t.targetEvidence,n):E(t.targetEvidence,n),a=t.targetEvidences?{source:E(t.targetEvidences.source,n),destination:E(t.targetEvidences.destination,n)}:t.targetEvidences;return{...t,result:r,targetEvidence:i,targetEvidences:a}}function pt(e,t){return e&&(Se(e,t)?void 0:e)}function E(e,t){return!e||!Se(e,t)?e:{...we(e,t),verification:`unverifiable`}}function mt(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const ht=new Set([`snapshot`,`get`,`is`,`find`]);function gt(e){return e.internal?.replayPlanStep!==!0&&ht.has(e.command)}function _t(e,t){return!t.interactiveObservation||T(e)===void 0?!1:t.flags?.record!==!0}const vt=Ie();function yt(e){if(!e)return{};let t={};for(let n of vt){let r=e[n];r!==void 0&&(t[n]=r)}return t}function D(e){return S.join(e,`idle-expiry.json`)}function bt(e){let t;try{t=C.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||!Number.isFinite(n.expiresAt))&&!(n.expiresAt<=Date.now())&&typeof n.owner==`string`&&!(!xt(n.expiredAtMs)||!xt(n.idleExpiryMs))&&(n.deviceKey===void 0||typeof n.deviceKey==`string`))return n}function xt(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function St(t){let n=t.flatMap((e,t)=>e.command===`open`?[t]:[]);if(n.length!==1||n[0]!==0)throw new e(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(t.some(e=>e.command===`close`))throw new e(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let r=-1;for(let[e,n]of t.entries())c({command:n.command,positionals:n.positionals,flags:n.flags})===`mutates-app`&&(r=e);if(!t.slice(r+1).some(Ot))throw new e(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function Ct(t){for(let n of t){if(wt(n)){Tt(n);continue}let t=kt(n),r=t??(n.command===`wait`?n.positionals[0]:void 0);if(r?.startsWith(`@`))throw new e(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${r}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(n.command===`find`&&c(n)===`mutates-app`)throw new e(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let i=t;if(!(!i||!u(i)||n.targetEvidence))throw new e(`COMMAND_FAILED`,`Cannot publish recorded step "${n.command} ${i}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function wt(e){return Et(e)!==void 0}function Tt(t){let n=Et(t);if(!n)return;let r=[n.source,n.destination];for(let n of r){if(n?.startsWith(`@`))throw new e(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!n||!u(n))&&!t.targetEvidences)throw new e(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${n}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function Et(e){return e.command===`gesture`?pe(e.positionals):void 0}function Dt(t,n){if(t instanceof e){if(t.details?.reason===`script_target_exists`)return new e(t.code,`A file already exists at ${String(t.details.path)}.`,{...t.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let n=t.details?.retriable===!0;return new e(t.code,t.message,{...t.details,retriable:n,hint:t.details?.hint??(n?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let r=t instanceof Error?t.message:String(t);return new e(`COMMAND_FAILED`,`Failed to publish the active session script${n?` to ${n}`:``}: ${r}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function Ot(e){if(e.command!==`wait`)return!1;let t=te(e.positionals);return t?.kind!==`selector`||!u(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function kt(e){if(e.command===`get`)return e.positionals[1];if(oe(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&At(t)&&At(n)?void 0:t}}function At(e){return e.trim().length>0&&Number.isFinite(Number(e))}function jt(e){let t=e.scriptPublication??h;return t.kind===`repair`?t.status===`committed`||!ye(t):!1}function Mt(e){return!Ne(e.scriptPublication??h)||jt(e)}var Nt=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=it(e),r=t?.publication===`active`,i;try{if(Mt(e))return{written:!1};let a=Pt(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=S.dirname(i);return C.existsSync(o)||C.mkdirSync(o,{recursive:!0}),Lt({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Pe(e.scriptPublication??h)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return Ft({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Te(e.scriptPublication??h);if(t)return x(t);let n=b(e.name),r=new Date(e.createdAt).toISOString().replaceAll(/[:.]/g,`-`);return S.join(this.sessionsDir,`${n}-${r}.ad`)}};function Pt(e,t){let n=Rt(e,{strictPortableRefs:t.activePublication});return t.activePublication&&St(n),{script:Jt(e,n,t.appendCompleteSentinel),actionCount:n.length}}function Ft(t){let{session:n,error:r,scriptPath:i,repairArmed:a,activePublication:o}=t;if(y({level:`warn`,phase:`session_script_write_failed`,data:{session:n.name,path:i,error:r instanceof Error?r.message:String(r)}}),a)return{written:!1,error:It(r,i)};if(o)return{written:!1,error:Dt(r,i)};if(r instanceof e)throw r;return{written:!1}}function It(t,n){if(t instanceof e)return t;let r=t instanceof Error?t.message:String(t);return new e(`COMMAND_FAILED`,`Failed to write the healed script${n?` to ${n}`:``}: ${r}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function Lt(t){let{scriptPath:n,script:r,force:i}=t;try{He({destination:n,contents:r,publish:i?`replace`:`link-exclusive`})}catch(t){throw t.code===`EEXIST`?new e(`COMMAND_FAILED`,`A file already exists at ${n}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:n}):t}}function Rt(e,t={}){let n=T(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=Vt(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&zt(n);let o=qt(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&Ct(a),a}function zt(t){let n=t.command===`gesture`?pe(t.positionals??[]):void 0;if(n){Bt(n);return}if(!O(t.command))return;let r=t.command===`get`?t.positionals?.[1]:t.positionals?.[0];if(r?.startsWith(`@`))throw new e(`COMMAND_FAILED`,`Cannot write recorded step "${t.command} ${r}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function Bt(t){let n=[t.source,t.destination].find(e=>e.startsWith(`@`));if(n)throw new e(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function Vt(e){let t=Ht(e);if(!(!t||!O(e.command)))return se(e.command)||e.command===`hover`?{...e,positionals:[t]}:e.command===`longpress`?Wt(e,t):e.command===`fill`?Ut(e,t):Gt(e,t)}function Ht(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function O(e){return oe(e)||e===`fill`||e===`get`}function Ut(e,t){let n=m(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function Wt(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):Kt(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function Gt(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function Kt(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function qt(e,t){if(!O(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function Jt(e,t,n){let i=[],a=e.device.kind?` kind=${e.device.kind}`:``;i.push(`context platform=${r(e.device)} device=${ue(e.device.name)}${a} theme=unknown`);for(let e of t)e.flags?.noRecord||(i.push(...Ze(e)),i.push(Yt(e)));return n&&i.push(`# agent-device:heal-complete`),`${i.join(`
2
- `)}\n`}function Yt(e){return Xt([e.command],e)||Xe(e)}function Xt(e,t){if(se(t.command))return Zt(e,t);if(t.command===`fill`)return Qt(e,t);if(t.command===`get`)return $t(e,t)}function Zt(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(f(d(n))),k(e,t),p(e,t),e.join(` `);if(t.positionals.length===1)return e.push(f(n)),p(e,t),e.join(` `)}}function Qt(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(f(d(n))),k(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(f(r)),p(e,t),e.join(` `)}function $t(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(f(n)),e.push(f(d(r))),r.startsWith(`@`)&&k(e,t),e.join(` `)}function k(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(f(n))}const en=[`id`,`deviceId`,`device_id`,`serial`,`udid`,`device_udid`,`identifier`],tn={ios:`iOS`,ipados:`iPadOS`,tvos:`tvOS`,watchos:`watchOS`,visionos:`visionOS`,macos:`macOS`,apple:`Apple`,android:`Android`,linux:`Linux`,web:`Web`};function nn(e,t){let n=t??{};switch(e.command){case g.devices:return rn(n.devices);case g.apps:return an(n.apps,e.flags?.appsFilter);case g.boot:return on(`Booted`,n,!0);case g.shutdown:return on(`Shut down`,n,!1);case g.install:return sn(`Installed`,n);case g.reinstall:return sn(`Reinstalled`,n);case g.screenshot:return cn(e,n);default:return{}}}function rn(e){if(!Array.isArray(e))return{};let t=e.flatMap(e=>{let t=un(e);return t?[t]:[]}),n=t.slice(0,5),r=Math.max(0,t.length-n.length),i=t.slice(0,3);return{summary:yn(`Found ${t.length} ${bn(`device`,t.length)}`,i.map(e=>_n(e,!0)),Math.max(0,t.length-i.length)),details:{deviceCount:t.length,devices:n,...r>0?{omittedDeviceCount:r}:{}}}}function an(e,t){if(!Array.isArray(e))return{};let n=e.flatMap(e=>{let t=M(e);return t?[t]:[]}),r=n.slice(0,5),i=Math.max(0,n.length-r.length),a=n.slice(0,3);return{summary:yn(`Found ${n.length} ${bn(`app`,n.length)}`,a,Math.max(0,n.length-a.length)),details:{appCount:n.length,apps:r,...i>0?{omittedAppCount:i}:{},...t===`all`||t===`user-installed`?{filter:t}:{}}}}function on(e,t,n){let r=dn(t);if(!r)return{};let i={device:r,...gn(t),booted:n};return{summary:`${e} ${_n(i,!1)}`,details:i}}function sn(e,t){let n=M(t.appName),r=M(t.bundleId),i=A(t,[`packageName`,`package`]),a=M(t.platform),o=M(t.launchTarget),s=A(t,[`bundleId`,`packageName`,`package`,`appId`,`launchTarget`]),c=vn(n,s);if(!c)return{};let l={};return j(l,`appName`,n),j(l,`bundleId`,r),j(l,`packageName`,i),j(l,`platform`,a),o!==s&&j(l,`launchTarget`,o),{summary:`${e} ${c}`,details:l}}function cn(e,t){let n=ln(e,t);return n?{details:{requestedFileName:n}}:{}}function ln(e,t){let n=R(e.meta?.clientArtifactPaths?.path)??R(t.path);if(n)return L(n)}function un(e){if(!n(e))return;let t=dn(e);if(t)return{name:t,...gn(e)}}function dn(e){let t=A(e,[`name`,`deviceName`,`device`]);return!t||!fn(e,t)?t:mn(e)}function fn(e,t){let n=pn(t);return en.some(t=>{let r=M(e[t]);return r!==void 0&&pn(r)===n})}function pn(e){return e.toLowerCase()}function mn(e){let t=M(e.appleOs),n=M(e.platform),r=M(e.kind),i=hn(t,n);return i&&(r===`simulator`||r===`emulator`)?`${i} ${r}`:i?`${i} device`:r===`simulator`?`Simulator`:r===`emulator`?`Emulator`:`Unnamed device`}function hn(e,t){let n=e??t;if(!(!n||!Object.hasOwn(tn,n)))return tn[n]}function gn(e){let t=M(e.platform),n=M(e.appleOs),r=M(e.kind),i=M(e.target);return{...t?{platform:t}:{},...n?{appleOs:n}:{},...r?{kind:r}:{},...i?{target:i}:{},...typeof e.booted==`boolean`?{booted:e.booted}:{}}}function _n(e,t){let n=M(e.name)??M(e.device)??`device`,r=M(e.platform),i=M(e.appleOs),a=[r,i===r?void 0:i,M(e.kind),M(e.target),t&&typeof e.booted==`boolean`?e.booted?`booted`:`stopped`:void 0].filter(e=>!!e);return a.length>0?`${n} (${a.join(`, `)})`:n}function vn(e,t){return e&&t&&e!==t?`${e} (${t})`:e??t}function A(e,t){for(let n of t){let t=M(e[n]);if(t)return t}}function j(e,t,n){n&&(e[t]=n)}function yn(e,t,n){let r=[...t,...n>0?[`+${n} more`]:[]];return r.length>0?`${e}: ${r.join(`, `)}`:e}function bn(e,t){return t===1?e:`${e}s`}function M(e){let t=R(e);if(!t)return;let n=t.trim(),r=Array.from(n);return r.length<=120?n:`${r.slice(0,119).join(``)}…`}function N(e){return M(e)}function P(e){return typeof e==`boolean`?e:void 0}function F(e,t){let n=N(e);return n&&t.includes(n)?n:void 0}function I(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}function L(e){let t=R(e);return t?M(t.split(/[\\/]/).at(-1)):void 0}function R(e){if(typeof e==`string`)return e.trim().length>0?e:void 0}function z(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}const xn=[`up`,`down`,`left`,`right`],Sn=[`top`,`bottom`];function Cn(e){return`${e.command===g.reinstall?`Reinstalled`:`Installed`} ${Dn(e.result??{})??`app`}`}function wn(e){let t=e.result??{};switch(e.command){case g.scroll:return kn(t);case g.screenshot:return Mn(t);case g.home:return`Went home`;case g.back:return Pn(t);case g.appSwitcher:return`Opened app switcher`;case g.actionButton:return`Pressed Action Button`;case g.orientation:return In(t);case g.fold:return Fn(t);case g.viewport:return Ln(t);case g.clipboard:return Rn(t);case g.keyboard:return zn(t);case g.tvRemote:return Hn(t);case g.gesture:return Un(t);case g.swipe:return Wn(t);case g.trace:return Kn(`trace`,e);case g.record:return Kn(`recording`,e);default:return}}function Tn(e){let t=e.result??{};switch(e.command){case g.scroll:return I({direction:F(t.direction,xn),edge:F(t.edge,Sn),passes:z(t.passes),amount:z(t.amount),pixels:z(t.pixels),durationMs:z(t.durationMs),x1:z(t.x1),y1:z(t.y1),x2:z(t.x2),y2:z(t.y2)});case g.screenshot:return I({requestedFileName:Nn(t)});case g.back:return I({mode:F(t.mode,_)});case g.orientation:return I({orientation:F(t.orientation,Ve)});case g.fold:return I({pose:F(t.pose,Be)});case g.viewport:return I({width:z(t.width),height:z(t.height)});case g.clipboard:return I({action:F(t.action,[`read`,`write`])});case g.keyboard:return Vn(t);case g.tvRemote:return I({button:F(t.button,Ue),durationMs:z(t.durationMs)});case g.gesture:case g.swipe:return Gn(t);case g.trace:case g.record:return I({action:F(t.action,[`start`,`stop`]),fileName:Jn(e),showTouches:P(t.showTouches)});default:return{}}}function En(e,t){if(e.command!==g.screenshot)return t;let n=ln(e,t);return n?{...t,requestedFileName:n}:t}function Dn(e){let t=N(e.appName),n=Yn(e,[`bundleId`,`packageName`,`appBundleId`,`launchTarget`]);return t&&n&&t!==n?`${t} (${n})`:t??n??On(e)}function On(e){let t=N(e.app);return t&&!t.includes(`/`)&&!t.includes(`\\`)?t:void 0}function kn(e){let t=F(e.direction,xn),n=F(e.edge,Sn),r=z(e.passes);return n?An(n,r):t?jn(t,e):`Scrolled`}function An(e,t){return t===0?`Already at ${e}`:t===void 0?`Scrolled to ${e}`:`Scrolled to ${e} in ${t} ${t===1?`pass`:`passes`}`}function jn(e,t){let n=z(t.pixels);if(n!==void 0)return`Scrolled ${e} by ${n}px`;let r=z(t.amount);return r===void 0?`Scrolled ${e}`:`Scrolled ${e} by ${r}`}function Mn(e){let t=Nn(e);return t?`Captured screenshot ${t}`:`Captured screenshot`}function Nn(e){return L(e.requestedFileName)??L(e.path)}function Pn(e){return F(e.mode,_)===`system`?`Went back using system navigation`:`Went back`}function Fn(e){let t=F(e.pose,Be);return t?`Folded to ${t}`:`Changed fold pose`}function In(e){let t=F(e.orientation,Ve);return t?P(e.confirmed)===!1?`Requested ${t} (unconfirmed)`:`Rotated to ${t}`:`Changed orientation`}function Ln(e){let t=z(e.width),n=z(e.height);return t!==void 0&&n!==void 0?`Set viewport to ${t}×${n}`:`Changed viewport`}function Rn(e){let t=F(e.action,[`read`,`write`]);return t===`read`?`Read clipboard`:t===`write`?`Updated clipboard`:`Used clipboard`}function zn(e){let t=R(e.action);if(!t||!qe(t))return`Used keyboard`;if(t===`dismiss`)return Bn(e);if(t===`enter`||t===`return`)return`Pressed keyboard return`;let n=P(e.visible);return n===void 0?`Inspected keyboard`:n?`Keyboard is visible`:`Keyboard is hidden`}function Bn(e){return P(e.dismissed)===!1?`Keyboard was already hidden`:`Dismissed keyboard`}function Vn(e){let t=R(e.action);return I({action:t&&qe(t)?t:void 0,platform:F(e.platform,[`ios`,`android`]),visible:P(e.visible),wasVisible:P(e.wasVisible),dismissed:P(e.dismissed),attempts:z(e.attempts),mechanism:F(e.mechanism,[`dismissKey`])})}function Hn(e){let t=F(e.button,Ue);return t?`Pressed TV remote ${t}`:`Used TV remote`}function Un(e){let t=F(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]);return t?`Ran ${t} gesture`:`Ran gesture`}function Wn(e){let t=z(e.count);return t!==void 0&&t>1?`Swiped ${t} times`:`Swiped`}function Gn(e){return I({kind:F(e.kind,[`fling`,`pan`,`pinch`,`rotate`,`transform`]),durationMs:z(e.durationMs),pointerCount:z(e.pointerCount),x1:z(e.x1),y1:z(e.y1),x2:z(e.x2),y2:z(e.y2),count:z(e.count),pauseMs:z(e.pauseMs),pattern:F(e.pattern,[`one-way`,`ping-pong`]),scale:z(e.scale)})}function Kn(e,t){let n=qn(e,F(t.result?.action,[`start`,`stop`])),r=Jn(t);return r?`${n} ${r}`:n}function qn(e,t){return t===`start`?e===`trace`?`Started trace`:`Started recording`:t===`stop`?e===`trace`?`Stopped trace`:`Stopped recording`:e===`trace`?`Updated trace`:`Updated recording`}function Jn(e){let t=e.result??{};return L(t.requestedFileName)??L(t.outPath)??L(t.path)??L(e.positionals[1])}function Yn(e,t){for(let n of t){let t=N(e[n]);if(t)return t}}function Xn(e){switch(e.command){case g.open:return`Opened ${B(e)??`session`}`;case g.close:return`Closed ${N(e.result?.session)??`session`}`;case g.click:case g.press:return`Tapped ${B(e)??`target`}`;case g.longPress:return`Long pressed ${B(e)??`target`}`;case g.hover:return`Hovered ${B(e)??`target`}`;case g.fill:return`Filled ${B(e)??`target`}`;case g.type:return`Typed text`;case g.install:case g.reinstall:case Fe.installSource:return Cn(e);default:return wn(e)??`Ran ${e.command}`}}function Zn(e){return I({command:e.command,positionals:or(e),flags:vr(e),...Qn(e),...$n(e),...er(e),...Tn(e)})}function Qn(e){if(!tr(e.command))return{};let t=e.result??{};return I({ref:G(t),targetLabel:B(e),selectorChainLength:mr(t.selectorChain)?.length,x:z(t.x),y:z(t.y),x2:z(t.x2),y2:z(t.y2),durationMs:z(t.durationMs)})}function $n(e){if(!nr(e.command))return{};let t=e.result??{};return I({platform:F(t.platform,i),target:F(t.target,o),appName:N(t.appName),appBundleId:N(t.appBundleId),bundleId:N(t.bundleId),packageName:N(t.packageName),launchTarget:N(t.launchTarget)})}function er(e){let t=e.result??{};return e.command===g.snapshot?Array.isArray(t.nodes)?{nodeCount:t.nodes.length}:{}:e.command!==g.wait&&e.command!==g.find&&e.command!==g.get&&e.command!==g.is?{}:I({waitedMs:z(t.waitedMs),found:P(t.found)})}function tr(e){return e===g.click||e===g.press||e===g.longPress||e===g.hover||e===g.focus||e===g.fill}function nr(e){return e===g.open||e===g.install||e===g.reinstall||e===Fe.installSource}function B(e){let t=e.result??{};return rr(t)??ir(t)??ar(t)??fr(e.positionals[0])}function rr(e){let t=G(e);if(t)return t.startsWith(`@`)?t:`@${t}`}function ir(e){let t=z(e.x),n=z(e.y);if(t!==void 0&&n!==void 0)return`(${t}, ${n})`}function ar(e){return N(e.appName)??N(e.appBundleId)??N(e.bundleId)??N(e.packageName)}function or(e){if(e.positionals.length!==0)return e.command===g.type?[H(`text`)]:e.command===g.fill?sr(e):e.command===g.find?cr(e):e.command===g.clipboard?lr(e):e.command===g.push?ur(e,`app`,`payload`):e.command===g.triggerAppEvent?ur(e,`event`,`payload`):e.positionals.map(V)}function sr(e){let t=H(`text`),n=e.result??{},r=G(n);if(r)return[`@${r}`,t];if(N(n.selector))return[H(`target`),t];let i=z(n.x),a=z(n.y);return i!==void 0&&a!==void 0?[String(i),String(a),t]:[t]}function cr(e){let t=+!!pr(e.positionals[0]);if(e.positionals[t]===void 0)return;let n=t+1,r=[...t===1?[String(e.positionals[0])]:[],H(`query`)],i=e.positionals[n];return i?i===`fill`||i===`type`?[...r,i,H(`text`)]:[...r,...e.positionals.slice(n).map(dr)]:r}function lr(e){let t=e.positionals[0]?.toLowerCase();return t===`read`?[`read`]:t===`write`?[`write`,H(`text`)]:e.positionals.map(V)}function ur(e,t,n){let[r,i,...a]=e.positionals;return[...r?[H(t)]:[],...i?[H(n)]:[],...a.map(V)]}function dr(e){return e===`click`||e===`focus`||e===`exists`||e===`get`||e===`text`||e===`attrs`||e===`wait`?e:V(e)}function V(e){return fr(e)??H(`arg`)}function fr(e){if(!e)return;let t=e.trim();if(/^@[a-zA-Z0-9:_-]+$/.test(t))return t}function H(e){return`<${e}>`}function pr(e){return e===`text`||e===`label`||e===`value`||e===`role`||e===`id`}function mr(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)?e:void 0}const hr={enums:[{source:`platform`,values:a},{source:`target`,values:o}]},gr={booleans:[{source:`settle`}],numbers:[{source:`settleQuietMs`}]},_r={[g.open]:{booleans:[{source:`relaunch`},{source:`testIme`}],enums:[{source:`surface`,values:Le}]},[g.click]:U(),[g.press]:U(),[g.longPress]:U(),[g.hover]:U(),[g.fill]:br(),[g.type]:br(),[g.scroll]:{numbers:[{source:`pixels`},{source:`durationMs`}]},[g.gesture]:xr(),[g.swipe]:xr(),[g.screenshot]:{booleans:[{source:`overlayRefs`},{source:`screenshotFullscreen`,output:`fullscreen`},{source:`screenshotNoStabilize`,output:`noStabilize`},{source:`screenshotNormalizeStatusBar`,output:`normalizeStatusBar`}],numbers:[{source:`screenshotPixelDensity`,output:`pixelDensity`},{source:`screenshotScale`,output:`scale`}]},[g.snapshot]:{booleans:[{source:`snapshotInteractiveOnly`,output:`interactiveOnly`},{source:`snapshotDiff`,output:`diff`},{source:`snapshotRaw`,output:`raw`},{source:`snapshotCustomActions`,output:`actions`},{source:`snapshotForceFull`,output:`forceFull`}],numbers:[{source:`snapshotDepth`,output:`depth`}]},[g.back]:{enums:[{source:`backMode`,output:`mode`,values:_}]},[g.record]:{booleans:[{source:`hideTouches`}],numbers:[{source:`fps`}],enums:[{source:`recordingScope`,output:`scope`,values:ne}]},[g.apps]:{enums:[{source:`appsFilter`,output:`filter`,values:[`user-installed`,`all`]}]},[g.boot]:{booleans:[{source:`headless`}]},[g.close]:{booleans:[{source:`shutdown`}]}};function vr(e){let t=e.flags??{},n={},r=Object.hasOwn(_r,e.command)?_r[e.command]:void 0;return W(n,t,hr),W(n,t,r),W(n,t,yr(e.command)),Object.keys(n).length>0?n:void 0}function yr(e){return ee(e)?gr:void 0}function U(){return{booleans:[{source:`doubleTap`}],numbers:[{source:`count`},{source:`intervalMs`},{source:`holdMs`},{source:`jitterPx`}],enums:[{source:`clickButton`,values:ze}]}}function br(){return{numbers:[{source:`delayMs`}]}}function xr(){return{numbers:[{source:`pointerCount`},{source:`count`},{source:`pauseMs`}],enums:[{source:`pattern`,values:re}]}}function W(e,t,n){n&&(Sr(e,t,n.booleans??[]),Cr(e,t,n.numbers??[]),wr(e,t,n.enums??[]))}function Sr(e,t,n){for(let r of n)Tr(e,r.output??r.source,t[r.source])}function Cr(e,t,n){for(let r of n)Er(e,r.output??r.source,t[r.source])}function wr(e,t,n){for(let r of n)Dr(e,r.output??r.source,t[r.source],r.values)}function G(e){let t=N(e.ref);if(!t)return;let n=t.startsWith(`@`)?t.slice(1):t;return/^[a-zA-Z0-9:_-]+$/.test(n)?n:void 0}function Tr(e,t,n){typeof n==`boolean`&&(e[t]=n)}function Er(e,t,n){let r=z(n);r!==void 0&&(e[t]=r)}function Dr(e,t,n,r){let i=F(n,r);i!==void 0&&(e[t]=i)}const Or=65536;function kr(e){return Je(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function K(e,t){let n=Nr(e);if(n===void 0)return!1;try{let e=jr(t),r=Buffer.allocUnsafe(Or),i=0;do if(i=C.readSync(n,r,0,r.length,null),!e.push(r.subarray(0,i)))return!0;while(i>0);return e.end(),!0}finally{C.closeSync(n)}}async function Ar(e){let t=await Pr(e);if(t===void 0)return{lineCount:0,firstLineDigest:void 0};let n={lineCount:0,firstLineDigest:void 0};try{let e=jr(e=>{n.lineCount===0&&(n.firstLineDigest=kr(e)),n.lineCount+=1}),r=Buffer.allocUnsafe(Or);for(;;){let{bytesRead:n}=await t.read(r,0,r.length,null);if(e.push(r.subarray(0,n)),n===0)break}return e.end(),n}finally{await t.close()}}function q(e){let t;return K(e,e=>(t=kr(e),!1)),t}function jr(e){let t=new Ye(`utf8`),n=``,r=!1;return{push(i){if(r)return!1;let a=`${n}${t.write(i)}`,o=0;for(let t=a.indexOf(`
3
- `);t!==-1;t=a.indexOf(`
4
- `,o)){if(Mr(a.slice(o,t),e)===!1)return r=!0,!1;o=t+1}return n=a.slice(o),!0},end(){r||Mr(`${n}${t.end()}`,e)}}}function Mr(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0)return t(n)}function Nr(e){try{return C.openSync(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function Pr(e){try{return await C.promises.open(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}const Fr=5242880;function Ir(e=process.env){let t=e.AGENT_DEVICE_EVENT_LOG_MAX_BYTES?.trim();if(t===void 0||!/^\d+$/.test(t))return Fr;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Fr}function J(e){return`${e}.1`}function Y(e){return`${e}.window.json`}function Lr(e){let t;for(let n=0;n<3;n+=1){let n=Z(e);try{let t=Rr(e);if(Z(e)===n)return t}catch(r){if(t=r,Z(e)===n)throw r}}throw t??X(e,`the window did not settle while reading`)}function Rr(e){let t=J(e),n=Gr(e);if(n===`unverifiable`)throw X(e,`window file is invalid`);if(n===void 0)return zr(e,t);let r=n.at(-1);if(!r)throw X(e,`window file records no generation`);let i=Jr(e),a=Br(e,r),o=[],s=Vr({eventLogPath:e,rotatedPath:t,sidecar:n,activeStart:a,activeExists:i});return s!==void 0&&o.push({path:t,firstLineIndex:s}),i&&o.push({path:e,firstLineIndex:a}),{files:o,earliestCursor:o[0]?.firstLineIndex??a}}function zr(e,t){if(q(t)!==void 0)throw X(e,`a rotated event log exists with no window record`);return{files:Jr(e)?[{path:e,firstLineIndex:0}]:[],earliestCursor:0}}function Br(e,t){let n=q(e);return n!==void 0&&n===t.firstLineDigest?t.firstLineIndex:t.firstLineIndex+t.lineCount}function Vr(e){let{eventLogPath:t,rotatedPath:n,sidecar:r,activeStart:i,activeExists:a}=e,o=q(n);if(o===void 0)return;let s=r.find(e=>e.firstLineDigest===o);if(!s)throw X(t,`the rotated event log matches no window record`);let c=Wr(n);if(c!==s.lineCount)throw X(t,`the rotated event log holds ${c} lines, the window recorded ${s.lineCount}`);if(a&&s.firstLineIndex+s.lineCount!==i)throw X(t,`retained event log generations are not contiguous`);return s.firstLineIndex}async function Hr(e,t){let n=Yr(e);if(!n||n.size<t)return!1;let r=Gr(e);if(r===`unverifiable`)return await C.promises.rename(e,J(e)),!0;let i=await Ar(e);if(i.firstLineDigest!==void 0){let t=r??[],n=t.at(-1),a=n&&n.firstLineDigest===i.firstLineDigest?n:{firstLineIndex:n?n.firstLineIndex+n.lineCount:0,lineCount:i.lineCount,firstLineDigest:i.firstLineDigest};await qr(e,(a===n?t:[...t,a]).slice(-2))}return await C.promises.rename(e,J(e)),!0}function Ur(t,n){if(!(t>=n))throw new e(`COMMAND_FAILED`,`events cursor ${t} precedes the retained event log window; events before cursor ${n} were rotated out.`,{reason:`EVENT_LOG_CURSOR_EXPIRED`,cursor:t,earliestCursor:n,hint:`Resume with cursor ${n}, the oldest retained event; earlier events are no longer available.`})}function X(t,n){return new e(`COMMAND_FAILED`,`Session event log window cannot be verified: ${n}.`,{reason:`EVENT_LOG_WINDOW_UNVERIFIED`,path:t,hint:`Cursor positions for this session cannot be resolved. Delete ${t}, ${J(t)}, and ${Y(t)} to restart the timeline, or read the files directly.`})}function Wr(e){let t=0;return K(e,()=>{t+=1}),t}function Z(e){return[Q(Y(e)),Q(e),Q(J(e))].join(`|`)}function Q(e){try{let t=C.lstatSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch{return`absent`}}function Gr(e){let t;try{t=C.readFileSync(Y(e),`utf8`)}catch(e){return e.code===`ENOENT`?void 0:`unverifiable`}try{let e=JSON.parse(t);if(!n(e)||e.version!==2)return`unverifiable`;let{generations:r}=e;if(!Array.isArray(r)||r.length===0)return`unverifiable`;let i=r.map(Kr);return i.every(e=>e!==void 0)?i:`unverifiable`}catch{return`unverifiable`}}function Kr(e){if(!n(e))return;let{firstLineIndex:t,lineCount:r,firstLineDigest:i}=e;if(!(!Number.isSafeInteger(t)||t<0)&&!(!Number.isSafeInteger(r)||r<0)&&typeof i==`string`&&i.length!==0)return{firstLineIndex:t,lineCount:r,firstLineDigest:i}}async function qr(e,t){let n=Y(e),r=`${n}.${process.pid}.tmp`;await C.promises.writeFile(r,JSON.stringify({version:2,generations:t}),`utf8`),await C.promises.rename(r,n)}function Jr(e){return Yr(e)!==void 0}function Yr(t){try{let n=C.lstatSync(t);if(n.isSymbolicLink())throw new e(`COMMAND_FAILED`,`Session event log must not be a symbolic link: ${t}`);return n}catch(e){if(e.code===`ENOENT`)return;throw e}}const $=new Map,Xr=new Set;function Zr(e){return S.join(e,`events.ndjson`)}function Qr(e){return e.command!==g.events}function $r(e,n,r){let i=t({version:1,ts:r.ts??new Date().toISOString(),session:n,...r});ti(e,`${JSON.stringify(i)}\n`)}async function ei(e){await(e?$.get(e):Promise.all($.values()))}function ti(e,t){let n=($.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await ni(e),await Hr(e,Ir()),await C.promises.appendFile(e,t,`utf8`)}).catch(t=>{y({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{$.get(e)===n&&$.delete(e)});$.set(e,n)}async function ni(e){let t=S.dirname(e);if(!Xr.has(t))try{await C.promises.mkdir(t,{recursive:!0}),Xr.add(t)}catch(t){throw y({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function ri(e,t,n){$r(e,t,{kind:`action.recorded`,requestId:v().requestId,command:n.command,summary:Xn(n),details:Zn(n)})}function ii(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??v().requestId,command:t.command,summary:`Started ${t.command}`}}function ai(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=nn(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??v().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??v().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function oi(e,t={}){let n=ci(t.cursor),r=li(t.limit),i=Lr(e);Ur(n,i.earliestCursor);let a=si(i.files,n,r),o=a.lines.flatMap(e=>{let t=ui(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:o,...a.nextCursor===void 0?{}:{nextCursor:String(a.nextCursor)}}}function si(e,t,n){let r=[],i;for(let a of e){let e=a.firstLineIndex;if(K(a.path,a=>{if(e>=t+n)return i=t+n,!1;e>=t&&r.push(a),e+=1}),i!==void 0)break}return{lines:r,...i===void 0?{}:{nextCursor:i}}}function ci(t){if(t===void 0||t.trim()===``)return 0;let n=Number(t);if(Number.isInteger(n)&&n>=0)return n;throw new e(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function li(t){if(t===void 0||typeof t==`string`&&t.trim()===``)return 100;let n=typeof t==`string`?Number(t):t;if(Number.isInteger(n)&&n>=1&&n<=500)return n;throw new e(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function ui(e){try{let t=di(JSON.parse(e));return t?fi(t):void 0}catch{return}}function di(e){if(n(e)&&e.version===1&&typeof e.ts==`string`&&typeof e.session==`string`&&pi(e.kind))return e}function fi(e){let t=n(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...mi(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function pi(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function mi(e){return e===`ok`||e===`error`}const hi=36e5;var gi=class{sessions=new Map;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new Nt(e)}get(e){return this.sessions.get(e)}set(e,t){let n=this.sessions.has(e);this.sessions.set(e,t),n||this.clearIdleExpiryTombstone(e)}delete(e){return this.runtimeHints.delete(e),this.sessions.delete(e)}values(){return this.sessions.values()}toArray(){return Array.from(this.sessions.values())}lookup(e){let t=this.sessions.get(e);return t?{address:e,session:t}:void 0}findByDevice(e){for(let[t,n]of this.sessions)if(n.device.id===e)return{address:t,session:n}}listRefs(){return Array.from(this.sessions,([e,t])=>({address:e,session:t}))}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){this.runtimeHints.set(e,t)}clearRuntimeHints(e){return this.runtimeHints.delete(e)}recordAction(e,t){let n=st(e,t);if(n){let t=this.resolveStoredSessionName(e);ri(this.resolveEventLogPath(t),t,n)}}recordEvent(e,t){$r(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return oi(this.resolveEventLogPath(e),t)}async flushEvents(e){await ei(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.scriptWriter.write(e,t);return n.written&&y({level:`info`,phase:`session_script_written`,data:{session:e.name,path:n.path}}),n}finalizeRepairTeardown(e){this.recordRepairFinalizeCloseIfCommitting(e);let t=this.writeSessionLog(e,{force:Ee(e,void 0)});at(e)&&(!t.written&&t.error?this.writeRepairTombstone(e,hi,{code:String(t.error.code),message:t.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){let t=e.scriptPublication??h;ye(t)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:e.name,...Re(`Closed: ${e.name}`)}})}writeRepairTombstone(e,t=hi,n){try{let r=this.resolveSessionDir(e.name);C.mkdirSync(r,{recursive:!0});let i={owner:e.name,reapedAt:Date.now(),expiresAt:Date.now()+t,...ot(e)?{sourcePath:ot(e)}:{},...n?{commitFailure:n}:{}};C.writeFileSync(this.repairTombstonePath(e.name),`${JSON.stringify(i)}\n`)}catch(t){y({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.name,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return We(this.repairTombstonePath(e))}clearRepairTombstone(e){try{C.rmSync(this.repairTombstonePath(e),{force:!0})}catch{}}noteSessionActivity(e,t=Date.now()){let n=this.sessions.get(e);n&&(n.lastActivityAtMs=t)}writeIdleExpiryTombstone(e,t){try{C.mkdirSync(this.resolveSessionDir(e),{recursive:!0}),C.writeFileSync(D(this.resolveSessionDir(e)),`${JSON.stringify(t)}\n`)}catch(t){y({level:`warn`,phase:`idle_expiry_tombstone_write_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}readIdleExpiryTombstone(e){if(!Ke(e))return;let t=bt(D(this.resolveSessionDir(e)));return t?.owner===e?t:void 0}clearIdleExpiryTombstone(e){try{C.rmSync(D(this.resolveSessionDir(e)),{force:!0})}catch(t){y({level:`warn`,phase:`idle_expiry_tombstone_clear_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}repairTombstonePath(e){return Ge(this.resolveSessionDir(e))}defaultTracePath(e){let t=b(e.name),n=new Date().toISOString().replaceAll(/[:.]/g,`-`);return S.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(t){if(!Ke(t))throw new e(`INVALID_ARGS`,`Invalid session name ${JSON.stringify(t)}: a session name cannot be empty, ".", or "..".`);return S.join(this.sessionsDir,b(t))}resolveDaemonStateDir(){return S.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return C.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return S.join(this.resolveSessionDir(e),`app.log`)}resolveAppLogPidPath(e){return S.join(this.resolveSessionDir(e),`app-log.pid`)}resolveEventLogPath(e){return Zr(this.resolveSessionDir(e))}static expandHome(e,t){return x(e,t)}resolveStoredSessionName(e){for(let[t,n]of this.sessions)if(n===e)return t;return e.name}};export{$e as _,or as a,ct as c,rt as d,it as f,T as g,tt as h,Qr as i,nt as l,et as m,ai as n,En as o,at as p,ii as r,gt as s,gi as t,Qe as u};