agent-device 0.21.20 → 0.21.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.apk → agent-device-android-ime-helper-0.21.22.apk} +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.22.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.20.manifest.json → agent-device-android-ime-helper-0.21.22.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.22.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/{agent-device-android-snapshot-helper-0.21.20.manifest.json → agent-device-android-snapshot-helper-0.21.22.manifest.json} +6 -6
  7. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/AppWindowScreenshot.swift +73 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/BackgroundInteraction.swift +557 -0
  9. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/GhostCursor.swift +141 -0
  10. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +107 -3
  11. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/main.swift +136 -22
  12. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/BackgroundInteractionTests.swift +88 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +121 -4
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.h +10 -2
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerSynthesizedGesture.m +36 -9
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Alert.swift +28 -0
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +27 -0
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedCommitDeadline.swift +6 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedGesturePolicy.swift +7 -2
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedInteraction.swift +21 -7
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +121 -17
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +179 -6
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +119 -0
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +8 -1
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryReadiness.swift +23 -11
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextInputProbe.swift +59 -6
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +112 -23
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +25 -12
  29. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/RecordingExportSupport.swift +6 -1
  30. package/dist/apple/runner/AgentDeviceRunner/RecordingScripts/recording-overlay.swift +43 -13
  31. package/dist/src/adapter.js +1 -1
  32. package/dist/src/adb-executor.js +2 -2
  33. package/dist/src/adb-failure.js +1 -1
  34. package/dist/src/adb-transport.js +1 -1
  35. package/dist/src/agent-browser-lifecycle.js +1 -1
  36. package/dist/src/agent-browser-process-record.js +1 -1
  37. package/dist/src/agent-browser-provider.js +1 -1
  38. package/dist/src/agent-browser-tool.js +1 -1
  39. package/dist/src/agent-device-client.js +2 -2
  40. package/dist/src/ai-sdk.js +1 -1
  41. package/dist/src/alert-runtime.js +1 -1
  42. package/dist/src/alert.js +1 -1
  43. package/dist/src/android-adb.d.ts +12 -0
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/app-backend.js +1 -0
  46. package/dist/src/app-catalog.js +1 -1
  47. package/dist/src/app-deployment-resolution.js +1 -1
  48. package/dist/src/app-inventory.js +1 -1
  49. package/dist/src/app-launch.js +1 -1
  50. package/dist/src/app-lifecycle.js +2 -2
  51. package/dist/src/app-lifecycle2.js +1 -1
  52. package/dist/src/app-log-files.js +1 -1
  53. package/dist/src/app-log-reconnect.js +1 -1
  54. package/dist/src/app-log-runtime2.js +3 -3
  55. package/dist/src/app-log-session-resource.js +1 -0
  56. package/dist/src/app-resolution.js +2 -2
  57. package/dist/src/apple-runner-platform.js +1 -1
  58. package/dist/src/application-lifecycle-interaction.js +1 -1
  59. package/dist/src/archive.js +2 -2
  60. package/dist/src/artifact-download.js +1 -1
  61. package/dist/src/auth-session.js +1 -1
  62. package/dist/src/auth.js +1 -1
  63. package/dist/src/back-mode.js +1 -1
  64. package/dist/src/backend-snapshot-options.js +1 -1
  65. package/dist/src/boot-diagnostics.js +1 -1
  66. package/dist/src/cache.js +1 -1
  67. package/dist/src/capabilities.js +1 -1
  68. package/dist/src/capture.js +1 -1
  69. package/dist/src/cli-config.js +1 -1
  70. package/dist/src/cli-help.js +13 -5
  71. package/dist/src/cli.js +4 -4
  72. package/dist/src/click-button.js +1 -1
  73. package/dist/src/client-metro-companion.js +1 -1
  74. package/dist/src/client-metro.js +1 -1
  75. package/dist/src/client-options.js +3 -0
  76. package/dist/src/client-types.d.ts +88 -5
  77. package/dist/src/clipboard-shell-response.js +1 -1
  78. package/dist/src/cloud-artifacts.d.ts +7 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-schema.js +1 -1
  82. package/dist/src/command-tools.js +2 -2
  83. package/dist/src/connection-runtime.js +1 -1
  84. package/dist/src/connection.js +5 -5
  85. package/dist/src/contracts.d.ts +1 -1
  86. package/dist/src/contracts.js +1 -1
  87. package/dist/src/daemon-artifacts.js +1 -0
  88. package/dist/src/daemon-client-lease-beat.js +1 -1
  89. package/dist/src/daemon-client-lifecycle.js +1 -1
  90. package/dist/src/daemon-client-liveness-probe.js +1 -0
  91. package/dist/src/daemon-client-transport.js +1 -1
  92. package/dist/src/daemon-http.js +1 -0
  93. package/dist/src/daemon-policy-file.js +1 -1
  94. package/dist/src/daemon-registration-owner.js +1 -0
  95. package/dist/src/daemon-registration.js +1 -1
  96. package/dist/src/daemon-resolution.js +1 -1
  97. package/dist/src/daemon-shutdown-report.js +1 -1
  98. package/dist/src/daemon.js +2 -2
  99. package/dist/src/debug-symbols-facade.js +1 -1
  100. package/dist/src/device-claim-inspection.js +1 -1
  101. package/dist/src/device-claim-rule.js +1 -1
  102. package/dist/src/device-inventory-context.js +1 -1
  103. package/dist/src/device-readiness-runtime.js +1 -1
  104. package/dist/src/device-release.js +1 -1
  105. package/dist/src/device-rotation.js +1 -1
  106. package/dist/src/device-selection-resolver.js +1 -1
  107. package/dist/src/device-session.js +1 -1
  108. package/dist/src/device-shell.js +1 -1
  109. package/dist/src/device.js +1 -1
  110. package/dist/src/device2.js +1 -3
  111. package/dist/src/device3.js +3 -0
  112. package/dist/src/devicectl.js +1 -1
  113. package/dist/src/diagnostics.js +3 -3
  114. package/dist/src/dispatch-resolve.js +4 -1
  115. package/dist/src/display-inventory.js +1 -1
  116. package/dist/src/doctor-facade.js +1 -1
  117. package/dist/src/doctor2.js +1 -1
  118. package/dist/src/durable-capture-resource.js +1 -0
  119. package/dist/src/engine-eval-script.js +1 -1
  120. package/dist/src/error.js +1 -1
  121. package/dist/src/exec.js +1 -1
  122. package/dist/src/file.js +1 -1
  123. package/dist/src/find.js +1 -1
  124. package/dist/src/generic-settle.js +1 -1
  125. package/dist/src/generic.js +1 -1
  126. package/dist/src/gesture-admission.js +1 -1
  127. package/dist/src/gesture-plan.js +1 -1
  128. package/dist/src/gesture-runtime.js +1 -1
  129. package/dist/src/harmonyos.js +1 -1
  130. package/dist/src/hdc.js +1 -1
  131. package/dist/src/helper.js +2 -2
  132. package/dist/src/host-file.js +1 -1
  133. package/dist/src/host.js +1 -1
  134. package/dist/src/human-control-contract.js +1 -1
  135. package/dist/src/human-control.js +1 -1
  136. package/dist/src/index.d.ts +1 -1
  137. package/dist/src/index.js +1 -1
  138. package/dist/src/input-actions.js +1 -1
  139. package/dist/src/input-actions2.js +2 -2
  140. package/dist/src/install-artifact-facade.js +1 -1
  141. package/dist/src/install-source-network-transport.js +1 -1
  142. package/dist/src/install-source.d.ts +5 -0
  143. package/dist/src/install-source2.js +1 -1
  144. package/dist/src/instance-client.js +1 -0
  145. package/dist/src/interaction-positionals.js +1 -1
  146. package/dist/src/interaction-ref-policy.js +1 -1
  147. package/dist/src/interaction.js +1 -1
  148. package/dist/src/interaction2.js +1 -1
  149. package/dist/src/interactor-operation-binding.js +1 -1
  150. package/dist/src/interactor.js +5 -5
  151. package/dist/src/interactor2.js +1 -1
  152. package/dist/src/interactors.js +1 -1
  153. package/dist/src/internal/bin.js +1 -1
  154. package/dist/src/internal/daemon.js +1 -2
  155. package/dist/src/internal/png-worker.js +1 -1
  156. package/dist/src/internal/run-script-http-child.js +1 -1
  157. package/dist/src/inventory.js +4 -4
  158. package/dist/src/inventory2.js +1 -1
  159. package/dist/src/inventory3.js +1 -1
  160. package/dist/src/inventory5.js +1 -1
  161. package/dist/src/ios-client.js +4 -30
  162. package/dist/src/ios-settings.js +1 -0
  163. package/dist/src/ios-snapshot-engine.js +1 -1
  164. package/dist/src/ios-snapshot-runtime.js +1 -1
  165. package/dist/src/launch-confirmation.js +1 -1
  166. package/dist/src/lease-context.js +1 -1
  167. package/dist/src/lease-registry-scope.js +1 -0
  168. package/dist/src/lease-scope.js +1 -1
  169. package/dist/src/lease.js +1 -1
  170. package/dist/src/legacy-xctest-device-set.js +1 -1
  171. package/dist/src/limrun-download-file.js +1 -1
  172. package/dist/src/limrun-runtime-dependencies.js +1 -1
  173. package/dist/src/limrun.d.ts +28 -2
  174. package/dist/src/limrun.js +1 -1
  175. package/dist/src/linux.js +1 -1
  176. package/dist/src/load.js +1 -0
  177. package/dist/src/location-coordinates.js +1 -1
  178. package/dist/src/macos-facade.js +1 -1
  179. package/dist/src/managed-device-scope.js +1 -1
  180. package/dist/src/mechanics.js +16 -16
  181. package/dist/src/observation.js +1 -1
  182. package/dist/src/observe-until.js +1 -1
  183. package/dist/src/overlay.js +2 -2
  184. package/dist/src/owner-identity.js +3 -3
  185. package/dist/src/path-resolution.js +1 -1
  186. package/dist/src/perf-facade.js +1 -1
  187. package/dist/src/perf-runtime-operation-builder.js +1 -1
  188. package/dist/src/perf-runtime-plan.js +1 -1
  189. package/dist/src/perf-target.js +1 -1
  190. package/dist/src/perf.js +1 -1
  191. package/dist/src/physical-device-control.js +1 -1
  192. package/dist/src/platform-request-scope.js +1 -1
  193. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  194. package/dist/src/platform-runtime-app-log-process.js +1 -1
  195. package/dist/src/platform-runtime-host.js +1 -1
  196. package/dist/src/platform-runtime-managed-owner.js +1 -1
  197. package/dist/src/platform-runtime-open-target.js +1 -1
  198. package/dist/src/platform-runtime-operation-host.js +2 -2
  199. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  200. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  201. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  202. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  203. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  204. package/dist/src/platform-runtime-screen-recording-output-host.js +1 -1
  205. package/dist/src/platform-runtime-screen-recording-process-host.js +1 -1
  206. package/dist/src/platform-runtime-unavailable.js +1 -1
  207. package/dist/src/platform-runtime.js +1 -1
  208. package/dist/src/platform-runtime2.js +1 -1
  209. package/dist/src/plugins.d.ts +9 -0
  210. package/dist/src/plugins.js +1 -0
  211. package/dist/src/plugins2.js +2 -0
  212. package/dist/src/png-crop-bytes.js +1 -1
  213. package/dist/src/png-size.js +1 -1
  214. package/dist/src/png-worker-client.js +1 -1
  215. package/dist/src/png.js +1 -1
  216. package/dist/src/prepare-kind.js +1 -1
  217. package/dist/src/process.js +1 -1
  218. package/dist/src/project-runtime.js +1 -1
  219. package/dist/src/provider-credential-fingerprint.js +1 -0
  220. package/dist/src/provider-device-admission.js +1 -1
  221. package/dist/src/provider-device-runtimes.js +1 -0
  222. package/dist/src/provider-limrun-credentials.js +1 -0
  223. package/dist/src/provider-profile-fields.js +1 -0
  224. package/dist/src/provider-session-ownership.js +2 -2
  225. package/dist/src/provider-webdriver.js +2 -1
  226. package/dist/src/providers.js +1 -1
  227. package/dist/src/proxy.js +1 -1
  228. package/dist/src/quality-warnings.js +1 -1
  229. package/dist/src/react-native.js +1 -1
  230. package/dist/src/record-runtime.js +1 -1
  231. package/dist/src/record-trace.js +1 -1
  232. package/dist/src/recording.js +1 -1
  233. package/dist/src/rect-center.js +1 -1
  234. package/dist/src/register-builtins.js +1 -1
  235. package/dist/src/registry.js +39 -39
  236. package/dist/src/remote-config2.js +1 -1
  237. package/dist/src/replay-divergence.js +1 -1
  238. package/dist/src/replay.js +2 -2
  239. package/dist/src/reporting.js +5 -5
  240. package/dist/src/request-admission.js +1 -1
  241. package/dist/src/request-cancel.js +1 -1
  242. package/dist/src/request-cancellation.js +1 -1
  243. package/dist/src/request-runtime-binding.js +1 -1
  244. package/dist/src/result-serialization.js +1 -1
  245. package/dist/src/retry.js +1 -1
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-metadata.js +3 -3
  248. package/dist/src/runner-client.js +1 -1
  249. package/dist/src/runner-dev-tools-security.js +1 -1
  250. package/dist/src/runner-device-readiness.js +1 -1
  251. package/dist/src/runner-disposal.js +1 -1
  252. package/dist/src/runner-error-classification.js +2 -2
  253. package/dist/src/runner-exchange.js +1 -1
  254. package/dist/src/runner-operations-facade.js +1 -1
  255. package/dist/src/runner-session-types.js +1 -1
  256. package/dist/src/runner-start-budget.js +1 -1
  257. package/dist/src/runner.js +1 -1
  258. package/dist/src/runtime-admission.js +1 -1
  259. package/dist/src/runtime-transport-hints.js +1 -1
  260. package/dist/src/runtime.js +1 -1
  261. package/dist/src/runtime10.js +2 -2
  262. package/dist/src/runtime2.js +3 -3
  263. package/dist/src/runtime3.js +1 -1
  264. package/dist/src/runtime4.js +5 -5
  265. package/dist/src/runtime5.js +1 -1
  266. package/dist/src/runtime6.js +1 -1
  267. package/dist/src/runtime7.js +1 -1
  268. package/dist/src/runtime8.js +1 -1
  269. package/dist/src/runtime9.js +1 -1
  270. package/dist/src/screen-recording-admission-ledger.js +1 -1
  271. package/dist/src/screen-recording-completion.js +1 -1
  272. package/dist/src/screen-recording-options.js +1 -1
  273. package/dist/src/screen-recording-resource-recovery.js +1 -1
  274. package/dist/src/screen-recording-transport.js +1 -1
  275. package/dist/src/screenshot-density.js +1 -1
  276. package/dist/src/screenshot-image.js +1 -1
  277. package/dist/src/screenshot-result.js +1 -1
  278. package/dist/src/screenshot-runtime.js +1 -1
  279. package/dist/src/screenshot.js +1 -1
  280. package/dist/src/screenshot3.js +1 -1
  281. package/dist/src/script.js +1 -1
  282. package/dist/src/scroll-command.js +1 -1
  283. package/dist/src/scroll-gesture.js +1 -1
  284. package/dist/src/sdk-batch-runner.js +2 -2
  285. package/dist/src/sdk-batch.js +2 -2
  286. package/dist/src/sdk-contracts.d.ts +45 -2
  287. package/dist/src/sdk-contracts.js +2 -2
  288. package/dist/src/sdk-device.js +1 -1
  289. package/dist/src/sdk-io.js +1 -1
  290. package/dist/src/sdk-remote-config.js +1 -1
  291. package/dist/src/sdk-selectors.d.ts +33 -4
  292. package/dist/src/selection.js +0 -0
  293. package/dist/src/selector-runtime.js +1 -1
  294. package/dist/src/selectors.d.ts +2 -2
  295. package/dist/src/selectors.js +1 -1
  296. package/dist/src/server.js +1 -1
  297. package/dist/src/session-allocation.js +1 -1
  298. package/dist/src/session-artifact-paths.js +1 -1
  299. package/dist/src/session-repair-tombstone.js +1 -1
  300. package/dist/src/session-routing.js +1 -1
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session-snapshot.js +1 -1
  303. package/dist/src/session-stream.js +27 -0
  304. package/dist/src/session.js +1 -1
  305. package/dist/src/session2.js +5 -5
  306. package/dist/src/settings.js +1 -1
  307. package/dist/src/settings2.js +1 -1
  308. package/dist/src/simctl-settings-facade.js +1 -0
  309. package/dist/src/simctl-settings.js +1 -0
  310. package/dist/src/simctl.js +1 -1
  311. package/dist/src/simulator.js +1 -1
  312. package/dist/src/snapshot-diagnostics.js +1 -1
  313. package/dist/src/snapshot-runtime-binding.js +1 -1
  314. package/dist/src/snapshot-runtime.js +1 -1
  315. package/dist/src/snapshot-state.js +1 -1
  316. package/dist/src/snapshot2.js +1 -1
  317. package/dist/src/snapshot3.js +1 -1
  318. package/dist/src/snapshot4.js +1 -1
  319. package/dist/src/src.js +1 -1
  320. package/dist/src/src7.js +1 -1
  321. package/dist/src/src8.js +2 -2
  322. package/dist/src/store.js +1 -0
  323. package/dist/src/string-enum.js +1 -1
  324. package/dist/src/surface-snapshot.js +1 -1
  325. package/dist/src/takeover.js +1 -1
  326. package/dist/src/target-evidence.js +1 -1
  327. package/dist/src/telemetry.js +1 -1
  328. package/dist/src/text-entry-focus.js +1 -1
  329. package/dist/src/tool-provider.js +1 -1
  330. package/dist/src/tool-provider2.js +1 -1
  331. package/dist/src/toolchain-probe.js +2 -2
  332. package/dist/src/touch-runtime.js +1 -1
  333. package/dist/src/touch-runtime2.js +1 -1
  334. package/dist/src/transport.js +2 -2
  335. package/dist/src/tv-remote.js +1 -1
  336. package/dist/src/type-text-runtime.js +1 -1
  337. package/dist/src/update-check.js +1 -1
  338. package/dist/src/vars.js +1 -1
  339. package/dist/src/verified-file.js +1 -1
  340. package/dist/src/version.js +1 -1
  341. package/dist/src/video.js +1 -1
  342. package/dist/src/viewport.js +1 -1
  343. package/dist/src/web.js +1 -1
  344. package/dist/src/web2.js +1 -1
  345. package/dist/src/webdriver-source.js +1 -1
  346. package/package.json +5 -1
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.20.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.20.apk.sha256 +0 -1
  351. package/dist/src/api.js +0 -3
  352. package/dist/src/daemon-process.js +0 -1
  353. package/dist/src/multitouch-support.js +0 -1
  354. package/dist/src/parameterized-recorded-fill.js +0 -1
  355. package/dist/src/runner-startup-transport.js +0 -1
  356. package/dist/src/runner-xctestrun.js +0 -1
  357. package/dist/src/session-store.js +0 -4
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t}from"./sdk-contracts.js";import{m as n}from"./sdk-device.js";import{C as r,D as i,E as a,I as ee,L as te,M as o,R as ne,W as re,_ as s,a as ie,m as ae,n as oe,s as se,u as c,v as ce,x as le,z as ue}from"./host.js";import{t as de}from"./runner-cache-metadata.js";import{d as l,m as u,n as d}from"./runner-session-types.js";import{n as fe}from"./runner-startup-transport.js";import{N as pe}from"./runner-error-classification.js";import{a as me,i as f,o as he}from"./runner-xctestrun.js";import p from"node:path";import m from"node:fs";import ge from"node:crypto";import _e from"node:os";const h=process.pid;let g;function _(){return g??={value:i(process.pid)},g.value}function v(){return ze(h,_())}function ve(e){let t=j(e.runnerLogPath);return{schemaVersion:1,deviceId:e.device.id,ownerToken:v(),ownerPid:h,ownerStartTime:_(),ownerStateDir:S(),sessionId:e.sessionId,runnerPid:e.runnerPid??null,runnerStartTime:e.runnerPid?i(e.runnerPid):null,port:e.port,xctestrunPath:e.xctestrunPath,cacheKey:e.cacheKey,jsonPath:e.jsonPath,...t?{runnerLogPath:t}:{},...M(l(e.device)),createdAtMs:Date.now(),deviceClaimProtocol:1}}async function y(e,t){return await re({acquire:()=>oe({lockDirPath:`${D(e)}.lock`,owner:{pid:h,startTime:_(),acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,ownerGraceMs:5e3,description:`iOS runner lease for ${e}`}),task:t})}function b(e){try{return k(JSON.parse(m.readFileSync(D(e),`utf8`)),e)}catch{return null}}function x(e){if(!e)return{type:`empty`};if(e.ownerToken===v())return{type:`owned`,lease:e};let t=se({owner:{pid:e.ownerPid,startTime:e.ownerStartTime},...e.ownerStateDir?{stateDir:e.ownerStateDir}:{}});return t!==`live`&&t!==`unknown`?{type:`stale`,lease:e,staleReason:t}:{type:`busy`,lease:e}}async function ye(e,n,r){let i=e.id,a=x(b(i));if(a.type===`empty`){await n.cleanupRunnerXcodebuildProcesses({deviceId:i});return}if(a.type===`busy`){if(be(a.lease)){await F(a.lease,`same-state-dir`,n);return}if(xe(a.lease,e)){await F(a.lease,`device-claim-takeover`,n);return}if(Se(a.lease,r)){await F(a.lease,`logical-lease-takeover`,n);return}throw new t(`COMMAND_FAILED`,r?`iOS runner for ${i} is busy after device lease admission`:`iOS runner for ${i} is already owned by another agent-device daemon`,{reason:`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,deviceId:i,logicalLeaseContext:r,ownerPid:a.lease.ownerPid,ownerStartTime:a.lease.ownerStartTime,ownerStateDir:a.lease.ownerStateDir,ownerToken:a.lease.ownerToken,sessionId:a.lease.sessionId,hint:we(a.lease,r)})}await F(a.lease,a.type,n)}function be(e){let t=S();return!t||!e.ownerStateDir?!1:p.resolve(t)===p.resolve(e.ownerStateDir)}function xe(e,t){return e.deviceClaimProtocol===1&&e.deviceId===t.id&&ae(t)}function Se(e,t){return!t||t.leaseProvider!==`proxy`||!t.leaseId||!t.clientId?!1:Ce(t.deviceKey,e.deviceId)}function Ce(e,t){if(!e)return!1;if(e===t)return!0;let[,,n]=e.split(`:`,3);return n===t}function S(){return le()||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}function we(e,t){let n=Te(e),r=Ee(e);return t?[r,n,`The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission.`,`Retry after the owning session closes or after the five-minute inactivity lease expires.`].join(` `):[r,n,`If the runner is still active, wait for it to finish. Do not run prepare ios-runner from another daemon/client to recover this.`].join(` `)}function Te(e){let t=`Runner owner: PID ${e.ownerPid}`;return e.ownerStateDir?`${t} with AGENT_DEVICE_STATE_DIR=${e.ownerStateDir}`:`${t}.`}function Ee(e){return e.ownerStateDir?`If it is stuck, stop the owning agent-device daemon for ${De(`AGENT_DEVICE_STATE_DIR`,e.ownerStateDir)} and retry.`:`If it is stuck, stop the owning agent-device daemon and retry.`}function De(e,t){return`${e}=${te(t)}`}function C(e){let t=x(b(e));switch(t.type){case`empty`:return{type:`absent`};case`owned`:return{type:`refused`,reason:`lease_owned_by_this_daemon`,lease:t.lease};case`busy`:return{type:`refused`,reason:`lease_owner_live`,lease:t.lease};case`stale`:return t.staleReason===`owner-state-dir-gone`?{type:`refused`,reason:`lease_owner_state_dir_gone`,lease:t.lease}:{type:`adoptable`,lease:t.lease}}}function Oe(e){let t=C(e);return t.type===`adoptable`?t.lease:null}function w(e){return{...e,ownerToken:`detached-${e.ownerToken}`}}async function T(e,t){let n=x(b(e));n.type===`owned`&&await F(n.lease,`owned`,t)}async function ke(e,t){if(!Number.isInteger(e.pid)||e.pid<=0)return;let n=Ne(e);await Promise.all(n.map(async e=>{await F(e,`owned`,t)}))}function Ae(e){return b(e)?.ownerToken??null}function E(e){e&&Me({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function je(e){let t=D(e.deviceId);m.mkdirSync(p.dirname(t),{recursive:!0}),r({destination:t,contents:JSON.stringify(e,null,2)})}function Me(e){let t=b(e.deviceId);if(t&&!(e.ownerToken&&t.ownerToken!==e.ownerToken)&&!(e.sessionId&&t.sessionId!==e.sessionId))try{m.unlinkSync(D(e.deviceId))}catch{}}function D(e){return p.join(O(),`${Be(e)}.json`)}function O(){let e=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim();return e?p.resolve(e):p.join(_e.homedir(),`.agent-device`,`apple-runner`,`leases`)}function Ne(e){let t,n=O();try{t=m.readdirSync(n,{withFileTypes:!0})}catch{return[]}let r=[];for(let i of t){if(!i.isFile()||!i.name.endsWith(`.json`))continue;let t=Pe(p.join(n,i.name));t&&t.ownerPid===e.pid&&(e.startTime===void 0||t.ownerStartTime===e.startTime)&&r.push(t)}return r}function Pe(e){try{let t=JSON.parse(m.readFileSync(e,`utf8`)),n=A(t.deviceId);return n?k(t,n):null}catch{return null}}function k(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;if(n.schemaVersion!==1||n.deviceId!==t)return null;let r=Fe(n);return r?{schemaVersion:1,deviceId:t,...r,ownerStartTime:N(n.ownerStartTime),ownerStateDir:N(n.ownerStateDir)??void 0,runnerPid:P(n.runnerPid),runnerStartTime:N(n.runnerStartTime),runnerLogPath:j(n.runnerLogPath),cacheKey:j(n.cacheKey),...M(n.simulatorSetPath),...n.deviceClaimProtocol===1?{deviceClaimProtocol:1}:{}}:null}function Fe(e){let t={ownerToken:A(e.ownerToken),ownerPid:P(e.ownerPid),sessionId:A(e.sessionId),port:P(e.port),xctestrunPath:A(e.xctestrunPath),jsonPath:A(e.jsonPath),createdAtMs:Ie(e.createdAtMs)};return Object.values(t).some(e=>e===null)?null:t}function A(e){return typeof e==`string`&&e.length>0?e:null}function j(e){return A(e)??void 0}function M(e){let t=A(e);return t?{simulatorSetPath:t}:{}}function N(e){return typeof e==`string`?e:null}function P(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:null}function Ie(e){return typeof e==`number`&&Number.isFinite(e)?e:null}async function F(e,t,n){c({level:t===`owned`?`debug`:`warn`,phase:`ios_runner_lease_cleanup`,data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await n.cleanupRunnerProcessTree(I(e),`SIGTERM`),await n.cleanupRunnerXcodebuildProcesses({deviceId:e.deviceId,xctestrunPath:e.xctestrunPath}),await n.cleanupRunnerProcessTree(I(e),`SIGKILL`),n.cleanupTempFile(e.xctestrunPath),n.cleanupTempFile(e.jsonPath),E(e)}function Le(e,t){return s(t)&&L(e,t)}function I(e){let t=e.runnerPid??void 0;if(!(!t||!s(t))){if(L(e,t))return t;c({level:`warn`,phase:`ios_runner_lease_recycled_pid_skipped`,data:{deviceId:e.deviceId,runnerPid:t,runnerStartTime:e.runnerStartTime??null,sessionId:e.sessionId}})}}function L(e,t){return e.runnerStartTime?i(t)===e.runnerStartTime:Re(a(t))}function Re(e){return!!e&&e.includes(`xcodebuild`)&&e.includes(`AgentDeviceRunner`)}function ze(e,t){let n=ge.createHash(`sha256`);return n.update(String(e)),n.update(`\0`),n.update(t??`unknown-start`),`owner-${e}-${n.digest(`hex`).slice(0,8)}`}function Be(e){return e.replaceAll(/[^A-Za-z0-9._-]/g,`-`)||`unknown-device`}var Ve=e({RUNNER_INVALIDATE_WAIT_TIMEOUT_MS:()=>R,abortRunnerSessionsAndPrepProcesses:()=>U,cleanupOwnedIosRunnerLease:()=>H,disposeRunnerSession:()=>V,isRunnerProcessAlive:()=>X,runnerLeaseCleanupAdapter:()=>B,stopRunnerPrepProcesses:()=>W});const R=1e3,z=2e3,B={cleanupRunnerProcessTree:$,cleanupRunnerXcodebuildProcesses:Ke,cleanupTempFile:u};async function V(e,t={}){d(e,`draining`);let r=!1;if(t.graceful!==!1)r=await He(e);else if(n(e.device)){await K([e]),await J(e,t);return}else await $(e.child.pid,`SIGTERM`);r||(await G(e,t.waitTimeoutMs??1e4),Y(e.child.pid)&&await $(e.child.pid,`SIGKILL`)),await J(e,t)}async function H(e){await T(e,B)}async function U(e){let t=Array.from(f),r=e.filter(e=>n(e.device)),i=e.filter(e=>!n(e.device));for(let t of e)d(t,`draining`);await Z(i,`SIGINT`),await Q(t,`SIGINT`),await Z(i,`SIGTERM`),await Q(t,`SIGTERM`),await Z(i,`SIGKILL`),await Q(t,`SIGKILL`),await K(r),await Promise.allSettled(e.map(async e=>{await J(e)}))}async function W(){let e=Array.from(f);await Promise.allSettled(e.map(async e=>{try{await $(e.pid,`SIGTERM`),await $(e.pid,`SIGKILL`)}finally{f.delete(e)}}))}async function He(e){try{return await fe(e.device,e.port,pe({command:`shutdown`}),void 0,15e3),!1}catch{return n(e.device)?(await K([e]),!0):(await $(e.child.pid,`SIGTERM`),!1)}}async function G(e,t){let n;try{return await Promise.race([e.testPromise.then(()=>!0,()=>!0),new Promise(e=>{n=setTimeout(()=>e(!1),t)})])||!Y(e.child.pid)}finally{n&&clearTimeout(n)}}async function K(e){if(e.length===0)return;await Z(e,`SIGINT`);let t=await q(e,5e3);await Z(t,`SIGTERM`),await Z(await q(t,2e3),`SIGKILL`)}async function q(e,t){let n=await Promise.all(e.map(async e=>await G(e,t)));return e.filter((e,t)=>!n[t])}async function J(e,t={}){await Ue(e,t),u(e.xctestrunPath),u(e.jsonPath),d(e,`stopped`)}async function Ue(e,t){let n=async()=>{if(!We(e))try{await Ge(e.device)}finally{E(e.lease)}};if(t.leaseLockHeld){await n();return}try{await y(e.deviceId,n)}catch(t){c({level:`warn`,phase:`ios_runner_disposal_lease_lock_unavailable`,data:{deviceId:e.deviceId,sessionId:e.sessionId,error:t instanceof Error?t.message:String(t)}})}}function We(e){let t=Ae(e.deviceId);return t!==null&&t!==e.lease?.ownerToken}async function Ge(e){e.kind===`simulator`&&await Promise.allSettled(de.map(async t=>{try{await ee(ie(e,[`terminate`,e.id,t]),{allowFailure:!0,timeoutMs:z})}catch(n){c({level:`warn`,phase:`ios_runner_simulator_app_terminate_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:z,error:n instanceof Error?n.message:String(n)}})}}))}function Y(e){return e?X(e)||ce(e):!1}function X(e){return e?s(e):!1}async function Z(e,t){await Promise.allSettled(e.map(async e=>{await $(e.child.pid,t)}))}async function Q(e,t){await Promise.allSettled(e.map(async e=>{await $(e.pid,t),t===`SIGKILL`&&f.delete(e)}))}async function $(e,t){if(!e||e<=0)return;ue(e,t),ne([e],t);let n=t===`SIGINT`?`INT`:t===`SIGTERM`?`TERM`:`KILL`;try{await o(`pkill`,[`-${n}`,`-P`,String(e)],{allowFailure:!0})}catch{}}async function Ke(e){let{deviceId:t}=e,n=`xcodebuild.*test-without-building.*${he(e.xctestrunPath)??me(t)}`;for(let e of[`TERM`,`KILL`])try{await o(`pkill`,[`-${e}`,`-f`,n],{allowFailure:!0,timeoutMs:2e3})}catch(n){c({level:`warn`,phase:`ios_runner_stale_xcodebuild_kill_failed`,data:{deviceId:t,signal:e,error:n instanceof Error?n.message:String(n)}})}}export{L as _,X as a,W as c,ke as d,Le as f,v as g,Oe as h,V as i,w as l,C as m,U as n,B as o,ye as p,H as r,Ve as s,R as t,ve as u,y as v,je as y};
1
+ import{r as e}from"./rolldown-runtime.js";import{F as t,K as n,P as r}from"./sdk-contracts.js";import{m as i}from"./sdk-device.js";import{t as a}from"./parser.js";import{A as o,B as s,D as c,F as l,G as u,H as d,L as f,N as p,O as m,R as ee,S as te,T as h,W as ne,_ as re,a as ie,b as g,d as ae,f as _,g as oe,m as se,n as ce,p as le,s as ue,u as v,v as y,w as de,y as fe,z as pe}from"./host.js";import{d as me,r as he}from"./apple-runner-platform.js";import{_ as ge,a as _e,b as ve,c as ye,d as be,f as xe,g as Se,h as Ce,l as we,m as Te,n as Ee,p as De,r as Oe,t as ke,v as Ae,x as je,y as Me}from"./runner-cache-metadata.js";import{S as Ne,_ as Pe,g as Fe,h as Ie,m as Le,n as b,u as Re,v as x}from"./runner-session-types.js";import{P as ze,r as Be}from"./runner-error-classification.js";import Ve from"node:crypto";import S from"node:fs";import He from"node:os";import C from"node:path";const w=new Set;function Ue(e){return C.join(e,Ee)}function We(e,t){S.mkdirSync(e,{recursive:!0}),S.writeFileSync(Ue(e),`${JSON.stringify(t,null,2)}\n`)}async function Ge(e,t){if(e.cache===`external`){k(`preserve`,`external_bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t});return}w.add(e.derived),await u({acquire:()=>Ke(e.derived),task:async()=>{k(`clean`,`bad_artifact`,{derived:e.derived,xctestrunPath:e.xctestrunPath,reason:t}),O(e.derived),D(e.derived)}})}async function Ke(e){return await ce({lockDirPath:qe(e),owner:{pid:process.pid,startTime:m(process.pid),acquiredAtMs:Date.now()},timeoutMs:6e5,pollMs:100,description:`iOS runner cache lock`})}function qe(e){return C.join(C.dirname(e),`${C.basename(e)}.lock`)}function Je(e,t){!$e()&&!t&&!w.has(e)||(k(`clean`,t?`forced_rebuild`:`forced_clean`,{derived:e}),O(e),D(e),w.delete(e))}async function T(e,t,n,r){let{buildRunnerCacheArtifactManifest:i}=await import(`./runner-artifact-manifest.js`),a=i(e,n,r);return We(e,a.ok?{...t,artifacts:a.artifacts}:t),a.ok?null:(k(`preserve`,`uncertifiable_products`,{derived:e,xctestrunPath:n,...a.refusal?{refusal:a.refusal}:{}}),a.refusal)}function E(e,t){if(e)throw new r(`COMMAND_FAILED`,`The Apple runner products cannot be certified for cache reuse`,{reason:`runner_cache_uncertifiable`,refusalReason:e.reason,refusingPath:e.path??t,...e.reason===`root_unusable`?{}:{resolvesTo:e.target},derived:t,hint:`Inspect ${e.path??t} under ${t}. A symlinked or unreadable product tree must be replaced; run pnpm build:xcuitest with a clean AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH.`})}function D(e){try{if(!S.existsSync(e))return;if(C.basename(e)!==`derived`){S.rmSync(e,{recursive:!0,force:!0});return}for(let t of S.readdirSync(e,{withFileTypes:!0}))Xe(t.name)&&S.rmSync(C.join(e,t.name),{recursive:!0,force:!0})}catch{}}const Ye=new Set([Ee,`Build`,`BuildCache.noindex`,`Index.noindex`,`Logs`,`ModuleCache.noindex`,`SDKStatCaches.noindex`,`SourcePackages`,`TextBasedInstallAPI`,`info.plist`]);function Xe(e){return Ye.has(e)}function Ze(e){try{let t=JSON.parse(S.readFileSync(Ue(e),`utf8`));return!t||typeof t!=`object`||Array.isArray(t)?null:t}catch{return null}}function Qe(e,t){let n=Ze(e);return n?ve(Oe(n))===ve(Oe(t))?{ok:!0,metadata:n}:{ok:!1,reason:`cache_metadata_mismatch`,differences:_e(t,n)}:{ok:!1,reason:`cache_metadata_missing`}}function $e(){return re(process.env.AGENT_DEVICE_IOS_CLEAN_DERIVED)}function O(e,t=process.env){if(t.AGENT_DEVICE_IOS_RUNNER_DERIVED_PATH?.trim()&&!et(e))throw new r(`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 ${C.join(_(),`.tmp`)}.`})}function et(e){let t=C.resolve(_(),`.tmp`),n=C.relative(t,C.resolve(e));return n!==``&&!n.startsWith(`..`)&&!C.isAbsolute(n)}async function tt(e){let t=Qe(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 nt(e,t){k(`rebuild`,e.reason,{derived:t,...e.reason===`cache_metadata_mismatch`?{metadataDifferences:e.metadataDifferences}:{},...e.reason===`artifact_content_mismatch`?{mismatch:e.mismatch}:{}})}function k(e,t,n){v({level:e===`rebuild`||e===`preserve`?`warn`:`info`,phase:`runner_xctestrun_cache`,data:{action:e,reason:t,...n}})}const rt=new Set([`RUNNER_PRODUCT_MISSING`,`RUNNER_PRODUCT_REPAIR_FAILED`]),it=[`--force`,`--preserve-metadata=identifier,entitlements,flags,runtime`,`--sign`,`-`];async function at(e,t,n){if(!i(e))return;if(t.length===0)throw new r(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,xctestrunPath:n});let a=Array.from(new Set(t)).sort((e,t)=>t.length-e.length);for(let e of a)if(!S.existsSync(e))throw new r(`COMMAND_FAILED`,`Missing macOS runner product`,{reason:`RUNNER_PRODUCT_MISSING`,productPath:e,xctestrunPath:n});for(let e of a)await lt(e)||await ot(e,n)}async function ot(e,n){try{let t=C.join(e,`Contents`,`Frameworks`),n=S.existsSync(t)?S.readdirSync(t).sort().map(e=>C.join(t,e)):[];for(let e of n)await p(`codesign`,[...it,e]);await p(`codesign`,[...it,e])}catch(r){let i=t(r,`COMMAND_FAILED`);throw st(e,n,i.message,i.details)}if(!await lt(e))throw st(e,n,`Product still fails code signature verification after re-signing`)}function st(e,t,n,i){return new r(`COMMAND_FAILED`,`Failed to repair macOS runner product signature`,{reason:`RUNNER_PRODUCT_REPAIR_FAILED`,productPath:e,xctestrunPath:t,error:n,details:i})}function ct(e){if(!(e instanceof r))return!1;let t=e.details&&typeof e.details==`object`?e.details.reason:void 0;return typeof t==`string`&&rt.has(t)}async function lt(e){return(await p(`codesign`,[`--verify`,`--deep`,`--strict`,e],{allowFailure:!0})).exitCode===0}const ut=new Set([`ProductPaths`,`DependentProductPaths`,`TestHostPath`,`TestBundlePath`,`UITargetAppPath`]);async function dt(e){let t=await mt(e);if(!t||t.length===0)return null;let n=C.dirname(e),r=new Set,i=ft(t,n);for(let e of i.testRootPaths){if(!S.existsSync(e))return null;r.add(e)}for(let e of pt(i)){if(!e)return null;r.add(e)}return Array.from(r)}function ft(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(C.join(t,e));let o=xt(e);o&&r.add(C.join(t,o))}return{testRootPaths:n,hostRoots:Array.from(r),hostRelativePaths:i}}function pt(e){return e.hostRelativePaths.map(t=>{let n=e.hostRoots.find(e=>S.existsSync(C.join(e,t)));return n?C.join(n,t):null})}async function mt(e){let t=await h(e);if(t)return ht(t);if(process.platform===`darwin`)return null;try{return yt(S.readFileSync(e,`utf8`))}catch{return null}}function ht(e){let t=new Set;for(let n of[e,...gt(e),..._t(e)])for(let e of vt(n))t.add(e);return Array.from(t)}function gt(e){let t=e.TestConfigurations;if(!Array.isArray(t))return[];let n=[];for(let e of t){if(!g(e))continue;let t=e.TestTargets;Array.isArray(t)&&n.push(...t.filter(g))}return n}function _t(e){return Object.values(e).filter(e=>g(e)&&`TestBundlePath`in e)}function vt(e){let t=new Set;for(let[n,r]of Object.entries(e))if(ut.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 yt(e){return bt(a(e))}function bt(e){let t=new Set;return d(e,(e,n)=>{if(ut.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 xt(e){let t=/\.app(?:\/|$)/.exec(e);return!t||t.index===void 0?null:e.slice(0,t.index+4)}const St=[`CFBundleIcons`,`CFBundleIcons~ipad`];async function Ct(e){await wt(Lt(e))}async function wt(e){let t=e.filter(Ft);if(t.length===0)return;let n=e.filter(e=>A(e)&&!It(e));for(let e of t){let t=Pt(e,n);t&&await Tt(t,e)}}async function Tt(e,t){let n=Et(e,t),r=await Dt(e,t);(n||r)&&(await At(t),Nt(t))}function Et(e,t){let n=!1;for(let r of S.readdirSync(e,{withFileTypes:!0}))!r.isFile()||!Mt(r.name)||jt(C.join(e,r.name),C.join(t,r.name))&&(n=!0);return n}async function Dt(e,t){let n=C.join(e,`Info.plist`),r=C.join(t,`Info.plist`),i=await h(n),a=await h(r);if(!i||!a)return!1;let o=Ot(i,a);if(o.length===0)return!1;for(let e of o)await kt(r,e.key,e.value,e.shouldInsert);return!0}function Ot(e,t){return St.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 kt(e,t,n,r){o(await p(`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 At(e){o(await p(`codesign`,[`--force`,`--sign`,`-`,`--timestamp=none`,`--generate-entitlement-der`,e],{allowFailure:!0}),`Failed to sign XCTest runner app after icon update`,{runnerAppPath:e})}function jt(e,t){if(S.existsSync(t)){let n=S.readFileSync(e),r=S.readFileSync(t);return!n.equals(r)&&(S.copyFileSync(e,t),!0)}return S.copyFileSync(e,t),!0}function Mt(e){return/^AppIcon.*\.png$/.test(e)||e===`Assets.car`}function Nt(e){let t=new Date;S.utimesSync(e,t,t)}function Pt(e,t){let n=C.dirname(e);return t.find(e=>C.dirname(e)===n&&C.basename(e)===`AgentDeviceRunner.app`)??t.find(t=>C.dirname(t)===n&&t!==e)??null}function Ft(e){return A(e)&&It(e)&&(e.includes(`Debug-iphonesimulator`)||e.includes(`Release-iphonesimulator`)||e.includes(`Debug-appletvsimulator`)||e.includes(`Release-appletvsimulator`))}function It(e){return C.basename(e).endsWith(`-Runner.app`)}function A(e){return C.basename(e).endsWith(`.app`)}function Lt(e){if(!S.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop();for(let r of S.readdirSync(e,{withFileTypes:!0})){if(!r.isDirectory())continue;let i=C.join(e,r.name);if(A(i)){t.push(i);continue}n.push(i)}}return t.sort((e,t)=>e.localeCompare(t))}const j=`AgentDeviceRunner.env`,Rt=`session`,zt=`${N(`${j}.${Rt}`)}-`;function Bt(e){return M(`${Rt}-${e.deviceId}-${e.ownerToken}-${e.port}`)}function Vt(e){return`${zt}${N(M(e))}-[0-9]`}function Ht(e){let t=e?C.basename(e):``;if(t.startsWith(`${j}.`))return N(t)}function M(e){return e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`)}function N(e){return e.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`)}const Ut={PreferredScreenCaptureFormat:`screenshots`,SystemAttachmentLifetime:`keepNever`,UserAttachmentLifetime:`keepNever`};async function Wt(e,t,n,r={}){let i=r.iosXctestEnvDir?.trim(),a=i?C.resolve(i):C.dirname(e);S.mkdirSync(a,{recursive:!0});let o=M(n),s=C.join(a,`${j}.${o}.json`),c=C.join(a,`${j}.${o}.xctestrun`),l=await Gt(e);return Yt(l,e=>qt(e,t)),Jt(l),await Kt(l,s,c),{xctestrunPath:c,jsonPath:s}}async function Gt(e){let t=await p(`plutil`,[`-convert`,`json`,`-o`,`-`,e],{allowFailure:!0});if(t.exitCode!==0||!t.stdout.trim())throw new r(`COMMAND_FAILED`,`Failed to read xctestrun plist`,{xctestrunPath:e,stderr:t.stderr});try{let e=JSON.parse(t.stdout);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`Root must be an object`);return e}catch(t){throw new r(`COMMAND_FAILED`,`Failed to parse xctestrun JSON`,{xctestrunPath:e,error:String(t)})}}async function Kt(e,t,n){S.writeFileSync(t,JSON.stringify(e,null,2)),o(await p(`plutil`,[`-convert`,`xml1`,`-o`,n,t],{allowFailure:!0}),`Failed to write xctestrun plist`,{tmpXctestrunPath:n})}function qt(e,t){e.EnvironmentVariables={...e.EnvironmentVariables??{},...t},e.UITestEnvironmentVariables={...e.UITestEnvironmentVariables??{},...t},e.UITargetAppEnvironmentVariables={...e.UITargetAppEnvironmentVariables??{},...t},e.TestingEnvironmentVariables={...e.TestingEnvironmentVariables??{},...t}}function Jt(e){Yt(e,e=>Object.assign(e,Ut),{requireTestBundlePath:!0})}function Yt(e,t,n={}){let r=e.TestConfigurations;if(Array.isArray(r))for(let e of r)!e||typeof e!=`object`||Xt(e.TestTargets,t,n);for(let n of Object.values(e)){let e=Zt(n,{requireTestBundlePath:!0});e&&t(e)}}function Xt(e,t,n){if(Array.isArray(e))for(let r of e){let e=Zt(r,n);e&&t(e)}}function Zt(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;return t.requireTestBundlePath&&!n.TestBundlePath?null:n}const Qt=new Map,P=new Set;function $t(e,t,n){let r={deviceId:e,requestId:n,child:t};P.add(r),t.on(`close`,()=>{P.delete(r)})}function en(e){return nn(e).map(e=>e.child)}function tn(e){return nn(e).filter(e=>!rn(e.requestId)).map(e=>e.child)}function nn(e){return[...P].filter(t=>e===void 0||t.deviceId===e)}function rn(e){if(!e)return!1;let t=le(e);return t!==void 0&&!t.aborted}function an(e){for(let t of P)t.child===e&&P.delete(t)}async function on(e,t){let n=sn(t);if(n)return n;let r=_(),i=we(e,r,t.budget),a=Ce(e,i);return await ne(Qt,a,async()=>await u({acquire:()=>Ke(a),task:()=>ln({device:e,options:t,projectRoot:r,expectedCacheMetadata:i,derived:a,forceRebuild:t.forceRunnerXctestrunRebuild===!0})}))}function sn(e){let t=e.iosXctestrunFile?.trim();if(!t)return null;let n=C.resolve(t);if(!S.existsSync(n))throw new r(`COMMAND_FAILED`,`Configured iOS XCTest runner .xctestrun file not found`,{configKey:`iosXctestrunFile`,xctestrunPath:n});let i=e.iosXctestDerivedDataPath?.trim(),a=i?C.resolve(i):cn(n);return k(`reuse`,`external_xctestrun`,{derived:a,xctestrunPath:n}),{xctestrunPath:n,derived:a,cache:`external`,artifact:`valid`,buildMs:0,xctestrunPathSource:`external`}}function cn(e){let t=Ve.createHash(`sha1`);t.update(e);let n=t.digest(`hex`).slice(0,12);return C.join(He.tmpdir(),`agent-device-ios-xctest-derived`,n)}async function ln(e){let{device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a}=e;Je(a,e.forceRebuild);let o=await tt({derived:a,expectedCacheMetadata:i}),s=o.reason===`reuse_ready`?`exact`:`miss`;return await un({device:t,derived:a,expectedCacheMetadata:i,existing:o,cache:s})||(o.reason!==`reuse_ready`&&nt(o,a),o.reason!==`cache_metadata_missing`&&(O(a),D(a)),await dn({device:t,options:n,projectRoot:r,expectedCacheMetadata:i,derived:a,cache:s,reason:o.reason}))}async function un(e){let{device:t,derived:n,expectedCacheMetadata:r,existing:i,cache:a}=e;if(i.reason!==`reuse_ready`)return null;let o=await fn(t,n,r,i);return o?{xctestrunPath:o,derived:n,cache:a,cacheKey:Te(r),artifact:`valid`,buildMs:0,xctestrunPathSource:`manifest`}:null}async function dn(e){let{device:t,options:n,projectRoot:i,expectedCacheMetadata:a,derived:o,cache:s,reason:c}=e,l=je(i);if(!S.existsSync(l))throw new r(`COMMAND_FAILED`,`iOS runner project not found`,{projectPath:l});let u=ye(n.budget,`runner_xctestrun_build`),d=Date.now();ae({type:`command`,status:`progress`,message:`Building Apple runner...`}),await vn(t,l,o,n,u);let f=Math.max(0,Date.now()-d),p=mn(o,t);if(!p)throw new r(`COMMAND_FAILED`,`Failed to locate .xctestrun after build`);let m=await dt(p);if(!m)throw new r(`COMMAND_FAILED`,`Runner build is missing expected products`,{xctestrunPath:p});return await at(t,m,p),await wt(m),E(await T(o,a,p,m),o),k(`build`,`built_new`,{derived:o,xctestrunPath:p}),{xctestrunPath:p,derived:o,cache:s,cacheKey:Te(a),artifact:`rebuilt`,buildMs:f,xctestrunPathSource:`build`,reason:c}}async function fn(e,t,n,r){try{return await at(e,r.productPaths,r.xctestrunPath),E(await T(t,n,r.xctestrunPath,r.productPaths),t),k(`reuse`,`reuse_ready`,{derived:t,xctestrunPath:r.xctestrunPath}),r.xctestrunPath}catch(e){if(!ct(e))throw e;return k(`rebuild`,`repair_failed`,{derived:t,xctestrunPath:r.xctestrunPath}),null}}async function pn(e){try{let t=_(),n=we(e,t);return(await tt({derived:Ce(e,n),expectedCacheMetadata:n})).reason===`reuse_ready`}catch{return!1}}function mn(e,t){let n=hn(e);return n.length===0?null:(n.sort((e,n)=>gn(e,n,t)),n[0]?.path??null)}function hn(e){if(!S.existsSync(e))return[];let t=[],n=[e];for(;n.length>0;){let e=n.pop(),r=S.readdirSync(e,{withFileTypes:!0});for(let i of r){let r=C.join(e,i.name);if(i.isDirectory()){n.push(r);continue}if(i.isFile()&&i.name.endsWith(`.xctestrun`))try{let e=S.statSync(r);t.push({path:r,mtimeMs:e.mtimeMs})}catch{}}}return t}function gn(e,t,n){if(n){let r=_n(t.path,n)-_n(e.path,n);if(r!==0)return r}return t.mtimeMs-e.mtimeMs||e.path.localeCompare(t.path)}function _n(e,t){let n=0,r=e.toLowerCase();C.basename(r).startsWith(`agentdevicerunner.env.`)&&(n-=1e3),r.includes(`${C.sep}macos${C.sep}`)&&(n-=5e3);let i=me(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 vn(e,t,i,a,o){let s=De(process.env),c=Me(process.env,e.kind===`device`,e),u=e.kind===`device`?[`-allowProvisioningUpdates`]:[],d=ge(),f=be(process.env),p=Ae();try{await l(`xcodebuild`,[`build-for-testing`,`-project`,t,`-scheme`,`AgentDeviceRunner`,`-parallel-testing-enabled`,`NO`,Se(e),`1`,...Pe(e,he(e)),`-derivedDataPath`,i,...xe(i),...d,...f,...p,...s,...u,...c],{detached:!0,timeoutMs:o,signal:a.budget?.signal,onSpawn:t=>{$t(e.id,t,a.requestId)},onStdoutChunk:e=>{Ne(e,a.logPath,a.traceLogPath,a.verbose)},onStderrChunk:e=>{Ne(e,a.logPath,a.traceLogPath,a.verbose)}})}catch(t){if(n(t))throw t;let i=t instanceof r?t:new r(`COMMAND_FAILED`,String(t)),o=Le(e),{reason:s,hint:c,matched:l}=Be(new r(i.code,i.message,{...i.details,...o})),u=oe(i),d=`xcodebuild build-for-testing failed`;throw new r(`COMMAND_FAILED`,s===`simulator_set_destination_not_found`?Fe(d,e,o):d,{reason:s,error:i.message,details:i.details,logPath:a.logPath,hint:c,startupRuleMatched:l,startupHostDeadlineHit:u,...o})}}const F=process.pid;let yn;function I(){return yn??={value:m(process.pid)},yn.value}function L(){return Zn(F,I())}function bn(e){let t=H(e.runnerLogPath);return{schemaVersion:1,deviceId:e.device.id,ownerToken:L(),ownerPid:F,ownerStartTime:I(),ownerStateDir:Dn(),sessionId:e.sessionId,runnerPid:e.runnerPid??null,runnerStartTime:e.runnerPid?m(e.runnerPid):null,port:e.port,xctestrunPath:e.xctestrunPath,cacheKey:e.cacheKey,jsonPath:e.jsonPath,...t?{runnerLogPath:t}:{},...Kn(Ie(e.device)),createdAtMs:Date.now(),deviceClaimProtocol:1}}async function xn(e,t){return await u({acquire:()=>ce({lockDirPath:`${B(e)}.lock`,owner:{pid:F,startTime:I(),acquiredAtMs:Date.now()},timeoutMs:3e4,pollMs:100,description:`iOS runner lease for ${e}`}),task:t})}function R(e){try{return Wn(JSON.parse(S.readFileSync(B(e),`utf8`)),e)}catch{return null}}function z(e){if(!e)return{type:`empty`};if(e.ownerToken===L())return{type:`owned`,lease:e};let t=ue({owner:{pid:e.ownerPid,startTime:e.ownerStartTime},...e.ownerStateDir?{stateDir:e.ownerStateDir}:{}});return t!==`live`&&t!==`unknown`?{type:`stale`,lease:e,staleReason:t}:{type:`busy`,lease:e}}async function Sn(e,t,n){let i=e.id,a=z(R(i));if(a.type===`empty`){await t.cleanupRunnerXcodebuildProcesses({deviceId:i});return}if(a.type===`busy`){if(Cn(a.lease)){await G(a.lease,`same-state-dir`,t);return}if(wn(a.lease,e)){await G(a.lease,`device-claim-takeover`,t);return}if(Tn(a.lease,n)){await G(a.lease,`logical-lease-takeover`,t);return}throw new r(`COMMAND_FAILED`,n?`iOS runner for ${i} is busy after device lease admission`:`iOS runner for ${i} is already owned by another agent-device daemon`,{reason:`IOS_RUNNER_OWNED_BY_OTHER_DAEMON`,deviceId:i,logicalLeaseContext:n,ownerPid:a.lease.ownerPid,ownerStartTime:a.lease.ownerStartTime,ownerStateDir:a.lease.ownerStateDir,ownerToken:a.lease.ownerToken,sessionId:a.lease.sessionId,hint:On(a.lease,n)})}await G(a.lease,a.type,t)}function Cn(e){let t=Dn();return!t||!e.ownerStateDir?!1:C.resolve(t)===C.resolve(e.ownerStateDir)}function wn(e,t){return e.deviceClaimProtocol===1&&e.deviceId===t.id&&se(t)}function Tn(e,t){return!t||t.leaseProvider!==`proxy`||!t.leaseId||!t.clientId?!1:En(t.deviceKey,e.deviceId)}function En(e,t){if(!e)return!1;if(e===t)return!0;let[,,n]=e.split(`:`,3);return n===t}function Dn(){return te()||process.env.AGENT_DEVICE_STATE_DIR?.trim()||void 0}function On(e,t){let n=kn(e),r=An(e);return t?[r,n,`The device is busy because another active device lease owns it, or the runner is owned by another daemon/process after lease admission.`,`Retry after the owning session closes or after the five-minute inactivity lease expires.`].join(` `):[r,n,`If the runner is still active, wait for it to finish. Do not run prepare ios-runner from another daemon/client to recover this.`].join(` `)}function kn(e){let t=`Runner owner: PID ${e.ownerPid}`;return e.ownerStateDir?`${t} with AGENT_DEVICE_STATE_DIR=${e.ownerStateDir}`:`${t}.`}function An(e){return e.ownerStateDir?`If it is stuck, stop the owning agent-device daemon for ${jn(`AGENT_DEVICE_STATE_DIR`,e.ownerStateDir)} and retry.`:`If it is stuck, stop the owning agent-device daemon and retry.`}function jn(e,t){return`${e}=${ee(t)}`}function Mn(e){let t=z(R(e));switch(t.type){case`empty`:return{type:`absent`};case`owned`:return{type:`refused`,reason:`lease_owned_by_this_daemon`,lease:t.lease};case`busy`:return{type:`refused`,reason:`lease_owner_live`,lease:t.lease};case`stale`:return t.staleReason===`owner-state-dir-gone`?{type:`refused`,reason:`lease_owner_state_dir_gone`,lease:t.lease}:{type:`adoptable`,lease:t.lease}}}function Nn(e){let t=Mn(e);return t.type===`adoptable`?t.lease:null}function Pn(e){return{...e,ownerToken:`detached-${e.ownerToken}`}}async function Fn(e,t){let n=z(R(e));n.type===`owned`&&await G(n.lease,`owned`,t)}async function In(e,t){if(!Number.isInteger(e.pid)||e.pid<=0)return;let n=Hn(e);await Promise.all(n.map(async e=>{await G(e,`owned`,t)}))}function Ln(e){return R(e)?.ownerToken??null}function Rn(e){e&&Bn({deviceId:e.deviceId,ownerToken:e.ownerToken,sessionId:e.sessionId})}function zn(e){let t=B(e.deviceId);S.mkdirSync(C.dirname(t),{recursive:!0}),de({destination:t,contents:JSON.stringify(e,null,2)})}function Bn(e){let t=R(e.deviceId);if(t&&!(e.ownerToken&&t.ownerToken!==e.ownerToken)&&!(e.sessionId&&t.sessionId!==e.sessionId))try{S.unlinkSync(B(e.deviceId))}catch{}}function B(e){return C.join(Vn(),`${Qn(e)}.json`)}function Vn(){let e=process.env.AGENT_DEVICE_IOS_RUNNER_LEASE_DIR?.trim();return e?C.resolve(e):C.join(He.homedir(),`.agent-device`,`apple-runner`,`leases`)}function Hn(e){let t,n=Vn();try{t=S.readdirSync(n,{withFileTypes:!0})}catch{return[]}let r=[];for(let i of t){if(!i.isFile()||!i.name.endsWith(`.json`))continue;let t=Un(C.join(n,i.name));t&&t.ownerPid===e.pid&&(e.startTime===void 0||t.ownerStartTime===e.startTime)&&r.push(t)}return r}function Un(e){try{let t=JSON.parse(S.readFileSync(e,`utf8`)),n=V(t.deviceId);return n?Wn(t,n):null}catch{return null}}function Wn(e,t){if(!e||typeof e!=`object`||Array.isArray(e))return null;let n=e;if(n.schemaVersion!==1||n.deviceId!==t)return null;let r=Gn(n);return r?{schemaVersion:1,deviceId:t,...r,ownerStartTime:U(n.ownerStartTime),ownerStateDir:U(n.ownerStateDir)??void 0,runnerPid:W(n.runnerPid),runnerStartTime:U(n.runnerStartTime),runnerLogPath:H(n.runnerLogPath),cacheKey:H(n.cacheKey),...Kn(n.simulatorSetPath),...n.deviceClaimProtocol===1?{deviceClaimProtocol:1}:{}}:null}function Gn(e){let t={ownerToken:V(e.ownerToken),ownerPid:W(e.ownerPid),sessionId:V(e.sessionId),port:W(e.port),xctestrunPath:V(e.xctestrunPath),jsonPath:V(e.jsonPath),createdAtMs:qn(e.createdAtMs)};return Object.values(t).some(e=>e===null)?null:t}function V(e){return typeof e==`string`&&e.length>0?e:null}function H(e){return V(e)??void 0}function Kn(e){let t=V(e);return t?{simulatorSetPath:t}:{}}function U(e){return typeof e==`string`?e:null}function W(e){return typeof e==`number`&&Number.isInteger(e)&&e>0?e:null}function qn(e){return typeof e==`number`&&Number.isFinite(e)?e:null}async function G(e,t,n){v({level:t===`owned`?`debug`:`warn`,phase:`ios_runner_lease_cleanup`,data:{deviceId:e.deviceId,ownerPid:e.ownerPid,ownerStateDir:e.ownerStateDir,ownerToken:e.ownerToken,runnerPid:e.runnerPid,sessionId:e.sessionId,reason:t}}),await n.cleanupRunnerProcessTree(Yn(e),`SIGTERM`),await n.cleanupRunnerXcodebuildProcesses({deviceId:e.deviceId,xctestrunPath:e.xctestrunPath}),await n.cleanupRunnerProcessTree(Yn(e),`SIGKILL`),n.cleanupTempFile(e.xctestrunPath),n.cleanupTempFile(e.jsonPath),Rn(e)}function Jn(e,t){return y(t)&&K(e,t)}function Yn(e){let t=e.runnerPid??void 0;if(!(!t||!y(t))){if(K(e,t))return t;v({level:`warn`,phase:`ios_runner_lease_recycled_pid_skipped`,data:{deviceId:e.deviceId,runnerPid:t,runnerStartTime:e.runnerStartTime??null,sessionId:e.sessionId}})}}function K(e,t){return e.runnerStartTime?m(t)===e.runnerStartTime:Xn(c(t))}function Xn(e){return!!e&&e.includes(`xcodebuild`)&&e.includes(`AgentDeviceRunner`)}function Zn(e,t){let n=Ve.createHash(`sha256`);return n.update(String(e)),n.update(`\0`),n.update(t??`unknown-start`),`owner-${e}-${n.digest(`hex`).slice(0,8)}`}function Qn(e){return e.replaceAll(/[^A-Za-z0-9._-]/g,`-`)||`unknown-device`}var $n=e({RUNNER_INVALIDATE_WAIT_TIMEOUT_MS:()=>er,abortRunnerSessionsAndPrepProcesses:()=>ir,cleanupOwnedIosRunnerLease:()=>rr,disposeRunnerSession:()=>nr,isRunnerProcessAlive:()=>X,runnerLeaseCleanupAdapter:()=>q,stopRunnerPrepProcesses:()=>ar,stopRunnerPrepProcessesWithoutActiveOwner:()=>or});const er=1e3,tr=2e3,q={cleanupRunnerProcessTree:$,cleanupRunnerXcodebuildProcesses:hr,cleanupTempFile:x};async function nr(e,t={}){b(e,`draining`);let n=!1;if(t.graceful!==!1)n=await cr(e);else if(i(e.device)){await J([e]),await Y(e,t);return}else await $(e.child.pid,`SIGTERM`);n||(await lr(e,t.waitTimeoutMs??1e4),mr(e.child.pid)&&await $(e.child.pid,`SIGKILL`)),await Y(e,t)}async function rr(e){await Fn(e,q)}async function ir(e){let t=en(),n=e.filter(e=>i(e.device)),r=e.filter(e=>!i(e.device));for(let t of e)b(t,`draining`);await Z(r,`SIGINT`),await Q(t,`SIGINT`),await Z(r,`SIGTERM`),await Q(t,`SIGTERM`),await Z(r,`SIGKILL`),await Q(t,`SIGKILL`),await J(n),await Promise.allSettled(e.map(async e=>{await Y(e)}))}async function ar(e){await sr(en(e))}async function or(e){await sr(tn(e))}async function sr(e){await Promise.allSettled(e.map(async e=>{try{await $(e.pid,`SIGTERM`),await $(e.pid,`SIGKILL`)}finally{an(e)}}))}async function cr(e){try{return await Re(e.device,e.port,ze({command:`shutdown`}),void 0,15e3),!1}catch{return i(e.device)?(await J([e]),!0):(await $(e.child.pid,`SIGTERM`),!1)}}async function lr(e,t){let n;try{return await Promise.race([e.testPromise.then(()=>!0,()=>!0),new Promise(e=>{n=setTimeout(()=>e(!1),t)})])||!mr(e.child.pid)}finally{n&&clearTimeout(n)}}async function J(e){if(e.length===0)return;await Z(e,`SIGINT`);let t=await ur(e,5e3);await Z(t,`SIGTERM`),await Z(await ur(t,2e3),`SIGKILL`)}async function ur(e,t){let n=await Promise.all(e.map(async e=>await lr(e,t)));return e.filter((e,t)=>!n[t])}async function Y(e,t={}){await dr(e,t),x(e.xctestrunPath),x(e.jsonPath),b(e,`stopped`)}async function dr(e,t){let n=async()=>{if(!fr(e))try{await pr(e.device)}finally{Rn(e.lease)}};if(t.leaseLockHeld){await n();return}try{await xn(e.deviceId,n)}catch(t){v({level:`warn`,phase:`ios_runner_disposal_lease_lock_unavailable`,data:{deviceId:e.deviceId,sessionId:e.sessionId,error:t instanceof Error?t.message:String(t)}})}}function fr(e){let t=Ln(e.deviceId);return t!==null&&t!==e.lease?.ownerToken}async function pr(e){e.kind===`simulator`&&await Promise.allSettled(ke.map(async t=>{try{await f(ie(e,[`terminate`,e.id,t]),{allowFailure:!0,timeoutMs:tr})}catch(n){v({level:`warn`,phase:`ios_runner_simulator_app_terminate_failed`,data:{deviceId:e.id,bundleId:t,timeoutMs:tr,error:n instanceof Error?n.message:String(n)}})}}))}function mr(e){return e?X(e)||fe(e):!1}function X(e){return e?y(e):!1}async function Z(e,t){await Promise.allSettled(e.map(async e=>{await $(e.child.pid,t)}))}async function Q(e,t){await Promise.allSettled(e.map(async e=>{await $(e.pid,t),t===`SIGKILL`&&an(e)}))}async function $(e,t){if(!e||e<=0)return;s(e,t),pe([e],t);let n=t===`SIGINT`?`INT`:t===`SIGTERM`?`TERM`:`KILL`;try{await p(`pkill`,[`-${n}`,`-P`,String(e)],{allowFailure:!0})}catch{}}async function hr(e){let{deviceId:t}=e,n=`xcodebuild.*test-without-building.*${Ht(e.xctestrunPath)??Vt(t)}`;for(let e of[`TERM`,`KILL`])try{await p(`pkill`,[`-${e}`,`-f`,n],{allowFailure:!0,timeoutMs:2e3})}catch(n){v({level:`warn`,phase:`ios_runner_stale_xcodebuild_kill_failed`,data:{deviceId:t,signal:e,error:n instanceof Error?n.message:String(n)}})}}export{T as A,pn as C,dt as D,Ct as E,Ge as O,mn as S,Wt as T,L as _,X as a,zn as b,ar as c,bn as d,In as f,Nn as g,Mn as h,nr as i,E as k,or as l,Sn as m,ir as n,q as o,Jn as p,rr as r,$n as s,er as t,Pn as u,K as v,Bt as w,on as x,xn as y};
@@ -1,3 +1,3 @@
1
- import{F as e,N as t,W as n,et as r}from"./sdk-contracts.js";import{i}from"./alert-contract.js";import{b as a,h as o,p as s}from"./host.js";import ee from"node:crypto";const c=`RUNNER_BUSY`,l=`RUNNER_WEDGED`,u=`APP_NOT_RUNNING`;function te(e){let t=s(e.requestId);return e.signal?!t||t===e.signal?e.signal:AbortSignal.any([t,e.signal]):t}function d(e){return e instanceof DOMException&&e.name===`TimeoutError`}function ne(e){return a(e.requestId)||s(e.requestId)?.aborted?!1:e.signal?.aborted===!0&&d(e.signal.reason)}function re(e){let t=s(e.requestId),n=e.signal;if(!n||n===t)return t;let r=new AbortController,i=()=>{d(n.reason)||r.abort(n.reason)};return n.aborted?i():n.addEventListener(`abort`,i,{once:!0}),t?AbortSignal.any([t,r.signal]):r.signal}const f=`SCROLL_KEYBOARD_OCCLUDES_SURFACE`,p=new Set([`APP_SCREEN_WINDOW_UNRESOLVED`,`APP_SCREEN_UNRESOLVED`,`APP_SCREEN_CAPTURE_UNRENDERABLE`]),ie=new Map([[c,{retriable:!0,reason:`runner_busy`}],[`MAIN_THREAD_TIMEOUT`,{reason:`runner_main_thread_timeout`}],[u,{retriable:!0}],[i,{}],[f,{}],...[...p].map(e=>[e,{}])]),ae=new Map([[`INVALID_ARGS`,`no`],[`ELEMENT_NOT_FOUND`,`no`],[`ELEMENT_OFFSCREEN`,`no`],[`AMBIGUOUS_MATCH`,`no`],[c,`no`],[l,`no`],[u,`no`],[f,`no`],[i,`no`],...[...p].map(e=>[e,`no`])]);function m(e){let t=e===void 0?void 0:ie.get(e);return Object.freeze({code:t?`COMMAND_FAILED`:r(e),details:Object.freeze({runnerErrorCode:e,...t,dispatched:(e===void 0?void 0:ae.get(e))??`unknown`})})}function oe(e){let n;try{n=JSON.parse(e)}catch{throw new t(`COMMAND_FAILED`,`Invalid runner response`,{text:e})}if(!h(n))throw new t(`COMMAND_FAILED`,`Invalid runner response`,{text:e});return n}function h(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function g(e){return e.ok===!0}function _(e){return!e.data||typeof e.data!=`object`||Array.isArray(e.data)?{}:e.data}function v(e,n){let r=y(e.error?.code),i=typeof e.error?.message==`string`?e.error.message:void 0,a=typeof e.error?.hint==`string`?e.error.hint:void 0,o=m(r);return new t(o.code,i??`Runner error`,{runner:e,...o.details,xcodebuild:{exitCode:1,stdout:``,stderr:``},hint:a,logPath:n})}function y(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function b(e){return e.command===`status`||e.commandId?.trim()?e:{...e,commandId:x()}}function x(){return`runner-${ee.randomUUID()}`}function S(t){if(a(t))throw e()}const C={readOnly:!1,readinessProbe:!1,readinessPreflightExempt:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},w={...C,readinessPreflightExempt:!0},T={...C,readOnly:!0},E={...T,readinessProbe:!0},D={...C,readinessPreflightSkipEligibleAfterHealthyMutation:!0},se={tap:D,mouseClick:C,longPress:D,drag:D,remotePress:C,type:C,swipe:D,scroll:D,desktopScroll:D,findText:T,querySelector:T,readText:T,snapshot:T,screenshot:T,backInApp:C,backSystem:C,home:C,rotate:C,gesture:D,gestureViewport:T,appSwitcher:C,actionButton:C,keyboardDismiss:C,keyboardReturn:C,alert:e=>(e.action??`get`).toLowerCase()===`get`?T:C,sequence:D,recordStart:C,recordStop:C,status:E,uptime:E,appState:T,pasteboardWrite:C,activate:w,terminate:w,targetReset:w,shutdown:C};function O(e){return k(e).readOnly}function ce(e){return k(e).readinessProbe}function le(e){return k(e).readinessPreflightExempt}function ue(e){return k(e).readinessPreflightSkipEligibleAfterHealthyMutation}function k(e){let t=se[e.command];return typeof t==`function`?t(e):t}const A="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/apple-runner/derived, then retry.";function j(e){return{runnerConnectFailureReason:e}}const M=`runner_reply_lost`,N=e=>e.reason===M,P=e=>e.runnerErrorCode===c,F=e=>typeof e.devToolsSecurityStatus==`string`,I=e=>typeof e.simulatorSetPath==`string`,L=e=>e.usbmuxDeviceAttached===!1,R=e=>t=>t.runnerConnectFailureReason===e,z=e=>e.runnerReadinessPreflightFailed===!0&&!n(e),B=`build_failed_unclassified`,V={reason:`signing_provisioning_profile_missing`,hint:`Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.`},H=[{reason:M,match:{code:`COMMAND_FAILED`,details:N},verdicts:{retryable:!1,drainResend:!1,connectRetry:!1,restartBeforeSend:!1,restartAfterReadinessPreflight:!1}},{reason:`usbmux_device_unattached`,match:{code:`DEVICE_NOT_FOUND`,details:L},verdicts:{connectRetry:!1}},{reason:`runner_busy_refusal`,match:{code:`COMMAND_FAILED`,details:P},verdicts:{retryable:!0,connectRetry:!0,drainResend:!0}},{reason:`xcodebuild_exited_early`,match:{code:`COMMAND_FAILED`,details:R(`xcodebuild_exited_early`)},verdicts:{retryable:!1,connectRetry:!1,artifactSuspect:!1}},{reason:`device_busy_connecting`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`device is busy`,`connecting`]},verdicts:{retryable:!1,connectRetry:!1}},{reason:`runner_readiness_preflight_failed`,match:{code:`COMMAND_FAILED`,details:z},verdicts:{restartAfterReadinessPreflight:!0}},{reason:`runner_connect_refused`,match:{code:`COMMAND_FAILED`,details:R(`runner_connect_refused`)},verdicts:{retryable:!0,connectRetry:!0,restartBeforeSend:!0,artifactSuspect:!0}},{reason:`runner_endpoint_probe_exhausted`,match:{code:`COMMAND_FAILED`,details:R(`runner_endpoint_probe_exhausted`)},verdicts:{artifactSuspect:!0}},{reason:`fetch_failed`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`fetch failed`]},verdicts:{retryable:!0,connectRetry:!0}},{reason:`econnrefused`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`econnrefused`]},verdicts:{retryable:!0,connectRetry:!0}},{reason:`socket_hang_up`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`socket hang up`]},verdicts:{retryable:!0,connectRetry:!0}},{reason:`ax_snapshot_failure`,match:{code:`IOS_AX_SNAPSHOT_FAILED`},verdicts:{sessionFatalReason:`ax_snapshot_failure`}},{reason:`xctest_recorded_failure`,match:{code:`XCTEST_RECORDED_FAILURE`},verdicts:{sessionFatalReason:`xctest_recorded_failure`}},{reason:`runner_main_thread_wedged`,match:{code:l},verdicts:{sessionFatalReason:`runner_main_thread_wedged`}},{reason:`simulator_set_destination_not_found`,match:{toolTextIncludesAll:[`matching the provided destination specifier`],details:I},verdicts:{},buildFailure:{reason:`simulator_set_destination_not_found`,hint:"Check that the simulator still exists in the --ios-simulator-device-set this error names (`xcrun simctl --set <set> list devices`). If it does, the Xcode this error names no longer honors -DVTSimulatorSetLocation, so use a simulator in the default set."}},{reason:`bundle_identifier_registration_failed`,match:{toolTextIncludesAll:[`failed registering bundle identifier`]},verdicts:{},buildFailure:{reason:`bundle_identifier_already_registered`,hint:`Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.`}},{reason:`bundle_identifier_unavailable`,match:{toolTextLineIncludesAll:[`app identifier`,`not available`]},verdicts:{},buildFailure:{reason:`bundle_identifier_already_registered`,hint:`Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.`}},{reason:`signing_requires_development_team`,match:{toolTextIncludesAll:[`requires a development team`]},verdicts:{},buildFailure:{reason:`signing_no_development_team`,hint:`Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.`}},{reason:`conflicting_provisioning_settings_unproven`,match:{toolTextIncludesAll:[`conflicting provisioning settings`]},verdicts:{},buildFailure:{reason:B,hint:A}},{reason:`signing_no_profiles_for_bundle_id`,match:{toolTextIncludesAll:[`no profiles for`]},verdicts:{},buildFailure:V},{reason:`signing_provisioning_profile_xcode_error`,match:{toolTextLineIncludesAll:[`provisioning profile`,`ideprovisioningerrordomain`]},verdicts:{},buildFailure:V},{reason:`signing_provisioning_profile_does_not_cover`,match:{toolTextLineIncludesAll:[`provisioning profile`,`doesn't include`]},verdicts:{},buildFailure:V},{reason:`signing_provisioning_profile_expired`,match:{toolTextLineIncludesAll:[`provisioning profile`,`has expired`]},verdicts:{},buildFailure:V},{reason:`signing_unspecified`,match:{toolTextIncludesAll:[`code signing`]},verdicts:{},buildFailure:{reason:`signing_unspecified`,hint:`Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.`}},{reason:`devtools_security_refused`,match:{code:`COMMAND_FAILED`,details:F},verdicts:{},buildFailure:{reason:`devtools_security_developer_mode_disabled`,hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach."}}];function U(e,t){return t.code!==void 0&&e.code!==t.code||!de(e,t.details)||!pe(e,t.toolTextIncludesAll)||!me(e,t.toolTextLineIncludesAll)?!1:fe(e,t.foreignMessageIncludesAll)}function de(e,t){return t===void 0||t(e.details??{})}function fe(e,t){if(!t)return!0;let n=`${e.message??``}`.toLowerCase();return t.every(e=>n.includes(e))}function W(e){let t=e.details??{};return[e.message,t.stdout,t.stderr].filter(e=>typeof e==`string`).join(`
1
+ import{G as e,I as t,P as n,rt as r}from"./sdk-contracts.js";import{i}from"./alert-contract.js";import{g as a,p as o,x as s}from"./host.js";import ee from"node:crypto";const c=`RUNNER_BUSY`,l=`RUNNER_WEDGED`,u=`APP_NOT_RUNNING`;function te(e){let t=o(e.requestId);return e.signal?!t||t===e.signal?e.signal:AbortSignal.any([t,e.signal]):t}function d(e){return e instanceof DOMException&&e.name===`TimeoutError`}function ne(e){return s(e.requestId)||o(e.requestId)?.aborted?!1:e.signal?.aborted===!0&&d(e.signal.reason)}function re(e){let t=o(e.requestId),n=e.signal;if(!n||n===t)return t;let r=new AbortController,i=()=>{d(n.reason)||r.abort(n.reason)};return n.aborted?i():n.addEventListener(`abort`,i,{once:!0}),t?AbortSignal.any([t,r.signal]):r.signal}const f=`SCROLL_KEYBOARD_OCCLUDES_SURFACE`,p=new Set([`APP_SCREEN_WINDOW_UNRESOLVED`,`APP_SCREEN_UNRESOLVED`,`APP_SCREEN_CAPTURE_UNRENDERABLE`]),ie=new Map([[c,{retriable:!0,reason:`runner_busy`}],[`MAIN_THREAD_TIMEOUT`,{reason:`runner_main_thread_timeout`}],[u,{retriable:!0}],[i,{}],[f,{}],...[...p].map(e=>[e,{}])]),ae=new Map([[`INVALID_ARGS`,`no`],[`ELEMENT_NOT_FOUND`,`no`],[`ELEMENT_OFFSCREEN`,`no`],[`AMBIGUOUS_MATCH`,`no`],[c,`no`],[l,`no`],[u,`no`],[f,`no`],[i,`no`],...[...p].map(e=>[e,`no`])]);function m(e){let t=e===void 0?void 0:ie.get(e);return Object.freeze({code:t?`COMMAND_FAILED`:r(e),details:Object.freeze({runnerErrorCode:e,...t,dispatched:(e===void 0?void 0:ae.get(e))??`unknown`})})}function oe(e){let t;try{t=JSON.parse(e)}catch{throw new n(`COMMAND_FAILED`,`Invalid runner response`,{text:e})}if(!h(t))throw new n(`COMMAND_FAILED`,`Invalid runner response`,{text:e});return t}function h(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function g(e){return e.ok===!0}function _(e){return!e.data||typeof e.data!=`object`||Array.isArray(e.data)?{}:e.data}function v(e,t){let r=y(e.error?.code),i=typeof e.error?.message==`string`?e.error.message:void 0,a=typeof e.error?.hint==`string`?e.error.hint:void 0,o=m(r);return new n(o.code,i??`Runner error`,{runner:e,...o.details,xcodebuild:{exitCode:1,stdout:``,stderr:``},hint:a,logPath:t})}function y(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function b(e){return e.command===`status`||e.commandId?.trim()?e:{...e,commandId:x()}}function x(){return`runner-${ee.randomUUID()}`}function S(e){if(s(e))throw t()}const C={readOnly:!1,readinessProbe:!1,readinessPreflightExempt:!1,readinessPreflightSkipEligibleAfterHealthyMutation:!1},w={...C,readinessPreflightExempt:!0},T={...C,readOnly:!0},E={...T,readinessProbe:!0},D={...C,readinessPreflightSkipEligibleAfterHealthyMutation:!0},se={tap:D,mouseClick:C,longPress:D,drag:D,remotePress:C,type:C,swipe:D,scroll:D,desktopScroll:D,findText:T,querySelector:T,readText:T,snapshot:T,screenshot:T,backInApp:C,backSystem:C,home:C,rotate:C,gesture:D,gestureViewport:T,appSwitcher:C,actionButton:C,keyboardDismiss:C,keyboardReturn:C,alert:e=>(e.action??`get`).toLowerCase()===`get`?T:C,sequence:D,recordStart:C,recordStop:C,status:E,uptime:E,appState:T,pasteboardWrite:C,activate:w,terminate:w,targetReset:w,shutdown:C};function O(e){return k(e).readOnly}function ce(e){return k(e).readinessProbe}function le(e){return k(e).readinessPreflightExempt}function ue(e){return k(e).readinessPreflightSkipEligibleAfterHealthyMutation}function k(e){let t=se[e.command];return typeof t==`function`?t(e):t}const A="If runner build products look stale or corrupted, run `pnpm clean:xcuitest` in a local checkout, or remove ~/.agent-device/apple-runner/derived, then retry.";function j(e){return{runnerConnectFailureReason:e}}const M=`runner_reply_lost`,N=e=>e.reason===M,P=e=>e.runnerErrorCode===c,F=e=>typeof e.devToolsSecurityStatus==`string`,I=e=>typeof e.simulatorSetPath==`string`,L=e=>e.usbmuxDeviceAttached===!1,R=e=>t=>t.runnerConnectFailureReason===e,z=t=>t.runnerReadinessPreflightFailed===!0&&!e(t),B=`build_failed_unclassified`,V={reason:`signing_provisioning_profile_missing`,hint:`Install/select a valid iOS provisioning profile, or set AGENT_DEVICE_IOS_PROVISIONING_PROFILE.`},H=[{reason:M,match:{code:`COMMAND_FAILED`,details:N},verdicts:{retryable:!1,drainResend:!1,connectRetry:!1,restartBeforeSend:!1,restartAfterReadinessPreflight:!1}},{reason:`usbmux_device_unattached`,match:{code:`DEVICE_NOT_FOUND`,details:L},verdicts:{connectRetry:!1}},{reason:`runner_busy_refusal`,match:{code:`COMMAND_FAILED`,details:P},verdicts:{retryable:!0,connectRetry:!0,drainResend:!0}},{reason:`xcodebuild_exited_early`,match:{code:`COMMAND_FAILED`,details:R(`xcodebuild_exited_early`)},verdicts:{retryable:!1,connectRetry:!1,artifactSuspect:!1}},{reason:`device_busy_connecting`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`device is busy`,`connecting`]},verdicts:{retryable:!1,connectRetry:!1}},{reason:`runner_readiness_preflight_failed`,match:{code:`COMMAND_FAILED`,details:z},verdicts:{restartAfterReadinessPreflight:!0}},{reason:`runner_connect_refused`,match:{code:`COMMAND_FAILED`,details:R(`runner_connect_refused`)},verdicts:{retryable:!0,connectRetry:!0,restartBeforeSend:!0,artifactSuspect:!0}},{reason:`runner_endpoint_probe_exhausted`,match:{code:`COMMAND_FAILED`,details:R(`runner_endpoint_probe_exhausted`)},verdicts:{artifactSuspect:!0}},{reason:`fetch_failed`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`fetch failed`]},verdicts:{retryable:!0,connectRetry:!0}},{reason:`econnrefused`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`econnrefused`]},verdicts:{retryable:!0,connectRetry:!0}},{reason:`socket_hang_up`,match:{code:`COMMAND_FAILED`,foreignMessageIncludesAll:[`socket hang up`]},verdicts:{retryable:!0,connectRetry:!0}},{reason:`ax_snapshot_failure`,match:{code:`IOS_AX_SNAPSHOT_FAILED`},verdicts:{sessionFatalReason:`ax_snapshot_failure`}},{reason:`xctest_recorded_failure`,match:{code:`XCTEST_RECORDED_FAILURE`},verdicts:{sessionFatalReason:`xctest_recorded_failure`}},{reason:`runner_main_thread_wedged`,match:{code:l},verdicts:{sessionFatalReason:`runner_main_thread_wedged`}},{reason:`simulator_set_destination_not_found`,match:{toolTextIncludesAll:[`matching the provided destination specifier`],details:I},verdicts:{},buildFailure:{reason:`simulator_set_destination_not_found`,hint:"Check that the simulator still exists in the --ios-simulator-device-set this error names (`xcrun simctl --set <set> list devices`). If it does, the Xcode this error names no longer honors -DVTSimulatorSetLocation, so use a simulator in the default set."}},{reason:`bundle_identifier_registration_failed`,match:{toolTextIncludesAll:[`failed registering bundle identifier`]},verdicts:{},buildFailure:{reason:`bundle_identifier_already_registered`,hint:`Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.`}},{reason:`bundle_identifier_unavailable`,match:{toolTextLineIncludesAll:[`app identifier`,`not available`]},verdicts:{},buildFailure:{reason:`bundle_identifier_already_registered`,hint:`Set AGENT_DEVICE_IOS_BUNDLE_ID to a unique reverse-DNS value (for example, com.yourname.agentdevice.runner), then retry.`}},{reason:`signing_requires_development_team`,match:{toolTextIncludesAll:[`requires a development team`]},verdicts:{},buildFailure:{reason:`signing_no_development_team`,hint:`Configure signing in Xcode or set AGENT_DEVICE_IOS_TEAM_ID for physical-device runs.`}},{reason:`conflicting_provisioning_settings_unproven`,match:{toolTextIncludesAll:[`conflicting provisioning settings`]},verdicts:{},buildFailure:{reason:B,hint:A}},{reason:`signing_no_profiles_for_bundle_id`,match:{toolTextIncludesAll:[`no profiles for`]},verdicts:{},buildFailure:V},{reason:`signing_provisioning_profile_xcode_error`,match:{toolTextLineIncludesAll:[`provisioning profile`,`ideprovisioningerrordomain`]},verdicts:{},buildFailure:V},{reason:`signing_provisioning_profile_does_not_cover`,match:{toolTextLineIncludesAll:[`provisioning profile`,`doesn't include`]},verdicts:{},buildFailure:V},{reason:`signing_provisioning_profile_expired`,match:{toolTextLineIncludesAll:[`provisioning profile`,`has expired`]},verdicts:{},buildFailure:V},{reason:`signing_unspecified`,match:{toolTextIncludesAll:[`code signing`]},verdicts:{},buildFailure:{reason:`signing_unspecified`,hint:`Enable Automatic Signing in Xcode or provide AGENT_DEVICE_IOS_TEAM_ID and optional AGENT_DEVICE_IOS_SIGNING_IDENTITY.`}},{reason:`devtools_security_refused`,match:{code:`COMMAND_FAILED`,details:F},verdicts:{},buildFailure:{reason:`devtools_security_developer_mode_disabled`,hint:"Run `sudo DevToolsSecurity -enable`, then retry the iOS runner. UI test runners start suspended until Xcode/testmanagerd can attach."}}];function U(e,t){return t.code!==void 0&&e.code!==t.code||!de(e,t.details)||!pe(e,t.toolTextIncludesAll)||!me(e,t.toolTextLineIncludesAll)?!1:fe(e,t.foreignMessageIncludesAll)}function de(e,t){return t===void 0||t(e.details??{})}function fe(e,t){if(!t)return!0;let n=`${e.message??``}`.toLowerCase();return t.every(e=>n.includes(e))}function W(e){let t=e.details??{};return[e.message,t.stdout,t.stderr].filter(e=>typeof e==`string`).join(`
2
2
  `).toLowerCase()}function pe(e,t){if(!t)return!0;let n=W(e);return t.every(e=>n.includes(e))}function me(e,t){return!t||W(e).split(`
3
- `).some(e=>t.every(t=>e.includes(t)))}function G(e,n){if(e instanceof t){for(let t of H)if(t.verdicts[n]!==void 0&&U(e,t.match))return t.verdicts[n]}}function he(e){return!(e instanceof t)||e.code!==`COMMAND_FAILED`?!1:G(e,`retryable`)??!1}function ge(e){return K(e)?!0:e instanceof t&&e.details?.runnerErrorCode===`MAIN_THREAD_TIMEOUT`}function K(e){return G(e,`drainResend`)??!1}function _e(e){return e instanceof t&&e.details?.runner!==void 0}function ve(e){return!(e instanceof t)||e.code!==`DEVICE_NOT_FOUND`?!1:L(e.details??{})}function ye(e){return G(e,`connectRetry`)??!0}function q(e){return G(e,`restartAfterReadinessPreflight`)??!1}function be(e){return G(e,`artifactSuspect`)??!1}function xe(e){return G(e,`sessionFatalReason`)}function Se(e,t){return J(e)?X(e)===`no`||O(t):!1}function J(e){return G(e,`restartBeforeSend`)??!1}function Ce(e){return J(e)&&Y(e)||q(e)||K(e)}function Y(e){return e instanceof t&&e.details?.dispatched===`no`||Z(e,0)}function X(e){return Y(e)?`no`:`unknown`}function Z(e,t){return t>4||typeof e!=`object`||!e?!1:e.code===`ECONNREFUSED`?!0:e instanceof AggregateError&&e.errors.length>0?e.errors.every(e=>Z(e,t+1)):Z(e.cause,t+1)}function Q(e){if(e instanceof t)for(let t of H){let n=t.buildFailure;if(n&&U(e,t.match))return{reason:n.reason,hint:n.hint,matched:!0}}return{reason:B,hint:A,matched:!1}}function $(e,n){if(!n||!(e instanceof t))return e;let r=we(e)===void 0&&n.developerDiskImage===`unavailable`&&!Ee(e)&&!Te(e);return new t(e.code,e.message,{...e.details??{},...r?{reason:`device_developer_disk_image_unavailable`,hint:n.developerDiskImageHint}:{},developerDiskImage:n.developerDiskImage},e.cause)}function we(e){let t=e.details?.reason;if(typeof t==`string`&&t!==`build_failed_unclassified`)return t}function Te(e){let t=e.details?.startupHostDeadlineHit;return typeof t==`boolean`?t:o(e)}function Ee(e){let t=e.details?.startupRuleMatched;return typeof t==`boolean`?t:Q(e).matched}export{_ as A,f as C,m as D,ne as E,re as M,b as N,oe as O,ce as S,v as T,Se as _,he as a,O as b,ge as c,ve as d,X as f,q as g,be as h,$ as i,te as j,g as k,Ce as l,j as m,M as n,K as o,xe as p,Q as r,Y as s,A as t,_e as u,ye as v,S as w,le as x,ue as y};
3
+ `).some(e=>t.every(t=>e.includes(t)))}function G(e,t){if(e instanceof n){for(let n of H)if(n.verdicts[t]!==void 0&&U(e,n.match))return n.verdicts[t]}}function he(e){return!(e instanceof n)||e.code!==`COMMAND_FAILED`?!1:G(e,`retryable`)??!1}function ge(e){return K(e)?!0:e instanceof n&&e.details?.runnerErrorCode===`MAIN_THREAD_TIMEOUT`}function K(e){return G(e,`drainResend`)??!1}function _e(e){return e instanceof n&&e.details?.runner!==void 0}function ve(e){return!(e instanceof n)||e.code!==`DEVICE_NOT_FOUND`?!1:L(e.details??{})}function ye(e){return G(e,`connectRetry`)??!0}function q(e){return G(e,`restartAfterReadinessPreflight`)??!1}function be(e){return G(e,`artifactSuspect`)??!1}function xe(e){return G(e,`sessionFatalReason`)}function Se(e,t){return J(e)?X(e)===`no`||O(t):!1}function J(e){return G(e,`restartBeforeSend`)??!1}function Ce(e){return J(e)&&Y(e)||q(e)||K(e)}function Y(e){return e instanceof n&&e.details?.dispatched===`no`||Z(e,0)}function X(e){return Y(e)?`no`:`unknown`}function Z(e,t){return t>4||typeof e!=`object`||!e?!1:e.code===`ECONNREFUSED`?!0:e instanceof AggregateError&&e.errors.length>0?e.errors.every(e=>Z(e,t+1)):Z(e.cause,t+1)}function Q(e){if(e instanceof n)for(let t of H){let n=t.buildFailure;if(n&&U(e,t.match))return{reason:n.reason,hint:n.hint,matched:!0}}return{reason:B,hint:A,matched:!1}}function $(e,t){if(!t||!(e instanceof n))return e;let r=we(e)===void 0&&t.developerDiskImage===`unavailable`&&!Ee(e)&&!Te(e);return new n(e.code,e.message,{...e.details??{},...r?{reason:`device_developer_disk_image_unavailable`,hint:t.developerDiskImageHint}:{},developerDiskImage:t.developerDiskImage},e.cause)}function we(e){let t=e.details?.reason;if(typeof t==`string`&&t!==`build_failed_unclassified`)return t}function Te(e){let t=e.details?.startupHostDeadlineHit;return typeof t==`boolean`?t:a(e)}function Ee(e){let t=e.details?.startupRuleMatched;return typeof t==`boolean`?t:Q(e).matched}export{g as A,f as C,m as D,ne as E,te as M,re as N,oe as O,b as P,ce as S,v as T,Se as _,he as a,O as b,ge as c,ve as d,X as f,q as g,be as h,$ as i,_ as j,d as k,Ce as l,j as m,M as n,K as o,xe as p,Q as r,Y as s,A as t,_e as u,ye as v,S as w,le as x,ue as y};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{H as t,t as n,u as r}from"./host.js";import{g as i,n as a}from"./runner-session-types.js";import{i as o,n as s,t as c}from"./runner-startup-transport.js";import{A as l,N as u,O as d,S as f,T as p,b as m,c as h,k as g,p as _,u as v,x as y,y as b}from"./runner-error-classification.js";import x from"node:fs/promises";const S=2e3;async function C(e,t={}){if(e){try{await i(e,{timeoutMs:Math.min(S,t.timeoutMs??S),signal:t.signal})}catch{return}try{return{logPath:e,byteOffset:(await x.stat(e)).size}}catch{return{logPath:e,byteOffset:0}}}}async function w(t){let n=await T(t.logSince)??D(t.error);return n?new e(n.code??t.error.code,t.error.message,{...t.error.details??{},hint:typeof t.error.details?.hint==`string`?`${t.error.details.hint} ${n.hint}`:n.hint,runnerFailureReason:n.reason},t.error):t.error}async function T(e){if(!e)return;let t=await j(e,65536);if(t)return E(t)}function E(e){let t=e.toLowerCase();if(O(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_axruntime_coretext_crash`,hint:`The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`};if(k(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_crash`,hint:`The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`}}function D(e){if(A(e.message))return{reason:`runner_main_thread_execution_timeout`,hint:`XCTest timed out waiting for main-thread work on the current iOS screen. The app may still be visually responsive, especially on focused React Native overlays or animating screens. Use screenshot as visual truth, use coordinate presses only to prove or leave the state, and retry snapshot -i after the UI settles or after navigating away.`}}function O(e){return e.includes(`axruntime`)&&e.includes(`coretext`)&&(e.includes(`attributesforelement`)||e.includes(`axuielementcopymultipleattributevalues`)||e.includes(`reconstitutedsmuggledctfontfromdictionary`)||e.includes(`reconstitutedsmuggledattributedstringfromdictionary`))}function k(e){return e.includes(`process crashed`)||e.includes(`the application under test`)||e.includes(`terminated unexpectedly`)||e.includes(`exception type:`)&&e.includes(`thread 0 crashed`)}function A(e){return e.toLowerCase().includes(`main thread execution timed out`)}async function j(e,t){let n;try{let r=await x.stat(e.logPath),i=Math.max(e.byteOffset,r.size-t),a=r.size-i;if(a<=0)return;n=await x.open(e.logPath,`r`);let o=Buffer.alloc(a);return await n.read(o,0,a,i),o.toString(`utf8`)}catch{return}finally{await n?.close().catch(()=>{})}}async function M(e,t,r,i,a,o,s){let c=await C(i,{timeoutMs:a,signal:s}),l=u(r),d=m(l),f=n.fromTimeoutMs(a),p=U(t,l);p.action===`run`?await R({device:e,session:t,runnerCommand:l,logAttempt:c,deadline:f,signal:s,decision:p}):z(l,t,p);let h;try{h=await L({device:e,session:t,runnerCommand:l,logPath:i,deadline:f,timeoutMs:a,signal:s,readOnlyCommand:d})}catch(e){throw I(e,t,p)}try{let e=await B(h,t,c);return await N(t,l,e,o),e}catch(e){let n=P(t,l,e),r=_(e);throw r?(t.lastHealthyMutation=void 0,await o(r),e):n?e:I(e,t,p)}}async function N(e,t,n,r){e.commandCharges.settleAnswered(t.commandId);let i=F(n);i!==void 0&&(e.runnerMainThreadBusy=i);let a=H(n);a?(e.lastHealthyMutation=void 0,await r(a)):b(t)&&(e.lastHealthyMutation={atMs:Date.now(),appBundleId:t.appBundleId})}function P(e,t,n){let r=v(n);return r?e.commandCharges.settleAnswered(t.commandId):e.commandCharges.markAbandoned(t.commandId),h(n)?e.runnerMainThreadBusy=!0:r&&(e.runnerMainThreadBusy=!1),r}function F(e){return typeof e.runnerMainThreadBusy==`boolean`?e.runnerMainThreadBusy:void 0}function I(e,t,n){return n.action!==`skip`||n.reason!==`recent_healthy_mutation`?e:(t.lastHealthyMutation=void 0,G(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:n.reason,runnerReadinessPreflightSkippedAgeMs:n.lastHealthyMutationAgeMs}))}async function L(n){let{device:r,session:i,runnerCommand:a,logPath:c,deadline:l,timeoutMs:u,signal:d,readOnlyCommand:p}=n,m=l.remainingMs();if(m<=0)throw new e(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:u});let h=p?{command:a.command,commandId:a.commandId,readOnly:!0,sessionReady:i.state===`ready`,timeoutMs:m}:{command:a.command,commandId:a.commandId},g=!f(a);g&&i.commandCharges.charge(a.commandId);try{return await t(`ios_runner_command_send`,async()=>p?await s(r,i.port,a,c,m,i,d):await o(r,i.port,a,m,d),h)}catch(e){throw g&&i.commandCharges.markAbandoned(a.commandId),e}}async function R(e){let{device:n,session:r,runnerCommand:i,logAttempt:a,deadline:o,signal:c,decision:l}=e,d=a?.logPath,f=r.state===`ready`?Math.min(1e3,o.remainingMs()):Math.min(K(r),o.remainingMs());try{let e=F(await B(await t(`ios_runner_readiness_preflight`,async()=>await s(n,r.port,u({command:`uptime`}),d,f,r,c),{command:i.command,commandId:i.commandId,reason:l.reason,lastHealthyMutationAgeMs:l.lastHealthyMutationAgeMs,sessionReady:r.state===`ready`,timeoutMs:f}),r,a));e!==void 0&&(r.runnerMainThreadBusy=e)}catch(e){throw W(e)}}function z(e,t,n){r({level:`debug`,phase:`ios_runner_readiness_preflight_skipped`,data:{command:e.command,commandId:e.commandId,reason:n.reason,lastHealthyMutationAgeMs:n.reason===`recent_healthy_mutation`?n.lastHealthyMutationAgeMs:void 0,sessionReady:t.state===`ready`}})}async function B(e,t,n){let r=d(await e.text());if(!g(r))throw await w({error:p(r,n?.logPath),logSince:n});a(t,`ready`);let i=l(r);return V(i),i}function V(e){let t=e.gestureFallback;typeof t==`string`&&t.length!==0&&r({level:`debug`,phase:`ios_runner_gesture_fallback`,data:{fallback:t,message:typeof e.gestureFallbackMessage==`string`?e.gestureFallbackMessage:void 0,hint:typeof e.gestureFallbackHint==`string`?e.gestureFallbackHint:void 0}})}function H(e){if(e.runnerFatal===!0)return typeof e.runnerFatalReason==`string`&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:`runner_reported_fatal_response`}function U(e,t){let n=m(t);if(y(t))return{action:`skip`,reason:`preflight_exempt_command`};if(e.state!==`ready`)return n?{action:`skip`,reason:`read_only_startup_command`}:{action:`run`,reason:`startup`};if(f(t))return{action:`skip`,reason:`readiness_probe_command`};if(!b(t))return{action:`run`,reason:`conservative_command`};let r=e.lastHealthyMutation;if(!r)return{action:`run`,reason:`no_recent_healthy_mutation`};if(t.appBundleId!==r.appBundleId)return{action:`run`,reason:`app_activation_uncertain`};let i=Date.now()-r.atMs;return i>5e3?{action:`run`,reason:`healthy_mutation_stale`,lastHealthyMutationAgeMs:i}:{action:`skip`,reason:`recent_healthy_mutation`,lastHealthyMutationAgeMs:i}}function W(e){return G(e,{runnerReadinessPreflightFailed:!0})}function G(t,n){let r=t instanceof e?t:new e(`COMMAND_FAILED`,t instanceof Error?t.message:String(t),void 0,t);return new e(r.code,r.message,{...r.details??{},...n},r.cause??t)}function K(e){let t=e.launchDeadline;return t?Math.max(0,Math.floor(t.remainingMs())):c}export{M as executeRunnerExchange,K as readRunnerStartupTimeoutMs};
1
+ import{P as e}from"./sdk-contracts.js";import{U as t,t as n,u as r}from"./host.js";import{b as i,f as a,l as o,n as s,u as c}from"./runner-session-types.js";import{A as l,O as u,P as d,S as f,T as p,b as m,c as h,j as g,p as _,u as v,x as y,y as b}from"./runner-error-classification.js";import x from"node:fs/promises";const S=2e3;async function C(e,t={}){if(e){try{await i(e,{timeoutMs:Math.min(S,t.timeoutMs??S),signal:t.signal})}catch{return}try{return{logPath:e,byteOffset:(await x.stat(e)).size}}catch{return{logPath:e,byteOffset:0}}}}async function w(t){let n=await T(t.logSince)??D(t.error);return n?new e(n.code??t.error.code,t.error.message,{...t.error.details??{},hint:typeof t.error.details?.hint==`string`?`${t.error.details.hint} ${n.hint}`:n.hint,runnerFailureReason:n.reason},t.error):t.error}async function T(e){if(!e)return;let t=await j(e,65536);if(t)return E(t)}function E(e){let t=e.toLowerCase();if(O(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_axruntime_coretext_crash`,hint:`The target iOS app appears to have crashed while XCTest/AXRuntime read accessibility attributes. This is usually a simulator/XCTest/runtime or app accessibility payload issue, not a text-entry failure. Reproduce on the latest stable simulator runtime, reinstall the app, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`};if(k(t))return{code:`IOS_TARGET_APP_CRASH`,reason:`target_app_crash`,hint:`The target iOS app appears to have crashed while the runner was executing the command. Reopen or reinstall the app, retry on a fresh/latest stable simulator runtime, and capture the app crash from Console.app or ~/Library/Logs/DiagnosticReports with the exact command, selector/ref, app build, Xcode, and simulator runtime.`}}function D(e){if(A(e.message))return{reason:`runner_main_thread_execution_timeout`,hint:`XCTest timed out waiting for main-thread work on the current iOS screen. The app may still be visually responsive, especially on focused React Native overlays or animating screens. Use screenshot as visual truth, use coordinate presses only to prove or leave the state, and retry snapshot -i after the UI settles or after navigating away.`}}function O(e){return e.includes(`axruntime`)&&e.includes(`coretext`)&&(e.includes(`attributesforelement`)||e.includes(`axuielementcopymultipleattributevalues`)||e.includes(`reconstitutedsmuggledctfontfromdictionary`)||e.includes(`reconstitutedsmuggledattributedstringfromdictionary`))}function k(e){return e.includes(`process crashed`)||e.includes(`the application under test`)||e.includes(`terminated unexpectedly`)||e.includes(`exception type:`)&&e.includes(`thread 0 crashed`)}function A(e){return e.toLowerCase().includes(`main thread execution timed out`)}async function j(e,t){let n;try{let r=await x.stat(e.logPath),i=Math.max(e.byteOffset,r.size-t),a=r.size-i;if(a<=0)return;n=await x.open(e.logPath,`r`);let o=Buffer.alloc(a);return await n.read(o,0,a,i),o.toString(`utf8`)}catch{return}finally{await n?.close().catch(()=>{})}}async function M(e,t,r,i,a,o,s){let c=await C(i,{timeoutMs:a,signal:s}),l=d(r),u=m(l),f=n.fromTimeoutMs(a),p=U(t,l);p.action===`run`?await R({device:e,session:t,runnerCommand:l,logAttempt:c,deadline:f,signal:s,decision:p}):z(l,t,p);let h;try{h=await L({device:e,session:t,runnerCommand:l,logPath:i,deadline:f,timeoutMs:a,signal:s,readOnlyCommand:u})}catch(e){throw I(e,t,p)}try{let e=await B(h,t,c);return await N(t,l,e,o),e}catch(e){let n=P(t,l,e),r=_(e);throw r?(t.lastHealthyMutation=void 0,await o(r),e):n?e:I(e,t,p)}}async function N(e,t,n,r){e.commandCharges.settleAnswered(t.commandId);let i=F(n);i!==void 0&&(e.runnerMainThreadBusy=i);let a=H(n);a?(e.lastHealthyMutation=void 0,await r(a)):b(t)&&(e.lastHealthyMutation={atMs:Date.now(),appBundleId:t.appBundleId})}function P(e,t,n){let r=v(n);return r?e.commandCharges.settleAnswered(t.commandId):e.commandCharges.markAbandoned(t.commandId),h(n)?e.runnerMainThreadBusy=!0:r&&(e.runnerMainThreadBusy=!1),r}function F(e){return typeof e.runnerMainThreadBusy==`boolean`?e.runnerMainThreadBusy:void 0}function I(e,t,n){return n.action!==`skip`||n.reason!==`recent_healthy_mutation`?e:(t.lastHealthyMutation=void 0,G(e,{runnerReadinessPreflightSkipped:!0,runnerReadinessPreflightSkipReason:n.reason,runnerReadinessPreflightSkippedAgeMs:n.lastHealthyMutationAgeMs}))}async function L(n){let{device:r,session:i,runnerCommand:o,logPath:s,deadline:l,timeoutMs:u,signal:d,readOnlyCommand:p}=n,m=l.remainingMs();if(m<=0)throw new e(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:u});let h=p?{command:o.command,commandId:o.commandId,readOnly:!0,sessionReady:i.state===`ready`,timeoutMs:m}:{command:o.command,commandId:o.commandId},g=!f(o);g&&i.commandCharges.charge(o.commandId);try{return await t(`ios_runner_command_send`,async()=>p?await c(r,i.port,o,s,m,i,d):await a(r,i.port,o,m,d),h)}catch(e){throw g&&i.commandCharges.markAbandoned(o.commandId),e}}async function R(e){let{device:n,session:r,runnerCommand:i,logAttempt:a,deadline:o,signal:s,decision:l}=e,u=a?.logPath,f=r.state===`ready`?Math.min(1e3,o.remainingMs()):Math.min(K(r),o.remainingMs());try{let e=F(await B(await t(`ios_runner_readiness_preflight`,async()=>await c(n,r.port,d({command:`uptime`}),u,f,r,s),{command:i.command,commandId:i.commandId,reason:l.reason,lastHealthyMutationAgeMs:l.lastHealthyMutationAgeMs,sessionReady:r.state===`ready`,timeoutMs:f}),r,a));e!==void 0&&(r.runnerMainThreadBusy=e)}catch(e){throw W(e)}}function z(e,t,n){r({level:`debug`,phase:`ios_runner_readiness_preflight_skipped`,data:{command:e.command,commandId:e.commandId,reason:n.reason,lastHealthyMutationAgeMs:n.reason===`recent_healthy_mutation`?n.lastHealthyMutationAgeMs:void 0,sessionReady:t.state===`ready`}})}async function B(e,t,n){let r=u(await e.text());if(!l(r))throw await w({error:p(r,n?.logPath),logSince:n});s(t,`ready`);let i=g(r);return V(i),i}function V(e){let t=e.gestureFallback;typeof t==`string`&&t.length!==0&&r({level:`debug`,phase:`ios_runner_gesture_fallback`,data:{fallback:t,message:typeof e.gestureFallbackMessage==`string`?e.gestureFallbackMessage:void 0,hint:typeof e.gestureFallbackHint==`string`?e.gestureFallbackHint:void 0}})}function H(e){if(e.runnerFatal===!0)return typeof e.runnerFatalReason==`string`&&e.runnerFatalReason.trim().length>0?e.runnerFatalReason:`runner_reported_fatal_response`}function U(e,t){let n=m(t);if(y(t))return{action:`skip`,reason:`preflight_exempt_command`};if(e.state!==`ready`)return n?{action:`skip`,reason:`read_only_startup_command`}:{action:`run`,reason:`startup`};if(f(t))return{action:`skip`,reason:`readiness_probe_command`};if(!b(t))return{action:`run`,reason:`conservative_command`};let r=e.lastHealthyMutation;if(!r)return{action:`run`,reason:`no_recent_healthy_mutation`};if(t.appBundleId!==r.appBundleId)return{action:`run`,reason:`app_activation_uncertain`};let i=Date.now()-r.atMs;return i>5e3?{action:`run`,reason:`healthy_mutation_stale`,lastHealthyMutationAgeMs:i}:{action:`skip`,reason:`recent_healthy_mutation`,lastHealthyMutationAgeMs:i}}function W(e){return G(e,{runnerReadinessPreflightFailed:!0})}function G(t,n){let r=t instanceof e?t:new e(`COMMAND_FAILED`,t instanceof Error?t.message:String(t),void 0,t);return new e(r.code,r.message,{...r.details??{},...n},r.cause??t)}function K(e){let t=e.launchDeadline;return t?Math.max(0,Math.floor(t.remainingMs())):o}export{M as executeRunnerExchange,K as readRunnerStartupTimeoutMs};
@@ -1 +1 @@
1
- import{l as e,n as t}from"./apple-runner-platform.js";import{_ as n,d as r,f as i,g as a,l as o,s,u as c,v as l}from"./runner-cache-metadata.js";import{a as u,c as d,d as f,f as p,i as m,l as h,n as g,o as _,p as v,r as y,s as b,u as x}from"./runner-client.js";import{f as S,l as C,n as w,p as T,u as E}from"./runner-xctestrun.js";import{_ as D,h as O}from"./runner-disposal.js";async function k(e,t,n,r){return await d(e,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:n},r)}async function A(e){let{cleanupRunnerLeasesForOwner:t}=await import(`./runner-client.js`).then(e=>e.t),{runnerLeaseCleanupAdapter:n}=await import(`./runner-disposal.js`).then(e=>e.s);await t(e,n)}export{C as applyXctestRunnerAppIconFromDerivedPath,A as cleanupRunnerLeasesForOwner,h as detachIosRunnerSessionsForShutdown,w as findRunnerXctestrun,g as hasLiveIosRunnerSession,t as isRunnerXcuitestScriptPlatform,y as notifyIosRunnerAppRelaunched,m as prepareIosRunner,u as prewarmAppleRunnerCache,_ as prewarmIosRunnerSession,k as queryAppleRunnerSelector,x as readRunnerSessionLiveness,O as readStaleRunnerLease,f as releaseIosRunnerOnClose,b as releaseSpeculativeIosRunnerSessionFor,S as requireCertifiedRunnerCacheArtifacts,s as requireRunnerBuildSettingsMatchBuildLog,E as resolveExistingRunnerProductPaths,o as resolveExpectedRunnerCacheMetadata,c as resolveRunnerAppBundleId,r as resolveRunnerArchBuildSettings,i as resolveRunnerBundleBuildSettings,a as resolveRunnerPerformanceBuildSettings,n as resolveRunnerSandboxBuildArgs,e as resolveRunnerScriptDevice,l as resolveRunnerSigningBuildSettings,d as runAppleRunnerCommand,p as stopAllIosRunnerSessions,v as stopIosRunnerSession,D as verifyLeaseRunnerPidIdentity,T as writeRunnerCacheMetadataForArtifacts};
1
+ import{l as e,n as t}from"./apple-runner-platform.js";import{_ as n,d as r,l as i,p as a,s as o,u as s,v as c,y as l}from"./runner-cache-metadata.js";import{a as u,c as d,d as f,f as p,i as m,l as h,n as g,o as _,p as v,r as y,s as b,u as x}from"./runner-client.js";import{A as S,D as C,E as w,S as T,g as E,k as D,v as O}from"./runner-disposal.js";async function k(e,t,n,r){return await d(e,{command:`querySelector`,selectorKey:t.key,selectorValue:t.value,appBundleId:n},r)}async function A(e){let{cleanupRunnerLeasesForOwner:t}=await import(`./runner-client.js`).then(e=>e.t),{runnerLeaseCleanupAdapter:n}=await import(`./runner-disposal.js`).then(e=>e.s);await t(e,n)}export{w as applyXctestRunnerAppIconFromDerivedPath,A as cleanupRunnerLeasesForOwner,h as detachIosRunnerSessionsForShutdown,T as findRunnerXctestrun,g as hasLiveIosRunnerSession,t as isRunnerXcuitestScriptPlatform,y as notifyIosRunnerAppRelaunched,m as prepareIosRunner,u as prewarmAppleRunnerCache,_ as prewarmIosRunnerSession,k as queryAppleRunnerSelector,x as readRunnerSessionLiveness,E as readStaleRunnerLease,f as releaseIosRunnerOnClose,b as releaseSpeculativeIosRunnerSessionFor,D as requireCertifiedRunnerCacheArtifacts,o as requireRunnerBuildSettingsMatchBuildLog,C as resolveExistingRunnerProductPaths,i as resolveExpectedRunnerCacheMetadata,s as resolveRunnerAppBundleId,r as resolveRunnerArchBuildSettings,a as resolveRunnerBundleBuildSettings,n as resolveRunnerPerformanceBuildSettings,c as resolveRunnerSandboxBuildArgs,e as resolveRunnerScriptDevice,l as resolveRunnerSigningBuildSettings,d as runAppleRunnerCommand,p as stopAllIosRunnerSessions,v as stopIosRunnerSession,O as verifyLeaseRunnerPidIdentity,S as writeRunnerCacheMetadataForArtifacts};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{B as t}from"./host.js";import{o as n}from"./runner-cache-metadata.js";import r from"node:path";import i from"node:fs";import a from"node:os";import o from"node:net";async function s(){return await new Promise((t,n)=>{let r=o.createServer();r.listen(0,`127.0.0.1`,()=>{let i=r.address();if(typeof i==`object`&&i?.port){let e=i.port;r.close(()=>t(e))}else r.close(()=>n(new e(`COMMAND_FAILED`,`Failed to allocate port`)))}),r.on(`error`,n)})}function c(e,t,n,r){t&&d(t,e),n&&d(n,e),r&&process.stderr.write(e)}const l=new Map,u=new Map;function d(e,t){let n=(l.get(e)??Promise.resolve()).then(()=>f(e,t),()=>f(e,t)).then(()=>{u.delete(e)},t=>{u.set(e,t)}).finally(()=>{l.get(e)===n&&l.delete(e)});l.set(e,n)}async function f(e,t){await i.promises.mkdir(r.dirname(e),{recursive:!0}),await i.promises.appendFile(e,t)}async function p(e,t={}){let n=AbortSignal.any([t.signal??new AbortController().signal,AbortSignal.timeout(t.timeoutMs??2e3)]);if(n.aborted)throw n.reason;let r=l.get(e);if(r){let e=()=>{};try{await Promise.race([r,new Promise((t,r)=>{e=()=>r(n.reason),n.addEventListener(`abort`,e,{once:!0})})])}finally{n.removeEventListener(`abort`,e)}}let i=u.get(e);if(i!==void 0)throw i}function m(e){try{i.existsSync(e)&&i.unlinkSync(e)}catch{}}function h(e,t){if(e)return e;let n=t.replaceAll(/[^A-Za-z0-9._-]/g,`_`);return r.join(a.tmpdir(),`agent-device`,`apple-runner`,`logs`,`${n}.log`)}function g(e,t){let n=0;try{n=i.fstatSync(t).size}catch{}return{logPath:e,startOffset:n}}function _(e){let t=e.pollMs??50,n=Buffer.alloc(65536),r=e.file.startOffset,a=null,o=null,s=!1,c=()=>{if(!s)try{a??=i.openSync(e.file.logPath,`r`);let t=i.fstatSync(a).size;for(t<r&&(r=0);r<t;){let o=Math.min(n.length,t-r),s=i.readSync(a,n,0,o,r);if(s<=0)break;r+=s,e.onOutput(n.toString(`utf8`,0,s)),t=i.fstatSync(a).size}}catch{u()}},l=()=>{s||(o=setTimeout(()=>{c(),l()},t),o.unref?.())};function u(){if(!s&&(s=!0,o&&clearTimeout(o),o=null,a!==null)){try{i.closeSync(a)}catch{}a=null}}return l(),{drain:()=>{c(),u()},stop:u}}function v(e,t){if(!e)return``;let n=null;try{n=i.openSync(e.logPath,`r`);let r=i.fstatSync(n).size,a=Math.max(e.startOffset,r-t),o=r-a;if(o<=0)return``;let s=Buffer.alloc(o),c=i.readSync(n,s,0,o,a);return s.toString(`utf8`,0,Math.max(c,0))}catch{return``}finally{if(n!==null)try{i.closeSync(n)}catch{}}}function y(e){return t(e).simulatorSetPath}function b(e,n){let r=t(e),i=t(n);return r.udid===i.udid&&r.simulatorSetPath===i.simulatorSetPath}function x(e,t){let n=y(e);return n===void 0?[`-destination`,t]:[`-destination`,t,`-DVTSimulatorSetLocation=${n}`]}function S(e){let t=y(e);if(t===void 0)return{};let r=n(e);return r===void 0?{simulatorSetPath:t}:{simulatorSetPath:t,xcodeVersion:r}}function C(e,t,n){return`${e}: xcodebuild found no simulator ${t.id} in simulator set ${n.simulatorSetPath}${n.xcodeVersion===void 0?``:` with Xcode ${n.xcodeVersion}`}`}const w={starting:[`ready`,`draining`,`stopped`],ready:[`draining`,`stopped`],draining:[`stopped`],stopped:[]};function T(e,t){w[e.state].includes(t)&&(e.state=t)}function E(e){return e.state===`starting`||e.state===`ready`}function D(e){return e?.runnerMainThreadBusy===!0}var O=class{charges=[];get hasOutstandingCharges(){return this.charges.length>0}get outstandingChargeCount(){return this.charges.length}get hasAbandonedCharges(){return this.charges.some(e=>e.abandoned)}charge(e){this.charges.push({commandId:k(e),abandoned:!1})}markAbandoned(e){let t=this.findChargeIndex(e);t!==-1&&(this.charges[t].abandoned=!0)}settleAnswered(e){let t=this.findChargeIndex(e);if(t===-1)return;let n=this.charges[t];if(this.charges.splice(t,1),n.abandoned)return;let r=this.charges.findIndex((e,n)=>n<t&&e.abandoned);r!==-1&&this.charges.splice(r,1)}settleTerminalEvidence(e){let t=k(e);if(t===``)return!1;let n=this.charges.filter(e=>e.commandId!==t||!e.abandoned);return n.length!==this.charges.length&&(this.charges=n,!0)}findChargeIndex(e){let t=k(e);if(t===``)return-1;for(let e=this.charges.length-1;e>=0;--e)if(this.charges[e].commandId===t)return e;return-1}};function k(e){return e?.trim()??``}function A(e){return e.state===`ready`?e.commandCharges.hasOutstandingCharges?{detach:!1,reason:`command_in_flight`}:D(e)?{detach:!1,reason:`main_thread_occupied`}:{detach:!0}:{detach:!1,reason:`runner_never_served_a_command`}}function j(e){return e.processRunning?e.state:`gone`}function M(e,t){return`${e}:${t}:${Date.now()}`}function N(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}export{s as _,D as a,h as b,j as c,y as d,C as f,p as g,g as h,E as i,b as l,m,T as n,N as o,x as p,M as r,A as s,O as t,S as u,c as v,_ as x,v as y};
1
+ import{I as e,K as t,P as n,V as r,z as i}from"./sdk-contracts.js";import{n as a}from"./entities.js";import{t as o}from"./parser.js";import{A as s,L as c,M as l,V as u,a as d,i as f,j as p,o as m,t as h}from"./host.js";import{o as g}from"./runner-cache-metadata.js";import{d as _,i as v,m as y,r as ee,s as te,t as ne,v as re}from"./runner-error-classification.js";import b from"node:fs";import ie from"node:os";import x from"node:path";import S from"node:net";import C from"node:http";async function ae(){return await new Promise((e,t)=>{let r=S.createServer();r.listen(0,`127.0.0.1`,()=>{let i=r.address();if(typeof i==`object`&&i?.port){let t=i.port;r.close(()=>e(t))}else r.close(()=>t(new n(`COMMAND_FAILED`,`Failed to allocate port`)))}),r.on(`error`,t)})}function oe(e,t,n,r){t&&E(t,e),n&&E(n,e),r&&process.stderr.write(e)}const w=new Map,T=new Map;function E(e,t){let n=(w.get(e)??Promise.resolve()).then(()=>D(e,t),()=>D(e,t)).then(()=>{T.delete(e)},t=>{T.set(e,t)}).finally(()=>{w.get(e)===n&&w.delete(e)});w.set(e,n)}async function D(e,t){await b.promises.mkdir(x.dirname(e),{recursive:!0}),await b.promises.appendFile(e,t)}async function se(e,t={}){let n=AbortSignal.any([t.signal??new AbortController().signal,AbortSignal.timeout(t.timeoutMs??2e3)]);if(n.aborted)throw n.reason;let r=w.get(e);if(r){let e=()=>{};try{await Promise.race([r,new Promise((t,r)=>{e=()=>r(n.reason),n.addEventListener(`abort`,e,{once:!0})})])}finally{n.removeEventListener(`abort`,e)}}let i=T.get(e);if(i!==void 0)throw i}function ce(e){try{b.existsSync(e)&&b.unlinkSync(e)}catch{}}function le(e,t){if(e)return e;let n=t.replaceAll(/[^A-Za-z0-9._-]/g,`_`);return x.join(ie.tmpdir(),`agent-device`,`apple-runner`,`logs`,`${n}.log`)}function ue(e,t){let n=0;try{n=b.fstatSync(t).size}catch{}return{logPath:e,startOffset:n}}function de(e){let t=e.pollMs??50,n=Buffer.alloc(65536),r=e.file.startOffset,i=null,a=null,o=!1,s=()=>{if(!o)try{i??=b.openSync(e.file.logPath,`r`);let t=b.fstatSync(i).size;for(t<r&&(r=0);r<t;){let a=Math.min(n.length,t-r),o=b.readSync(i,n,0,a,r);if(o<=0)break;r+=o,e.onOutput(n.toString(`utf8`,0,o)),t=b.fstatSync(i).size}}catch{l()}},c=()=>{o||(a=setTimeout(()=>{s(),c()},t),a.unref?.())};function l(){if(!o&&(o=!0,a&&clearTimeout(a),a=null,i!==null)){try{b.closeSync(i)}catch{}i=null}}return c(),{drain:()=>{s(),l()},stop:l}}function fe(e,t){if(!e)return``;let n=null;try{n=b.openSync(e.logPath,`r`);let r=b.fstatSync(n).size,i=Math.max(e.startOffset,r-t),a=r-i;if(a<=0)return``;let o=Buffer.alloc(a),s=b.readSync(n,o,0,a,i);return o.toString(`utf8`,0,Math.max(s,0))}catch{return``}finally{if(n!==null)try{b.closeSync(n)}catch{}}}const O=new Map;function k(e,t){let n,r=!1;return{markUsbmuxUnattached:()=>{r=!0},resolveRoute:async(i,a=!1)=>{if(e.kind!==`device`)return j(e,t,null,!1);let o=p(e);if(o.backend===`xctest`||!r)return pe(e,t);if(!a){let r=me(e.id);if(r)return j(e,t,r,!0);if(n!==void 0)return j(e,t,n,!1)}let{tunnelIp:s}=await o.resolveTunnel(e,i);return n=s,s&&he(e.id,s),j(e,t,s,!1)}}}function A(e){O.delete(e)}function pe(e,t){return{kind:`usbmux`,endpoints:[`usbmux://${e.id}:${t}/command`],cachedTunnelIp:!1}}function j(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 me(e){let t=O.get(e);return t?t.expiresAt<=Date.now()?(O.delete(e),null):t.ip:null}function he(e,t){O.set(e,{ip:t,expiresAt:Date.now()+3e4})}function M(e){return u(e).simulatorSetPath}function ge(e,t){let n=u(e),r=u(t);return n.udid===r.udid&&n.simulatorSetPath===r.simulatorSetPath}function _e(e,t){let n=M(e);return n===void 0?[`-destination`,t]:[`-destination`,t,`-DVTSimulatorSetLocation=${n}`]}function N(e){let t=M(e);if(t===void 0)return{};let n=g(e);return n===void 0?{simulatorSetPath:t}:{simulatorSetPath:t,xcodeVersion:n}}function P(e,t,n){return`${e}: xcodebuild found no simulator ${t.id} in simulator set ${n.simulatorSetPath}${n.xcodeVersion===void 0?``:` with Xcode ${n.xcodeVersion}`}`}const F=`Connect the device by cable, trust this Mac, keep it unlocked, and retry.`;async function ve(e,t,n,r,i){let a=h.fromTimeoutMs(r);return await be(e,t,await ye(e,t,a.remainingMs(),i),n,a.remainingMs(),i)}async function ye(e,t,r,i){let a=await I(e,r,i);try{await L(a,1,z(`ListDevices`));let e=xe((await R(a,r,i)).payload.toString(`utf8`),t);if(e!==void 0)return e;throw new n(`DEVICE_NOT_FOUND`,`iOS device is not available through usbmux`,{deviceId:t,backend:`xctest`,usbmuxDeviceAttached:!1,hint:F})}finally{a.destroy()}}async function be(e,t,n,r,i,a){let o=await I(e,i,a);try{await L(o,2,z(`Connect`,{DeviceID:n,PortNumber:Te(r)}));let e=Ce((await R(o,i,a)).payload.toString(`utf8`),`Number`);if(e!==0)throw we({result:e,udid:t,deviceId:n,port:r});return o}catch(e){throw o.destroy(),e}}async function I(t,r,i){if(H(r,`connect to usbmuxd`),i?.aborted)throw e();return await new Promise((a,o)=>{let s=S.createConnection(t),c=!1,l=setTimeout(()=>{p(new n(`COMMAND_FAILED`,`Timed out connecting to usbmuxd`,{backend:`xctest`,socketPath:t,timeoutMs:r}))},r),u=()=>p(),d=e=>p(e),f=()=>p(e()),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 L(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 R(t,r,i){if(H(r,`read usbmuxd response`),i?.aborted)throw e();return await new Promise((a,o)=>{let s=Buffer.alloc(0),c=!1,l=setTimeout(()=>m(new n(`COMMAND_FAILED`,`Timed out reading usbmuxd response`,{backend:`xctest`,timeoutMs:r})),r),u=e=>{if(s=Buffer.concat([s,e]),s.length<16)return;let t=s.readUInt32LE(0);if(t<16||t>4194304){m(new n(`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 n(`COMMAND_FAILED`,`usbmuxd closed the connection unexpectedly`)),p=()=>m(e()),m=(e,n)=>{c||(c=!0,clearTimeout(l),t.off(`data`,u),t.off(`error`,d),t.off(`close`,f),i?.removeEventListener(`abort`,p),t.pause(),e?o(e):a(n))};t.on(`data`,u),t.once(`error`,d),t.once(`close`,f),i?.addEventListener(`abort`,p,{once:!0}),t.resume()})}function z(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 xe(e,t){let n;for(let r of V(o(e))){let e=Se(r);if(e?.udid===t){if(B(B(r,`Properties`),`ConnectionType`)?.text===`USB`)return e.id;n??=e.id}}return n}function Se(e){if(e.name!==`dict`)return;let t=B(e,`Properties`);if(t?.name!==`dict`)return;let n=B(t,`SerialNumber`)?.text,r=Number(B(e,`DeviceID`)?.text);if(!(!n||!Number.isSafeInteger(r)||r<=0))return{udid:n,id:r}}function Ce(e,t){for(let n of V(o(e))){if(n.name!==`dict`)continue;let e=B(n,t);if(e?.name!==`integer`)continue;let r=Number(e.text);if(Number.isSafeInteger(r))return r}}function B(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*V(e){for(let t of e)yield t,yield*V(t.children)}function we(e){let{result:t,udid:r,deviceId:i,port:a}=e;return t===2?new n(`DEVICE_NOT_FOUND`,`iOS device is no longer available through usbmux`,{deviceId:r,backend:`xctest`,usbmuxDeviceAttached:!1,usbmuxResult:t,hint:F}):t===3?new n(`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 n(`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 Te(e){return(e&255)<<8|e>>>8&255}function H(e,t){if(!(e>0))throw new n(`COMMAND_FAILED`,`No time remaining to ${t}`,{backend:`xctest`,timeoutMs:e})}function Ee(e){return{postCommand:async(t,r,a,o,s)=>{let c=h.fromTimeoutMs(o),l=await ve(e,t,r,c.remainingMs(),s).catch(e=>{throw e instanceof n?i(e,`no`):e});try{return await De(l,a,c.remainingMs(),s)}catch(e){throw l.destroy(),e}}}}const U=Ee(`/var/run/usbmuxd`);async function De(t,r,i,a){if(Ae(i),a?.aborted)throw e();let o=Buffer.from(JSON.stringify(r),`utf8`),s=AbortSignal.timeout(i),c=a?AbortSignal.any([a,s]):s,l=new C.Agent;l.createConnection=(e,n)=>(n?.(null,t),t);try{let e=await Oe(l,t,o,c);return new Response((await ke(e)).toString(`utf8`),{status:e.statusCode??500})}catch(t){throw a?.aborted?e():s.aborted?new n(`COMMAND_FAILED`,`Timed out waiting for XCTest runner over usbmux`,{backend:`xctest`,timeoutMs:i}):t}finally{l.destroy(),t.destroy()}}async function Oe(e,t,n,r){return await new Promise((i,a)=>{let o=C.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 ke(e){let t=[],r=0;for await(let i of e){let e=Buffer.isBuffer(i)?i:Buffer.from(i);if(r+=e.length,r>67108864)throw new n(`COMMAND_FAILED`,`XCTest runner response exceeded size limit`);t.push(e)}return Buffer.concat(t)}function Ae(e){if(!(e>0))throw new n(`COMMAND_FAILED`,`No time remaining to send XCTest runner command`,{backend:`xctest`,timeoutMs:e})}const W=45e3;async function je(t,r,i,a=W,o){if(o?.aborted)throw e();let s=h.fromTimeoutMs(a),c=k(t,r),l=await c.resolveRoute(s.remainingMs());if(l.kind===`usbmux`)try{return await Me(t,r,i,s,o)}catch(e){if(!G(t,e))throw e;c.markUsbmuxUnattached(),l=await c.resolveRoute(s.remainingMs())}let u=s.remainingMs();if(u<=0)throw new n(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:a});let d=l.endpoints[0];if(!d)throw new n(`COMMAND_FAILED`,`Runner command endpoint not available`,{port:r,endpoints:l.endpoints});return await K(d,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(i)},u,o)}async function Me(e,t,r,i,a){let o=i.remainingMs();if(o<=0)throw new n(`COMMAND_FAILED`,`Runner command deadline exceeded`,{port:t,timeoutMs:o});return await U.postCommand(e.id,t,r,o,a)}function G(e,t){return _(t)?p(e).backend!==`xctest`:!1}async function K(e,t,r,i){let a=AbortSignal.timeout(r),o=i?AbortSignal.any([i,a]):a;try{return await fetch(e,{...t,signal:o})}catch(e){throw e===a.reason?new n(`COMMAND_FAILED`,`Runner command deadline exceeded`,{timeoutMs:r},e):e}}const q=45e3,J=2e4;async function Ne(n,r,i,a,o=q,s,c){let u=h.fromTimeoutMs(o),{resolveRoute:d,markUsbmuxUnattached:f}=k(n,r),p=await d(u.remainingMs()),m=null,g=!1,v=Math.max(1,Math.ceil(o/250));try{return await l(async({deadline:e})=>{let t=await Pe({device:n,port:r,command:i,timeoutMs:o,logPath:a,session:s,route:p,resolveRoute:d,markUsbmuxUnattached:f,signal:c,attemptDeadline:e,setRoute:e=>{p=e},setLastError:e=>{m=e,te(e)||(g=!0)}});if(t)return t;throw ze({port:r,endpoints:p.endpoints,lastError:m,signal:c})},{maxAttempts:v,baseDelayMs:300,maxDelayMs:2e3,jitter:.2,shouldRetry:re},{deadline:u,phase:`ios_runner_connect`,signal:c,retryWakeSignal:n.kind===`simulator`?s?.startupRetryWake:void 0})}catch(n){if(c?.aborted||t(n))throw e();if(_(n))throw n;m||=n}if(c?.aborted)throw e();if(n.kind===`simulator`){let e=u.remainingMs();if(e<=0)throw Y(Ue({port:r,endpoints:p.endpoints,logPath:a,lastError:m}),g);let t=await Z(n,r,i,e,c).catch(e=>{throw Y(e,g)});return new Response(t.body,{status:t.status})}throw s?.child.exitCode!==null&&s?.child.exitCode!==void 0?Y(await We({session:s,port:r,logPath:a}),g):Y(Ue({port:r,endpoints:p.endpoints,logPath:a,lastError:m,deviceStates:s?.startupDeviceStates}),g)}function Y(e,t){return e instanceof n?t?i(e,`unknown`):r(e,`no`):e}async function Pe(e){await Fe(e);let t=await Ie(e);return t.response?t.response:await Le(e)||await Re(e,t.usedCachedTunnelIp)}async function Fe(e){if(e.attemptDeadline?.isExpired())throw new n(`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 We({session:e.session,port:e.port,logPath:e.logPath})}async function Ie(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&&A(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 Le(e){return e.device.kind!==`simulator`||e.session?.state!==`ready`?null:await Ve(e.device,e.port,e.command,{signal:e.signal,attemptDeadline:e.attemptDeadline,onError:e.setLastError})}async function Re(e,t){if(e.device.kind!==`device`||!t)return null;A(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 ze(t){if(t.signal?.aborted)throw e();return new n(`COMMAND_FAILED`,`Runner endpoint probe failed`,{port:t.port,endpoints:t.endpoints,lastError:t.lastError?String(t.lastError):void 0,...y(`runner_endpoint_probe_exhausted`)})}async function X(r,a,o){if(a.kind===`network`)return await Be(a.endpoints,o);let s=a.endpoints[0];try{let e=o.attemptDeadline?.remainingMs()??o.timeoutMs;if(e<=0)throw i(new n(`COMMAND_FAILED`,`Runner connection deadline exceeded`,{port:o.port,timeoutMs:o.timeoutMs}),`no`);return await U.postCommand(r.id,o.port,o.command,Math.min(J,e),o.signal)}catch(n){if(o.signal?.aborted||t(n))throw e();if(_(n)){if(!G(r,n))throw n;return o.onUsbmuxUnattached?.(),null}return o.onError(s,n),null}}async function Be(r,a){let{command:o,port:s,timeoutMs:c,signal:l,attemptDeadline:u,onError:d}=a;for(let a of r)try{let e=u?.remainingMs()??c;if(e<=0)throw i(new n(`COMMAND_FAILED`,`Runner connection deadline exceeded`,{port:s,timeoutMs:c}),`no`);return await K(a,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(o)},Math.min(J,e),l)}catch(n){if(l?.aborted||t(n))throw e();d(a,n)}return null}async function Ve(n,r,i,a){let{signal:o,attemptDeadline:s,onError:c}=a,l=s?.remainingMs()??45e3;if(l<=0)return null;try{let e=await Z(n,r,i,l,o);return new Response(e.body,{status:e.status})}catch(n){if(o?.aborted||t(n))throw e();return c(n),null}}async function Z(e,t,n,r,i){let a=JSON.stringify(n),o=d(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:s(await c(o,{allowFailure:!0,timeoutMs:r,signal:i}),`Runner did not accept connection (simctl spawn)`,e=>{let n=m({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:f(n),...y(`runner_connect_refused`),dispatched:e.exitCode===7?`no`:`unknown`}}).stdout}}function He(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`?f(a):`${f(a)} ${ne}`}function Ue(e){let{port:t,endpoints:r,logPath:i,lastError:a,deviceStates:o}=e,s=`Runner did not accept connection`,c=new n(`COMMAND_FAILED`,s,{port:t,endpoints:r,logPath:i,lastError:a?String(a):void 0,reason:m({error:a,message:s,context:{platform:`ios`,phase:`connect`}}),hint:f(`IOS_RUNNER_CONNECT_TIMEOUT`),...y(`runner_connect_refused`)});return v(c,o)}async function We(e){let{session:t,port:r,logPath:i}=e,a=await t.testPromise,o=`Runner did not accept connection (xcodebuild exited early)`,s=t.readLogTail?.(65536)??``,c=m({message:o,stdout:s,stderr:s,context:{platform:`ios`,phase:`connect`}}),l=N(t.device),u=ee(new n(`COMMAND_FAILED`,o,{stderr:s,...l})),d=u.reason===`simulator_set_destination_not_found`,f=new n(`COMMAND_FAILED`,d?P(o,t.device,l):o,{port:r,logPath:t.runnerLogPath??i,xcodebuild:{exitCode:a.exitCode,stderr:s},reason:d?u.reason:c,hint:d?u.hint:He(o,s,s,c),...l,...y(`xcodebuild_exited_early`)});return v(f,t.startupDeviceStates)}const Ge={starting:[`ready`,`draining`,`stopped`],ready:[`draining`,`stopped`],draining:[`stopped`],stopped:[]};function Ke(e,t){Ge[e.state].includes(t)&&(e.state=t)}function qe(e){return e.state===`starting`||e.state===`ready`}function Q(e){return e?.runnerMainThreadBusy===!0}var Je=class{charges=[];get hasOutstandingCharges(){return this.charges.length>0}get outstandingChargeCount(){return this.charges.length}get hasAbandonedCharges(){return this.charges.some(e=>e.abandoned)}charge(e){this.charges.push({commandId:$(e),abandoned:!1})}markAbandoned(e){let t=this.findChargeIndex(e);t!==-1&&(this.charges[t].abandoned=!0)}settleAnswered(e){let t=this.findChargeIndex(e);if(t===-1)return;let n=this.charges[t];if(this.charges.splice(t,1),n.abandoned)return;let r=this.charges.findIndex((e,n)=>n<t&&e.abandoned);r!==-1&&this.charges.splice(r,1)}settleTerminalEvidence(e){let t=$(e);if(t===``)return!1;let n=this.charges.filter(e=>e.commandId!==t||!e.abandoned);return n.length!==this.charges.length&&(this.charges=n,!0)}findChargeIndex(e){let t=$(e);if(t===``)return-1;for(let e=this.charges.length-1;e>=0;--e)if(this.charges[e].commandId===t)return e;return-1}};function $(e){return e?.trim()??``}function Ye(e){return e.state===`ready`?e.commandCharges.hasOutstandingCharges?{detach:!1,reason:`command_in_flight`}:Q(e)?{detach:!1,reason:`main_thread_occupied`}:{detach:!0}:{detach:!1,reason:`runner_never_served_a_command`}}function Xe(e){return e.processRunning?e.state:`gone`}function Ze(e,t){return`${e}:${t}:${Date.now()}`}function Qe(e){return typeof e==`number`&&Number.isFinite(e)&&e>0?Math.floor(e):void 0}export{fe as C,oe as S,de as T,_e as _,Q as a,se as b,Xe as c,W as d,je as f,P as g,M as h,qe as i,q as l,N as m,Ke as n,Qe as o,ge as p,Ze as r,Ye as s,Je as t,Ne as u,ce as v,le as w,ae as x,ue as y};
@@ -1 +1 @@
1
- import{F as e,G as t,N as n}from"./sdk-contracts.js";import{u as r}from"./host.js";import{i}from"./runner-cache-metadata.js";import{o as a}from"./runner-session-types.js";import{M as o}from"./runner-error-classification.js";import"./runner-xctestrun.js";function s(e){let t=a(e.startupTimeoutMs),n=t??6e5,r=new AbortController,s=setTimeout(()=>{r.abort(c(n,t!==void 0))},n);s.unref?.();let l=o(e),u=l?AbortSignal.any([l,r.signal]):r.signal;return{phase:i(n,u),timeoutMs:n,explicit:t!==void 0,exhausted:r.signal,close:()=>clearTimeout(s)}}function c(e,t){return new n(`COMMAND_FAILED`,`Apple runner start exceeded its ${t?`startup timeout`:`default start budget`} of ${e}ms`,{reason:`runner_start_budget_exhausted`,timeoutMs:e,retriable:!0,hint:t?"Raise the startup timeout, or run `prepare ios-runner` first so the runner is built before it is needed.":"Run `prepare ios-runner --timeout <ms>` so the cold build has a budget of your choosing; the session runner.log names the step that stalled."})}async function l(t,n){return n?await new Promise((r,i)=>{let a=()=>{i(e(void 0,n.reason)),t.catch(u)};n.aborted?a():n.addEventListener(`abort`,a,{once:!0}),t.then(r,i).finally(()=>n.removeEventListener(`abort`,a))}):await t}function u(e){if(t(e))return;let i=e instanceof n?e:void 0;r({level:`warn`,phase:`ios_runner_detached_start_failed`,data:{code:i?.code,reason:i?.details?.reason,error:e instanceof Error?e.message:String(e)}})}export{s as openRunnerStartBudget,l as raceRunnerStartAgainstCaller};
1
+ import{I as e,K as t,P as n}from"./sdk-contracts.js";import{u as r}from"./host.js";import{i}from"./runner-cache-metadata.js";import{o as a}from"./runner-session-types.js";import{N as o,k as s}from"./runner-error-classification.js";import{l as c}from"./runner-disposal.js";function l(e){let t=a(e.startupTimeoutMs),n=t??6e5,r=new AbortController,s=setTimeout(()=>{r.abort(u(n,t!==void 0))},n);s.unref?.();let c=o(e),l=c?AbortSignal.any([c,r.signal]):r.signal;return{phase:i(n,l),timeoutMs:n,explicit:t!==void 0,exhausted:r.signal,close:()=>clearTimeout(s)}}function u(e,t){return new n(`COMMAND_FAILED`,`Apple runner start exceeded its ${t?`startup timeout`:`default start budget`} of ${e}ms`,{reason:`runner_start_budget_exhausted`,timeoutMs:e,retriable:!0,hint:t?"Raise the startup timeout, or run `prepare ios-runner` first so the runner is built before it is needed.":"Run `prepare ios-runner --timeout <ms>` so the cold build has a budget of your choosing; the session runner.log names the step that stalled."})}async function d(t,n,r){return n?await new Promise((i,a)=>{let o=()=>{a(e(void 0,n.reason)),s(n.reason)||c(r),t.catch(f)};n.aborted?o():n.addEventListener(`abort`,o,{once:!0}),t.then(i,a).finally(()=>n.removeEventListener(`abort`,o))}):await t}function f(e){if(t(e))return;let i=e instanceof n?e:void 0;r({level:`warn`,phase:`ios_runner_detached_start_failed`,data:{code:i?.code,reason:i?.details?.reason,error:e instanceof Error?e.message:String(e)}})}export{l as openRunnerStartBudget,d as raceRunnerStartAgainstCaller};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime.js";import{N as t,R as n,et as r,z as i}from"./sdk-contracts.js";import{O as a}from"./sdk-device.js";import{r as o}from"./touch-runtime.js";import{t as s}from"./runner-cache-metadata.js";import{AsyncLocalStorage as c}from"node:async_hooks";const l=new c;function u(e,t){return{runCommand:e,...t}}function d(e,t,n={}){let r=f(e,n);return m(r?r.provider:t)}function f(e,t={}){let n=l.getStore();return n&&n.deviceId===e.id&&(n.requestId?n.requestId===t.requestId:!t.requestId)?n:void 0}async function p(e,t,n){if(!e)return await n();let r={provider:m(e),deviceId:t.deviceId,requestId:t.requestId};return await l.run(r,n)}function m(e){return typeof e==`function`?{runCommand:e,hasLiveSession:()=>!0}:e}const h=[`tap`,`doubleTap`,`longPress`];function g(e){return typeof e==`string`&&h.includes(e)}function _(e,r){return n(new t(`INVALID_ARGS`,e,{...r,reason:`runner_sequence_invalid`}),`no`)}function v(e,t,n){return _(n,{stepIndex:e,kind:typeof t==`string`?t:void 0})}function y(e){if(!Array.isArray(e)||e.length===0)throw _(`sequence requires at least one step`,{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw _(`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});e.forEach((e,t)=>b(e,t))}function b(e,t){if(!g(e.kind))throw v(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${h.join(`, `)}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw v(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);e.durationMs!==void 0&&x(e.durationMs,0,1e4,t,e.kind,`durationMs`),e.pauseMs!==void 0&&x(e.pauseMs,0,1e4,t,e.kind,`pauseMs`)}function x(e,t,n,r,i,a){if(!Number.isFinite(e)||e<t||e>n)throw v(r,i,`sequence step ${r} (${i}) ${a} must be between ${t} and ${n}`)}function S(e,t){return y(e),{command:`sequence`,steps:e,appBundleId:t}}async function C(e,t,n,r,a){let o=w(T(e,t,n),20).map(e=>S(e,r)),s,c,l=0,u=[],d=0;for(let e of o){let t;try{t=await a(e)}catch(e){throw i(e,l)}s??=t,c=t;let n;try{n=O(t)}catch(e){throw i(D(e,d),l+E(e))}l+=n.completedSteps,u.push(...n.results),d+=e.steps?.length??0}return{...s??{},completedSteps:l,sequenceResults:u,...c?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:c.gestureEndUptimeMs},timingMode:`runner-sequence`}}function w(e,t,n=2e4){let r=[],i=[],a=0;for(let o of e){let e=(o.durationMs??0)+(o.pauseMs??0)+250;i.length>0&&(i.length>=t||a+e>n)&&(r.push(i),i=[],a=0),i.push(o),a+=e}return i.length>0&&r.push(i),r}function T(e,t,n){let r=n.doubleTap?`doubleTap`:n.holdMs>0?`longPress`:`tap`,i=r===`tap`&&a(e);return Array.from({length:n.count},(e,a)=>{let[s,c]=o(a,n.jitterPx);return{kind:r,x:t.x+s,y:t.y+c,...i?{synthesized:!0}:{},...n.holdMs>0?{durationMs:n.holdMs}:{},...a<n.count-1&&n.intervalMs>0?{pauseMs:n.intervalMs}:{}}})}function E(e){let n=e instanceof t?e.details?.completedSteps:void 0;return typeof n==`number`?n:0}function D(e,n){if(n===0||!(e instanceof t)||!e.details)return e;let r=e.details.failedStepIndex;if(typeof r!=`number`)return e;let i=e.details.completedSteps;return new t(e.code,e.message,{...e.details,failedStepIndex:r+n,chunkStepIndex:r,...typeof i==`number`?{completedSteps:n+i}:{}},e.cause)}function O(e){let t=A(e.sequenceResults),n=typeof e.completedSteps==`number`&&Number.isFinite(e.completedSteps)?e.completedSteps:t.filter(e=>e.ok).length,r=t.findIndex(e=>!e.ok),i=typeof e.failedStepIndex==`number`&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:r>=0?r:void 0;if(i!==void 0)throw k(t,n,i);return{results:t,completedSteps:n,failedStepIndex:i}}function k(e,n,i){let a=e[i],o=a?.kind??`step`,s=a?.errorMessage??`sequence step ${i} (${o}) failed`;return new t(r(a?.errorCode),s,{failedStepIndex:i,failedStepKind:o,completedSteps:n,sequenceResults:e,hint:`Run snapshot -i to inspect the current UI, then continue from the observed state.`})}function A(e){return Array.isArray(e)?e.map(e=>{let t=e??{};return{ok:t.ok===!0,kind:typeof t.kind==`string`?t.kind:`unknown`,errorCode:typeof t.errorCode==`string`?t.errorCode:void 0,errorMessage:typeof t.errorMessage==`string`?t.errorMessage:void 0,gestureStartUptimeMs:typeof t.gestureStartUptimeMs==`number`?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:typeof t.gestureEndUptimeMs==`number`?t.gestureEndUptimeMs:void 0}}):[]}var j=e({IOS_RUNNER_CONTAINER_BUNDLE_IDS:()=>s,withAppleRunnerProvider:()=>p});export{u as a,C as i,S as n,d as o,O as r,p as s,j as t};
1
+ import{r as e}from"./rolldown-runtime.js";import{B as t,P as n,rt as r,z as i}from"./sdk-contracts.js";import{k as a}from"./sdk-device.js";import{r as o}from"./touch-runtime.js";import{t as s}from"./runner-cache-metadata.js";import{AsyncLocalStorage as c}from"node:async_hooks";const l=new c;function u(e,t){return{runCommand:e,...t}}function d(e,t,n={}){let r=f(e,n);return m(r?r.provider:t)}function f(e,t={}){let n=l.getStore();return n&&n.deviceId===e.id&&(n.requestId?n.requestId===t.requestId:!t.requestId)?n:void 0}async function p(e,t,n){if(!e)return await n();let r={provider:m(e),deviceId:t.deviceId,requestId:t.requestId};return await l.run(r,n)}function m(e){return typeof e==`function`?{runCommand:e,hasLiveSession:()=>!0}:e}const h=[`tap`,`doubleTap`,`longPress`];function g(e){return typeof e==`string`&&h.includes(e)}function _(e,t){return i(new n(`INVALID_ARGS`,e,{...t,reason:`runner_sequence_invalid`}),`no`)}function v(e,t,n){return _(n,{stepIndex:e,kind:typeof t==`string`?t:void 0})}function y(e){if(!Array.isArray(e)||e.length===0)throw _(`sequence requires at least one step`,{stepCount:Array.isArray(e)?e.length:0});if(e.length>20)throw _(`sequence accepts at most 20 steps, received ${e.length}`,{stepCount:e.length,maxSteps:20});e.forEach((e,t)=>b(e,t))}function b(e,t){if(!g(e.kind))throw v(t,e.kind,`sequence step ${t} has unsupported kind "${String(e.kind)}"; allowed: ${h.join(`, `)}`);if(!Number.isFinite(e.x)||!Number.isFinite(e.y))throw v(t,e.kind,`sequence step ${t} (${e.kind}) requires finite x and y`);e.durationMs!==void 0&&x(e.durationMs,0,1e4,t,e.kind,`durationMs`),e.pauseMs!==void 0&&x(e.pauseMs,0,1e4,t,e.kind,`pauseMs`)}function x(e,t,n,r,i,a){if(!Number.isFinite(e)||e<t||e>n)throw v(r,i,`sequence step ${r} (${i}) ${a} must be between ${t} and ${n}`)}function S(e,t){return y(e),{command:`sequence`,steps:e,appBundleId:t}}async function C(e,n,r,i,a){let o=w(T(e,n,r),20).map(e=>S(e,i)),s,c,l=0,u=[],d=0;for(let e of o){let n;try{n=await a(e)}catch(e){throw t(e,l)}s??=n,c=n;let r;try{r=O(n)}catch(e){throw t(D(e,d),l+E(e))}l+=r.completedSteps,u.push(...r.results),d+=e.steps?.length??0}return{...s??{},completedSteps:l,sequenceResults:u,...c?.gestureEndUptimeMs===void 0?{}:{gestureEndUptimeMs:c.gestureEndUptimeMs},timingMode:`runner-sequence`}}function w(e,t,n=2e4){let r=[],i=[],a=0;for(let o of e){let e=(o.durationMs??0)+(o.pauseMs??0)+250;i.length>0&&(i.length>=t||a+e>n)&&(r.push(i),i=[],a=0),i.push(o),a+=e}return i.length>0&&r.push(i),r}function T(e,t,n){let r=n.doubleTap?`doubleTap`:n.holdMs>0?`longPress`:`tap`,i=r===`tap`&&a(e);return Array.from({length:n.count},(e,a)=>{let[s,c]=o(a,n.jitterPx);return{kind:r,x:t.x+s,y:t.y+c,...i?{synthesized:!0}:{},...n.holdMs>0?{durationMs:n.holdMs}:{},...a<n.count-1&&n.intervalMs>0?{pauseMs:n.intervalMs}:{}}})}function E(e){let t=e instanceof n?e.details?.completedSteps:void 0;return typeof t==`number`?t:0}function D(e,t){if(t===0||!(e instanceof n)||!e.details)return e;let r=e.details.failedStepIndex;if(typeof r!=`number`)return e;let i=e.details.completedSteps;return new n(e.code,e.message,{...e.details,failedStepIndex:r+t,chunkStepIndex:r,...typeof i==`number`?{completedSteps:t+i}:{}},e.cause)}function O(e){let t=A(e.sequenceResults),n=typeof e.completedSteps==`number`&&Number.isFinite(e.completedSteps)?e.completedSteps:t.filter(e=>e.ok).length,r=t.findIndex(e=>!e.ok),i=typeof e.failedStepIndex==`number`&&Number.isFinite(e.failedStepIndex)?e.failedStepIndex:r>=0?r:void 0;if(i!==void 0)throw k(t,n,i);return{results:t,completedSteps:n,failedStepIndex:i}}function k(e,t,i){let a=e[i],o=a?.kind??`step`,s=a?.errorMessage??`sequence step ${i} (${o}) failed`;return new n(r(a?.errorCode),s,{failedStepIndex:i,failedStepKind:o,completedSteps:t,sequenceResults:e,hint:`Run snapshot -i to inspect the current UI, then continue from the observed state.`})}function A(e){return Array.isArray(e)?e.map(e=>{let t=e??{};return{ok:t.ok===!0,kind:typeof t.kind==`string`?t.kind:`unknown`,errorCode:typeof t.errorCode==`string`?t.errorCode:void 0,errorMessage:typeof t.errorMessage==`string`?t.errorMessage:void 0,gestureStartUptimeMs:typeof t.gestureStartUptimeMs==`number`?t.gestureStartUptimeMs:void 0,gestureEndUptimeMs:typeof t.gestureEndUptimeMs==`number`?t.gestureEndUptimeMs:void 0}}):[]}var j=e({IOS_RUNNER_CONTAINER_BUNDLE_IDS:()=>s,withAppleRunnerProvider:()=>p});export{u as a,C as i,S as n,d as o,O as r,p as s,j as t};
@@ -1 +1 @@
1
- import{N as e,o as t}from"./sdk-contracts.js";import{n}from"./request-runtime-binding.js";function r(e,n){return t(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:n.reason},n.hint?{hint:n.hint}:void 0)}async function i(e){let t=await s(e.inspectFacts)(e.device);for(let n of e.required){let i=t.operations[n];if(!i.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(i):r(e.command,i)}}return{type:`admitted`,bind:c(e.bindDevice)}}async function a(e){let t=await i({...e,required:e.use.required});if(t.type===`response`)return t;let r=await t.bind(e.device,e.use);return e.readiness&&await n(r),{type:`runtime`,runtime:r}}async function o(e,t){let n=await a(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function s(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function c(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}export{r as i,a as n,o as r,i as t};
1
+ import{P as e,s as t}from"./sdk-contracts.js";import{n}from"./request-runtime-binding.js";function r(e,n){return t(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:n.reason},n.hint?{hint:n.hint}:void 0)}async function i(e){let t=await s(e.inspectFacts)(e.device);for(let n of e.required){let i=t.operations[n];if(!i.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(i):r(e.command,i)}}return{type:`admitted`,bind:c(e.bindDevice)}}async function a(e){let t=await i({...e,required:e.use.required});if(t.type===`response`)return t;let r=await t.bind(e.device,e.use);return e.readiness&&await n(r),{type:`runtime`,runtime:r}}async function o(e,t){let n=await a(e);if(n.type===`response`)return{ok:!1,response:n.response};let r=n.runtime;return{ok:!0,execute:async({dispatchContext:e})=>await t(r,e)}}function s(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function c(t){if(t)return t;throw new e(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}export{r as i,a as n,o as r,i as t};
@@ -1 +1 @@
1
- import{N as e}from"./sdk-contracts.js";import{URL as t}from"node:url";function n(n){if(!n)return;let o=r(n.metroHost),s=i(n.metroPort),c=`http`,l=r(n.bundleUrl);if(l){let n;try{n=new t(l)}catch(t){throw new e(`INVALID_ARGS`,`Invalid runtime bundle URL: ${l}`,{},t)}(n.protocol===`http:`||n.protocol===`https:`)&&(o??=r(n.hostname),s??=i(n.port.length>0?Number(n.port):a(n.protocol)),c=n.protocol===`https:`?`https`:`http`)}if(!(!o||!s))return{host:o,port:s,scheme:c}}function r(e){let t=e?.trim();return t&&t.length>0?t:void 0}function i(e){if(Number.isInteger(e)&&!(e<=0||e>65535))return e}function a(e){if(e===`https:`)return 443;if(e===`http:`)return 80}export{r as n,n as t};
1
+ import{P as e}from"./sdk-contracts.js";import{URL as t}from"node:url";function n(n){if(!n)return;let o=r(n.metroHost),s=i(n.metroPort),c=`http`,l=r(n.bundleUrl);if(l){let n;try{n=new t(l)}catch(t){throw new e(`INVALID_ARGS`,`Invalid runtime bundle URL: ${l}`,{},t)}(n.protocol===`http:`||n.protocol===`https:`)&&(o??=r(n.hostname),s??=i(n.port.length>0?Number(n.port):a(n.protocol)),c=n.protocol===`https:`?`https`:`http`)}if(!(!o||!s))return{host:o,port:s,scheme:c}}function r(e){let t=e?.trim();return t&&t.length>0?t:void 0}function i(e){if(Number.isInteger(e)&&!(e<=0||e>65535))return e}function a(e){if(e===`https:`)return 443;if(e===`http:`)return 80}export{r as n,n as t};