agent-device 0.21.23 → 0.21.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.25.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -13
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +50 -106
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  31. package/dist/src/absence-observation-errors.js +1 -0
  32. package/dist/src/adapter.js +1 -1
  33. package/dist/src/adb-executor.js +2 -2
  34. package/dist/src/adb-failure.js +2 -2
  35. package/dist/src/adb.js +1 -1
  36. package/dist/src/agent-browser-lifecycle.js +1 -1
  37. package/dist/src/agent-browser-process-record.js +1 -1
  38. package/dist/src/agent-browser-provider.js +1 -1
  39. package/dist/src/agent-browser-tool.js +1 -1
  40. package/dist/src/agent-device-client.js +2 -2
  41. package/dist/src/alert.js +1 -1
  42. package/dist/src/android-adb.d.ts +3 -2
  43. package/dist/src/android-adb.js +1 -1
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/android-system-surface-disclosure.js +1 -0
  46. package/dist/src/android-text-entry.js +1 -0
  47. package/dist/src/android.js +1 -1
  48. package/dist/src/app-backend.js +1 -1
  49. package/dist/src/app-helpers.js +1 -1
  50. package/dist/src/app-inventory.d.ts +4 -0
  51. package/dist/src/app-launch.js +1 -1
  52. package/dist/src/app-lifecycle.js +4 -3
  53. package/dist/src/app-lifecycle2.js +2 -2
  54. package/dist/src/app-log-files.js +1 -1
  55. package/dist/src/app-log-reconnect.js +1 -1
  56. package/dist/src/app-log-runtime2.js +3 -3
  57. package/dist/src/app-resolution-facade.js +1 -1
  58. package/dist/src/app-resolution.js +2 -2
  59. package/dist/src/app-state-runtime.d.ts +15 -0
  60. package/dist/src/apple-runner-platform.js +1 -1
  61. package/dist/src/application-lifecycle-interaction.js +1 -1
  62. package/dist/src/artifact-download.js +1 -1
  63. package/dist/src/auth.js +1 -1
  64. package/dist/src/aws-device-farm-connection.js +1 -0
  65. package/dist/src/back-mode.js +1 -1
  66. package/dist/src/backend-snapshot-options.js +1 -1
  67. package/dist/src/boot-diagnostics.js +1 -1
  68. package/dist/src/browserstack-connection.js +1 -0
  69. package/dist/src/capture-disclosure.js +1 -0
  70. package/dist/src/cli-config.js +1 -1
  71. package/dist/src/cli-help.js +36 -17
  72. package/dist/src/cli-output.js +1 -1
  73. package/dist/src/cli-runner.js +3 -1
  74. package/dist/src/cli.js +3 -4
  75. package/dist/src/client-companion-tunnel.js +1 -0
  76. package/dist/src/client-metro.js +1 -1
  77. package/dist/src/client-types.d.ts +15 -7
  78. package/dist/src/cloud-artifacts.d.ts +3 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-metadata.js +73 -1
  82. package/dist/src/command-policy.js +1 -0
  83. package/dist/src/command-schema.js +3 -3
  84. package/dist/src/command-surface.js +1 -1
  85. package/dist/src/command-tools.js +2 -2
  86. package/dist/src/connection-runtime.js +1 -1
  87. package/dist/src/connection-verification.js +1 -0
  88. package/dist/src/connection.js +5 -5
  89. package/dist/src/contracts.d.ts +1 -1
  90. package/dist/src/contracts.js +1 -1
  91. package/dist/src/daemon-client-lease-beat.js +1 -1
  92. package/dist/src/daemon-client-lifecycle.js +1 -1
  93. package/dist/src/daemon-client-liveness-probe.js +1 -1
  94. package/dist/src/daemon-policy-file.js +1 -1
  95. package/dist/src/daemon-registration-owner.js +1 -1
  96. package/dist/src/daemon-registration.js +1 -1
  97. package/dist/src/daemon-resolution.js +3 -1
  98. package/dist/src/debug-symbols-facade.js +1 -1
  99. package/dist/src/device-claim-inspection.js +1 -1
  100. package/dist/src/device-input-state.d.ts +6 -17
  101. package/dist/src/device-inventory-context.js +1 -1
  102. package/dist/src/device-readiness-runtime.js +1 -1
  103. package/dist/src/device-release.js +1 -1
  104. package/dist/src/device-selection-resolver.js +1 -1
  105. package/dist/src/device-shell.js +1 -1
  106. package/dist/src/device.js +3 -1
  107. package/dist/src/devicectl.js +1 -1
  108. package/dist/src/diagnostics.js +1 -1
  109. package/dist/src/doctor-facade.js +1 -1
  110. package/dist/src/durable-capture-resource.js +1 -1
  111. package/dist/src/durable-resource.js +1 -1
  112. package/dist/src/engine-eval-script.js +1 -1
  113. package/dist/src/error.js +1 -1
  114. package/dist/src/exec.js +1 -1
  115. package/dist/src/expo-dev-client-launch.js +1 -0
  116. package/dist/src/file.js +3 -1
  117. package/dist/src/find.js +1 -1
  118. package/dist/src/finders.js +1 -1
  119. package/dist/src/generic-settle.js +1 -1
  120. package/dist/src/generic.js +1 -1
  121. package/dist/src/gesture-admission.js +1 -1
  122. package/dist/src/gesture-plan-types.d.ts +2 -5
  123. package/dist/src/gesture-plan.js +1 -1
  124. package/dist/src/gesture-runtime.js +1 -1
  125. package/dist/src/harmonyos.js +1 -1
  126. package/dist/src/hdc.js +1 -1
  127. package/dist/src/helper.js +2 -2
  128. package/dist/src/human-control.js +1 -1
  129. package/dist/src/ime-rebind.js +1 -1
  130. package/dist/src/ime-state.js +1 -1
  131. package/dist/src/index.d.ts +4 -4
  132. package/dist/src/index.js +1 -1
  133. package/dist/src/input-actions.js +1 -1
  134. package/dist/src/input-actions2.js +2 -2
  135. package/dist/src/install-source-network-transport.js +1 -1
  136. package/dist/src/install-source2.js +1 -1
  137. package/dist/src/interaction-error.js +1 -0
  138. package/dist/src/interaction-positionals.js +1 -1
  139. package/dist/src/interaction.js +1 -1
  140. package/dist/src/interaction2.js +1 -1
  141. package/dist/src/interactor-operation-catalog.js +1 -1
  142. package/dist/src/interactor.js +5 -5
  143. package/dist/src/interactor2.js +1 -1
  144. package/dist/src/interactors.js +1 -1
  145. package/dist/src/internal/bin.js +1 -1
  146. package/dist/src/internal/daemon.js +5 -1
  147. package/dist/src/internal/png-worker.js +1 -1
  148. package/dist/src/inventory.js +2 -2
  149. package/dist/src/inventory2.js +1 -1
  150. package/dist/src/inventory6.js +1 -1
  151. package/dist/src/io.d.ts +2 -2
  152. package/dist/src/ios-client.js +1 -1
  153. package/dist/src/ios-settings.js +1 -1
  154. package/dist/src/ios-snapshot-acquisition.js +1 -1
  155. package/dist/src/ios-snapshot-adapter.js +1 -1
  156. package/dist/src/ios-snapshot-engine.js +1 -1
  157. package/dist/src/ios-snapshot-runtime.js +1 -1
  158. package/dist/src/keyed-lock.js +1 -1
  159. package/dist/src/launch-confirmation.js +1 -1
  160. package/dist/src/lease.js +1 -1
  161. package/dist/src/limrun-runtime-dependencies.js +1 -1
  162. package/dist/src/limrun.d.ts +5 -564
  163. package/dist/src/limrun.js +1 -1
  164. package/dist/src/linux.js +1 -1
  165. package/dist/src/load.js +1 -1
  166. package/dist/src/local-interactor-operation-set.js +1 -1
  167. package/dist/src/log-stream.js +9 -9
  168. package/dist/src/mechanics.js +16 -16
  169. package/dist/src/metro.js +1 -1
  170. package/dist/src/metro2.js +1 -1
  171. package/dist/src/mobile-snapshot-semantics.js +1 -1
  172. package/dist/src/observability.js +1 -1
  173. package/dist/src/observation.js +1 -2
  174. package/dist/src/open-target-resolution.js +1 -1
  175. package/dist/src/output-path.js +1 -1
  176. package/dist/src/overlay.js +1 -3
  177. package/dist/src/perf-facade.js +1 -1
  178. package/dist/src/perf-runtime-operation-builder.js +1 -1
  179. package/dist/src/perf-runtime.js +1 -1
  180. package/dist/src/perf-target.js +1 -1
  181. package/dist/src/physical-device-control.js +1 -1
  182. package/dist/src/platform-request-scope.js +1 -1
  183. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  184. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  185. package/dist/src/platform-runtime-apple-resources.js +1 -0
  186. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  187. package/dist/src/platform-runtime-daemon-services.js +1 -0
  188. package/dist/src/platform-runtime-host.js +1 -1
  189. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  190. package/dist/src/platform-runtime-open-target.js +1 -1
  191. package/dist/src/platform-runtime-operation-host.js +4 -4
  192. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  193. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  194. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  195. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  196. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  197. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  198. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  199. package/dist/src/platform-runtime-unavailable.js +1 -1
  200. package/dist/src/platform-runtime.js +1 -1
  201. package/dist/src/platform-runtime2.js +1 -1
  202. package/dist/src/plugin.js +1 -0
  203. package/dist/src/plugins/webdriver.d.ts +111 -0
  204. package/dist/src/plugins/webdriver.js +1 -0
  205. package/dist/src/plugins.d.ts +2 -1
  206. package/dist/src/plugins2.js +1 -1
  207. package/dist/src/png-crop-bytes.js +1 -1
  208. package/dist/src/png-resize.js +1 -0
  209. package/dist/src/png-worker-client.js +1 -1
  210. package/dist/src/png-worker-contract.js +1 -1
  211. package/dist/src/process-entry.js +1 -1
  212. package/dist/src/process-exit.js +1 -1
  213. package/dist/src/process.js +1 -1
  214. package/dist/src/provider-credential-fingerprint.js +1 -1
  215. package/dist/src/provider-device-admission.js +1 -1
  216. package/dist/src/provider-device-runtime.d.ts +556 -0
  217. package/dist/src/provider-policy.js +1 -0
  218. package/dist/src/provider-profile-fields.js +1 -1
  219. package/dist/src/provider-webdriver.js +1 -2
  220. package/dist/src/proxy.js +2 -2
  221. package/dist/src/quality-warnings.js +1 -1
  222. package/dist/src/react-devtools.js +2 -0
  223. package/dist/src/react-native-overlay2.js +3 -0
  224. package/dist/src/react-native.js +1 -1
  225. package/dist/src/record-runtime.js +1 -1
  226. package/dist/src/record-trace.js +1 -1
  227. package/dist/src/recording.js +2 -2
  228. package/dist/src/register-builtins.js +1 -1
  229. package/dist/src/remote-bridge.js +1 -0
  230. package/dist/src/remote-config-core.js +1 -0
  231. package/dist/src/remote-config.js +1 -1
  232. package/dist/src/remote-config2.js +1 -1
  233. package/dist/src/replay-backend-registry.js +1 -0
  234. package/dist/src/replay-divergence.js +1 -1
  235. package/dist/src/replay-maestro-backend.js +117 -0
  236. package/dist/src/replay-script-selection.js +1 -0
  237. package/dist/src/replay.js +1 -3
  238. package/dist/src/replay2.js +1 -0
  239. package/dist/src/reporting.js +3 -3
  240. package/dist/src/request-cancel.js +1 -1
  241. package/dist/src/request-providers.js +1 -1
  242. package/dist/src/request-runtime-binding.js +1 -1
  243. package/dist/src/result-serialization.js +1 -1
  244. package/dist/src/retry.js +1 -1
  245. package/dist/src/retry2.js +1 -0
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-retention.js +1 -0
  248. package/dist/src/runner-cache-trim.js +1 -0
  249. package/dist/src/runner-client.js +1 -1
  250. package/dist/src/runner-dev-tools-security.js +1 -1
  251. package/dist/src/runner-device-readiness.js +1 -1
  252. package/dist/src/runner-device-set.js +1 -0
  253. package/dist/src/runner-error-classification.js +3 -3
  254. package/dist/src/runner-exchange.js +1 -1
  255. package/dist/src/runner-lease.js +1 -0
  256. package/dist/src/runner-operations-facade.js +1 -1
  257. package/dist/src/runner-retention.js +1 -0
  258. package/dist/src/runner-start-budget.js +1 -1
  259. package/dist/src/runner-startup-transport.js +1 -0
  260. package/dist/src/runner-toolchain-probe.js +2 -0
  261. package/dist/src/runner.js +2 -1
  262. package/dist/src/runtime-command-surface.js +1 -0
  263. package/dist/src/runtime-deployment.js +1 -0
  264. package/dist/src/runtime-factory.js +1 -0
  265. package/dist/src/runtime-session.js +1 -0
  266. package/dist/src/runtime-transport-hints.js +1 -1
  267. package/dist/src/runtime.js +2 -1
  268. package/dist/src/runtime10.js +2 -2
  269. package/dist/src/runtime2.js +4 -4
  270. package/dist/src/runtime3.js +1 -1
  271. package/dist/src/runtime4.js +5 -5
  272. package/dist/src/runtime5.js +1 -1
  273. package/dist/src/runtime6.js +1 -1
  274. package/dist/src/runtime7.js +1 -1
  275. package/dist/src/runtime8.js +1 -1
  276. package/dist/src/runtime9.js +1 -1
  277. package/dist/src/screen-recording-transport.js +1 -1
  278. package/dist/src/screenshot-density.js +1 -1
  279. package/dist/src/screenshot-image.js +1 -1
  280. package/dist/src/screenshot-runtime.js +1 -1
  281. package/dist/src/screenshot3.js +5 -5
  282. package/dist/src/sdk-batch-runner.js +2 -2
  283. package/dist/src/sdk-batch.js +2 -2
  284. package/dist/src/sdk-contracts.d.ts +20 -29
  285. package/dist/src/sdk-contracts.js +2 -2
  286. package/dist/src/sdk-device.js +1 -1
  287. package/dist/src/sdk-finders.d.ts +1 -1
  288. package/dist/src/sdk-finders.js +1 -1
  289. package/dist/src/sdk-io.d.ts +4 -2
  290. package/dist/src/sdk-remote-config.d.ts +4 -0
  291. package/dist/src/sdk-remote-config.js +1 -1
  292. package/dist/src/sdk-selectors.d.ts +5 -6
  293. package/dist/src/sdk-selectors.js +1 -1
  294. package/dist/src/selection.js +0 -0
  295. package/dist/src/selector-pipeline-policy.js +1 -1
  296. package/dist/src/selector-runtime.js +1 -1
  297. package/dist/src/selectors.js +1 -1
  298. package/dist/src/server.js +2 -2
  299. package/dist/src/session-allocation.js +1 -1
  300. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session.js +1 -1
  303. package/dist/src/session2.js +5 -5
  304. package/dist/src/settings.js +1 -1
  305. package/dist/src/settings2.js +1 -1
  306. package/dist/src/simctl-settings.js +1 -1
  307. package/dist/src/simctl.js +1 -1
  308. package/dist/src/simulator-boot.js +1 -1
  309. package/dist/src/simulator-state.js +1 -1
  310. package/dist/src/simulator.js +1 -1
  311. package/dist/src/snapshot-capture-annotations.js +1 -1
  312. package/dist/src/snapshot-chrome.js +1 -0
  313. package/dist/src/snapshot-desktop-projection.js +1 -1
  314. package/dist/src/snapshot-evidence.js +1 -0
  315. package/dist/src/snapshot-node-lookup.js +1 -0
  316. package/dist/src/snapshot-occlusion.js +1 -0
  317. package/dist/src/snapshot-quality-verdict.js +1 -0
  318. package/dist/src/snapshot-runtime-binding.js +1 -1
  319. package/dist/src/snapshot-runtime.js +1 -1
  320. package/dist/src/snapshot-state.js +1 -1
  321. package/dist/src/snapshot.js +1 -1
  322. package/dist/src/snapshot2.js +1 -1
  323. package/dist/src/snapshot3.js +1 -1
  324. package/dist/src/src.js +5 -1
  325. package/dist/src/src2.js +1 -1
  326. package/dist/src/src3.js +2 -1
  327. package/dist/src/store.js +1 -1
  328. package/dist/src/surface-snapshot2.js +1 -1
  329. package/dist/src/target-evidence-tree.js +1 -0
  330. package/dist/src/target-evidence.js +1 -1
  331. package/dist/src/text-entry-focus.js +1 -1
  332. package/dist/src/tool-provider2.js +1 -1
  333. package/dist/src/touch-runtime.js +1 -1
  334. package/dist/src/touch-runtime2.js +1 -1
  335. package/dist/src/tree.js +1 -1
  336. package/dist/src/tv-remote.js +1 -1
  337. package/dist/src/type-text-runtime.js +1 -1
  338. package/dist/src/undici.js +8 -8
  339. package/dist/src/update-check.js +1 -1
  340. package/dist/src/vars.js +1 -1
  341. package/dist/src/version.js +1 -1
  342. package/dist/src/video.js +2 -2
  343. package/dist/src/wait.js +1 -0
  344. package/dist/src/web.js +1 -1
  345. package/dist/src/web2.js +1 -1
  346. package/package.json +22 -19
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  351. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.manifest.json +0 -16
  352. package/dist/src/adb-transport.js +0 -1
  353. package/dist/src/alert-runtime.js +0 -1
  354. package/dist/src/app-deployment-resolution.js +0 -2
  355. package/dist/src/app-inventory-contract.js +0 -1
  356. package/dist/src/app-log-session-resource.js +0 -1
  357. package/dist/src/application-lifecycle-runtime.js +0 -1
  358. package/dist/src/auth-session.js +0 -1
  359. package/dist/src/cache.js +0 -1
  360. package/dist/src/capabilities.js +0 -1
  361. package/dist/src/capture.js +0 -1
  362. package/dist/src/catalog.js +0 -1
  363. package/dist/src/click-button.js +0 -1
  364. package/dist/src/client-metro-companion.js +0 -1
  365. package/dist/src/client-options.js +0 -3
  366. package/dist/src/compatibility-policy.js +0 -1
  367. package/dist/src/daemon-artifacts.js +0 -1
  368. package/dist/src/daemon-client-transport.js +0 -1
  369. package/dist/src/daemon-http.js +0 -1
  370. package/dist/src/device-claim-rule.js +0 -1
  371. package/dist/src/device-rotation.js +0 -1
  372. package/dist/src/device-session.js +0 -3
  373. package/dist/src/device2.js +0 -1
  374. package/dist/src/device3.js +0 -3
  375. package/dist/src/dispatch-resolve.js +0 -4
  376. package/dist/src/format.js +0 -1
  377. package/dist/src/gesture-plan-types.js +0 -1
  378. package/dist/src/host.js +0 -1
  379. package/dist/src/human-control-contract.js +0 -1
  380. package/dist/src/interaction-ref-policy.js +0 -1
  381. package/dist/src/interactor-operation-binding.js +0 -1
  382. package/dist/src/keyboard-actions.js +0 -1
  383. package/dist/src/lease-context.js +0 -1
  384. package/dist/src/lease-registry-scope.js +0 -1
  385. package/dist/src/lease-scope.js +0 -1
  386. package/dist/src/managed-device-scope.js +0 -1
  387. package/dist/src/observe-until.js +0 -1
  388. package/dist/src/output-common.js +0 -5
  389. package/dist/src/owner-identity.js +0 -3
  390. package/dist/src/path-resolution.js +0 -1
  391. package/dist/src/perf-runtime-plan.js +0 -1
  392. package/dist/src/platform-runtime-app-log-process.js +0 -1
  393. package/dist/src/platform-runtime-managed-owner.js +0 -1
  394. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  395. package/dist/src/png.js +0 -1
  396. package/dist/src/prepare-kind.js +0 -1
  397. package/dist/src/provider-device-runtimes.js +0 -1
  398. package/dist/src/provider-session-ownership.js +0 -2
  399. package/dist/src/providers.js +0 -1
  400. package/dist/src/registry.js +0 -68
  401. package/dist/src/request-admission.js +0 -1
  402. package/dist/src/request-cancellation.js +0 -1
  403. package/dist/src/request-progress-protocol.js +0 -1
  404. package/dist/src/runner-cache-metadata.js +0 -3
  405. package/dist/src/runner-disposal.js +0 -1
  406. package/dist/src/runner-session-types.js +0 -1
  407. package/dist/src/runtime-admission.js +0 -1
  408. package/dist/src/screen-recording-admission-ledger.js +0 -1
  409. package/dist/src/screen-recording-resource-recovery.js +0 -1
  410. package/dist/src/screenshot-result.js +0 -1
  411. package/dist/src/script.js +0 -1
  412. package/dist/src/scroll-command.js +0 -1
  413. package/dist/src/scroll-gesture.js +0 -1
  414. package/dist/src/scroll-indicator.js +0 -1
  415. package/dist/src/session-artifact-paths.js +0 -1
  416. package/dist/src/session-paths.js +0 -1
  417. package/dist/src/session-repair-tombstone.js +0 -1
  418. package/dist/src/session-routing.js +0 -1
  419. package/dist/src/session-snapshot.js +0 -1
  420. package/dist/src/snapshot4.js +0 -1
  421. package/dist/src/src4.js +0 -1
  422. package/dist/src/src5.js +0 -1
  423. package/dist/src/src6.js +0 -1
  424. package/dist/src/src7.js +0 -2
  425. package/dist/src/src8.js +0 -115
  426. package/dist/src/string-enum.js +0 -1
  427. package/dist/src/success-text.js +0 -1
  428. package/dist/src/timeouts.js +0 -1
  429. package/dist/src/touch-reference-frame.js +0 -1
  430. package/dist/src/transport.js +0 -3
  431. package/dist/src/ttl-memo.js +0 -1
  432. package/dist/src/verified-file.js +0 -1
  433. package/dist/src/viewport.js +0 -1
  434. package/dist/src/window-state.js +0 -1
  435. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
@@ -1 +1,5 @@
1
- import{r as e}from"../rolldown-runtime.js";import{F as t,I as n,J as r,P as i,Q as a,R as o,a as s,b as c,f as l,rt as u,s as d,t as f,z as p}from"../sdk-contracts.js";import"../capture.js";import{l as m}from"../android-input-ownership.js";import{t as h}from"../viewport.js";import{a as g,i as _,l as v,o as y,r as b,s as x,t as S}from"../diagnostics.js";import"../diagnostics2.js";import{C,M as w,h as ee,j as te,p as T,w as E}from"../sdk-device.js";import{m as D}from"../lease-scope.js";import{$ as O,Dr as k,Dt as A,H as ne,Jt as j,Kt as M,Lt as re,Qt as ie,S as ae,U as oe,b as se,ct as ce,gr as N,m as le,ot as ue,qr as de,u as fe,vt as pe,xt as P,yt as me}from"../sdk-batch.js";import{d as he,g as ge}from"../scroll-gesture.js";import{n as _e,r as ve}from"../script.js";import{_ as ye,a as be,c as xe,i as Se,n as Ce,o as F,s as I,u as we}from"../dispatch-resolve.js";import{r as Te}from"../format.js";import{M as Ee,n as De,t as Oe}from"../provider-device-admission.js";import{D as ke,O as Ae,d as je}from"../runtime.js";import{i as Me,r as L}from"../success-text.js";import{d as Ne}from"../overlay.js";import{a as Pe,c as Fe,i as Ie,l as Le,o as Re,r as ze,s as Be}from"../scroll-command.js";import"../device.js";import{d as Ve,f as He,h as Ue,m as We,p as Ge}from"../device-rotation.js";import{j as Ke,o as qe,v as Je}from"../owner-identity.js";import{n as Ye}from"../verified-file.js";import{v as Xe}from"../exec.js";import{t as Ze}from"../timeouts.js";import"../file.js";import{r as Qe}from"../tv-remote.js";import{c as $e,i as et,n as tt,o as nt,p as rt,r as it}from"../daemon-http.js";import"../command.js";import{a as at,r as ot,t as st}from"../transport.js";import{a as ct,i as lt,o as ut,r as dt}from"../request-progress-protocol.js";import{n as ft}from"../session-paths.js";import{a as pt,o as mt,s as ht}from"../session-artifact-paths.js";import{n as gt,r as _t}from"../process.js";import{a as vt}from"../version.js";import{n as yt,t as bt}from"../daemon-resolution.js";import{r as xt}from"../retry.js";import{t as St}from"../platform-runtime-android-mechanics.js";import{a as Ct,r as wt}from"../archive.js";import{t as Tt}from"../byte-limit-stream.js";import{s as Et}from"../device-shell.js";import{t as Dt}from"../keyed-lock.js";import{t as Ot}from"../snapshot-state.js";import{_ as kt,l as At,v as jt}from"../lease-registry-scope.js";import{a as Mt,c as Nt,i as Pt,o as Ft,s as It,t as Lt}from"../request-cancel.js";import{n as Rt}from"../request.js";import{a as zt,c as Bt,l as Vt,o as Ht,r as Ut,u as Wt}from"../provider-session-ownership.js";import{Ct as Gt,D as Kt,Dt as qt,E as Jt,Et as Yt,F as Xt,H as Zt,I as Qt,L as $t,N as en,Ot as tn,P as nn,S as rn,St as an,T as on,Tt as sn,a as cn,at as ln,bt as un,ct as dn,dt as fn,ft as pn,ht as mn,i as hn,j as gn,kt as _n,lt as vn,m as yn,mt as bn,o as xn,ot as Sn,pt as Cn,s as wn,st as Tn,t as En,ut as Dn,vt as On,wt as kn,xt as An,yt as jn,z as Mn}from"../device-claim-rule.js";import{a as Nn,t as Pn}from"../human-control-contract.js";import{b as Fn,c as In,d as Ln,g as Rn,h as zn,l as Bn,m as Vn,n as Hn,o as Un,p as Wn,s as Gn,v as Kn,x as qn,y as Jn}from"../screenshot-runtime.js";import{i as Yn,r as Xn,t as Zn}from"../interactors.js";import{n as Qn}from"../daemon-policy-file.js";import{A as $n,C as er,D as tr,E as nr,I as rr,L as ir,S as ar,T as or,_ as sr,h as cr,m as R,v as lr,w as ur,x as dr,y as fr}from"../session-snapshot.js";import{i as pr,n as mr,r as hr,t as gr}from"../platform-runtime.js";import{r as _r}from"../application-lifecycle-runtime.js";import{n as vr,t as yr}from"../provider-device-runtimes.js";import{n as br}from"../provider-credential-fingerprint.js";import{i as xr}from"../daemon-registration.js";import{d as Sr,f as Cr,h as wr,m as Tr}from"../perf-runtime-plan.js";import{o as Er}from"../device-inventory-context.js";import{t as Dr}from"../observe-until.js";import{t as Or}from"../touch-reference-frame.js";import{n as kr,t as Ar}from"../screen-recording-admission-ledger.js";import{c as jr,f as Mr,l as Nr,p as Pr,r as Fr,s as Ir}from"../session-routing.js";import{i as Lr,r as Rr,t as zr}from"../request-runtime-binding.js";import{i as Br,n as Vr,r as Hr,t as Ur}from"../platform-request-scope.js";import{n as Wr,r as z}from"../runtime-admission.js";import{t as Gr}from"../selector-pipeline-policy.js";import{c as Kr,l as qr}from"../png-worker-client.js";import{c as B,s as Jr,t as Yr}from"../daemon-registration-owner.js";import{i as Xr,o as Zr}from"../code-signature.js";import Qr,{randomUUID as $r}from"node:crypto";import V from"node:fs";import ei from"node:os";import H from"node:path";import{pipeline as ti}from"node:stream/promises";import ni from"node:net";import{pathToFileURL as ri}from"node:url";import ii from"node:http";import{once as ai}from"node:events";function oi(e,t){if(t?.replayBackend&&t.replayBackend!==`maestro`)throw new i(`INVALID_ARGS`,`Unsupported replay backend "${t.replayBackend}".`);return{..._e(e),metadata:ve(e)}}function si(e){switch(e){case`INVALID_ARGS`:return 400;case`UNAUTHORIZED`:return 401;case`SESSION_NOT_FOUND`:case`REPAIR_SESSION_EXPIRED`:return 404;default:return 500}}function U(e,t){e.statusCode=si(t.code),e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function ci(e,t){if(e.headersSent){e.destroy(t);return}let n=r(t);e.statusCode=si(n.code),e.end(n.message)}async function li(e){let t=H.join(e.tempDir,`extracted`),n=``,r=await ui(e.archivePath);await wt({archivePath:e.archivePath,outputRoot:t,type:r,validateManifest:t=>{n=di(t,e.platform,e.expectedRootName)}});let a=H.join(t,n);if(!V.existsSync(a))throw V.rmSync(t,{recursive:!0,force:!0}),new i(`INVALID_ARGS`,`Expected extracted bundle "${n}" not found in archive`);return a}async function ui(e){let t=await V.promises.open(e,`r`);try{let e=Buffer.alloc(2),{bytesRead:n}=await t.read(e,0,e.length,0);return n===e.length&&e[0]===31&&e[1]===139?`tgz`:`tar`}finally{await t.close()}}function di(e,t,n){if(e.length===0)throw new i(`INVALID_ARGS`,`Uploaded app bundle archive is empty`);let r=new Set(e.map(e=>e.name.split(`/`)[0]).filter(e=>!!e)),a=n??fi([...r],t);if(!r.has(a))throw new i(`INVALID_ARGS`,`Uploaded archive must contain a top-level "${a}" bundle`);for(let t of e)if(t.name!==a&&!t.name.startsWith(`${a}/`))throw new i(`INVALID_ARGS`,`Archive entry must stay inside top-level "${a}" bundle: ${t.name}`);return a}function fi(e,t){if(t===`ios`){let t=e.filter(e=>e.toLowerCase().endsWith(`.app`));if(t.length===1)return t[0];throw t.length===0?new i(`INVALID_ARGS`,`iOS app bundle archives must contain a single top-level .app directory`):new i(`INVALID_ARGS`,`iOS app bundle archives must contain exactly one top-level .app directory, found: ${t.join(`, `)}`)}if(e.length===1)return e[0];throw new i(`INVALID_ARGS`,`Archive must contain a single top-level bundle, found: ${e.join(`, `)}`)}const pi=6e4;function mi(e){let t=e.trim(),n=H.basename(t);if(!n||n===`.`||n===`..`)throw new i(`INVALID_ARGS`,`Invalid artifact filename: ${e}`);return n}function hi(e){let t=yi(e);return V.mkdtempSync(H.join(ei.tmpdir(),`agent-device-artifact-${t}-`))}function gi(e){if(e===void 0)return;let t=String(e);if(!/^\d+$/.test(t))throw new i(`INVALID_ARGS`,`Invalid content-length header`);let n=Number(t);if(!Number.isSafeInteger(n))throw new i(`INVALID_ARGS`,`Invalid content-length header`);if(n>2147483648)throw new i(`INVALID_ARGS`,`Upload exceeds maximum size of ${Ct} bytes`)}function _i(e,t){return new Promise((n,r)=>{let a=!1,o,s=V.createWriteStream(t),c=e=>{if(!a){if(a=!0,o&&clearTimeout(o),e){vi(s,t).finally(()=>r(e));return}n()}},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{let t=new i(`COMMAND_FAILED`,`Artifact transfer timed out due to inactivity`,{timeoutMs:pi});`destroy`in e&&typeof e.destroy==`function`&&e.destroy(t),u.destroy(t),c(t)},pi)},u=Tt({maxBytes:Ct,createLimitError:()=>new i(`INVALID_ARGS`,`Upload exceeds maximum size of ${Ct} bytes`)});u.on(`data`,l),e.on(`aborted`,()=>{c(new i(`COMMAND_FAILED`,`Artifact transfer was interrupted`))}),l(),ti(e,u,s).then(()=>c(),e=>c(e))})}async function vi(e,t){if(e.destroy(),!e.closed)try{await ai(e,`close`)}catch{}await V.promises.rm(t,{force:!0}).catch(()=>{})}function yi(e){let t=e?.trim();if(!t)return`request`;let n=t.replaceAll(/[^a-zA-Z0-9._-]+/g,`-`).replaceAll(/^-+|-+$/g,``);return n.length>0?n.slice(0,48):`request`}function bi(e,t){let n=Array.isArray(e)?e[0]:e;if(!n)return;let r=n.match(/^bytes (\d+)-(\d+)\/(\d+)$/);r||Si();let i=Number(r[1]),a=Number(r[2]),o=Number(r[3]);return(!Number.isSafeInteger(i)||!Number.isSafeInteger(a)||!Number.isSafeInteger(o)||i<0||a<i||a>=o||o<1||o!==t)&&Si(),{start:i,end:a,size:o,span:a-i+1}}function xi(e){if(e===void 0)return;if(!/^\d+$/.test(e))throw new i(`INVALID_ARGS`,`Invalid content-length header`);let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new i(`INVALID_ARGS`,`Invalid content-length header`);return t}function Si(){throw new i(`INVALID_ARGS`,`Invalid content-range header`)}async function Ci(e){let t=await Ti(e.entry),n=bi(e.req.headers[`content-range`],e.entry.sizeBytes);if(n&&n.start!==t||!n&&t>0)return{complete:!1,offset:t,appended:!1};let r=e.entry.sizeBytes-t,a=n?.span??r,o=xi(e.req.headers[`content-length`]);if(o!==void 0&&o>a)throw new i(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`);if(n&&o!==void 0&&o!==n.span)throw new i(`INVALID_ARGS`,`Upload chunk length does not match content-range`);let s=Tt({maxBytes:a,createLimitError:()=>new i(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`)});try{if(await ti(e.req,s,V.createWriteStream(e.entry.payloadPath,{flags:`a`})),n&&s.bytesSeen!==n.span)throw new i(`INVALID_ARGS`,`Upload chunk length does not match content-range`);if(o!==void 0&&s.bytesSeen!==o)throw new i(`INVALID_ARGS`,`Upload chunk length does not match content-length`)}catch(n){throw await Ei(e.entry.payloadPath,t,n,e.invalidate),n}let c=await Ti(e.entry);return{complete:c===e.entry.sizeBytes,offset:c,appended:c>t}}async function wi(e){let t=Qr.createHash(`sha256`);for await(let n of V.createReadStream(e))t.update(n);return t.digest(`hex`)}async function Ti(e){let t=(await V.promises.stat(e.payloadPath).catch(e=>{if(e.code!==`ENOENT`)throw e}))?.size??0;if(t>e.sizeBytes)throw new i(`COMMAND_FAILED`,`Upload state is corrupt`,{reason:`UPLOAD_STATE_CORRUPT`});return t}async function Ei(e,t,n,r){try{await V.promises.truncate(e,t)}catch(e){let t=new i(`COMMAND_FAILED`,`Upload rollback failed; the upload ticket was invalidated`,{reason:`UPLOAD_ROLLBACK_FAILED`,originalError:String(n)},e);throw await r(t),t}}const Di=3e5,Oi={label:`Upload`,expiredHint:`Resumable uploads expire ${Di/6e4} minutes after the last received chunk. Start the upload again from the beginning.`},ki=new Map,Ai=new Map;function ji(e){Wi(e);let t=Gi(e),n=Ai.get(t),r=(n?ki.get(n):void 0)??Pi(e,t);return{uploadId:r.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${r.id}`,e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`).toString(),headers:{...e.tokenHeaders,"content-type":e.contentType||`application/octet-stream`}}}}async function Mi(e){let t=Ui(e.uploadId,e.tenantId);return await Li(t,`receive`,e.req,async()=>{let{appended:n,...r}=await Ci({entry:t,req:e.req,invalidate:async()=>await Vi(t)});return n&&!t.closed&&Fi(t),r})}async function Ni(e,t){let n=Ui(e,t);return await Li(n,`finalize`,void 0,async()=>{let t=V.statSync(n.payloadPath).size;if(t!==n.sizeBytes)throw new i(`INVALID_ARGS`,`Upload is incomplete`,{uploadId:e,offset:t,sizeBytes:n.sizeBytes});try{let t=await wi(n.payloadPath);if(t!==n.sha256)throw new i(`INVALID_ARGS`,`Upload hash mismatch`,{uploadId:e,expectedSha256:n.sha256,actualSha256:t});let r=await Ri(n);return zi(n),{artifactPath:r,tempDir:n.tempDir}}catch(e){throw await Bi(n,e)}})}function Pi(e,t){let n=Qr.randomUUID(),r=hi(`upload`),i=H.join(r,`payload`);V.writeFileSync(i,``);let a={id:n,key:t,tempDir:r,payloadPath:i,fileName:mi(e.fileName),sizeBytes:e.sizeBytes,sha256:e.sha256.toLowerCase(),artifactType:e.artifactType,platform:e.platform,tenantId:e.tenantId,generation:0,tail:Promise.resolve(),closed:!1,finalized:!1};return ki.set(n,a),Ai.set(t,n),Fi(a),a}function Fi(e){e.timer&&clearTimeout(e.timer),e.generation+=1;let t=e.generation;e.timer=setTimeout(()=>Ii(e,t),Di),e.timer.unref()}function Ii(e,t){if(e.generation!==t||e.closed)return;Hi(e);let n=e.activeReceive;n?.once(`error`,()=>{}),n?.destroy(new i(`COMMAND_FAILED`,`Upload expired while receiving data`,{reason:`RESOURCE_EXPIRED`})),e.tail=e.tail.then(async()=>{e.finalized||await V.promises.rm(e.tempDir,{recursive:!0,force:!0})}).catch(()=>{})}async function Li(e,t,n,r){let i=e.tail.catch(()=>{}).then(async()=>{e.closed&&Ui(e.id,e.tenantId),t===`receive`&&(e.activeReceive=n);try{return await r()}finally{t===`receive`&&(e.activeReceive=void 0)}});return e.tail=i.then(()=>{},()=>{}),await i}async function Ri(e){if(e.artifactType===`file`){let t=H.join(e.tempDir,e.fileName);return await V.promises.rename(e.payloadPath,t),t}let t=await li({archivePath:e.payloadPath,tempDir:e.tempDir,platform:e.platform===`android`?`android`:`ios`,expectedRootName:e.fileName});return await V.promises.rm(e.payloadPath,{force:!0}),t}function zi(e){e.finalized=!0,Hi(e)}async function Bi(e,t){Hi(e);try{return await V.promises.rm(e.tempDir,{recursive:!0,force:!0}),t}catch(e){return new i(`COMMAND_FAILED`,`Upload finalize cleanup failed`,{reason:`UPLOAD_FINALIZE_CLEANUP_FAILED`,originalError:String(t)},e)}}async function Vi(e){Hi(e),await V.promises.rm(e.tempDir,{recursive:!0,force:!0}).catch(()=>{})}function Hi(e){e.closed=!0,e.timer&&clearTimeout(e.timer),ki.delete(e.id),Ai.delete(e.key)}function Ui(e,t){return Wt(ki,e,t,Oi)}function Wi(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new i(`INVALID_ARGS`,`Invalid upload sha256`);if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new i(`INVALID_ARGS`,`Invalid upload sizeBytes`);if(gi(String(e.sizeBytes)),mi(e.fileName),!e.uploadAttemptId.trim())throw new i(`INVALID_ARGS`,`uploadAttemptId is required`)}function Gi(e){return[e.tenantId??``,e.uploadAttemptId,e.sha256.toLowerCase(),String(e.sizeBytes),mi(e.fileName),e.artifactType,e.platform??``].join(`\0`)}async function Ki(e){let t=e.headers[`x-artifact-type`],n=e.headers[`x-artifact-filename`];if(!t||!n)throw new i(`INVALID_ARGS`,`Missing required headers: x-artifact-type and x-artifact-filename`);if(t!==`file`&&t!==`app-bundle`)throw new i(`INVALID_ARGS`,`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);gi(e.headers[`content-length`]);let r=mi(n),a=hi(`upload`);try{if(t===`file`){let t=H.join(a,r);return await _i(e,t),{artifactPath:t,tempDir:a}}let n=H.join(a,`artifact.tar`);await _i(e,n);let i=await li({archivePath:n,tempDir:a,platform:`ios`,expectedRootName:r});return V.rmSync(n,{force:!0}),{artifactPath:i,tempDir:a}}catch(e){throw V.rmSync(a,{recursive:!0,force:!0}),e}}function qi(e){let{req:t,res:n,authorize:r,token:i}=e,a=Yi(t);return a!==null&&(Ji(a,t,n,r,i),!0)}async function Ji(e,t,n,r,i){switch(e.kind){case`preflight`:await Zi(t,n,r,i);return;case`direct`:await Qi(e.uploadId,t,n,r);return;case`finalize`:await $i(t,n,r);return;case`upload`:await Xi(t,n,r);return}}function Yi(e){return e.method===`POST`&&e.url===`/upload/preflight`?{kind:`preflight`}:e.method===`PUT`&&e.url?.startsWith(`/upload/direct/`)?{kind:`direct`,uploadId:e.url.slice(15).replace(/\?.*$/,``)}:e.method===`POST`&&e.url===`/upload/finalize`?{kind:`finalize`}:e.method===`POST`&&e.url===`/upload`?{kind:`upload`}:null}async function Xi(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[]}});if(!r)return;ta(t,await Ki(e),r.tenantId)}catch(e){U(t,r(e))}}async function Zi(e,t,n,i){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`preflight`]}});if(!r)return;let a=ra(await na(e,65536));ea(t,{ok:!0,...ji({baseUrl:ua(e),tokenHeaders:la(i),...a,tenantId:r.tenantId})})}catch(e){U(t,r(e))}}async function Qi(e,t,n,i){try{let r=await i({req:t,res:n,daemonRequest:{command:`upload`,positionals:[`direct`,e]}});if(!r)return;let a=await Mi({uploadId:e,req:t,tenantId:r.tenantId});if(a.complete){n.statusCode=200,n.end(`ok`);return}n.statusCode=308,a.offset>0&&n.setHeader(`range`,`bytes=0-${a.offset-1}`),n.setHeader(`x-upload-offset`,String(a.offset)),n.end()}catch(e){U(n,r(e))}}async function $i(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`finalize`]}});if(!r)return;ta(t,await Ni(ia(await na(e,65536)).uploadId,r.tenantId),r.tenantId)}catch(e){U(t,r(e))}}function ea(e,t){e.statusCode=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function ta(e,t,n){ea(e,{ok:!0,uploadId:Vt({artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:n})})}async function na(e,t){let n=(await ot(e,t,`Request body is too large.`)).toString(`utf8`);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`expected object`);return e}catch(e){throw new i(`INVALID_ARGS`,`Invalid JSON request body`,{},e)}}function ra(e){return{sha256:aa(e,`sha256`),uploadAttemptId:aa(e,`uploadAttemptId`),fileName:aa(e,`fileName`),sizeBytes:sa(e,`sizeBytes`),artifactType:ca(e),platform:oa(e,`platform`),contentType:oa(e,`contentType`)}}function ia(e){return{uploadId:aa(e,`uploadId`)}}function aa(e,t){let n=oa(e,t)?.trim();if(!n)throw new i(`INVALID_ARGS`,`${t} is required`);return n}function oa(e,t){let n=e[t];return typeof n==`string`?n:void 0}function sa(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n))throw new i(`INVALID_ARGS`,`${t} must be an integer`);return n}function ca(e){let t=aa(e,`artifactType`);if(t===`file`||t===`app-bundle`)return t;throw new i(`INVALID_ARGS`,`artifactType must be "file" or "app-bundle"`)}function la(e){return{authorization:`Bearer ${e}`,"x-agent-device-token":e}}function ua(e){let t=typeof e.headers.host==`string`?e.headers.host:``;if(!t)throw new i(`INVALID_ARGS`,`Missing host header`);let n=e.headers[`x-forwarded-proto`];return`${(Array.isArray(n)?n[0]:n)||`http`}://${t}`}function da(e){try{return decodeURIComponent(e)}catch{return``}}function fa(e){let{req:t,res:n,authorize:r,retainArtifacts:i}=e,a=ma(t);return a!==null&&(pa(a,t,n,r,{retainArtifacts:i}),!0)}async function pa(e,t,n,r,i){switch(e.kind){case`inventory`:await ga(t,n,r);return;case`download`:await ha(e.artifactId,t,n,r,i);return}}function ma(e){if(e.method!==`GET`)return null;let t=va(e.url);return t===`/artifacts`||t===`/artifacts/`?{kind:`inventory`}:t.startsWith(`/artifacts/`)?{kind:`download`,artifactId:_a(t)}:null}async function ha(e,t,n,i,a){if(!e){n.statusCode=400,n.end(`Missing artifact id`);return}try{let r=await i({req:t,res:n,daemonRequest:{command:`download_artifact`,positionals:[e]}});if(!r)return;let o=await Ht(e,r.tenantId),s=a.retainArtifacts===!0,c=V.createReadStream(o.artifactPath);n.statusCode=200,n.setHeader(`content-type`,o.mimeType),n.setHeader(`content-length`,String(o.sizeBytes)),o.fileName&&n.setHeader(`content-disposition`,`attachment; filename="${o.fileName.replace(/"/g,``)}"`),c.on(`error`,e=>{ci(n,e)});let l=!1,u=()=>{l||s||(l=!0,Ut(e))},d=0;c.on(`data`,e=>{d+=e.length,d>=o.sizeBytes&&u()}),c.on(`end`,u),n.on(`finish`,u),n.on(`close`,()=>{n.writableFinished&&u()}),c.pipe(n)}catch(e){U(n,r(e))}}async function ga(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`list_artifacts`,positionals:[]}});if(!r)return;t.statusCode=200,t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({artifacts:await zt(r.tenantId)}))}catch(e){U(t,r(e))}}function _a(e){let t=e.slice(11);return!t||t.includes(`/`)?``:da(t)}function va(e){let t=e||`/`,n=t.indexOf(`?`);return n>=0?t.slice(0,n)||`/`:t}const ya=[``,`sessions`,null,`requests`,null,`diagnostics`];function ba(e){let t=xa(e.req);return t!==null&&(Sa(t,e),!0)}function xa(e){if(e.method!==`GET`)return null;let t=(e.url??``).split(`?`,1)[0].split(`/`);return t.length!==ya.length||!ya.every((e,n)=>e===null||t[n]===e)?null:{session:da(t[2]??``),requestId:da(t[4]??``)}}async function Sa(e,t){let{req:n,res:a,authorize:o,resolveRecordPath:s}=t;try{if(!ft(e.session)||!ft(e.requestId)){U(a,r(new i(`INVALID_ARGS`,`Invalid session or request id in diagnostics route`)));return}let t=await o({req:n,res:a,daemonRequest:{command:`request_diagnostics`,positionals:[e.session,e.requestId]}});if(!t)return;if(t.sessionNamespace&&!_n(t.sessionNamespace,e.session)){U(a,r(new i(`UNAUTHORIZED`,`Session is outside this tenant`,{session:e.session})));return}let c=s(e),l=await Ca(c);if(!l){U(a,r(new i(`SESSION_NOT_FOUND`,`No diagnostics record for request ${e.requestId} in session ${e.session}`,{hint:`The daemon keeps a request record only for the session it ran in; re-run the command against this daemon to produce a fresh one.`})));return}let u=V.createReadStream(c);a.statusCode=200,a.setHeader(`content-type`,`application/x-ndjson`),a.setHeader(`content-length`,String(l.size)),u.on(`error`,e=>{ci(a,e)}),u.pipe(a)}catch(e){U(a,r(e))}}async function Ca(e){try{let t=await V.promises.stat(e);return t.isFile()?t:null}catch{return null}}function wa(e){let{hookConfigured:t,hookAttestedTenant:n,clientDeclaredTenant:r}=e;return n?{trusted:!0,tenantId:n,attested:!0}:t?{trusted:!1}:{trusted:!0,tenantId:r,attested:!1}}function Ta(){return r(new i(`UNAUTHORIZED`,`Request tenant is not attested by the auth hook`))}function Ea(e,t,n,a){let o=e.headers[tt];return typeof o!=`string`||!o||o===a?!1:(t.statusCode=409,t.setHeader(`content-type`,`application/json`),t.setHeader(it,`true`),t.end(JSON.stringify(rt(n,`Daemon instance changed`,r(new i(`COMMAND_FAILED`,`Daemon instance changed`,{reason:`remote_instance_mismatch`}))))),!0)}function Da(e){let t=Na(e.req);return t?(Oa(t,e),!0):!1}async function Oa(e,t){let{req:n,res:i,expectedToken:a}=t;try{La(n,a),await ka(e,t)}catch(e){U(i,r(e))}}async function ka(e,t){switch(e.kind){case`list`:W(t.res,{ok:!0,holds:t.registry.listHumanControlHolds({kind:`host`})});return;case`upsert`:await Aa(e.holdId,t);return;case`remove`:ja(e.holdId,t);return;case`unsupported`:Ma(t.res);return;case`invalid`:throw new i(`INVALID_ARGS`,`Invalid request URL.`)}}async function Aa(e,t){let{req:r,res:i}=t,a=new AbortController,o=()=>{i.writableFinished||a.abort(n())};r.once(`aborted`,o),i.once(`close`,o),(r.aborted||i.destroyed)&&o();try{let n=await Ia(r);W(i,{ok:!0,hold:await t.registry.putHumanControlHold({kind:`host`},e,n,a.signal),state:`active`})}finally{r.off(`aborted`,o),i.off(`close`,o)}}function ja(e,t){let n=t.registry.removeHumanControlHold({kind:`host`},e);W(t.res,{ok:!0,released:!!n,...n?{hold:n}:{}})}function Ma(e){e.statusCode=405,e.setHeader(`allow`,`GET, PUT, DELETE`),W(e,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`})}function Na(e){let t=Fa(e.url);return t===null?{kind:`invalid`}:Pa(t,e.method)}function Pa(e,t){if(e===`/admin/human-control/holds`)return t===`GET`?{kind:`list`}:{kind:`unsupported`};if(!e.startsWith(`/admin/human-control/holds/`))return null;let n=e.slice(Pn.length+1);return!n||n.includes(`/`)?{kind:`unsupported`}:t===`PUT`?{kind:`upsert`,holdId:n}:t===`DELETE`?{kind:`remove`,holdId:n}:{kind:`unsupported`}}function Fa(e){try{return new URL(e??`/`,`http://127.0.0.1`).pathname}catch{return null}}async function Ia(e){return Nn(await Ra(e,`Human-control`))}function La(e,t){let n=typeof e.headers.authorization==`string`?e.headers.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):``,a=(typeof e.headers[`x-agent-device-token`]==`string`?e.headers[`x-agent-device-token`]:``)||r;if(!a||!at(a,t))throw new i(`UNAUTHORIZED`,`Invalid token`)}async function Ra(e,t){let n=await ot(e,16384,`${t} request body is too large.`);try{return JSON.parse(n.toString(`utf8`))}catch(e){throw new i(`INVALID_ARGS`,`${t} request body must be valid JSON.`,{},e)}}function W(e,t){e.statusCode||=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}const za=new Set([`tenantId`,`runId`,`clientId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`ttlMs`,`retainOnClose`]);function Ba(e){return Va(e)||Da(e)}function Va(e){let t=Wa(e.req);return t?(Ha(t,e).catch(t=>{U(e.res,r(t))}),!0):!1}async function Ha(e,t){let{req:n,res:r,registry:i}=t;switch(La(n,t.expectedToken),e.kind){case`list`:W(r,{ok:!0,leases:i.listActiveLeases().filter(Ua)});return;case`put`:{let t=qa(await Ra(n,`Host lease`));W(r,{ok:!0,lease:i.putHostLease(e.leaseId,t)});return}case`remove`:{let t=kt(e.leaseId),n=i.listActiveLeases().find(e=>e.leaseId===t),a=n?i.releaseLease(At(n)).released:!1;W(r,{ok:!0,released:a,...n&&a?{lease:n}:{}});return}case`unsupported`:r.statusCode=405,r.setHeader(`allow`,`GET, PUT, DELETE`),W(r,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`});return}}function Ua(e){return e.backend===`macos-app`}function Wa(e){let t=URL.parse(e.url??`/`,`http://127.0.0.1`)?.pathname??``;return t===`/admin/leases`?e.method===`GET`?{kind:`list`}:{kind:`unsupported`}:t.startsWith(`/admin/leases/`)?Ga(t.slice(14),e.method):null}function Ga(e,t){let n=Ka[t??``];return!n||!e||e.includes(`/`)?{kind:`unsupported`}:{kind:n,leaseId:e}}const Ka={PUT:`put`,DELETE:`remove`};function qa(e){let t=Ja(e);return qt(G(t,`deviceKey`)),{tenantId:G(t,`tenantId`)??``,runId:G(t,`runId`)??``,clientId:G(t,`clientId`),leaseBackend:`macos-app`,leaseProvider:G(t,`leaseProvider`),deviceKey:G(t,`deviceKey`),ttlMs:Ya(t),retainOnClose:Xa(t)}}function Ja(e){if(typeof e!=`object`||!e||Array.isArray(e))throw new i(`INVALID_ARGS`,`Host lease request body must be a JSON object.`);let t=e,n=Object.keys(t).filter(e=>!za.has(e));if(n.length>0)throw new i(`INVALID_ARGS`,`Unknown host lease field(s): ${n.join(`, `)}.`);if(t.leaseBackend!==`macos-app`)throw new i(`INVALID_ARGS`,`The host lease route allocates only macos-app leases.`);return t}function Ya(e){if(e.ttlMs===void 0||Number.isInteger(e.ttlMs))return e.ttlMs;throw new i(`INVALID_ARGS`,`Host lease ttlMs must be an integer.`)}function Xa(e){if(e.retainOnClose===void 0)return!0;if(typeof e.retainOnClose==`boolean`)return e.retainOnClose;throw new i(`INVALID_ARGS`,`Host lease retainOnClose must be a boolean.`)}function G(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new i(`INVALID_ARGS`,`Host lease ${t} must be a string.`);return n}}const Za=new Set([`agent_device.command`,`agent-device.command`]),Qa=new Set([`agent_device.install_from_source`,`agent-device.install_from_source`]),$a=new Set([`agent_device.release_materialized_paths`,`agent-device.release_materialized_paths`]),eo={"agent_device.lease.allocate":`lease_allocate`,"agent-device.lease.allocate":`lease_allocate`,"agent_device.lease.heartbeat":`lease_heartbeat`,"agent-device.lease.heartbeat":`lease_heartbeat`,"agent_device.lease.release":`lease_release`,"agent-device.lease.release":`lease_release`};function to(e,t,n){if(n!==void 0&&n!==`public-only`)throw new i(`INVALID_ARGS`,`Invalid daemon HTTP network access marker`);if(!t&&n===void 0)return e;let r=e.meta?.installSource,a=e.meta?.uploadedArtifactId;if(r?.kind===`path`&&!(typeof a==`string`&&a.length>0))throw new i(`INVALID_ARGS`,`Invalid params: path install sources are disabled on the remote HTTP surface`);let{developerDir:o,providerCredentialFingerprint:s,...c}=e.meta??{};return{...e,...e.meta?{meta:c}:{},internal:{...e.internal,publicNetworkOnly:!0}}}const no=new Set([...Za,...Qa,...$a,...Object.keys(eo)]);function K(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,data:r}}}function q(e,t,n=200){e.statusCode=n,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function ro(e,t){e.destroyed||e.writableEnded||e.write(dt(t))}function io(e,t){e.destroyed||(e.write(ct(t)),e.end())}function ao(e){return e===`INVALID_ARGS`?-32602:-32e3}function J(e,t){let n=typeof t.authorization==`string`?t.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):void 0,i=typeof t[`x-agent-device-token`]==`string`?t[`x-agent-device-token`]:void 0;return(typeof e.token==`string`?e.token:void 0)??i??r??``}function oo(e,t){return{token:J(e,t),session:e.session??`default`,command:e.command??``,positionals:e.positionals??[],input:e.input,flags:e.flags,runtime:e.runtime,meta:e.meta}}function Y(e,t){let n=e[t];return typeof n==`string`?n:void 0}function so(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function co(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function lo(e,t){let n=typeof e[t]==`string`?e[t].trim():``;if(!n)throw new i(`INVALID_ARGS`,`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function uo(e,t){let n=e[t],r=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isInteger(r))throw new i(`INVALID_ARGS`,`Invalid params: source.${t} must be an integer`);return r}function fo(e){let t=lo(e,`owner`),n=lo(e,`repo`),r=e.artifactId!==void 0,a=e.runId!==void 0,o=e.artifactName!==void 0;if(r&&(a||o))throw new i(`INVALID_ARGS`,`Invalid params: source must specify either artifactId or artifactName, not both`);if(!r&&a&&!o)throw new i(`INVALID_ARGS`,`Invalid params: source.artifactName is required when source.runId is specified`);if(!r&&!o)throw new i(`INVALID_ARGS`,`Invalid params: source must specify artifactId or artifactName`);if(r)return{kind:`github-actions-artifact`,owner:t,repo:n,artifactId:uo(e,`artifactId`)};let s;return a&&(s=uo(e,`runId`)),{kind:`github-actions-artifact`,owner:t,repo:n,...a?{runId:s}:{},artifactName:lo(e,`artifactName`)}}function po(e,t,n){return{token:J(t,n),session:Y(t,`session`)??`default`,command:e,positionals:[],flags:e===`lease_allocate`?D(t):void 0,meta:{tenantId:Y(t,`tenantId`)??Y(t,`tenant`),runId:Y(t,`runId`),leaseId:Y(t,`leaseId`),leaseTtlMs:so(t,`ttlMs`),leaseRetainOnClose:co(t,`retainOnClose`),leaseBackend:Y(t,`backend`),leaseProvider:Y(t,`leaseProvider`)??Y(t,`provider`),deviceKey:Y(t,`deviceKey`),clientId:Y(t,`clientId`),providerCredentialFingerprint:e===`lease_allocate`?Y(t,`providerCredentialFingerprint`):void 0}}}function mo(e){let t=e.source;if(!t||typeof t!=`object`)throw new i(`INVALID_ARGS`,`Invalid params: source is required`);let n=t;if(n.kind===`url`){let e=typeof n.url==`string`?n.url.trim():``;if(!e)throw new i(`INVALID_ARGS`,`Invalid params: source.url is required for url sources`);let t=n.headers,r={};if(t!==void 0){if(!t||typeof t!=`object`||Array.isArray(t))throw new i(`INVALID_ARGS`,`Invalid params: source.headers must be a string map`);for(let[e,n]of Object.entries(t)){if(typeof n!=`string`)throw new i(`INVALID_ARGS`,`Invalid params: source.headers values must be strings`);r[e]=n}}return Object.keys(r).length>0?{kind:`url`,url:e,headers:r}:{kind:`url`,url:e}}if(n.kind===`path`)throw new i(`INVALID_ARGS`,`Invalid params: source.kind "path" names a file on the daemon host and is not accepted over HTTP`,{hint:`Use a "url" or "github-actions-artifact" source.`});if(n.kind===`github-actions-artifact`)return fo(n);throw new i(`INVALID_ARGS`,`Invalid params: source.kind must be "url" or "github-actions-artifact"`)}function ho(e,t){let n=Y(e,`platform`);if(n!==`ios`&&n!==`android`)throw new i(`INVALID_ARGS`,`Invalid params: platform must be "ios" or "android"`);return{token:J(e,t),session:Y(e,`session`)??`default`,command:`install_source`,positionals:[],flags:{platform:n},meta:{requestId:Y(e,`requestId`),installSource:mo(e),retainMaterializedPaths:co(e,`retainPaths`),materializedPathRetentionMs:so(e,`retentionMs`)}}}function go(e,t){let n=Y(e,`materializationId`)?.trim();if(!n)throw new i(`INVALID_ARGS`,`Invalid params: materializationId is required`);return{token:J(e,t),session:Y(e,`session`)??`default`,command:`release_materialized_paths`,positionals:[],meta:{requestId:Y(e,`requestId`),materializationId:n}}}function _o(e){let t=e.indexOf(`: `);if(t===-1||!e.startsWith(`$`))return e;let n=e.slice(0,t).replace(/^\$\.?/,``),r=e.slice(t+2);return n?`${n}: ${r}`:r}function vo(e){try{return s.parse(e)}catch(e){let t=e instanceof Error?_o(e.message):`invalid command params`;throw new i(`INVALID_ARGS`,`Invalid params: ${t}`)}}function yo(e,t,n){if(Za.has(e))return oo(vo(t),n);if(Qa.has(e))return ho(t,n);if($a.has(e))return go(t,n);let r=eo[e];if(r)return po(r,t,n);throw new i(`INVALID_ARGS`,`Method not found: ${e}`)}function bo(e){return Za.has(e)}async function xo(e,t){if(!e)return{ok:!0};let n=await e(t);if(n===void 0||n===!0)return{ok:!0};if(n===!1){let e=r(new i(`UNAUTHORIZED`,`Request rejected by auth hook`));return{ok:!1,statusCode:401,response:K(t.rpcRequest.id??null,-32001,e.message,e)}}if(n.ok===!1){let e=r(new i(u(n.code,`UNAUTHORIZED`),n.message??`Request rejected by auth hook`,n.details));return{ok:!1,statusCode:401,response:K(t.rpcRequest.id??null,-32001,e.message,e)}}if(typeof n.tenantId==`string`&&n.tenantId.length>0){let e=jt(n.tenantId);if(!e){let e=r(new i(`INVALID_ARGS`,`Auth hook returned invalid tenantId`));return{ok:!1,statusCode:500,response:K(t.rpcRequest.id??null,-32e3,e.message,e)}}return{ok:!0,tenantId:e}}return{ok:!0}}async function So(e=process.env){let t=e.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=e.AGENT_DEVICE_HTTP_AUTH_EXPORT||`default`,r=H.isAbsolute(t)?t:H.resolve(t),a;try{a=await import(ri(r).href)}catch(e){throw new i(`COMMAND_FAILED`,`Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module`,{hookPath:r,error:e instanceof Error?e.message:String(e)})}let o=a[n];if(typeof o!=`function`)throw new i(`INVALID_ARGS`,`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return o}async function Co(e){let t=$r(),n=await Je(),i=f.filter(e=>e!==`macos-app`||process.platform===`darwin`),a=await So(e.env??process.env),{handleRequest:o,token:s,retainArtifacts:c=!1,resolveRequestDiagnosticsPath:l}=e;return ii.createServer((u,d)=>{if(u.method===`GET`&&u.url===`/health`){d.statusCode=200,d.setHeader(`content-type`,`application/json`),d.end(JSON.stringify($e(`agent-device-daemon`,vt(),{instanceId:t,hostArch:n,leaseBackends:i})));return}if(s&&e.leaseRegistry&&Ba({req:u,res:d,expectedToken:s,registry:e.leaseRegistry})||qi({req:u,res:d,token:J({},u.headers),authorize:async e=>await To({req:e.req,res:e.res,authHook:a,expectedToken:s,daemonRequest:e.daemonRequest})})||fa({req:u,res:d,retainArtifacts:c,authorize:async e=>await To({req:e.req,res:e.res,authHook:a,expectedToken:s,daemonRequest:e.daemonRequest})})||l&&ba({req:u,res:d,resolveRecordPath:l,authorize:async t=>await Eo({...t,authHook:a,expectedToken:s,leaseRegistry:e.leaseRegistry})}))return;if(u.method!==`POST`||u.url!==`/rpc`){d.statusCode=404,d.end(`Not found`);return}let f=``;u.setEncoding(`utf8`),u.on(`data`,e=>{f+=e,f.length>1048576&&u.destroy(Error(`request too large`))}),u.on(`error`,()=>{d.headersSent||q(d,K(null,-32700,`Parse error`),400)}),u.on(`end`,async()=>{let e;try{e=JSON.parse(f)}catch{q(d,K(null,-32700,`Parse error`),400);return}if(e.jsonrpc!==`2.0`||typeof e.method!=`string`){q(d,K(e.id??null,-32600,`Invalid Request`),400);return}if(!no.has(e.method)){q(d,K(e.id??null,-32601,`Method not found: ${e.method}`),404);return}if(!e.params||typeof e.params!=`object`){q(d,K(e.id??null,-32602,`Invalid params`),400);return}let n,i,c=!1;try{let r=e.params,l=yo(e.method,r,u.headers);if(bo(e.method)&&(typeof l.command!=`string`||l.command.length===0)){q(d,K(e.id??null,-32602,`Invalid params: command is required`),400);return}n=It(l.meta?.requestId,e.id),l.meta={...l.meta,requestId:n},i=Ft(n);let f=l.meta?.tenantId??l.flags?.tenant,p=await xo(a,{headers:u.headers,rpcRequest:e,daemonRequest:l});if(!p.ok){q(d,p.response,p.statusCode);return}let m=wa({hookConfigured:a!==null,hookAttestedTenant:p.tenantId,clientDeclaredTenant:f});if(!m.trusted){let t=Ta();q(d,K(e.id??null,-32001,t.message,t),401);return}let h=ko(l.token,s);if(h){q(d,K(e.id??null,-32e3,h.message,h),401);return}if(Ea(u,d,e.id??null,t))return;l.meta={...l.meta,tenantId:m.tenantId,sessionIsolation:m.attested?`tenant`:l.meta?.sessionIsolation},l.flags?.tenant!==void 0&&(l.flags={...l.flags,tenant:m.tenantId}),m.attested&&l.flags?.sessionIsolation!==void 0&&(l.flags={...l.flags,sessionIsolation:`tenant`}),l=to(l,a!==null,u.headers[et]);let g=!1,_=()=>{c||d.writableFinished||g||(g=!0,Mt(n),b({level:`warn`,phase:`request_client_disconnected`,data:{requestId:n}}))};if(u.on(`aborted`,_),d.on(`close`,_),(u.aborted||d.destroyed)&&_(),ut(l)){d.statusCode=200,d.setHeader(`content-type`,`application/x-ndjson`);let t=await Rt(e=>ro(d,e),async()=>await o(l));c=!0,io(d,t.ok?{jsonrpc:`2.0`,id:e.id??null,result:t}:K(e.id??null,-32e3,t.error.message,t.error));return}let v=await o(l);if(c=!0,v.ok){q(d,{jsonrpc:`2.0`,id:e.id??null,result:v});return}q(d,K(e.id??null,-32e3,v.error.message,v.error),wo(v.error))}catch(t){c=!0;let n=r(t),i=ao(n.code);if(d.headersSent){io(d,K(e.id??null,i,n.message,n));return}q(d,K(e.id??null,i,n.message,n),si(n.code))}finally{Lt(i)}})})}function wo(e){return e.code===`DEVICE_IN_USE`&&e.details?.reason===`human_control_active`?423:si(e.code)}async function To(e){let{req:t,res:n,authHook:r,expectedToken:i,daemonRequest:a}=e,o=J({},t.headers),s=jt(Oo(t.headers,nt)),c=ko(o,i);if(c)return U(n,c),null;let l=await xo(r,{headers:t.headers,rpcRequest:{jsonrpc:`2.0`,id:null,method:`agent_device.command`},daemonRequest:{token:o,session:`default`,command:a.command,positionals:a.positionals,...s?{meta:{tenantId:s}}:{}}});if(!l.ok)return Do(n,l),null;let u=wa({hookConfigured:r!==null,hookAttestedTenant:l.tenantId,clientDeclaredTenant:s});if(!u.trusted)return U(n,Ta()),null;let d=u.tenantId;return{tenantId:d,...d?{sessionNamespace:{tenant:d,partitioned:u.attested}}:{}}}async function Eo(e){let{leaseRegistry:t,...n}=e,i=await To(n);if(!i||!t)return i;try{Yt(t,i.tenantId)}catch(e){return U(n.res,r(e)),null}return i}function Do(e,t){e.statusCode=t.statusCode,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.response.error?.data?.message??t.response.error?.message??`Unauthorized`}))}function Oo(e,t){let n=e[t];return typeof n==`string`?n:void 0}function ko(e,t){return!t||at(e,t)?null:r(new i(`UNAUTHORIZED`,`Invalid token`))}function Ao(){return Object.freeze({toolchainCheck:async(e,t)=>{if(e===`android`){let{androidToolchainCheck:e}=await St();return await e(process.env,process.platform)}if(e===`vega`){let{vegaToolchainCheck:e}=await import(`../src3.js`).then(e=>e.r);return await e(t)}if(e===`harmonyos`){let{harmonyToolchainCheck:e}=await import(`../src4.js`).then(e=>e.b);return await e()}if(e===`ios`||e===`macos`||e===`apple`){let{appleToolchainCheck:e}=await import(`../doctor-facade.js`);return await e()}},deviceChecks:async(e,t)=>{if(e.platform!==`android`)return[];let{androidDeviceChecks:n}=await St();return await n(e,t)},ambientChecks:async e=>{let{webBrowserLifecycleCheck:t}=await import(`../src6.js`).then(e=>e.i);return[await t(e.stateDir)]},warmupCheck:async(e,t)=>{if(e.platform!==`apple`)return;let{appleRunnerWarmupCheck:n}=await import(`../doctor-facade.js`);return await n(e,t)}})}const jo=[`leaseId`,`tenantId`,`runId`,`backend`,`leaseProvider`],Mo=[`createdAt`,`heartbeatAt`,`expiresAt`];function No(e){let t=new Map,n=Bo(e.stateDir),r=new Set(n.keys()),i=e.retryDelayMs??1e3,a,o=new Map,s=!1,c=new Map,l=e=>{s&&c.set(e.leaseId,e)},u=()=>{if(!e.stateDir)return zo(n.size,Error(`daemon state directory is unavailable`)),!1;let t=Ho(e.stateDir);try{if(n.size===0)V.rmSync(t,{force:!0});else{V.mkdirSync(e.stateDir,{recursive:!0,mode:448});let r={version:1,leases:[...n.values()]};Ke({destination:t,contents:`${JSON.stringify(r)}\n`,mode:384}),V.chmodSync(t,384)}r.clear();for(let e of n.keys())r.add(e);return!0}catch(e){return zo(n.size,e),!1}},d=()=>{a||!Fo(t,e.providerRuntimeIds)&&!Io(n,e.recoverableProviderIds)||(a=setTimeout(()=>{a=void 0,h()},i),a.unref?.(),b({level:`warn`,phase:`provider_lease_expiry_retry_scheduled`,data:{pendingLiveLeaseCount:t.size,pendingRecoveryLeaseCount:n.size,retryDelayMs:i}}))},f=(e,r)=>{o.set(e,r);let i=()=>{o.get(e)===r&&o.delete(e),t.size===0&&n.size===0&&a?(clearTimeout(a),a=void 0):d()};return r.then(i,i),r},p=n=>{if(!Lo(n,e.providerRuntimeIds))return;let r=`live:${n.leaseId}`,i=o.get(r);if(i)return i;let a=(async()=>{await Po(e.leaseLifecycleProvider,n)&&(t.delete(n.leaseId),l(n))})();return f(r,a)},m=t=>{if(!Ro(t,e.recoverableProviderIds)||!r.has(t.leaseId)&&!u())return;let i=`recovery:${t.leaseId}`,a=o.get(i);if(a)return a;let s=(async()=>{await mn(e.recoverExpiredLease,t)&&(n.delete(t.leaseId),l(t),u())})();return f(i,s)},h=async()=>{let e=[...[...t.values()].map(p),...[...n.values()].map(m)].filter(e=>e!==void 0);if(e.length===0){d();return}await Promise.all(e)};return{beginShutdown:()=>{c.clear(),s=!0},release:async r=>{if(r.leaseProvider){if(Ro(r,e.recoverableProviderIds)){n.set(r.leaseId,r),u()?await m(r):d();return}Lo(r,e.providerRuntimeIds)&&e.leaseLifecycleProvider?.release&&(t.set(r.leaseId,r),await p(r),t.has(r.leaseId)&&d())}},retryPending:h,drain:async e=>{await Promise.race([h(),Ze(Math.max(0,e))]);let r={pending:[...t.values(),...n.values()],released:[...c.values()]};return s=!1,c.clear(),r},shutdown:()=>{a&&clearTimeout(a),a=void 0}}}async function Po(e,t){return await mn(e?.release?async t=>{await e.release?.(t)}:void 0,t)}function Fo(e,t){return[...e.values()].some(e=>Lo(e,t))}function Io(e,t){return[...e.values()].some(e=>Ro(e,t))}function Lo(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function Ro(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function zo(e,t){b({level:`error`,phase:`provider_lease_expiry_record_write_failed`,data:{pendingLeaseCount:e,error:t instanceof Error?t.message:String(t)}})}function Bo(e){if(!e)return new Map;let t=Ho(e);try{let e=JSON.parse(V.readFileSync(t,`utf8`));if(e.version!==1||!Array.isArray(e.leases))throw Error(`unsupported expiry release record`);return new Map(e.leases.filter(Vo).map(e=>[e.leaseId,e]))}catch(e){return e.code===`ENOENT`||b({level:`warn`,phase:`provider_lease_expiry_record_read_failed`,data:{error:e instanceof Error?e.message:String(e)}}),new Map}}function Vo(e){if(!e||typeof e!=`object`)return!1;let t=e;return jo.every(e=>typeof t[e]==`string`)&&Mo.every(e=>typeof t[e]==`number`)}function Ho(e){return H.join(e,`expired-provider-leases.json`)}function Uo(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.nodes)?e.nodes:[],r=n.filter(e=>e.hittable===!0&&e.interactionBlocked!==`covered`).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier})),i=Object.fromEntries([`visibility`,`viewport`,`snapshotQuality`,`targetActivation`,`warnings`,`fallbackScreenshotPath`,`artifacts`,`refsGeneration`].filter(t=>e[t]!==void 0).map(t=>[t,e[t]]));return{nodeCount:n.length,refs:r,truncated:e.truncated,...i}}const Wo=[`width`,`height`,`logicalWidth`,`logicalHeight`,`pixelDensity`];function Go(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.overlayRefs)?e.overlayRefs:[],r=n.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{...Ko(e),overlayCount:n.length,overlayRefs:r,...e.warnings===void 0?{}:{warnings:e.warnings},...e.artifacts===void 0?{}:{artifacts:e.artifacts}}}function Ko(e){let t={};typeof e.path==`string`&&(t.path=e.path),Ve(e.displayRotation)&&(t.displayRotation=e.displayRotation);for(let n of Wo)typeof e[n]==`number`&&(t[n]=e[n]);return t}const qo=[`role`,`type`,`subrole`,`label`,`value`,`contentDescription`,`identifier`,`enabled`,`selected`,`checked`,`focused`,`heading`,`roleDescription`,`editable`,`password`,`hintShowing`,`placeholder`,`selectionStart`,`selectionEnd`,`hittable`];function Jo(e){let t={ref:e.ref};for(let n of qo){let r=e[n];r!==void 0&&(t[n]=r)}return t}function Yo(e,t){if(t!==`digest`)return e;let n=e.node;if(!n||typeof n!=`object`)return e;if(typeof e.text==`string`){let{node:t,...n}=e;return n}return{...e,node:Jo(n)}}function Xo(e,t){return t===`digest`?Qo(Zo(e)):e}function Zo(e){let t=e.resolution;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=t;if(n.kind!==`disambiguated`)return e;let{alternatives:r,...i}=n;return{...e,resolution:i}}function Qo(e){let t=e.settle;if(!t||typeof t!=`object`||Array.isArray(t))return e;let{diff:n,tail:r,...i}=t;if(!n||typeof n!=`object`||Array.isArray(n))return e;let a=n,o=a.summary,s=es(a.lines);return{...e,settle:{...i,...s.length>0?{refs:s}:{},...$o(r),diff:{summary:o}}}}function $o(e){return!Array.isArray(e)||e.length===0?{}:{tail:e.slice(0,12)}}function es(e){return Array.isArray(e)?e.flatMap(ts).slice(0,12):[]}function ts(e){let t=rs(e);return t?.kind===`added`?ns(t.ref):[]}function ns(e){return typeof e==`string`&&e.length>0?[{ref:e}]:[]}function rs(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const is=[`headers`,`requestHeaders`,`responseHeaders`,`requestBody`,`responseBody`,`raw`];function as(e,t){if(t!==`digest`)return e;let n=e.entries;return Array.isArray(n)?{...e,entries:n.map(os)}:e}function os(e){let t=rs(e);if(!t)return e;let n={};for(let[e,r]of Object.entries(t))is.includes(e)||(n[e]=r);return n}const ss={snapshot:Uo,screenshot:Go,find:Yo,get:Yo,press:Xo,click:Xo,fill:Xo,longpress:Xo,hover:Xo,network:as};async function cs(e){let t=await ls(e.req,e.existingSession);if(t)return{device:t,...e.req.session===void 0?{}:{requestedSession:e.req.session},...e.req.meta?.requestId===void 0?{}:{requestId:e.req.meta.requestId},...e.existingSession?{session:{name:e.existingSession.name,device:e.existingSession.device,...e.existingSession.appBundleId?{appBundleId:e.existingSession.appBundleId}:{},...e.existingSession.appName?{appName:e.existingSession.appName}:{},...e.existingSession.surface?{surface:e.existingSession.surface}:{}}}:{},...e.useDefaultWebProvider?{useDefaultWebProvider:!0}:{}}}async function ls(e,t){switch(zn(e,{hasExistingSession:!!t,hasExplicitDeviceIdentity:vn(e.flags),hasDeviceSelectionInput:dn(e.flags)})){case`existing-session`:return t?.device;case`explicit-device`:case`sessionless-default-device`:try{return await us(e)}catch{return}case`skip`:return}}async function us(e){let t=e.command===`open`?Tn(e.positionals?.[0]):void 0;return await Ce(e.flags??{},t)}const ds=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,fs=/^close app$/i,ps=`Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.`;function ms(e){if(!e)throw new i(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);return e}async function hs(e){let{session:t}=e;if(t.device.platform!==`android`||!t.screenRecording||js(t))return{status:`absent`};let n=ms(e.observation),i;try{i=await ws(t,n)}catch(e){let n=r(e);return b({level:`warn`,phase:`android_blocking_dialog_inspection_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`unknown`,reason:`inspection-failed`,warning:Ss(n)}}let a=Es(i);if(!a?.rect)return{status:`absent`};try{let e=await Ts(t,a,n);return e.ok?await Os(t,n)?t.appBundleId&&(await n.openApp(t.device,t.appBundleId),!await ks(t,t.appBundleId,n))?(b({level:`warn`,phase:`android_blocking_dialog_relaunch_unfocused`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),{status:`failed`,reason:`relaunch-failed`}):(b({level:`warn`,phase:`android_blocking_dialog_recovered`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:e.x,y:e.y}}),{status:`recovered`}):(b({level:`warn`,phase:`android_blocking_dialog_still_present`,data:{session:t.name,deviceId:t.device.id}}),{status:`failed`,reason:`dismiss-failed`}):(b({level:`warn`,phase:`android_blocking_dialog_tap_failed`,data:{session:t.name,deviceId:t.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:`failed`,reason:`tap-failed`})}catch(e){return b({level:`warn`,phase:`android_blocking_dialog_recovery_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`failed`,reason:`error`}}}async function gs(e){let{session:t,command:n}=e;if(t.device.platform!==`android`||js(t))return{status:`clear`};let r=ms(e.observation),i=await r.readBlockingDialog(t.device);if(i.status!==`dialog`)return i.status===`unknown`&&b({level:`warn`,phase:`android_blocking_dialog_unobserved`,data:{session:t.name,deviceId:t.device.id,command:n,commandPhase:e.phase}}),{status:`clear`};let a=i.focus;if(vs(t,a)){if(await _s(t,r)){let r=`Recovered Android app ANR before ${n}: closed and relaunched ${t.appBundleId}.`;if(e.phase===`before-command`)return{status:`recovered`,warning:r};throw bs({session:t,command:n,focus:a,message:`Android app ANR appeared after ${n}; ${t.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:`Retry the command. If the ANR returns, inspect app logs or restart the emulator.`})}throw bs({session:t,command:n,focus:a,message:`Android app ANR blocked ${n}: ${xs(a)}. Automatic recovery failed.`,hint:ps})}throw bs({session:t,command:n,focus:a,message:`Android system dialog is blocking ${n}: ${xs(a)}.`,hint:ps})}async function _s(e,t){try{return await ys(e,t)}catch(t){return b({level:`warn`,phase:`android_app_anr_recovery_failed`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}function vs(e,t){return!!(e.appBundleId&&t.package===e.appBundleId)}async function ys(e,t){if(!e.appBundleId)return!1;let n=Es(await ws(e,t),{requireDialogSignal:!1});if(!n?.rect)return!1;let r=await Ts(e,n,t);if(!r.ok)return!1;await t.openApp(e.device,e.appBundleId);let i=await ks(e,e.appBundleId,t,{requireNoBlockingDialog:!0});return i&&b({level:`warn`,phase:`android_app_anr_recovered`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),i}function bs(e){let{session:t,command:n,focus:r,message:a,hint:o}=e;return new i(`COMMAND_FAILED`,a,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:o})}function xs(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}function Ss(e){let t=[`Inspection error: ${Cs(e.message)}`];return e.hint&&t.push(`Hint: ${Cs(e.hint)}`),[`Android blocking-dialog readiness could not be inspected; the command continued.`,...t].join(` `)}function Cs(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}async function ws(e,t){return await t.readSnapshotNodes(e.device)}async function Ts(e,t,n){if(!t.rect)return{ok:!1,exitCode:1,stdout:``,stderr:`button has no rect`};let{x:r,y:i}=c(t.rect);$n(e);let a=await n.tap(e.device,r,i);return a.exitCode===0?{ok:!0,x:r,y:i}:{ok:!1,exitCode:a.exitCode,stdout:a.stdout.trim(),stderr:a.stderr.trim()}}function Es(e,t={}){if(!(t.requireDialogSignal!==!1&&!Ps(e)))return e.filter(Ds).find(e=>Ns(e).some(e=>fs.test(e))&&e.rect)}function Ds(e){return!m(e)}async function Os(e,t){for(let n=0;n<12;n+=1){if(!Ps(await ws(e,t)))return!0;await Ze(500)}return!Ps(await ws(e,t))}async function ks(e,t,n,r={}){for(let i=0;i<12;i+=1){if(await As(e,t,n,r))return!0;await Ze(500)}return await As(e,t,n,r)}async function As(e,t,n,r){return await n.readAppFocus(e.device,t,r)}function js(e){return!!e.lease?.leaseProvider||De(e.device)}function Ms(e){return Ns(e).join(` `).trim()}function Ns(e){let t=[e.label,e.identifier];return typeof e.value==`string`&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim())}function Ps(e){return e.filter(Ds).some(e=>{let t=Ms(e);return t.length>0&&ds.test(t)})}function Fs(e){if(typeof e.gestureClockOriginAtMs==`number`&&typeof e.gestureClockOriginUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`){let t=e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs);return Math.max(0,t-e.recordingStartedAt)}if(typeof e.runnerStartedAtUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`)return Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs);if(typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`){let t=e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs);return Math.max(0,t-e.recordingStartedAt)}return Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}function Is(e){return typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`?Math.max(0,e.gestureEndUptimeMs-e.gestureStartUptimeMs):typeof e.reportedDurationMs==`number`?Math.max(0,e.reportedDurationMs):Math.max(0,e.fallbackFinishedAtMs-e.fallbackStartedAtMs)}function Ls(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return Fs(e);let n=Math.min(Math.max(t*.15,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}function X(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e!=`string`||e.trim().length===0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function Rs(e,t,n){for(let r of[e,...t,n]){let e=X(r);if(e!==void 0&&e>=1)return Math.floor(e)}return n}function zs(e,t,n,r,i){switch(t.kind){case`pan`:case`fling`:case`rotate`:case`transform`:{let e=Us(t.from),a=Us(t.to);if(!e||!a)return[];let o=(t.kind===`pan`||t.kind===`fling`)&&X(t.pointerCount)!==2;return[Bs(n,e.x,e.y,a.x,a.y,Rs(r,[t.durationMs],250),{referenceFrame:i,classifyBackSwipe:o})]}case`pinch`:{let a=Us(t.from),o=X(t.scale)??X(e[1]);return!a||o===void 0||o<=0?[]:[{kind:`pinch`,tMs:n,x:a.x,y:a.y,...i,scale:o,durationMs:Rs(r,[t.durationMs],280)}]}default:return[]}}function Bs(e,t,n,r,i,a,o={}){let{referenceFrame:s,classifyBackSwipe:c=!0}=o,l=c?Vs(t,n,r,i,s):`swipe`;return l===`back-swipe`?{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a,edge:Hs(t,r,s)}:{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a}}function Vs(e,t,n,r,i){if(!i||Math.abs(n-e)<=Math.abs(r-t)*1.25)return`swipe`;let a=i.referenceWidth*.08;return e<=a&&n>e||e>=i.referenceWidth-a&&n<e?`back-swipe`:`swipe`}function Hs(e,t,n){if(n){let t=n.referenceWidth*.08;if(e<=t)return`left`;if(e>=n.referenceWidth-t)return`right`}return t>=e?`left`:`right`}function Us(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=X(t.x),r=X(t.y);if(n!==void 0&&r!==void 0)return{x:n,y:r}}const Ws={referenceWidth:1e3,referenceHeight:1e3};function Gs(e,t,n,r,i={},a=Date.now(),o=Date.now()){let s=e.screenRecording?.handle;if(!s)return;let c=s.inspect(),l={...i,...r??{}},u=X(l.effectiveDurationMs)??X(l.durationMs),d={recordingStartedAt:c.startedAt,gestureClockOriginAtMs:c.gestureClockOriginAtMs,gestureClockOriginUptimeMs:c.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:c.runnerStartedAtUptimeMs,gestureStartUptimeMs:X(l.gestureStartUptimeMs),gestureEndUptimeMs:X(l.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},f=Is({gestureStartUptimeMs:X(l.gestureStartUptimeMs),gestureEndUptimeMs:X(l.gestureEndUptimeMs),reportedDurationMs:u,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}),p=T(e.device)&&X(l.gestureStartUptimeMs)===void 0&&Xs(t,l)?Ls({...d,gestureDurationMs:f}):Fs(d),m=Js(t,n,l,p,f,ac(e.snapshot,l));m.length!==0&&(s.appendGestureEvents(m),b({level:`debug`,phase:`record_touch_visualization_event`,data:{session:e.name,command:t,count:m.length,tMs:p,gestureDurationMs:f,kinds:m.map(e=>e.kind)}}))}function Ks(e,t,n,r){if(t!==`scroll`)return r;let i=Or(e.snapshot),a={...r??{}},o=oc(a.direction)??oc(n[0]);if(!o)return r;let s=X(a.amount)??X(n[1]),c=X(a.pixels),l=X(a.durationMs)??qs(e),u=cc(a,[]),d=X(a.referenceWidth),f=X(a.referenceHeight),p=d!==void 0&&d>0&&f!==void 0&&f>0?{referenceWidth:d,referenceHeight:f}:i??Ws;if(u&&(u.x1!==u.x2||u.y1!==u.y2))return{...a,x1:u.x1,y1:u.y1,x2:u.x2,y2:u.y2,contentDirection:o,...s===void 0?{}:{amount:s},...c===void 0?{}:{pixels:c},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l};let m=he({direction:o,amount:s,pixels:c,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:m.x1,y1:m.y1,x2:m.x2,y2:m.y2,contentDirection:o,...s===void 0?{}:{amount:s},...m.pixels===void 0?{}:{pixels:m.pixels},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l}}function qs(e){return e.device.target===`desktop`||e.device.target===`tv`?250:300}function Js(e,t,n,r,i,a){let o=Ys[e];return o?.(t,n,r,i,a)??[]}const Ys={click:(e,t,n,r,i)=>Zs(e,t,n,i),press:(e,t,n,r,i)=>Zs(e,t,n,i),"react-native":(e,t,n,r,i)=>e[0]===`dismiss-overlay`?Zs(e,t,n,i):[],fill:(e,t,n,r,i)=>Qs(e,t,n,i),focus:(e,t,n,r,i)=>Qs(e,t,n,i),longpress:$s,scroll:nc,gesture:zs,swipe:ec};function Xs(e,t){switch(e){case`click`:case`fill`:case`focus`:return!0;case`press`:{let e=Z(X(t.count),1)??1,n=t.doubleTap===!0,r=Z(X(t.holdMs),1);return e===1&&!n&&r===void 0}case`react-native`:return t.action===`dismiss-overlay`;default:return!1}}function Zs(e,t,n,r){let i=sc(t,e);if(!i)return[];let{x:a,y:o}=i,s=Z(X(t.count),1)??1,c=Z(X(t.intervalMs),0)??0,l=t.doubleTap===!0,u=Z(X(t.holdMs),1),d=[];for(let e=0;e<s;e+=1){let t=n+e*c;if(u!==void 0&&u>0){d.push(ic(t,a,o,u,r));continue}d.push(rc(t,a,o,r)),l&&d.push(rc(t+90,a,o,r))}return d}function Qs(e,t,n,r){let i=sc(t,e);if(!i)return[];let{x:a,y:o}=i;return[rc(n,a,o,r)]}function $s(e,t,n,r,i){let a=sc(t,e);if(!a)return[];let{x:o,y:s}=a;return[ic(n,o,s,Rs(r,[X(t.durationMs),X(e[2])],800),i)]}function ec(e,t,n,r,i){let a=cc(t,e);if(!a)return[];let{x1:o,y1:s,x2:c,y2:l}=a,u=Rs(r,[X(t.effectiveDurationMs),X(t.durationMs)],250),d=Z(X(t.count),1)??1,f=Z(X(t.pauseMs),0)??0,p=t.pattern===`ping-pong`?`ping-pong`:`one-way`;return Array.from({length:d},(e,t)=>{let{startX:r,startY:a,endX:d,endY:m}=tc(t,p,o,s,c,l);return Bs(n+t*(u+f),r,a,d,m,u,{referenceFrame:i})})}function tc(e,t,n,r,i,a){return t===`ping-pong`&&e%2==1?{startX:i,startY:a,endX:n,endY:r}:{startX:n,startY:r,endX:i,endY:a}}function nc(e,t,n,r,i){let a=cc(t,e),o=oc(t.contentDirection)??oc(t.direction);if(!a||!o)return[];let{x1:s,y1:c,x2:l,y2:u}=a,d=Rs(r,[],250),f=X(t.amount)??X(e[1]),p=X(t.pixels);return[{kind:`scroll`,tMs:n,x:s,y:c,x2:l,y2:u,...i,durationMs:d,contentDirection:o,...f===void 0?{}:{amount:f},...p===void 0?{}:{pixels:p}}]}function rc(e,t,n,r){return{kind:`tap`,tMs:e,x:t,y:n,...r}}function ic(e,t,n,r,i){return{kind:`longpress`,tMs:e,x:t,y:n,...i,durationMs:r}}function ac(e,t){let n=X(t.referenceWidth),r=X(t.referenceHeight);return n!==void 0&&n>0&&r!==void 0&&r>0?{referenceWidth:n,referenceHeight:r}:Or(e)}function oc(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();switch(t){case`up`:case`down`:case`left`:case`right`:return t;default:return}}function Z(e,t){if(e===void 0)return;let n=Math.floor(e);return n>=t?n:void 0}function sc(e,t,n=0){let r=X(e.x)??X(t[n]),i=X(e.y)??X(t[n+1]);if(r!==void 0&&i!==void 0)return{x:r,y:i}}function cc(e,t){let n=lc(e.x1,e.x,t[0]),r=lc(e.y1,e.y,t[1]),i=lc(e.x2,t[2]),a=lc(e.y2,t[3]);if(n!==void 0&&r!==void 0&&i!==void 0&&a!==void 0)return{x1:n,y1:r,x2:i,y2:a}}function lc(...e){return e.map(X).find(e=>e!==void 0)}var uc=e({dispatchGenericCommand:()=>dc});async function dc(e){let{req:t,ref:n,logPath:r,sessionStore:i,contextFromFlags:a}=e,o=i.requireCurrent(n),s=t.command,c=await _c(o,s,e.androidObservation);if(c.response)return c.response;let l=await mc({sessionRef:n,req:t,session:o,sessionName:e.sessionName,logPath:r,sessionStore:i,contextFromFlags:a,command:s,flags:t.flags});if(`response`in l)return l.response;let u=await gc(o,s,e.androidObservation);if(`response`in u)return u.response;let d=t.positionals??[],f=e.recordedRequest??{positionals:d,flags:t.flags??{}},p=Date.now(),m=i.requireCurrent(n),h={...a(t.flags,m.appBundleId,m.trace?.outPath),surface:m.surface};return Rn(t)===`may-invalidate`&&$n(m),await fc({req:t,ref:n,sessionStore:i,command:s,resolvedPositionals:d,recorded:f,data:await e.executePlatformCommand({session:m,sessionName:e.sessionName,logPath:r,command:s,request:t,positionals:d,out:t.flags?.out,dispatchContext:h}),actionStartedAt:p,readinessWarnings:[c.warning,u.status===`recovered`?u.warning:void 0],observeSettle:l.observe,androidObservation:e.androidObservation})}async function fc(e){let{req:t,ref:n,sessionStore:r,command:i}=e,a=await gc(r.requireCurrent(n),i,e.androidObservation,`after-command`);if(`response`in a)return a.response;let o=pc(e.data,e.readinessWarnings);if(vc({ref:n,sessionStore:r,command:i,resolvedPositionals:e.resolvedPositionals,recorded:e.recorded,data:o,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),flags:t.flags??{},clientArtifactPaths:t.meta?.clientArtifactPaths}),fr({session:r.requireCurrent(n),command:i,positionals:e.resolvedPositionals,flags:t.flags}),e.observeSettle){let t=await e.observeSettle();t&&(o={...o??{},settle:t})}return{ok:!0,data:o??{}}}function pc(e,t){let n=t.filter(e=>typeof e==`string`&&e.length>0);if(n.length===0||e&&typeof e!=`object`)return e;let r=e&&typeof e.warning==`string`&&e.warning.length>0?[e.warning]:[];return{...e??{},warning:[...r,...n].join(` `)}}async function mc(e){return!le(e.command)||!hc(e.flags)?{}:(await import(`../generic-settle.js`)).planGenericSettleObservation(e)}function hc(e){return e?.settle===!0||e?.settleQuietMs!==void 0}async function gc(e,t,n,i=`before-command`){if(e.device.platform!==`android`||!Jn(t)||De(e.device))return{status:`clear`};try{return await gs({session:e,command:t,phase:i,observation:n})}catch(e){return{response:{ok:!1,error:r(e)}}}}async function _c(e,t,n){if(e.device.platform!==`android`||De(e.device)||!e.screenRecording||t===`record`)return{};let r=await hs({session:e,observation:n});return r.status===`failed`?{response:{ok:!1,error:{code:`COMMAND_FAILED`,message:`Android system dialog blocked the recording session`}}}:r.status===`unknown`?{warning:r.warning}:{}}function vc(e){let{ref:t,sessionStore:n,command:r,resolvedPositionals:i,recorded:a,data:o,actionStartedAt:s,actionFinishedAt:c,flags:l,clientArtifactPaths:u}=e,d=n.requireCurrent(t);Gs(d,r,i,Ks(d,r,i,o),l,s,c),n.recordAction(t,{command:r,positionals:a.positionals,flags:a.flags,result:we({command:r,meta:{clientArtifactPaths:u}},o??{})})}const yc={humanControl:Q({load:()=>import(`../human-control.js`),run:Sc}),lease:Q({load:()=>import(`../lease.js`),run:Cc}),session:Q({load:()=>import(`../session2.js`),run:wc}),snapshot:Q({load:()=>import(`../snapshot4.js`),run:Tc}),reactNative:Q({load:()=>import(`../react-native.js`),run:Ec}),recordTrace:Q({load:()=>import(`../record-trace.js`),run:Dc}),find:Q({load:()=>import(`../interaction.js`),run:Oc}),interaction:Q({load:()=>import(`../interaction.js`),run:kc}),generic:Q({load:async()=>uc,run:async()=>null})};async function bc(e){let t=In(e.req.command);return await yc[t].run(e)}async function xc(){return await yc.generic.loadModule()}async function Sc({handleHumanControlCommand:e},t){return await e({req:t.req,registry:t.leaseRegistry})}async function Cc({handleLeaseCommands:e},t){return $(t.req.command,`lease`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,providerRuntimeIds:t.providerRuntimeIds,providerRuntimeRequiredIds:t.providerRuntimeRequiredIds,providerCredentials:t.providerCredentials,leaseLifecycleProvider:t.leaseLifecycleProvider,cloudArtifactProvider:t.cloudArtifactProvider}))}async function wc({handleSessionCommands:e},t){return $(t.req.command,`session`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,leaseLifecycleProvider:t.leaseLifecycleProvider,providerAppCatalog:t.providerAppCatalog,invoke:t.invoke,invokeReplayAction:t.invokeReplayAction,androidAdbExecutor:t.providerScope.androidAdbExecutor,bindDevice:t.bindDevice,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:t.reconcileOrphanedDeviceClaim,appLogAdmissionLedger:t.appLogAdmissionLedger,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,perfCaptureAdmissionLedger:t.perfCaptureAdmissionLedger,screenRecordingAdmissionLedger:t.screenRecordingAdmissionLedger,hostDiagnostics:t.hostDiagnostics,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,platformResourceCleanup:t.platformResourceCleanup}))}async function Tc({handleSnapshotCommands:e},t){return $(t.req.command,`snapshot`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup}))}async function Ec({handleReactNativeCommands:e},t){return $(t.req.command,`react-native`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice}))}async function Dc({handleRecordTraceCommands:e},t){return $(t.req.command,`record-trace`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,bindDevice:t.bindDevice,bindExactDevice:t.bindExactDevice,admissionLedger:t.screenRecordingAdmissionLedger,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled}))}async function Oc({handleFindCommands:e},t){return $(t.req.command,`find`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,invoke:t.invoke,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice}))}async function kc({handleInteractionCommands:e},t){return $(t.req.command,`interaction`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice,androidObservation:t.androidObservation}))}function Q(e){let t=Ac(e.load);return{loadModule:t,run:async n=>await e.run(await t(),n)}}function Ac(e){let t;return()=>(t??=e(),t)}function $(e,t,n){if(n)return n;throw new i(`UNKNOWN`,`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`,{hint:`This is a daemon-internal routing bug in agent-device — please report it.`})}const jc=new Set([`udid`,`serial`,`device`]);function Mc(e){return jc.has(e.key)}function Nc(e,t){let n=e.meta?.lockPolicy;if(!n)return e;let r={...e.flags??{}},a=Un(e.command),o=a?[]:t?Nr(t.session,r):zc(r,e.meta?.lockPlatform),s=e.meta?.lockPlatform;if(o.length===0)return Lc(a,t,r,s)&&(r.platform=s),{...e,flags:r};let c=o.filter(Mc);if(n===`strip`&&c.length===0)return Rc(r,o,s,t?.session),{...e,flags:r};throw new i(`INVALID_ARGS`,Fc(e,o,t),{session:t?.address??e.session,conflicts:o.map(jr),...Pc(c,t?.session),hint:Ic(e,t,c)})}function Pc(e,t){return e.length===0?{}:{requestedDevice:Object.fromEntries(e.map(e=>[e.key,e.value])),...t?{boundDevice:{platform:t.device.platform,name:t.device.name,id:t.device.id}}:{}}}function Fc(e,t,n){let r=t.map(jr).join(`, `);if(n)return`Session "${n.address}" is already bound to ${Pr(n.session)}, but ${e.command} selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:``;return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}function Ic(e,t,n){if(t)return Mr(t,`selector-conflict`);let r=e.meta?.lockPlatform,i=e.session?` --session ${Et(e.session)}`:``,a=r?`Run agent-device open <app>${i} --platform ${r} first if no session is active. `:`Run agent-device open <app>${i} first if no session is active. `;return n.length>0?`Remove ${n.map(jr).join(`, `)} and rerun to use the session-lock device, or drop --session so this command binds to the device you selected. `+a+`Run agent-device session list to inspect active sessions.`:`Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. `+a+`Run agent-device session list to inspect active sessions.`}function Lc(e,t,n,r){return!r||t||n.platform!==void 0?!1:!e||!Dn(n)}function Rc(e,t,n,r){if(r){Kc(e,t),e.platform=E(r.device);return}Kc(e,t),n&&e.platform===void 0&&(e.platform=n)}function zc(e,t){let n=[],r=t;return e.platform!==void 0&&r&&C(e.platform,r)&&n.push({key:`platform`,value:e.platform}),r?(Bc(n,e,r),Hc(n,e,r),n):n}function Bc(e,t,n){let r=t.target;r&&Vc(r,n)&&e.push({key:`target`,value:r})}function Vc(e,t){switch(t){case`android`:case`harmonyos`:case`ios`:return e===`desktop`;case`vega`:return e!==`tv`;case`macos`:case`linux`:case`web`:return e!==`desktop`;case`apple`:return!1;default:return qc(t)}}function Hc(e,t,n){for(let r of Uc(n,t)){let n=t[r];fn(n)&&e.push({key:r,value:n})}}function Uc(e,t){if(Wc(e))return[`udid`,`iosSimulatorDeviceSet`];switch(e){case`vega`:return[`udid`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];case`ios`:return[`serial`,`androidDeviceAllowlist`];case`apple`:return Gc(t)?[`udid`,`serial`,`androidDeviceAllowlist`,`iosSimulatorDeviceSet`]:[`serial`,`androidDeviceAllowlist`];case`macos`:case`linux`:case`web`:return[`udid`,`serial`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];default:return qc(e)}}function Wc(e){return e===`android`||e===`harmonyos`}function Gc(e){return e.target===`desktop`||e.platform===`macos`}function Kc(e,t){for(let n of t)delete e[n.key]}function qc(e){throw Error(`Unhandled lock platform: ${String(e)}`)}function Jc(e){if(e.command!==`replay`||e.flags?.replayFrom!==void 0)return;let t=e.flags?.replayScriptSource;if(t)try{let n=t.entry,r=Mn(t,n);if(Te(n,e.flags?.replayBackend)===`maestro`){let t=Zt(r,n);return{flags:e.flags??{},options:Xt(t.appTarget,e.flags?.platform)}}let i=oi(r,e.flags),a=$t(i.actions);if(!a.appTarget)return;let o=Qt(e.flags,i.actions),s=o.platform??i.metadata.platform;return{flags:s&&o.platform===void 0?{...o,platform:s}:o,options:s===`ios`?nn(a.appTarget):void 0}}catch{return}}function Yc(e,t){return ol([il(e),al(t)])}async function Xc(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i)return{keys:Yc(n,i.device.id),deviceId:i.device.id};let a=new Set([il(n)]),o=await el(t);return o&&a.add(al(o.id)),{keys:ol(a),deviceId:o?.id}}function Zc(e){let{existingRef:t}=e;return{req:Nc(e.req,t),existingRef:t}}function Qc(e){if(!e.meta?.lockPolicy)return e;try{return Nc(e)}catch{return e}}function $c(e){return e.command===`open`?tl(e):e.command===`replay`?nl(e):rl(e)}async function el(e){let t=$c(Qc(e));if(t)try{return await Ce(t.flags,t.options)}catch{return}}function tl(e){let t=Tn(e.positionals?.[0]);return t?{flags:e.flags??{},options:t}:void 0}function nl(e){return Jc(e)??rl(e)}function rl(e){return dn(e.flags)?{flags:e.flags??{},options:{}}:void 0}function il(e){return`session:${e}`}function al(e){return`device:${e}`}function ol(e){return Array.from(e).sort((e,t)=>{let n=sl(e)-sl(t);return n===0?e.localeCompare(t):n})}function sl(e){return+!e.startsWith(`session:`)}function cl(e){let{locks:t,initialKeys:n}=e,r=new Set(n),i=new Map,a=!1,o=async()=>{let e=[...i.values()];for(let t of e)t.release();await Promise.all(e.map(async e=>await e.completion)),i.clear()};return{run:async e=>{if(a)throw Error(`Request execution locks cannot run the same scope concurrently.`);a=!0;try{return await ll(t,n,e)}finally{try{await o()}finally{a=!1}}},retainDevice:async e=>{if(!a)throw Error(`A device execution lock can only be retained by a running request.`);let n=`device:${e}`;if(r.has(n))return;let o=i.get(n);o||(o=ul(t,n),i.set(n,o)),await o.acquired}}}async function ll(e,t,n){let[r,...i]=t;return r?await Dt(e,r,async()=>await ll(e,i,n)):await n()}function ul(e,t){let n=()=>{},r=()=>{},i=new Promise(e=>{n=e}),a=new Promise(e=>{r=e});return{acquired:i,completion:Dt(e,t,async()=>{n(),await a}),release:r}}function dl(e,t,n){let a=g();if(!t.ok){b({level:`error`,phase:`request_failed`,data:{code:t.error.code,message:t.error.message}});let e=_({force:!0});return{ok:!1,error:r(new i(u(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??(typeof t.error.details?.hint==`string`?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath,diagnosticsRecord:t.error.diagnosticsRecord,retriable:t.error.retriable??(typeof t.error.details?.retriable==`boolean`?t.error.details.retriable:void 0),supportedOn:t.error.supportedOn??(typeof t.error.details?.supportedOn==`string`?t.error.details.supportedOn:void 0)}),{diagnosticId:a.diagnosticId,logPath:e?.path,diagnosticsRecord:e?.ref})}}return b({level:`info`,phase:`request_success`}),_(),{ok:!0,data:fl(e,t.data,n)}}function fl(e,t,n){if(!t)return t;let r=pl(e,t);return r.length===0?t:{...t,artifacts:r.map(t=>{let r=t.path;return{field:t.field,...t.artifactType===void 0?{}:{artifactType:t.artifactType},artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,artifactType:t.artifactType,fileName:t.fileName,...Ve(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),fileName:t.fileName,localPath:t.localPath}})}}function pl(e,t){let n=Array.isArray(t.artifacts)?[...t.artifacts]:[];return e.command===`screenshot`&&!(e=>n.some(t=>t?.field===e))(`path`)&&typeof t.path==`string`&&n.push({field:`path`,artifactType:`screenshot`,path:t.path,localPath:e.meta?.clientArtifactPaths?.path,fileName:H.basename(e.meta?.clientArtifactPaths?.path??t.path),...Ve(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),n.filter(e=>!!(e&&typeof e.field==`string`&&typeof e.path==`string`&&(typeof e.localPath==`string`&&e.localPath.length>0||e.field===`fallbackScreenshotPath`&&e.artifactType===`screenshot`)))}async function ml(e,t){let n=e.requireCurrent(t);if(!hl(n))return;let r=n.screenRecording,i=r.handle,a=await cr.observeRunnerSession(n.device.id);if(e.resolveCurrent(t)?.screenRecording!==r)return;let o=i.inspect();if(!o.runnerSessionId){a?.alive&&i.setRunnerSessionId(a.sessionId);return}if(!a?.alive){i.invalidate(`iOS runner session exited during recording`);return}a.sessionId!==o.runnerSessionId&&i.invalidate(`iOS runner session restarted during recording`)}function hl(e){let t=e.screenRecording?.handle.inspect();return!t||!T(e.device)?!1:t.backend===`runner AVAssetWriter`&&t.showTouches!==!1}async function gl(e){let{leaseRegistry:t,req:n,task:r}=e,i=n.internal?.admittedLease;if(!i)return await r();let a=n.meta?.requestId,o=t.retainLeaseWork(i,()=>!Pt(a));try{return await(Ln(n)?t.runDeviceMutation(i,r):r())}finally{o.release()}}async function _l(e){let{inspectFacts:t,bind:n,session:r,stateDir:i,runtimeHints:a}=e,o={...xl(r,i),...e.daemonShutdown?{daemonShutdown:!0}:{}};if(!Sl(r,a)){let e=ne;bl(await t(r.device),e.required,r),await(await n(r.device,e)).operations.finalizeApplicationClose(o);return}let s=oe;bl(await t(r.device),s.required,r);let c=await n(r.device,s);await c.operations.finalizeApplicationClose(o),await c.operations.clearRuntimeHints({appId:r.appBundleId,values:a})}async function vl(e){await _l({...e,bind:e.bindDevice})}async function yl(e){let{gateway:t,scope:n,session:r,stateDir:i,runtimeHints:a}=e,o;try{await _l({inspectFacts:async e=>await t.inspectFacts(e),bind:async(e,r)=>(o??=await t.bind({device:e,intent:{kind:`ordinary`},scope:n}),ie(o,r)),session:r,stateDir:i,runtimeHints:a,...e.daemonLeaving===!1?{}:{daemonShutdown:!0}})}catch(e){try{await o?.[Symbol.asyncDispose]()}catch(t){n.diagnostics.emit({level:`error`,phase:`daemon_lifecycle_binding_cleanup_failed`,data:{session:r.name,error:Cl(t),operationError:Cl(e)}})}throw e}await o?.[Symbol.asyncDispose]()}function bl(e,t,n){for(let r of t){let t=e.operations[r];if(!t?.available)throw new i(`UNSUPPORTED_OPERATION`,`Session lifecycle ${r} is not supported on this device.`,{reason:t?.reason,...t?.hint===void 0?{}:{hint:t.hint},deviceId:n.device.id})}}function xl(e,t){return{appBundleId:e.appBundleId,surface:e.surface??`app`,retainRunner:!1,stateDir:t}}function Sl(e,t){return e.appBundleId!==void 0&&_r(t)}function Cl(e){return e instanceof Error?e.message:String(e)}function wl(e){let t=[];async function n(n){if(e.policy===`none`)return;let r=xn(n);if(r)throw cn(n,r);if(e.policy!==`transient-exclusive`)return;let i=await Sr({device:n,command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim});if(i.status===`conflict`)throw cn(n,i.conflict);i.status===`acquired`&&t.push(i.ownership)}return{admit:async(t,r,i)=>{switch(En(r)){case`none`:return;case`allocator-held`:{let n=hn(t,r,wn({device:t,owner:r,stateDir:e.stateDir,intent:i}));if(!n.admitted)throw n.error;return}case`ordinary`:return await n(t)}},[Symbol.asyncDispose]:async()=>{for(let n of t.splice(0))try{await Cr(n)}catch(t){b({level:`error`,phase:`transient_device_claim_release_failed`,data:{command:e.command,deviceKey:n.deviceKey,error:t instanceof Error?t.message:String(t)}})}}}}const Tl=new WeakMap,El=new WeakMap;async function Dl(e){let{sessionStore:t,leaseRegistry:n}=e,a=jl(jn(e.req)),o=a.command,s=Date.now(),c=Fn(o),l=Fr(a,t,{attachesToSession:Bn(o)!==`inventory`}),u=g(),d=t.resolveSessionDir(l),f=pt({sessionDir:d,session:l,requestId:a.meta?.requestId??u.requestId}),p=f.path,m=ht(d);x({session:l,logPath:f.path,logRecord:f.ref}),b({level:`info`,phase:`request_start`,data:{publicSession:a.session,effectiveSession:l,command:a.command,tenant:a.meta?.tenantId,isolation:a.meta?.sessionIsolation,requestLogPath:p,runnerLogPath:m}});let h=xe(a);h&&t.recordEvent(l,I({req:a}));try{e.daemonPolicy&&an(e.daemonPolicy,a),Cn(a);let r=a.command===`open`?en(a):void 0,u=Fn(o)?await Xc({req:a,sessionName:l,sessionStore:t}):{keys:[],deviceId:void 0},d=gn({req:a,budgetMs:r,sessionName:l,sessionStore:t,deviceId:u.deviceId});await d?.waitForDeviceOutsideLocks();let f=cl({locks:Fl(n),initialKeys:u.keys}),g=Lr(a),{claimAdmission:_,runtimeBindings:v}=Ol({command:o,dispatchLedger:g,workspace:a.meta?.cwd??process.cwd(),stateDir:t.resolveDaemonStateDir(),deviceRuntimeGateway:e.deviceRuntimeGateway,platformRequestScope:e.platformRequestScope,daemonPolicy:e.daemonPolicy}),y={req:a,command:o,sessionName:l,requestLogPath:p,runnerLogPath:m,startedAtMs:s,retainDeviceExecutionLock:async e=>await f.retainDevice(e),bindDevice:v?.bindDevice??(async()=>{throw new i(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})}),inspectFacts:v?.inspectFacts??(async()=>{throw new i(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})}),bindExactDevice:v?.bindExactDevice??(async()=>{throw new i(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})}),dispatchLedger:g,throwIfCanceled:()=>Nt(a.meta?.requestId),runAdmitted:async r=>{Nt(a.meta?.requestId);try{await bn({sessionName:l,sessionStore:t,leaseRegistry:n,teardownSession:async n=>await kl({ref:n,sessionStore:t,inspectFacts:y.inspectFacts,bindDevice:y.bindDevice,platformCleanup:Al(e.platformResourceCleanup)})}),a=pn({req:a,sessionName:l,sessionStore:t,leaseRegistry:n,providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy}),y.req=a;let i=a.internal?.admittedLease;return i&&await sn(i),await gl({leaseRegistry:n,req:a,task:r})}finally{c&&!Pt(a.meta?.requestId)&&t.noteSessionActivity(l)}},runLocked:async e=>(Nt(a.meta?.requestId),d?await d.runWhenDeviceIsUnheld({acquireLocks:f.run,task:async()=>await y.runAdmitted(e)}):await f.run(async()=>await y.runAdmitted(e))),[Symbol.asyncDispose]:async()=>{try{await v?.[Symbol.asyncDispose]()}finally{await _?.[Symbol.asyncDispose]()}}};return El.set(y,e=>(h&&t.recordEvent(l,F({req:a,response:e,durationMs:Math.max(0,Date.now()-s)})),e)),y}catch(e){throw h&&t.recordEvent(l,F({req:a,response:{ok:!1,error:r(e,{diagnosticId:g().diagnosticId,logPath:p})},durationMs:Math.max(0,Date.now()-s)})),e}}function Ol(e){let{deviceRuntimeGateway:t,platformRequestScope:n,daemonPolicy:r}=e;if(!t||!n)return{claimAdmission:void 0,runtimeBindings:void 0};let i=wl({policy:se(e.command),command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:Hr(n)});return{claimAdmission:i,runtimeBindings:zr({gateway:t,scope:n,dispatchLedger:e.dispatchLedger,admitDeviceClaim:i.admit,admitDevice:r?e=>An(r,e):void 0})}}async function kl(e){let{ref:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformCleanup:a}=e,o=n.resolveCurrent(t)??t.session,s=t.address,c=yn(n.getRuntimeHints(t.address)),l;try{await on({appLog:`run`,ref:t,sessionStore:n,platformCleanup:a})}catch(e){l=e}try{await vl({inspectFacts:r,bindDevice:i,session:o,stateDir:n.resolveDaemonStateDir(),runtimeHints:c})}catch(e){if(l!==void 0)b({level:`error`,phase:`expired_session_lifecycle_cleanup_failed`,data:{session:s,error:e instanceof Error?e.message:String(e),primaryError:l instanceof Error?l.message:String(l)}});else throw e}if(l!==void 0)throw l}function Al(e){if(!e)throw new i(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);return e}function jl(e){let t={...e.flags??{}};return fe(e.command,t)?{...e,flags:t}:e}async function Ml(e){let{scope:t,sessionStore:n,trackDownloadableArtifact:r}=e,i=t.runnerLogPath;t.throwIfCanceled();let a=n.lookup(t.sessionName);a&&(await ml(n,a),t.throwIfCanceled(),n.requireCurrent(a));let o=Zc({req:t.req,existingRef:a?n.refresh(a):void 0}),s=o.req,c=o.existingRef,l=c?.session;x({traceLogPath:l?.trace?.outPath}),El.set(t,e=>{let i=dl(s,e,r);return xe(s)&&n.recordEvent(t.sessionName,F({req:s,response:i,durationMs:Math.max(0,Date.now()-t.startedAtMs)})),i});let u=l?.screenRecording?.handle.inspect().invalidatedReason;if(u&&Kn(t.command))return{type:`response`,response:{ok:!1,error:{code:`COMMAND_FAILED`,message:u}}};c&&!s.meta?.lockPolicy&&qn(t.command)&&Ir(c,s.flags);let d=(e,t,n)=>Pl(i,e,t,n,s.meta);return{type:`scope`,scope:{req:s,sessionName:t.sessionName,logPath:i,existingSession:l,retainDeviceExecutionLock:t.retainDeviceExecutionLock,bindDevice:t.bindDevice,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,dispatchLedger:t.dispatchLedger,throwIfCanceled:t.throwIfCanceled,contextFromFlags:d,handlerContextFromFlags:(e,r,i)=>({...d(e,r,i),surface:(a?n.resolveCurrent(a):n.get(t.sessionName))?.surface})}}}function Nl(e,t){let n=El.get(e);return El.delete(e),n?n(t):t}function Pl(e,t,n,r,i){let a=g().requestId;return{...sr(e,t,n,r,a,i),requestId:a}}function Fl(e){let t=Tl.get(e);return t||(t=new Map,Tl.set(e,t)),t}const Il=`--save-script is supported only by ${Wn().join(`, `)}.`;function Ll(e){if(e.flags?.saveScript===void 0||Vn(e.command))return;b({level:`warn`,phase:`save_script_flag_rejected`,data:{command:e.command}});let t=g(),n=_({force:!0});return{ok:!1,error:r(new i(`INVALID_ARGS`,Il,{hint:`Arm publication on the session instead: open/close --save-script, replay --save-script, or session save-script to publish an armed recording without closing its session.`}),{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}const Rl=`AGENT_DEVICE_SESSION_IDLE_TIMEOUT_MS`;function zl(e=process.env){let t=e[Rl]?.trim();if(!t)return 0;let n=Number(t);return!Number.isFinite(n)||n<=0?0:Math.max(1,Math.floor(n))}function Bl(e){return e.lastActivityAtMs??e.createdAt}function Vl(e){return e.deviceClaim!==void 0&&e.lease===void 0&&e.screenRecording===void 0&&e.appLog===void 0&&e.audioProbe===void 0&&e.perfCapture===void 0&&e.trace===void 0}function Hl(e,t,n=Date.now()){return t<=0?!1:n-Bl(e)>=t}function Ul(e,t,n=Date.now()){return Vl(e)&&Hl(e,t,n)}function Wl(e,t){if(!(!Vl(e)||t<=0))return Bl(e)+t}function Gl(e,t){return{owner:e,expiredAtMs:t.expiredAtMs,expiresAt:t.expiredAtMs+36e5,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{}}}function Kl(e,t,n=Date.now()){let r=Math.max(0,n-t.expiredAtMs);return new i(`SESSION_NOT_FOUND`,`Session "${t.owner}" expired ${ql(r)} ago for idleness (window ${ql(t.idleExpiryMs)}). Run open again to start a new session.`,{reason:`SESSION_IDLE_EXPIRED`,session:e,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{},hint:t.deviceKey?`Run open again to claim ${t.deviceKey} and start a new session. Set ${Rl}=0 to keep sessions open indefinitely.`:`Run open again to start a new session. Set ${Rl}=0 to keep sessions open indefinitely.`})}function ql(e){let t=e/1e3;if(t<90)return`${Math.round(t)}s`;let n=t/60;return n<90?`${Math.round(n)}m`:`${Math.round(n/60)}h`}function Jl(e,t,n){let r;for(let[i,a]of e)if(!(!a.device||w(a.device)!==t)){if(!n(i)){e.delete(i);continue}r??=a}return r}function Yl(e={}){let t=e.markerExists??V.existsSync,n=kr({displayName:`app-log`,now:e.now,undurableCleanupTtlMs:e.undurableCleanupTtlMs,onUndurableCleanupExpired:e.onUndurableCleanupExpired}),r=new Map;return Object.freeze({...n,retainLegacyMarkers(e){for(let t of e)t.device&&r.set(t.markerPath,t)},assertStartAllowed(e){let a=w(te(e));if(Jl(r,a,t))throw new i(`COMMAND_FAILED`,`A retained legacy app-log marker prevents replacement capture`,{reason:`cleanup-unconfirmed`,hint:`Inspect and remove the retained app-log.pid only after manually confirming its process is gone.`});n.assertStartAllowed(e)}})}function Xl(e){return ke(e,`focus requires x y`)}function Zl(e,t){return{point:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:R(t)}}async function Ql(e){let t=Xl(e.positionals);return await z({command:`focus`,device:e.device,use:pe,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},(e,n)=>$l(e,t,n))}async function $l(e,t,n){return await e.operations.focusPoint(Zl(t,n)),{x:t.x,y:t.y,...L(`Focused (${t.x}, ${t.y})`)}}function eu(e){if(e===`down`)return`bottom`;if(e===`up`)return`top`}async function tu(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=await i(r),{analyzeScrollEdgeState:a}=await import(`../selection.js`),o=a(e,t,n);return r&&o.emptySnapshot?await tu({edge:t,target:n,captureNodes:i}):o}catch(e){throw du(t,r,e)}}async function nu(e,t,n={}){let{analyzeScrollEdgeState:r}=await import(`../selection.js`);return r(e,t,n)}async function ru(e,t){return(await nu(e,t)).canScroll}async function iu(e,t){let{analyzeScrollEdgeState:n}=await import(`../selection.js`);return n(e,t).fingerprint??``}function au(e){if(e.length<4)return!1;let t=e.slice(-6);if(new Set(t).size>2)return!1;let n=t.at(-1);return n!==void 0&&t.slice(0,-1).includes(n)}function ou(e,t,n){t&&(e.push(t),e.length>n&&e.shift())}async function su(e){let{edge:t,captureState:n,scroll:r,settleAfterPass:a=async()=>{}}=e,o=await n();o.scope&&(o=await n(o.scope));let s=0,c,l=[];for(ou(l,o.fingerprint,6);o.canScroll;){if(s>=40)throw new i(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{reason:`scroll_edge_pass_limit`,edge:t,passes:s,hint:`The scoped scroll container still reports hidden content. Run scroll <dir> --until <selector> to stop on the element you are after, or snapshot -i to inspect the current state.`});if(c=await r(),s+=1,await a(),o=await n(o.scope),ou(l,o.fingerprint,6),o.canScroll&&au(l))throw lu(t,s)}return{passes:s,result:c}}function cu(e){let{direction:t,edge:n,passes:r,amount:i,pixels:a,honoredPixels:o,movement:s}=e;if(n&&r===0)return`Already at ${n}; no hidden content ${n===`bottom`?`below`:`above`} detected`;if(n)return`Scrolled to ${n} with ${r} ${t} passes`;let c=eu(t);return s===`at-edge`&&c?`Scrolled ${t} and no hidden content ${c===`bottom`?`below`:`above`} was detected`:s===`unchanged`?`Scrolled ${t} and the visible content did not change`:a===void 0?i===void 0?`Scrolled ${t}`:o===void 0?`Scrolled ${t} by ${i}`:`Scrolled ${t} by ${i} of the viewport (${o}px)`:`Scrolled ${t} by ${o??a}px`}function lu(e,t){let n=`${t} ${t===1?`pass`:`passes`}`;return new i(`COMMAND_FAILED`,`scroll ${e} moved nothing across ${n}: the container still reports hidden content but its contents never shifted`,{reason:`scroll_edge_no_progress`,edge:e,passes:t,hint:uu({targetDirectly:`with scroll <dir> --until <selector>`})})}function uu(e={}){let t=`The scroll is not reaching this container. If a field is focused, dismiss the keyboard first; if it is nested inside another scroller, ${e.targetDirectly===void 0?`target it directly`:`target it directly ${e.targetDirectly}`}.`;return e.rawDrag===!1?t:t+` Some lists ignore synthesized scrolls — a raw drag moves them: swipe x1 y1 x2 y2 started inside the list.`}function du(e,t,n){return t?new i(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},n):new i(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},n)}async function fu(e){let{selector:t,direction:n,platform:r,capture:a,scroll:o}=e,s=e.passLimit??12,c=eu(n),l=0,u,d=[],f=!1;try{for(;;){if((await pu({captured:await a(),selector:t,direction:n,platform:r,edge:c,passes:l,passLimit:s,recentSignatures:d})).visible)return{passes:l,...u===void 0?{}:{result:u}};f=!0,u=await o(),f=!1,l+=1}}catch(e){throw l===0&&!f&&e instanceof i?p(e,`no`):e}}async function pu(e){let{captured:t,selector:n,direction:r,platform:i,edge:a,passes:o,passLimit:s,recentSignatures:c}=e,l=gu(t);if(l)throw yu(r,n,l);let u=t.nodes??[];if(await hu(u,n,i))return{visible:!0};if(a&&!await ru(u,a))throw _u(r,n,`edge-reached`,o);if(o>=s)throw _u(r,n,`pass-limit`,o);if(a&&(ou(c,await iu(u,a),6),au(c)))throw vu(r,n,o);return{visible:!1}}function mu(e,t,n){return n===0?`${t} was already visible; no ${e} scroll needed`:`Scrolled ${e} ${n} ${n===1?`pass`:`passes`} until ${t} was visible`}async function hu(e,t,n){let r=await je(Gr.wait,e,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[],a=k(e);return i.some(e=>N({predicate:`visible`,node:e,visibility:a,platform:n}).pass)}function gu(e){let t=e.nodes;if(t===void 0)return{reason:`no-capture`,detail:`the capture returned no accessibility tree`};if(t.length===0)return{reason:`no-capture`,detail:`the capture returned an empty accessibility tree`};let n=Ne({backend:e.backend,nodes:t,...e.quality?{snapshotQuality:e.quality}:{}});if(n)return{reason:`sparse-tree`,detail:n.reason??`the capture backend reported a sparse tree`}}function _u(e,t,n,r){let a=`${r} ${r===1?`pass`:`passes`}`;return n===`edge-reached`?new i(`COMMAND_FAILED`,`scroll ${e} reached the end of the scrollable content after ${a} without ${t} becoming visible`,{reason:`scroll_until_edge_reached`,selector:t,direction:e,passes:r,hint:`The content ends here, so no further ${e} scroll can reveal it. Run snapshot -i to see what is on screen, scroll the opposite direction, or check the selector — the element may be on another screen.`}):new i(`COMMAND_FAILED`,`scroll ${e} spent its ${r}-pass budget without ${t} becoming visible`,{reason:`scroll_until_pass_limit`,selector:t,direction:e,passes:r,hint:`Raise the step with an amount (scroll ${e} 0.8 --until <selector>), or run snapshot -i to confirm the selector matches something on this screen.`})}function vu(e,t,n){let r=`${n} ${n===1?`pass`:`passes`}`;return new i(`COMMAND_FAILED`,`scroll ${e} --until ${t} moved nothing across ${r}: the on-screen content never shifted`,{reason:`scroll_until_no_progress`,selector:t,direction:e,passes:n,hint:uu()})}function yu(e,t,n){return new i(`COMMAND_FAILED`,`scroll ${e} --until ${t} could not read the screen: ${n.detail}`,{reason:`scroll_until_capture_unreadable`,selector:t,direction:e,captureRefusal:n.reason,hint:n.reason===`no-capture`?`Run snapshot -i to see whether the app is producing an accessibility tree at all, and retry once it does.`:`The accessibility tree came back sparse, so its refs and selectors are not trustworthy. Run screenshot, inspect the image, and navigate by coordinates until snapshot -i reports a full tree.`})}const bu={intervalMs:200,budgetMs:1500};function xu(e){return ee(e.device)?e.flags?.postGestureStabilization===!1?{kind:`declined`,reason:`caller-declined-observation`}:e.flags?.settle===!0?{kind:`declined`,reason:`settle-observer-owns-outcome`}:Cu(e.session):{kind:`declined`,reason:`non-swipe-platform`}}function Su(e){if(!e||e.nodes.length===0)return;let t=ar(e.nodes);if(t.length!==0)return{signature:t,presentationKey:e.presentationKey,comparisonKey:nr(e),nodes:e.nodes}}function Cu(e){let t=Su(e.snapshot);return t?rr(e)===`active`?lr(e)?{kind:`unobservable`,reason:`prior-gesture-unsettled`}:{kind:`observe`,baseline:t}:{kind:`unobservable`,reason:`stored-surface-not-current`}:{kind:`unobservable`,reason:`stored-surface-unusable`}}async function wu(e){let{direction:t,baseline:n,swipe:r}=e,i=await Eu(n,e);switch(i.kind){case`moved`:return await Nu({...i,direction:t,baseline:n,swipe:r});case`blind`:return Bu(t,i.reason,{swipe:r});case`settled`:return await Pu({...i,direction:t,baseline:n,swipe:r})}}function Tu(e,t){if(e.presentationKey!==t.presentationKey)return`baseline-presentation-drift`;if(e.comparisonKey!==t.comparisonKey)return`capture-lineage-drift`}async function Eu(e,t){let n,r,i=await Dr({capture:async()=>{let n=await ku(e,t.capture);return n.kind===`changed`&&(r??=await Ou(e,t.direction,t.swipe)),n},schedule:{intervalMs:t.pollMs??bu.intervalMs,budgetMs:t.budgetMs??bu.budgetMs},verdict:e=>{if(e.kind===`blind`)return{kind:`done`,result:{kind:`blind`,reason:e.reason}};let t=Du(e,{previous:n,changeNeedsRest:r===!0});return n=e.observed.signature,t?{kind:`done`,result:t}:{kind:`continue`}},...t.clock?{clock:t.clock}:{}}),a=i.polls.length;if(i.kind===`failed`)throw i.error;if(i.kind!==`done`)return Au(t,a,i.waitedMs);let o=Date.now()-i.waitedMs;return i.result.kind===`blind`?i.result:{...i.result,attempts:a,startedAt:o}}function Du(e,t){let n=ju(t.previous,e.observed.signature);if(e.kind===`changed`)return!t.changeNeedsRest||n?{kind:`moved`,observed:e.observed}:void 0;if(n)return{kind:`settled`,observed:e.observed,evidence:e.evidence}}async function Ou(e,t,n){let r=eu(t);if(!r)return!1;let i=await nu(e.nodes,r,{point:n.midpoint}),a=i.containerRect!==void 0&&!i.canScroll;return a&&b({level:`debug`,phase:`scroll_movement_edge_rest_required`,data:{direction:t,containerRect:i.containerRect}}),a}async function ku(e,t){let n=await Mu(t);if(!n)return{kind:`blind`,reason:`capture-unreadable`};let r=Tu(e,n);if(r)return{kind:`blind`,reason:r};let i=er(e.signature,n.signature);return i===`changed`?{kind:`changed`,observed:n}:{kind:`unchanged`,observed:n,evidence:i}}function Au(e,t,n){return b({level:`warn`,phase:`scroll_movement_budget_expired`,data:{direction:e.direction,attempts:t,durationMs:n,...e.swipe.pixels===void 0?{}:{requestedPixels:e.swipe.pixels}}}),{kind:`blind`,reason:`surface-unsettled`}}function ju(e,t){return e!==void 0&&dr(e,t)}async function Mu(e){let t;try{t=await e()}catch{return}let n=Ot(t,void 0);return{signature:ar(n.nodes),presentationKey:n.presentationKey,comparisonKey:nr(n),nodes:n.nodes}}async function Nu(e){let{direction:t,baseline:n,swipe:r,observed:i}=e,a=eu(t),o=a?(await nu(i.nodes,a)).containerRect:void 0;return o&&!ur(n.signature,i.signature,o)?Bu(t,`change-outside-container`,{swipe:r,containerRect:o}):Vu(t,`moved`,r,e.attempts,e.startedAt)}async function Pu(e){let{direction:t,baseline:n,observed:r,evidence:i,swipe:a}=e,o=Fu(n,r,i);return o?Bu(t,o.reason,{swipe:a,divergence:o.divergence}):await Iu(e)}function Fu(e,t,n){if(n===`ambiguous`)return{reason:`no-comparable-content`};if(!or(e.signature,t.signature))return{reason:`surface-divergence`,divergence:tr(e.signature,t.signature)}}async function Iu(e){let{direction:t,observed:n,swipe:r}=e,i=eu(t);if(!i)return Vu(t,`unchanged`,r,e.attempts,e.startedAt);let a=await nu(n.nodes,i),o=a.containerRect;if(!o)return Bu(t,`no-scroll-container`,{swipe:r});if(r.midpoint&&!Lu(o,r.midpoint))return Bu(t,`container-outside-swipe`,{swipe:r,containerRect:o});if(a.canScroll)throw Ru(t,i,r,o);return Vu(t,`at-edge`,r,e.attempts,e.startedAt)}function Lu(e,t){return de(e,t.x,t.y)}function Ru(e,t,n,r){let a=new i(`COMMAND_FAILED`,`scroll ${e} moved nothing: the container still reports hidden content ${t===`bottom`?`below`:`above`} and its contents never shifted`,{reason:`scroll_no_progress`,direction:e,hiddenContentAt:t,containerRect:r,...n.pixels===void 0?{}:{requestedPixels:n.pixels},hint:uu({targetDirectly:`with scroll ${e} --until <selector>`,rawDrag:n.midpoint!==void 0})});return p(a,`unknown`)}function zu(e,t){b({level:`debug`,phase:`scroll_movement_not_applicable`,data:{direction:e,reason:t}})}function Bu(e,t,n){return b({level:`info`,phase:`scroll_movement_unobserved`,data:{direction:e,reason:t,...n.swipe.pixels===void 0?{}:{requestedPixels:n.swipe.pixels},...n.divergence??{},...n.containerRect===void 0?{}:{containerRect:n.containerRect}}}),`unobserved`}function Vu(e,t,n,r,i){return b({level:t===`moved`?`debug`:`info`,phase:`scroll_movement_observed`,data:{direction:e,movement:t,attempts:r,durationMs:Date.now()-i,...n.pixels===void 0?{}:{requestedPixels:n.pixels}}}),t}function Hu(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:ge(e)}}function Uu(e,t,n){if(e!==void 0&&!Number.isFinite(e))throw new i(`INVALID_ARGS`,`scroll amount must be a number`);Fe(n),ze({amount:e,pixels:t})}async function Wu(e){let t=e.positionals[0],n=e.positionals[1]?Number(e.positionals[1]):void 0,r=e.context.pixels,a=e.context.durationMs,o=e.context.until;if(!t)throw new i(`INVALID_ARGS`,`scroll requires direction`);Uu(n,r,a);let s=Hu(t),c={...s.edge===void 0?{}:{edge:s.edge},...o===void 0?{}:{until:o}};Ie(c);let l=Le({amount:n,pixels:r,durationMs:a},s.edge),u=re(c),d={command:`scroll`,device:e.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice};switch(u.kind){case`direction`:{let t=xu({device:e.device,flags:e.flags,session:e.session});return await z({...d,use:u.use},async(e,n)=>await Ku(e,s,l,n,t))}case`edge`:{let e=u.edge;return await z({...d,unavailableResponse:t=>Gu(`scroll ${e}, which verifies hidden content before scrolling,`,t.hint),use:u.use},async(t,n)=>await Xu(t,e,s,l,n))}case`until`:{let t=u.until;return await z({...d,unavailableResponse:e=>Gu(`scroll --until, which checks whether the selector became visible,`,e.hint),use:u.use},async(n,r)=>await Zu(n,e.device,t,s,l,r))}}}function Gu(e,t){return d(`UNSUPPORTED_OPERATION`,`${e} requires snapshot support`,void 0,t===void 0?void 0:{hint:t})}async function Ku(e,t,n,r,i){let a=await $u(e,t,n,r)??{};return td(t,n,1,a,await qu(e,t.direction,r,i,a))}async function qu(e,t,n,r,i){if(r.kind===`declined`){zu(t,r.reason);return}let a=e.operations.captureSnapshot;if(!a){zu(t,`owner-without-capture`);return}return r.kind===`unobservable`?Bu(t,r.reason,{swipe:Yu(i)}):await wu({direction:t,baseline:r.baseline,swipe:Yu(i),capture:async()=>await a(Ju(n))})}function Ju(e,t){return{options:{...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...t},execution:R(e)}}function Yu(e){let t=Be(e),n=Re(e);return{...t===void 0?{}:{midpoint:t},...n===void 0?{}:{pixels:n}}}async function Xu(e,t,n,r,i){let a,o=await su({edge:t,captureState:async n=>{let r=await Qu(e,t,n,i);return a=r.scope??a,r},scroll:async()=>await $u(e,n,r,i),settleAfterPass:async()=>{await ed(async()=>(await e.operations.captureSnapshot(Ju(i,{scope:a}))).nodes??[],t)}});return td(n,r,o.passes,o.result??{})}async function Zu(e,t,n,r,i,a){let o=await fu({selector:n,direction:r.direction,platform:E(t),capture:async()=>await e.operations.captureSnapshot(Ju(a)),scroll:async()=>await $u(e,r,i,a)});return Me({direction:r.direction,until:n,passes:o.passes,...i.amount===void 0?{}:{amount:i.amount},...i.pixels===void 0?{}:{pixels:i.pixels},...o.result??{}},mu(r.direction,n,o.passes))}async function Qu(e,t,n,r){return await tu({edge:t,scope:n,captureNodes:async t=>(await e.operations.captureSnapshot(Ju(r,{scope:t}))).nodes??[]})}async function $u(e,t,n,r){return await e.operations.scrollDirection(nd(t.direction,n,r))}async function ed(e,t,n=1200,r=120){let i,a=Date.now()+n;for(;Date.now()<a;){let n=await iu(await e(),t);if(n===i)return;i=n,await new Promise(e=>setTimeout(e,r))}}function td(e,t,n,r,i){let a=Pe(r),o=Re(r);return Me({direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...a===void 0?{}:{durationMs:a},...r,...i===void 0?{}:{movement:i}},cu({direction:e.direction,edge:e.edge,passes:n,amount:t.amount,pixels:t.pixels,honoredPixels:o,...i===void 0?{}:{movement:i}}))}function nd(e,t,n){return{direction:e,options:t,...n.appBundleId===void 0?{}:{target:{appBundleId:n.appBundleId}},execution:R(n)}}async function rd(e){let t=h(e.positionals),n=await Wr({command:`viewport`,device:e.device,use:j,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});return n.type===`response`?{ok:!1,response:n.response}:{ok:!0,execute:async()=>(await n.runtime.operations.setViewport(t),{...t,message:`Viewport set: ${t.width}x${t.height}`})}}function id(e,t){return{mode:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:R(t)}}async function ad(e){return await z({command:`back`,device:e.device,use:ce,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},od)}async function od(e,t){return await e.operations.back(id(t.backMode,t)),{action:`back`,mode:t.backMode??`in-app`,...L(`Back`)}}const sd={home:{use:P,message:`Home`},"app-switcher":{use:ue,message:`Opened app switcher`},"action-button":{use:O,message:`Pressed Action Button`}};function cd(e){return Object.hasOwn(sd,e)}function ld(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:R(e)}}async function ud(e,t){let n=sd[e];return await z({command:e,device:t.device,use:n.use,inspectFacts:t.inspectFacts,bindDevice:t.bindDevice},async(t,r)=>{let[i]=n.use.required;return await t.operations[i](ld(r)),{action:e,...L(n.message)}})}function dd(e){return He(e[0])}function fd(e,t){return{rotation:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:R(t)}}async function pd(e){let t=dd(e.positionals);return await z({command:`orientation`,device:e.device,use:A,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},(e,n)=>md(e,t,n))}async function md(e,t,n){let r=(await e.operations.setOrientation(fd(t,n)))?.orientation;return r?{action:`orientation`,orientation:r,...L(`Rotated to ${r}`)}:{action:`orientation`,orientation:t,confirmed:!1,warning:`Requested ${t}; the device owner reported no resulting orientation, so the rotation is unconfirmed.`,...L(`Rotation requested: ${t} (unconfirmed)`)}}function hd(e){return Ue(e[0])}async function gd(e){let t=e.keyframes===void 0?{pose:hd(e.positionals)}:Ge({pose:e.positionals[0],keyframes:We(e.keyframes)});return await z({command:`fold`,device:e.device,use:me,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},e=>_d(e,t))}async function _d(e,t){let n=await e.operations.setFoldPose(t),r=n.screen;return{action:`fold`,pose:n.pose,hingeAngleDegrees:n.hingeAngleDegrees,...r?{screen:r}:{},...L(r?`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°, ${r.display} native panel ${r.widthPt}x${r.heightPt}pt, not snapshot coordinates); refs from before the pose change are stale`:`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°); refs from before the pose change are stale`)}}function vd(e){if(e.length!==1)throw new i(`INVALID_ARGS`,`tv-remote requires exactly one button`);return Qe(e[0])}function yd(e,t,n){return{button:e,durationMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:R(n)}}async function bd(e){let t=vd(e.positionals),n=e.durationMs===void 0?void 0:Ae(e.durationMs,`durationMs`,0,1e4);return await z({command:`tv-remote`,device:e.device,use:M,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice},(e,r)=>xd(e,t,n,r))}async function xd(e,t,n,r){return await e.operations.tvRemote(yd(t,n,r)),{action:`tv-remote`,button:t,...n===void 0?{}:{durationMs:n},...L(`Pressed TV remote ${t}`)}}async function Sd(e){if(cd(e.req.command))return await ud(e.req.command,{device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});switch(e.req.command){case`screenshot`:return await Hn(e);case`focus`:return await Ql({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`scroll`:return await Wu({device:e.session.device,positionals:e.req.positionals??[],context:e.context,session:e.session,flags:e.req.flags,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`viewport`:return await rd({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`back`:return await ad({device:e.session.device,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`orientation`:return await pd({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`fold`:return await gd({keyframes:e.req.flags?.keyframes,device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});case`tv-remote`:return await bd({device:e.session.device,positionals:e.req.positionals??[],durationMs:e.req.flags?.durationMs,inspectFacts:e.inspectFacts,bindDevice:e.bindDevice});default:return{ok:!1,response:d(`COMMAND_FAILED`,`${e.req.command} has no runtime execution on the generic route`,{reason:`generic-route-runtime-missing`})}}}async function Cd(e,n,r){let i=ae(e);try{let e=await r();if(!e||e.ok)return e;let t=wd(i,e.error.details,n);return t===e.error.details?e:{...e,error:{...e.error,details:t}}}catch(e){let r=t(e),a=wd(i,r.details,n);throw a===r.details?e:(r.details=a,r)}}function wd(e,t,n){return n.dispatchedSteps>0?o(t,n.dispatchedSteps):e===void 0?t:e===`observes-app`?t?.dispatched===`no`?t:{...t,dispatched:`no`}:t?.dispatched===void 0?{...t,dispatched:`unknown`}:t}function Td(e){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,dispatched:`no`}}}}function Ed(e){return p(t(e),`no`)}const Dd=new Proxy({},{get(){return async()=>{throw new i(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`)}}});function Od(){return new i(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`)}const kd=Object.freeze({stopSnapshotHelper:async()=>{throw Od()},closeManagedBrowser:async()=>{throw Od()},cleanupSessionlessExecutionHost:async()=>{throw Od()},retainExecutionHostAfterClose:()=>{throw Od()}});function Ad(e){let{logPath:t,token:n,requestPlatformProviders:r=Md,deviceRuntimeGateway:i,appLogAdmissionLedger:a=Yl(),audioProbeAdmissionLedger:o=Sn(),perfCaptureAdmissionLedger:s=ln(),screenRecordingAdmissionLedger:c=Ar(),hostDiagnostics:l,providerRuntimeIds:u,providerRuntimeRequiredIds:d,providerCredentials:f,leaseLifecycleProvider:p,cloudArtifactProvider:m,providerAppCatalog:h,androidObservation:g=Dd,platformResourceCleanup:_=kd,providerDeviceRuntimeScope:y,trackDownloadableArtifact:b,daemonPolicy:x}=e,{sessionStore:S,leaseRegistry:C}=e,w=x?kn(e.deviceInventoryGateways,x):e.deviceInventoryGateways;async function ee(e){let n=Date.now(),r=!!(e.meta?.debug||e.flags?.verbose);return await v({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{let t=await Xe(jd(e),async()=>await te(e));return t.ok?Yd(e,t,n):{ok:!1,error:Jd(Gd(e,Wd(e,t.error,S),S))}})}async function te(e){if(!at(e.token,n))return Pd();Rd(e);let t=Id(e);if(t)return t;let r=Ld(e);if(r)return r;let a=Ll(e);if(a)return a;let o,s,c=Vr(e);try{s=await Er({...w,requestScope:c},async()=>await Se(async()=>(o=await Dl({req:e,sessionStore:S,leaseRegistry:C,deviceRuntimeGateway:i,platformRequestScope:c,platformResourceCleanup:_,providerAppCatalog:h,daemonPolicy:x}),await E(o))))}catch(e){s=Hd(e)}return T(e,o,await Ud(o,s))}function T(e,t,n){let r=t?S.lookup(t.sessionName)?.session:void 0;return On(t?.req??e,C,r,x)?tn(e.command,n):n}async function E(e,t){let n=async()=>{let n=await Ml({scope:e,sessionStore:S,trackDownloadableArtifact:b});if(n.type===`response`)return n.response;let i=n.scope,a=async e=>{let n=async()=>await D({lockedScope:i,providerScope:e,allowReplayActions:t===void 0});return y?await y(n):await n()};if(t)return await a(t);let o=Nd(i);if(!r.hasConfiguredResolvers&&!o)return await a({});let s=await cs({req:i.req,existingSession:i.existingSession,useDefaultWebProvider:o});return s?await r.run(s,a):await a({})};return t?await e.runAdmitted(n):await e.runLocked(n)}async function D(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e;return await Cd(t.req,t.dispatchLedger,async()=>await O({lockedScope:t,providerScope:n,allowReplayActions:r}))}async function O(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e,{dispatchLedger:i}=t,v=Vr(t.req);return await bc({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:S,leaseRegistry:C,leaseLifecycleProvider:p,providerRuntimeIds:u,providerRuntimeRequiredIds:d,providerCredentials:f,cloudArtifactProvider:m,providerAppCatalog:h,invoke:Rr(ee,i),invokeReplayAction:r?Rr(k(t,n),i):void 0,providerScope:n,androidObservation:g,platformResourceCleanup:_,bindDevice:t.bindDevice,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:Hr(v),appLogAdmissionLedger:a,audioProbeAdmissionLedger:o,perfCaptureAdmissionLedger:s,screenRecordingAdmissionLedger:c,hostDiagnostics:l,requestScope:v,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,contextFromFlags:t.handlerContextFromFlags})||await zd({lockedScope:t,logPath:t.logPath,sessionStore:S,androidObservation:g})}function k(e,t){return async r=>{if(!Vd(r,e))return await ee(r);if(!at(r.token,n))return Pd();Rd(r);let a,o;try{let n=Bd(r,e);a=await Dl({req:n,sessionStore:S,leaseRegistry:C,deviceRuntimeGateway:i,platformRequestScope:Vr(n),platformResourceCleanup:_,providerAppCatalog:h,daemonPolicy:x}),o=a.sessionName===e.sessionName?await E(a,t):await E(a)}catch(e){o=Hd(e)}return await Ud(a,o)}}return ee}function jd(e){let t=e.meta?.developerDir;return typeof t==`string`?{DEVELOPER_DIR:t}:void 0}const Md=Object.freeze({hasConfiguredResolvers:!1,run:async(e,t)=>await t({})});function Nd(e){return e.existingSession!==void 0&&Jt(e.existingSession)||e.req.flags?.platform===`web`}function Pd(){return{ok:!1,error:r(new i(`UNAUTHORIZED`,`Invalid token`))}}function Fd(){return d(`INVALID_ARGS`,`--record and --no-record are mutually exclusive; pass at most one.`)}function Id(e){if(e.flags?.record&&e.flags?.noRecord)return Fd();if(e.flags?.recordAs!==void 0&&e.command!==`fill`)return d(`INVALID_ARGS`,`--record-as is supported only by fill.`)}function Ld(e){if(e.flags?.snapshotCustomActions===!0&&e.flags?.snapshotRaw===!0)return d(`INVALID_ARGS`,`--actions and --raw are mutually exclusive: custom actions are only readable through the private-AX snapshot path, which a raw capture does not use.`)}function Rd(e){e.command===`fill`&&typeof e.flags?.recordAs==`string`&&y(Ee({ts:0,command:`fill`,positionals:e.positionals??[],flags:e.flags}))}async function zd(e){let{lockedScope:t,logPath:n,sessionStore:r,androidObservation:i}=e,a=r.lookup(t.sessionName);if(!a)return l();let o=r.requireCurrent(a),s=await Sd({req:t.req,session:o,context:t.contextFromFlags(t.req.flags,o.appBundleId,o.trace?.outPath),inspectFacts:t.inspectFacts,bindDevice:t.bindDevice});if(!s.ok)return Td(s.response);let{dispatchGenericCommand:c}=await xc();return await c({req:t.req,ref:a,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags,executePlatformCommand:s.execute,androidObservation:i,...s.recorded?{recordedRequest:s.recorded}:{}})}function Bd(e,t){if(e.command!==`open`)return e;let n=e.internal?.retainDeviceExecutionLock;return{...e,internal:{...e.internal,retainDeviceExecutionLock:async e=>{await t.retainDeviceExecutionLock(e),await n?.(e)}}}}function Vd(e,t){return e.session===t.sessionName&&Gn(e.command)}function Hd(e){b({level:`error`,phase:`request_failed`,data:{error:e instanceof Error?e.message:String(e)}});let t=g(),n=_({force:!0});return{ok:!1,error:r(e,{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}async function Ud(e,t){if(!e)return t;let n=t;try{await e[Symbol.asyncDispose]()}catch(e){t.ok?n=Hd(e):(b({level:`error`,phase:`request_binding_cleanup_failed`,data:{primaryCode:t.error.code,cleanupError:e instanceof Error?e.message:String(e)}}),_({force:!0}))}return Nl(e,n)}function Wd(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let a=Kd(e,n);if(a===void 0)return t;let o=n.readRepairTombstone(a);if(!o)return t;let s=o.sourcePath?`re-run: replay ${o.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return o.commitFailure?r(new i(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${e.session}" completed, but committing its healed script failed at teardown: ${o.commitFailure.message}. ${s}.`)):r(new i(`REPAIR_SESSION_EXPIRED`,`The --save-script repair session "${e.session}" was reaped before it was finalized (idle-reap); ${s}.`))}function Gd(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let i=qd(e,n);return i?r(Kl(i.owner,i)):t}function Kd(e,t){try{return Fr(jn(e),t,{attachesToSession:!1})}catch{return}}function qd(e,t){let n=Kd(e,t);if(n!==void 0)try{return t.readIdleExpiryTombstone(n)}catch{return}}function Jd(e){let t=e.retriable??a(e.code);return t===void 0?e:{...e,retriable:t}}function Yd(e,t,n){let r=Xd(e,t);if(!e.meta?.includeCost)return r;let i=Qd(t.data,n);return{ok:!0,data:{...r.data??{},cost:i}}}function Xd(e,t){let n=e.meta?.responseLevel??`default`;if(n==="default")return t;let r=ss[e.command];return r?{ok:!0,data:r(t.data??{},n)}:t}const Zd=[`ios_runner_command_send`,`ios_runner_readiness_preflight`];function Qd(e,t){let n={wallClockMs:Date.now()-t,runnerRoundTrips:S(Zd)},r=e?.nodes;return Array.isArray(r)&&(n.nodeCount=r.length),n}function $d(e){let t=5e3;return e.screenRecording&&(t+=11e3),Jt(e)&&(t+=3e4),t}function ef(e){e.destroyConnections?.();let t=`closeAllConnections`in e?e.closeAllConnections:void 0;if(typeof t==`function`){t.call(e);return}let n=`closeIdleConnections`in e?e.closeIdleConnections:void 0;typeof n==`function`&&n.call(e)}async function tf(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{ef(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function nf(e=process.env){let t=e.AGENT_DEVICE_DAEMON_IDLE_TIMEOUT_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function rf(e){return e.toArray().some(e=>!af(e))}function af(e){return ye(e)}function of(e){return e.toArray().some(e=>!!e.screenRecording)}function sf(e){return e.inFlightRequestCount>0||rf(e.sessionStore)?!1:!of(e.sessionStore)}function cf(e){let t=nf(e.env),n,r=()=>sf({sessionStore:e.sessionStore,inFlightRequestCount:e.getInFlightRequestCount()}),i=()=>{n&&=(clearTimeout(n),void 0)},a=()=>{i(),!(t<=0)&&(n=setTimeout(()=>{if(n=void 0,r()){if(e.hasRetainedLeases()){a();return}b({level:`info`,phase:`daemon_idle_reap`,data:{idleMs:t}}),e.onIdleReap()}},t),n.unref?.())};return{noteActivity:()=>{r()?a():i()},cancel:i,idleMs:t}}const lf=`claim-clear-failed`,uf=Object.freeze({deleted:!0,absent:!0,"ownership-changed":!0,unattributable:!1}),df=2147483647;function ff(e){let{sessionStore:t,idleExpiryMs:n}=e,r=e.now??Date.now,i,a=!1,o=!1,s=new Set,c=new Map,l=()=>{i&&=(clearTimeout(i),void 0)},u=()=>{o=!0,l()},d=()=>{let e,r=new Set;for(let i of t.listRefs()){r.add(i.address);let t=Wl(i.session,n);if(t===void 0)continue;let a=c.get(i.address),o=a===void 0?t:Math.max(t,a);(e===void 0||o<e)&&(e=o)}for(let e of c.keys())r.has(e)||c.delete(e);return e},f=()=>{if(l(),o||n<=0||a)return;let e=r(),t=d();if(t===void 0)return;let s=Math.max(0,t-e),c=s>df;i=setTimeout(()=>{i=void 0,c?f():p()},Math.min(s,df)),i.unref?.()},p=async()=>{a=!0;let t=async()=>{try{await pf({...e,now:r,retryNotBeforeMs:c,settling:s,closing:()=>o,notifyExpired:e.onSessionExpired})}catch(e){b({level:`warn`,phase:`session_idle_expiry_sweep_failed`,data:{idleExpiryMs:n,error:e instanceof Error?e.message:String(e)}})}};try{await(e.withinDiagnosticsScope?e.withinDiagnosticsScope(t):t())}finally{a=!1,f()}};return{noteSessionsChanged:f,cancel:u,idleExpiryMs:n}}async function pf(e){for(let t of e.sessionStore.listRefs())if(Vl(t.session)){if(e.closing())return;await mf({...e,ref:t})}}async function mf(e){let{address:t}=e.ref;if(e.settling.has(t)){e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs);return}let n=Yc(t,e.ref.session.device.id),r=_f({...e,lockKeys:n}),i=e.settleBudgetMs?.(e.ref.session);if(i===void 0)return void await r;let a=gf(i);try{if(await Promise.race([r,a.promise])!==hf)return}finally{a.cancel()}b({level:`warn`,phase:`session_idle_expiry_settle_timeout`,data:{session:t,idleExpiryMs:e.idleExpiryMs,settleBudgetMs:i,...e.ref.session.deviceClaim?{deviceKey:e.ref.session.deviceClaim.deviceKey}:{}}}),e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}const hf=Symbol(`session-idle-settle-budget-elapsed`);function gf(e){let t;return{promise:new Promise(n=>{t=setTimeout(()=>n(hf),e),t.unref?.()}),cancel:()=>clearTimeout(t)}}async function _f(e){let{address:t,session:n}=e.ref;e.settling.add(t);let r;try{r=await ll(e.executionLocks,e.lockKeys,async()=>{if(e.closing())return vf;let t=e.sessionStore.resolveCurrent(e.ref);if(!t||t.device.id!==n.device.id)return vf;let r=e.now();return Ul(t,e.idleExpiryMs,r)?{outcome:await bf({ref:e.sessionStore.refresh(e.ref),idleExpiryMs:e.idleExpiryMs,expiredAtMs:r,sessionStore:e.sessionStore,settleSession:e.settleSession}),retry:!0}:vf}),r.retry?yf(e,t,r.outcome):e.retryNotBeforeMs.delete(t)}catch(n){b({level:`warn`,phase:`session_idle_expiry_settle_failed`,data:{session:t,idleExpiryMs:e.idleExpiryMs,error:n instanceof Error?n.message:String(n)}}),yf(e,t,void 0);return}finally{e.settling.delete(t)}return r.outcome&&e.notifyExpired?.(r.outcome),r.outcome}const vf=Object.freeze({outcome:void 0,retry:!1});function yf(e,t,n){if(n){e.retryNotBeforeMs.delete(t);return}e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}async function bf(e){let{ref:t,idleExpiryMs:n,expiredAtMs:r}=e,{address:i,session:a}=t,o=a.deviceClaim?.deviceKey,s={session:i,idleExpiryMs:n,...o?{deviceKey:o}:{}};if(!await xf(e,s))return;let c=await Sf(i,a.deviceClaim);if(c===lf||!uf[c]){b({level:`warn`,phase:`session_idle_expiry_device_claim_unconfirmed`,data:s});return}if(e.sessionStore.finalizeRepairTeardown(t),!e.sessionStore.retire(t)){b({level:`info`,phase:`session_idle_expiry_superseded`,data:s});return}e.sessionStore.writeIdleExpiryTombstone(i,Gl(i,{expiredAtMs:r,idleExpiryMs:n,deviceKey:o}));let l=r-Bl(a);return b({level:`info`,phase:`session_idle_expired`,data:{...s,idleForMs:l,claim:c}}),{sessionName:i,idleExpiryMs:n,idleForMs:l,claim:c,...o?{deviceKey:o}:{}}}async function xf(e,t){try{return await e.settleSession(e.ref),!0}catch(e){return b({level:`warn`,phase:`session_idle_expiry_cleanup_failed`,data:{...t,error:e instanceof Error?e.message:String(e)}}),!1}}async function Sf(e,t){if(!t)return`absent`;try{return await Cr(t)}catch(n){return b({level:`warn`,phase:`session_idle_expiry_device_claim_clear_failed`,data:{session:e,deviceKey:t.deviceKey,error:n instanceof Error?n.message:String(n)}}),lf}}async function Cf(e){let{leaseRegistry:t,expiredProviderLeaseReleaser:n,timeoutMs:r}=e;await Promise.all(t.listActiveLeases().map(async e=>{try{let i=await wf(n.release(e),r);t.releaseLease(At(e)),i||b({level:`warn`,phase:`daemon_shutdown_lease_release_timed_out`,data:{leaseId:e.leaseId,timeoutMs:r}})}catch(t){b({level:`warn`,phase:`daemon_shutdown_lease_release_failed`,data:{leaseId:e.leaseId,error:t instanceof Error?t.message:String(t)}})}}))}async function wf(e,t){return await new Promise((n,r)=>{let i=setTimeout(()=>n(!1),t);e.then(()=>{clearTimeout(i),n(!0)},e=>{clearTimeout(i),r(e)})})}const Tf=`clear-unrecorded`;function Ef(){let e={released:[],orphaned:[],superseded:[],unattributable:[]},t=new Map;return{claims:e,releaseClaim:async e=>{if(e.deviceClaim)try{t.set(e.name,await Cr(e.deviceClaim))}catch(n){t.set(e.name,Tf),b({level:`warn`,phase:`daemon_shutdown_device_claim_release_failed`,data:{session:e.name,deviceKey:e.deviceClaim.deviceKey,error:n instanceof Error?n.message:String(n)}})}},finalize:n=>{let r=n.deviceClaim;if(!r)return;let i={deviceKey:r.deviceKey,session:n.name,platform:E(n.device),deviceId:n.device.id},a=t.get(n.name);switch(a){case`deleted`:case`absent`:e.released.push(i);return;case`ownership-changed`:e.superseded.push(i);return;case`unattributable`:e.unattributable.push(i);return;case Tf:case void 0:e.orphaned.push(i);return;default:Df(a)}}}}function Df(e){throw Error(`Undeclared device-claim outcome: ${String(e)}`)}function Of(e){if(e===void 0)return;let t=Number(e);if(Number.isInteger(t))return t}const kf=Object.freeze({match:!1,replaced:!0,absent:!0,unreadable:!1,ownerless:!1,unproven:!1});function Af(e){let t=xr(e.infoPath,e.owner);if(kf[t.state]&&!(t.state===`absent`&&Mf(e.stateDir)))return t.state===`replaced`?{state:`replaced`,registeredPid:t.identity.pid}:{state:`absent`}}function jf(e){let t,n=()=>{t&&=(clearInterval(t),void 0)};return t=setInterval(()=>{if(Mf(e.stateDir)){n();return}let t=Af(e);t&&(n(),e.onLoss(t))},15e3),t.unref?.(),n}function Mf(e){try{return Ye(e)===void 0}catch{return!1}}function Nf(e){let t=new Set,i=ni.createServer(i=>{t.add(i),i.on(`close`,()=>t.delete(i));let a=``,o=0,s=new Set,c=!1,l=()=>{if(!(c||o===0)){c=!0;for(let e of s)Mt(e);b({level:`warn`,phase:`request_client_disconnected`,data:{inFlightRequests:o}})}};i.setEncoding(`utf8`),i.on(`close`,l),i.on(`error`,l),i.on(`data`,async t=>{let c=st(a,t);a=c.buffer;for(let t of c.lines){let a;o+=1;let c,l,u=!1;try{let r=Pf(t);if(u=ut(r),c=It(r.meta?.requestId,`socket`),r.meta={...r.meta,requestId:c},l=Ft(c),s.add(c),Pt(c))throw n();a=await Rt(u?e=>{i.destroyed||i.write(dt(e))}:void 0,async()=>await e(r))}catch(e){a={ok:!1,error:r(e)}}finally{--o,l&&s.delete(l.requestId),Lt(l)}i.destroyed||i.write(u?lt(a):`${JSON.stringify(a)}\n`)}})});return i.destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},i}function Pf(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return t;let{internal:n,...r}=t;return r}function Ff(e){return Lf(e,`Failed to bind socket server`)}function If(e){return Lf(e,`Failed to bind HTTP server`)}function Lf(e,t){return new Promise((n,r)=>{e.once(`error`,r),e.listen(0,`127.0.0.1`,()=>{e.off(`error`,r);let a=e.address();if(typeof a==`object`&&a?.port){n(a.port);return}r(new i(`COMMAND_FAILED`,t))})})}async function Rf(){let{resetAndroidSnapshotHelperSessions:e}=await St();await e()}async function zf(e){let{stopAndroidSnapshotHelperSessionForDevice:t}=await St();await t(e)}async function Bf(e){if(process.platform!==`darwin`)return;let{restoreLegacyXctestDeviceSetRedirect:t}=await import(`../runner-owner-facade.js`);await t(e)}async function Vf(e){let{getManagedAgentBrowserStatus:t}=await import(`../src6.js`).then(e=>e.i),n=await t({stateDir:e.stateDir});if(!n.installed)return;let{cleanupManagedAgentBrowserOrphans:r}=await import(`../src6.js`).then(e=>e.i);await r(n,`daemon-startup`,{openWebSessionNames:e.openWebSessionNames,...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}async function Hf(e){let{createAgentBrowserWebProvider:t}=await import(`../src6.js`).then(e=>e.i);await(await t({session:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openWebSessionNames})).close()}const Uf=Object.freeze({async stopSnapshotHelper(e){e.platform===`android`&&await zf(e)},async closeManagedBrowser(e){e.device.platform===`web`&&await Hf({sessionName:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openSessionNames})},async cleanupSessionlessExecutionHost(e){if(!T(e))return;let{resolveRunnerAppBundleId:t,stopIosRunnerSession:n}=await import(`../runner-operations-facade.js`);await n(e.id);let r=await t(),{closeIosApp:i}=await import(`../app-lifecycle-facade.js`);await i(e,r).catch(t=>{b({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:r,error:t instanceof Error?t.message:String(t)}})})},retainExecutionHostAfterClose(e){return T(e.device)&&e.device.kind===`simulator`&&!e.shutdownRequested&&!e.hasScreenRecording&&!e.hasLease}});async function Wf(e){let{setRunnerLeaseOwnerStateDir:t}=await import(`../runner-owner-facade.js`);t(e)}async function Gf(e){let{setRunnerDeviceClaimAuthorityProbe:t}=await import(`../runner-owner-facade.js`);t(e)}const Kf=Object.freeze({configureForDaemonLock:async e=>{await Wf(e.stateDir),await Gf(e.hasDeviceClaimAuthority),await Bf(e.onDiagnostic)},clearDaemonLockConfiguration:async()=>{await Wf(void 0),await Gf(void 0)},recoverLegacyAppLogMarkers:async e=>{let{recoverLegacyAppLogMarkersAfterDaemonLock:t}=await import(`../platform-runtime-operation-host.js`);return await t(e)},cleanupManagedWebOrphans:async e=>{await Vf(e)},resetAndroidSnapshotHelper:async()=>{await Rf()}});async function qf(e){let{session:t,stderr:n,resource:r,teardown:i}=e;try{return await i(),!0}catch(e){return n.write(`Daemon ${r} teardown error (${t.name}): ${e instanceof Error?e.message:String(e)}\n`),!1}}async function Jf(e){let{ref:t,sessionStore:n,stateDir:r,stderr:i,finalizeApplicationLifecycle:a,afterSuccessfulTeardown:o}=e,s=n.resolveCurrent(t),c=s??t.session,l=yn(s?n.getRuntimeHints(t.address):void 0),u=$d(c),d=await qf({session:c,stderr:i,resource:`app-log`,teardown:async()=>await rn({ref:t,sessionStore:n})}),f=n.resolveCurrent(t)??c,p=(async()=>{let e=await qf({session:c,stderr:i,resource:`session`,teardown:async()=>await on({appLog:`already-settled`,ref:t,sessionStore:n,stateDir:r,platformCleanup:Uf})}),o=!a||await qf({session:c,stderr:i,resource:`lifecycle`,teardown:async()=>await a(f,l)});return e&&o})(),m=await Promise.race([p,Ze(u).then(()=>(i.write(`Daemon session teardown timed out (${c.name}).\n`),!1))]),h=d&&m;n.finalizeRepairTeardown(t),h&&await o?.(c),n.retire(t)}async function Yf(e,t){t.length!==0&&await B({logPath:e,command:`daemon-startup`,debug:!1},()=>{for(let e of t)b({level:`warn`,phase:e.phase,data:{resourcePath:e.resourcePath,...e.data}})})}async function Xf(e,t){for(let{provider:n,error:r}of t??[])await Zf(e,`provider_runtime_skipped`,{provider:n,code:r.code,message:r.message,hint:r.details?.hint})}async function Zf(e,t,n){await B({logPath:e},()=>{b({level:`warn`,phase:t,data:n})})}async function Qf(e){try{let t=await e.registration.finish(e.outcome);t.state!==`removed`&&t.state!==`absent`&&await Zf(e.logPath,`daemon_info_removal_declined`,{infoPath:e.infoPath,removed:!1,reason:t.state,...t.state===`replaced`?{registeredPid:t.identity.pid}:{}})}catch(t){await Zf(e.logPath,`daemon_registration_finish_failed`,{error:r(t)})}}async function $f(e){await Zf(e.logPath,`daemon_metadata_lost`,{infoPath:e.infoPath,...e.loss})}function ep(e,t,n,r){return jf({infoPath:t,stateDir:e,owner:r,onLoss:e=>void $f({infoPath:t,logPath:n,loss:e}).catch(()=>{})})}async function tp(e={}){let n=e.env??process.env,r=e.stdout??process.stdout,a=e.stderr??process.stderr,o=e.exit??(e=>process.exit(e)),s=bt(n.AGENT_DEVICE_STATE_DIR),{baseDir:c,infoPath:l,logPath:u,sessionsDir:d}=s,f=yt(n.AGENT_DEVICE_DAEMON_SERVER_MODE),p=xt(n.AGENT_DEVICE_RETAIN_ARTIFACTS),m;try{m=Qn(n)}catch(e){return a.write(`Daemon error: ${t(e).message}\n`),o(1),null}let h=new be(d),g=gt({stateDir:c,sessionsDir:d,resolveSessionDir:e=>h.resolveSessionDir(e)}),_=Yl(),v=Sn(),y=ln(),x=Ao(),S=Ar(),C=vt(),w=Qr.randomBytes(24).toString(`hex`),ee=qe(),te=Xr(),T=Zr(),E=await vr(n),D=[...E.runtimes],O=hr({assertShutdownAllowed:m?()=>Gt(m,`device-shutdown`):void 0,providerRuntimes:D,providerModules:E.platformModules,sessionsDir:d,ownedProcesses:g,resolveSessionArtifacts:e=>({outputPath:h.resolveAppLogPath(e),pidPath:h.resolveAppLogPidPath(e)})}),k=O.applicationLifecycle;if(!k)throw new i(`COMMAND_FAILED`,`Platform lifecycle gateway is not configured.`,{reason:`runtime-gateway-missing`});let A=Xn(D,{providerRuntimeRequiredIds:yr});Oe({isActive:e=>Yn(e)}),ir({resolve:Zn});let ne=pr({providers:{appleRunnerProvider:A.appleRunnerProvider,appleRunnerScreenRecordingTransport:A.appleRunnerScreenRecordingTransport},defaultWebProvider:{stateDir:c,openWebSessionNames:()=>Kt(h),ownedProcessRecords:g}}),j=No({leaseLifecycleProvider:A.leaseLifecycleProvider,providerRuntimeIds:A.providerRuntimeIds,recoverExpiredLease:A.recoverExpiredLease,stateDir:c,recoverableProviderIds:A.recoverableProviderIds});j.retryPending();let M=new un({maxActiveSimulatorLeases:Of(n.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:Of(n.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:Of(n.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:Of(n.AGENT_DEVICE_LEASE_MAX_TTL_MS),onLeaseExpired:e=>{j.release(e)}}),re=A.cloudArtifactProvider,ie=A.providerAppCatalog,ae=mr(A.deviceInventorySource),oe=Ad({logPath:u,token:w,sessionStore:h,leaseRegistry:M,leaseLifecycleProvider:A.leaseLifecycleProvider,cloudArtifactProvider:re,providerAppCatalog:ie,deviceInventoryGateways:ae,deviceRuntimeGateway:O,appLogAdmissionLedger:_,audioProbeAdmissionLedger:v,perfCaptureAdmissionLedger:y,hostDiagnostics:x,screenRecordingAdmissionLedger:S,requestPlatformProviders:ne,androidObservation:gr,platformResourceCleanup:Uf,providerRuntimeIds:A.providerRuntimeIds,providerRuntimeRequiredIds:A.providerRuntimeRequiredIds,providerCredentials:br(n,c),providerDeviceRuntimeScope:A.providerDeviceRuntimeScope,trackDownloadableArtifact:Bt,daemonPolicy:m}),se=()=>{},ce=async e=>{await B({logPath:u},()=>{b({level:`error`,phase:`daemon_fatal`,data:{error:e instanceof Error?e.message:String(e)}})})},N=Ef(),le=async e=>{let t=h.resolveCurrent(e)??e.session;try{await Jf({ref:e,sessionStore:h,stderr:a,finalizeApplicationLifecycle:async(e,t)=>await yl({gateway:O,scope:Ur(),session:e,stateDir:c,runtimeHints:t}),afterSuccessfulTeardown:N.releaseClaim})}finally{N.finalize(t)}},ue=async()=>{h.closeAdmission();let e=h.listRefs();await Promise.all(e.map(le))},de=ff({sessionStore:h,idleExpiryMs:zl(n),executionLocks:Fl(M),settleSession:async e=>{let t=h.resolveCurrent(e)??e.session,n=e.address,r=yn(h.getRuntimeHints(n));await on({appLog:`run`,ref:e,sessionStore:h,stateDir:c,platformCleanup:Uf}),await yl({gateway:O,scope:Ur(),session:t,stateDir:c,runtimeHints:r,daemonLeaving:!1})},settleBudgetMs:e=>$d(e),withinDiagnosticsScope:async e=>await B({logPath:u},e),onSessionExpired:()=>{P.noteActivity()}}),fe=!1,pe=new Set,P=cf({sessionStore:h,getInFlightRequestCount:()=>pe.size,hasRetainedLeases:()=>M.hasRetainedLeases(),onIdleReap:()=>{I()},env:n}),me=async e=>{if(fe)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`Daemon is shutting down.`,details:{reason:`daemon_shutting_down`}}};P.cancel();let t=oe(e);pe.add(t);try{return await t}finally{pe.delete(t),P.noteActivity(),de.noteSessionsChanged()}},he=async()=>{let e=[],t,r,i=f!==`http`,a=f!==`socket`;if(i){let n=Nf(me);e.push(n),t=await Ff(n)}if(a){let t=await Co({handleRequest:me,leaseRegistry:M,token:w,retainArtifacts:p,env:n,resolveRequestDiagnosticsPath:m?.requiredLeaseBackend?void 0:e=>mt(h.resolveSessionDir(e.session),e.requestId)});e.push(t),r=await If(t)}return{servers:e,socketPort:t,httpPort:r}},ge=(e,t)=>{ye.publish({socketPort:e,httpPort:t,token:w,version:C,codeOrigin:te,codeSignature:T,policyDigest:m?.digest}),e&&r.write(`AGENT_DEVICE_DAEMON_PORT=${e}\n`),t&&r.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${t}\n`)},_e=e=>{for(let t of e)try{t.close(()=>{})}catch{}},ve=await Jr(s);if(ve.status!==`acquired`)return await Promise.allSettled(D.map(async e=>await e.shutdown())),a.write(`Daemon registration ${ve.status}; exiting.\n`),o(Yr[ve.status]),null;let ye=ve.owner,xe=[],Se,Ce,F=[];try{await Kf.configureForDaemonLock({stateDir:c,hasDeviceClaimAuthority:Tr,onDiagnostic:e=>F.push(e)});let e=await Kf.recoverLegacyAppLogMarkers(d);_.retainLegacyMarkers(e.retained);for(let t of e.recovered)F.push({phase:`app_log_legacy_marker_recovered`,resourcePath:t,data:{}});for(let t of e.retained)F.push({phase:`app_log_legacy_marker_retained`,resourcePath:t.markerPath,data:{reason:t.reason,...t.message===void 0?{}:{message:t.message}}});await Br({sessionsDir:d,gateway:O,scope:Ur(),onDiagnostic:e=>F.push(e)}),await _t(g,{openWebSessionNames:Kt(h),purposes:[`simctl-screen-recording`],termTimeoutMs:5e3}),await rp({stateDir:c,sessionStore:h,ownedProcessRecords:g}),k.recoverStartupResources({stateDir:c}).catch(e=>{b({level:`warn`,phase:`daemon_lifecycle_startup_recovery_failed`,data:{error:e instanceof Error?e.message:String(e)}})});let t=await he();xe=t.servers,Se=t.socketPort,Ce=t.httpPort,ge(Se,Ce),se=ep(c,l,u,ee),await Yf(u,F),await Xf(u,E.skipped),await np(u,Hr(Ur()),c),P.noteActivity()}catch(e){let n=t(e);return a.write(`Daemon error: ${n.message}\n`),_e(xe),se(),await Promise.allSettled(D.map(async e=>await e.shutdown())),await Qf({registration:ye,infoPath:l,logPath:u}),await Kf.clearDaemonLockConfiguration(),o(1),null}Kr();let I=async(e={})=>{if(P.cancel(),de.cancel(),fe)return;fe=!0,se(),e.cause&&await ce(e.cause),await tf(xe),await Promise.allSettled(pe);try{await B({logPath:u},async()=>{await k.detachForDaemonShutdown()})}catch{}j.beginShutdown(),await ue(),await B({logPath:u},async()=>{await Cf({leaseRegistry:M,expiredProviderLeaseReleaser:j,timeoutMs:1e3})});try{await Kf.resetAndroidSnapshotHelper()}catch(e){b({level:`warn`,phase:`daemon_shutdown_android_snapshot_helper_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}let t=await j.drain(2e3);b({level:t.pending.length===0?`info`:`warn`,phase:`daemon_shutdown_provider_release_drain`,data:{releasedLeaseIds:t.released.map(e=>e.leaseId),pendingLeaseIds:t.pending.map(e=>e.leaseId),releasedDeviceKeys:N.claims.released.map(e=>e.deviceKey),orphanedDeviceKeys:N.claims.orphaned.map(e=>e.deviceKey)}}),j.shutdown(),await O.shutdown(),await Promise.allSettled(D.map(async e=>await e.shutdown())),await k.finalizeDaemonShutdown(),await Promise.race([qr().catch(()=>{}),Ze(1e3)]),await Qf({registration:ye,infoPath:l,logPath:u,outcome:{providerReleases:t,claims:N.claims}}),await Kf.clearDaemonLockConfiguration(),o(e.exitCode??0)};return e.registerProcessHandlers!==!1&&(process.on(`SIGINT`,()=>{I()}),process.on(`SIGTERM`,()=>{I()}),process.on(`SIGHUP`,()=>{I()}),process.on(`uncaughtException`,e=>{let n=e instanceof i?e:t(e);a.write(`Daemon error: ${n.message}\n`),I({exitCode:1,cause:e})}),process.on(`unhandledRejection`,e=>{let n=e instanceof Error?e:Error(String(e)),r=n instanceof i?n:t(n);a.write(`Daemon error: ${r.message}\n`),I({exitCode:1,cause:n})})),{httpPort:Ce,shutdown:I,socketPort:Se,token:w}}async function np(e,t,n){await B({logPath:e},async()=>{try{let e=await wr(t,n);e.examined>0&&b({phase:`device_claim_reconcile`,data:e})}catch(e){b({level:`warn`,phase:`device_claim_reconcile_failed`,data:{error:e instanceof Error?e.message:String(e)}})}})}async function rp(e){try{await Kf.cleanupManagedWebOrphans({stateDir:e.stateDir,openWebSessionNames:Kt(e.sessionStore),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){b({level:`warn`,phase:`web_agent_browser_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}tp().catch(e=>{let n=t(e);process.stderr.write(`Daemon error: ${n.message}\n`),process.exit(1)});export{gs as a,Gs as i,Ed as n,hs as o,$l as r,Td as t};
1
+ import{r as e}from"../rolldown-runtime.js";import{$ as t,B as n,I as r,L as i,P as a,U as o,Y as s,a as c,at as l,b as u,f as d,g as f,it as p,k as m,l as h,s as g,t as _,z as v}from"../sdk-contracts.js";import{F as ee,H as y,I as te,L as ne,M as b,N as x,P as re,S as ie,U as S,b as C,j as w,ot as T,r as E,tt as ae,v as D,vt as oe,x as se,y as ce}from"../tv-remote.js";import{A as le,m as ue,v as de}from"../sdk-batch-runner.js";import{A as fe,B as pe,E as me,F as he,H as ge,I as _e,J as ve,K as O,L as ye,M as be,N as xe,P as Se,Q as Ce,S as we,U as Te,V as Ee,W as De,X as Oe,Y as ke,_ as Ae,_t as k,a as je,bt as Me,dt as Ne,f as Pe,ht as Fe,ot as Ie,q as Le,st as Re,w as ze,yt as Be,z as Ve}from"../back-mode.js";import{a as A,i as He,l as Ue,o as We,r as j,s as Ge,t as Ke}from"../diagnostics.js";import"../diagnostics2.js";import{E as M,N as qe,P as Je,S as Ye,T as Xe,_ as Ze,b as Qe,f as $e,g as et,h as N,i as tt,u as nt,w as rt}from"../sdk-device.js";import{$ as it,$n as at,Ar as ot,Dt as st,Er as ct,H as lt,Jt as ut,Kr as dt,Kt as ft,Lt as pt,Qn as mt,S as ht,U as gt,Xt as _t,b as vt,cn as yt,ct as bt,f as xt,hr as St,l as Ct,m as wt,o as Tt,on as Et,ot as Dt,pn as Ot,u as kt,vt as At,xt as jt,yt as Mt}from"../sdk-batch.js";import{a as Nt}from"../session.js";import{C as Pt,T as Ft,d as It,y as Lt,z as Rt}from"../file.js";import{n as zt}from"../app-log-files.js";import{l as Bt,v as Vt}from"../exec.js";import{i as Ht,n as Ut,t as Wt}from"../retry.js";import{A as Gt,B as Kt,D as qt,E as Jt,L as Yt,M as Xt,O as Zt,S as Qt,_ as $t,a as en,b as tn,c as nn,d as rn,f as an,g as on,l as sn,n as cn,o as ln,p as un,s as dn,t as fn,u as pn,v as mn,w as hn,y as gn}from"../daemon-resolution.js";import"../command.js";import{n as _n,r as vn}from"../process.js";import{a as yn}from"../version.js";import{r as bn}from"../runtime-transport-hints.js";import"../retry2.js";import{t as xn}from"../platform-runtime-android-mechanics.js";import{a as Sn,r as Cn}from"../archive.js";import{t as wn}from"../byte-limit-stream.js";import{c as Tn}from"../device-shell.js";import{t as En}from"../keyed-lock.js";import{r as Dn}from"../snapshot-occlusion.js";import{t as On}from"../snapshot-state.js";import{c as P,d as kn,l as An,s as jn,t as Mn,u as Nn}from"../daemon-registration-owner.js";import{t as Pn}from"../snapshot-chrome.js";import{_ as Fn,d as In,h as Ln,i as Rn,l as zn,m as Bn,n as Vn,o as Hn,p as Un,r as Wn,s as Gn,t as Kn,v as qn}from"../replay-script-selection.js";import{a as Jn,c as Yn,i as Xn,o as Zn,s as Qn,t as $n}from"../request-cancel.js";import{n as er,t as tr}from"../request.js";import{i as nr,r as rr,t as ir}from"../interactors.js";import{n as ar,t as or}from"../provider-device-admission.js";import{n as sr,r as cr}from"../daemon-policy-file.js";import{i as lr,n as ur,r as dr,t as fr}from"../platform-runtime.js";import{$ as pr}from"../perf-runtime.js";import{r as mr,t as hr}from"../provider-webdriver.js";import{i as gr}from"../provider-limrun-credentials.js";import{n as _r}from"../provider-credential-fingerprint.js";import{i as vr}from"../daemon-registration.js";import{n as yr,t as br}from"../device-claim-inspection.js";import{F as xr,I as Sr,M as Cr,N as wr,T as Tr,k as Er,n as Dr,r as Or,s as kr,t as Ar,x as jr}from"../platform-request-scope.js";import{t as Mr}from"../device-isolation.js";import{o as Nr}from"../device-inventory-context.js";import{C as Pr,D as Fr,E as Ir,a as Lr,g as Rr,h as zr,k as Br,t as Vr,v as Hr,w as Ur,x as Wr,y as Gr}from"../selector-pipeline-policy.js";import{i as Kr,o as qr,s as Jr}from"../durable-capture-resource.js";import{i as Yr,n as Xr,r as Zr,t as Qr}from"../request-runtime-binding.js";import{i as $r,o as ei}from"../code-signature.js";import{c as ti,l as ni}from"../png-worker-client.js";import F,{createHash as ri,randomUUID as ii}from"node:crypto";import I from"node:fs";import ai from"node:os";import L from"node:path";import oi from"node:fs/promises";import{pipeline as si}from"node:stream/promises";import ci from"node:net";import{pathToFileURL as li}from"node:url";import ui from"node:http";import{once as di}from"node:events";import{StringDecoder as fi}from"node:string_decoder";function pi(e,t={}){let n=[e.command];return e.command===`snapshot`?De(n,e):e.command===`open`?ye(n,e):e.command===`runtime`?Ee(n,e,{includeAllPositionals:t.runtimeIncludeAllPositionals}):e.command===`record`?pe(n,e):e.command===`screenshot`?ge(n,e):Ve(n,e),n.join(` `)}function mi(e){return e.targetEvidences?[mt(e.targetEvidences)]:e.targetEvidence?[at(e.targetEvidence)]:[]}const hi=/^\$\{([A-Z_][A-Z0-9_]*)\}$/;function gi(e){if(e!==e.trim()||!Se.test(e))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": use uppercase letters, digits, and underscores (for example PASSWORD).`);if(e.startsWith(`AD_`))throw new a(`INVALID_ARGS`,`Invalid --record-as variable "${e}": the AD_* namespace is reserved for built-in replay variables.`);return e}function _i(e){return typeof e?.recordAs==`string`||e?.textStdin===!0}function vi(e){return typeof e?.recordAs==`string`?yi(e.recordAs):`[REDACTED]`}function yi(e){return`\${${e}}`}function bi(e){let t=hi.exec(e);if(!(!t?.[1]||t[1].startsWith(`AD_`)))return t[1]}function xi(e){let t=e.result?.text;if(typeof t==`string`)return t;let n=e.positionals??[];return n.length===0?``:n[0]?.startsWith(`@`)?n.length>=3?n.slice(2).join(` `):n.slice(1).join(` `):n.length>=3&&!Number.isNaN(Number(n[0]))&&!Number.isNaN(Number(n[1]))?n.slice(2).join(` `):n.slice(1).join(` `)}function Si(e,t){if(t?.replayBackend&&!fe(t.replayBackend))throw new a(`INVALID_ARGS`,xe(t.replayBackend));return{...he(e),metadata:_e(e)}}const R={kind:`none`};function Ci(e,t){if(t.path===void 0){let n=e??{kind:`default`,force:!1};return t.force?{...n,force:!0}:n}let n=e?.force===!0&&(e.kind==="default"||e.path===t.path);return{kind:`explicit`,path:t.path,force:t.force||n}}function wi(e){return e.kind===`repair`?{...e,status:`armed`}:e}function Ti(e){return e.kind===`none`?void 0:e.target}function Ei(e){return e.kind===`repair`&&(e.status===`complete`||e.status===`close-succeeded`)}function Di(e){return e.kind===`authoring`&&e.status===`aborted`}function Oi(e){return e.kind===`authoring`?e.status===`armed`:e.kind===`repair`}function ki(e){return e.kind===`repair`?e.status===`committed`:e.kind===`authoring`&&e.status===`published`}function Ai(e){return{kind:`authoring`,status:`armed`,target:Ci(void 0,e)}}function ji(e){return e.kind!==`authoring`||e.status!==`armed`?e:{...e,status:`aborted`}}function Mi(e,t){return e.kind===`authoring`?{kind:`authoring`,status:`published`,target:{kind:`explicit`,path:t,force:e.target.force}}:e}function Ni(e,t){let n=e.kind===`repair`?e:void 0,r=n?.sourcePath??t.sourcePath;return{kind:`repair`,status:n?.status??`armed`,target:Ci(n?.target,t.requested),boundary:n?.boundary??t.boundary,...r===void 0?{}:{sourcePath:r},...n?.closeReceipt===void 0?{}:{closeReceipt:n.closeReceipt}}}function Pi(e){return e.kind!==`repair`||e.status!==`armed`?e:{...e,status:`complete`}}function Fi(e,t){return e.kind===`repair`?{...e,status:e.status===`complete`?`close-succeeded`:e.status,closeReceipt:t}:e}function Ii(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`committed`}}function Li(e){if(e.kind!==`repair`)return e;let{closeReceipt:t,...n}=e;return{...n,status:`aborted`}}function Ri(e){return e.kind===`repair`?e.boundary:void 0}function zi(e){return e.kind===`repair`?e.sourcePath:void 0}function Bi(e){return e.kind===`repair`&&e.status!==`committed`}function Vi(e){let t=Ti(e);return t?.kind===`explicit`?t.path:void 0}function Hi(e){return Ti(e)?.force===!0}function z(e){return e?.scriptPublication??R}function Ui(e){let t=z(e);return t.kind===`authoring`&&t.status===`armed`}function Wi(e,t){e.scriptPublication=Ai({path:t.path===void 0?void 0:rn(t.path),force:t.force===!0})}function Gi(e){e.scriptPublication=ji(z(e))}function Ki(e){return Oi(z(e))}function qi(e,t){if(!t.saveScript||Di(z(e)))return;let n={path:typeof t.saveScript==`string`?rn(t.saveScript):void 0,force:t.force===!0},r=z(e);if(r.kind===`repair`){e.scriptPublication=Ni(r,{requested:n,boundary:r.boundary,sourcePath:r.sourcePath});return}if(r.kind===`authoring`){e.scriptPublication={...r,target:Ci(r.target,n)};return}e.scriptPublication=Ai(n)}function Ji(e,t){let n=z(e);n.kind===`authoring`&&(e.scriptPublication={...n,target:Ci(n.target,{path:t.explicitPath===void 0?void 0:rn(t.explicitPath),force:t.liveForce===!0})})}function Yi(e,t){e.scriptPublication=Mi(z(e),t)}function Xi(e,t){let n=z(e);n.kind===`authoring`&&(e.scriptPublication=Mi(n,t))}function Zi(e,t){return t===!0||Hi(z(e))}function Qi(e){return ki(z(e))}function B(e){return e?.scriptPublication??R}function $i(e,t){let n=B(e);e.scriptPublication=Ni(n,{requested:{path:typeof t.saveScript==`string`?rn(t.saveScript):n.kind===`repair`?void 0:t.healedSiblingPath,force:t.force===!0},boundary:t.firstArm?e.actions.length:0,sourcePath:t.sourcePath})}function ea(e){e.scriptPublication=wi(B(e))}function ta(e){e.scriptPublication=Pi(B(e))}function na(e,t){e.scriptPublication=Fi(B(e),t)}function ra(e){e.scriptPublication=Li(B(e))}function ia(e,t){let n=B(e);return n.kind===`repair`&&n.closeReceipt===t}function aa(e){return B(e).kind===`repair`}function oa(e){return Bi(B(e))}function sa(e){return Ri(B(e))}function ca(e){return zi(B(e))}const la=new Set(`action.backend.cost.delayMs.evidence.gesture.hint.kind.maestroFallbackReason.maestroNonHittableCoordinateFallbackAllowed.maestroNonHittableCoordinateFallbackUsed.message.platform.ref.referenceHeight.referenceWidth.refLabel.resolution.selector.selectorChain.settle.targetHittable.targetKind.text.warning.x.y`.split(`.`)),ua=new Set([`action`,`backend`,`gesture`,`kind`,`platform`,`ref`,`selector`,`targetKind`]),da=new Set([`cost`,`evidence`,`resolution`,`settle`]),fa=new Map([[`cost`,new Set([`nodeCount`,`runnerRoundTrips`,`wallClockMs`])],[`evidence`,new Set([`changedFromBefore`,`digest`,`foregroundApp`,`interactiveNodeCount`,`nodeCount`])],[`resolution`,new Set([`alternatives`,`kind`,`matchCount`,`phase`,`source`,`tiebreak`,`winnerDiagnostic`])],[`resolution.alternatives`,new Set([`diagnosticRef`,`label`,`role`])],[`resolution.winnerDiagnostic`,new Set([`diagnosticRef`,`label`,`role`])],[`settle`,new Set([`captures`,`diff`,`hint`,`quietMs`,`refs`,`refsGeneration`,`settled`,`tail`,`tailTruncated`,`timeoutMs`,`waitedMs`])],[`settle.diff`,new Set([`lines`,`summary`,`truncated`])],[`settle.diff.lines`,new Set([`kind`,`ref`,`text`])],[`settle.diff.summary`,new Set([`additions`,`removals`,`unchanged`])],[`settle.refs`,new Set([`ref`])],[`settle.tail`,new Set([`label`,`ref`,`role`])]]),pa=new Set([`evidence.digest`,`evidence.foregroundApp`,`resolution.alternatives.diagnosticRef`,`resolution.alternatives.role`,`resolution.kind`,`resolution.phase`,`resolution.source`,`resolution.tiebreak`,`resolution.winnerDiagnostic.diagnosticRef`,`resolution.winnerDiagnostic.role`,`settle.diff.lines.kind`,`settle.diff.lines.ref`,`settle.refs.ref`,`settle.tail.ref`,`settle.tail.role`]);function ma(e,t,n){if(!e)return e;let r=Ma(e.selectorChain),i=e=>xa(e,t);return{...Sa(e,e=>Ea(e,t,n),i),...typeof e.text==`string`?{text:n}:{},...r?{selectorChain:r.filter(e=>!i(e))}:{}}}function ha(e,t){if(!e)return e;let n=ka(t);return Sa(e,e=>Aa(e,n),e=>ya(e,t))}function ga(e,t){if(!e)return e;let n=ka(t);return{...e,...e.label===void 0?{}:{label:Aa(e.label,n)},ancestry:e.ancestry.map(e=>({...e,...e.label===void 0?{}:{label:Aa(e.label,n)}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===void 0?{}:{label:Aa(e.scrollRegion.label,n)}}}:{}}}function _a(e,t){return!!(e.label!==void 0&&va(e.label,t)||e.ancestry.some(e=>e.label&&va(e.label,t))||e.scrollRegion?.label&&va(e.scrollRegion.label,t))}function va(e,t){for(let n of t.keys())if(e.includes(n))return!0;return!1}function ya(e,t){for(let n of t.keys())if(xa(e,n))return!0;return!1}function ba(e,t,n){return!e||!t?e:{...e,...e.label===t?{label:n}:{},ancestry:e.ancestry.map(e=>({...e,...e.label===t?{label:n}:{}})),...e.scrollRegion?{scrollRegion:{...e.scrollRegion,...e.scrollRegion.label===t?{label:n}:{}}}:{}}}function xa(e,t){return Ot(e,t)}function Sa(e,t,n){return Object.fromEntries(Object.entries(e).map(([e,r])=>[la.has(e)?e:t(e),Ca(r,e,t,n)]))}function Ca(e,t,n,r){return typeof e==`string`&&ua.has(t)?e:t===`selectorChain`&&ja(e)?Ta(e,r):wa(e,n,r,da.has(t)?t:void 0)}function wa(e,t,n,r){if(typeof e==`string`)return r&&pa.has(r)?e:t(e);if(Array.isArray(e))return e.map(e=>wa(e,t,n,r));if(!e||typeof e!=`object`)return e;let i=r?fa.get(r):void 0;return Object.fromEntries(Object.entries(e).map(([e,a])=>{let o=i?.has(e)===!0;return[o?e:t(e),wa(a,t,n,o?`${r}.${e}`:void 0)]}))}function Ta(e,t){return e.filter(e=>!t(e))}function Ea(e,t,n){if(!t)return e;let r=n?e.split(n):[e];return r.every(e=>!e.includes(t))?Da(e,t,n):t.trim()?Da(r.map(e=>e.replaceAll(t,n)).join(n),t,n):n}function Da(e,t,n){let r=[];if(n)for(let t=e.indexOf(n);t!==-1;t=e.indexOf(n,t+n.length))r.push(t);let i=0;for(let a=e.indexOf(t);a!==-1;a=e.indexOf(t,a+1)){for(;i<r.length&&r[i]+n.length<a+t.length;)i+=1;if(i===r.length||r[i]>a)return n}return e}const Oa=/\$\{[A-Z_][A-Z0-9_]*\}/y;function ka(e){return[...e].sort(([e],[t])=>t.length-e.length)}function Aa(e,t){if(!e||t.length===0)return e;let n=``,r=0;scan:for(;r<e.length;){for(let[i,a]of t)if(e.startsWith(i,r)){n+=a,r+=i.length;continue scan}if(e[r]===`$`){Oa.lastIndex=r;let t=Oa.exec(e);if(t){n+=t[0],r+=t[0].length;continue}}n+=e[r],r+=1}return n}function ja(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function Ma(e){return ja(e)?e:void 0}function Na(e,t){if(t.flags?.noRecord||_i(t.flags)&&t.flags.recordAs===void 0||Wa(e,t))return;t.flags&&qi(e,t.flags);let n=Fa(t),r=Ra(e,Ia(t,n));n&&La(e,n);let i={ts:Date.now(),command:r.command,positionals:r.positionals,runtime:r.runtime,flags:Ka(r.flags),result:r.result,...r.targetEvidence?{targetEvidence:r.targetEvidence}:{},...r.targetEvidences?{targetEvidences:r.targetEvidences}:{}};return e.actions.push(i),j({level:`debug`,phase:`record_action`,data:{command:t.command,session:e.name}}),i}function Pa(e,t,n,r,i,a){!t||!e.resolveCurrent(t)||e.recordAction(t,{command:r,positionals:a?.positionals??n.positionals??[],flags:a?.flags??n.flags??{},result:i??{}})}function Fa(e){if(e.command!==`fill`||typeof e.flags.recordAs!=`string`)return;let t=yi(gi(e.flags.recordAs));return{literal:xi({ts:0,command:e.command,positionals:e.positionals,flags:e.flags}),placeholder:t}}function Ia(e,t){if(!t)return e;let{literal:n,placeholder:r}=t;return{...e,positionals:Va(e.positionals,r),result:ma(e.result,n,r),targetEvidence:ba(e.targetEvidence,n,r)}}function La(e,t){t.literal.trim()&&(e.recordedFillLiterals??=new Map,!e.recordedFillLiterals.has(t.literal)&&e.recordedFillLiterals.set(t.literal,t.placeholder))}function Ra(e,t){let n=e.recordedFillLiterals;if(!n||n.size===0)return t;let r=ha(t.result,n),i=(t.targetEvidenceMode??`action`)===`landmark`?za(t.targetEvidence,n):Ba(t.targetEvidence,n),a=t.targetEvidences?{source:Ba(t.targetEvidences.source,n),destination:Ba(t.targetEvidences.destination,n)}:t.targetEvidences;return{...t,result:r,targetEvidence:i,targetEvidences:a}}function za(e,t){return e&&(_a(e,t)?void 0:e)}function Ba(e,t){return!e||!_a(e,t)?e:{...ga(e,t),verification:`unverifiable`}}function Va(e,t){let n=e[0];return n?.startsWith(`@`)?e.length>=3?[n,e[1],t]:[n,t]:e.length>=3&&Number.isFinite(Number(e[0]))&&Number.isFinite(Number(e[1]))?[e[0],e[1],t]:n===void 0?[t]:[n,t]}const Ha=new Set([`snapshot`,`get`,`is`,`find`]);function Ua(e){return e.internal?.replayPlanStep!==!0&&Ha.has(e.command)}function Wa(e,t){return!t.interactiveObservation||sa(e)===void 0?!1:t.flags?.record!==!0}const Ga=ze();function Ka(e){if(!e)return{};let t={};for(let n of Ga){let r=e[n];r!==void 0&&(t[n]=r)}return t}function qa(e){return L.join(e,`idle-expiry.json`)}function Ja(e){let t;try{t=I.readFileSync(e,`utf8`)}catch{return}let n;try{n=JSON.parse(t)}catch{return}if(!(typeof n?.expiresAt!=`number`||!Number.isFinite(n.expiresAt))&&!(n.expiresAt<=Date.now())&&typeof n.owner==`string`&&!(!Ya(n.expiredAtMs)||!Ya(n.idleExpiryMs))&&(n.deviceKey===void 0||typeof n.deviceKey==`string`))return n}function Ya(e){return typeof e==`number`&&Number.isFinite(e)&&e>=0}function Xa(e){let t=e.flatMap((e,t)=>e.command===`open`?[t]:[]);if(t.length!==1||t[0]!==0)throw new a(`COMMAND_FAILED`,`Cannot publish this session: an open-to-destination script requires exactly one initial recorded open.`,{retriable:!1,hint:`Close this session and start a fresh one with open <app> --save-script[=<path>].`});if(e.some(e=>e.command===`close`))throw new a(`COMMAND_FAILED`,`Cannot publish an active-session script containing close.`,{retriable:!1,hint:`Close this session and record the journey again from a fresh open --save-script session.`});let n=-1;for(let[t,r]of e.entries())ht({command:r.command,positionals:r.positionals,flags:r.flags})===`mutates-app`&&(n=t);if(!e.slice(n+1).some(no))throw new a(`COMMAND_FAILED`,`Cannot publish this session without a portable destination guard after the final mutating action.`,{retriable:!0,hint:`Record a selector-targeted wait on a labeled or id-bearing landmark, for example wait 'role="heading" label="Screen X"', so its recorded identity is captured, then retry session save-script.`})}function Za(e){for(let t of e){if(Qa(t)){$a(t);continue}let e=ro(t),n=e??(t.command===`wait`?t.positionals[0]:void 0);if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${n}": the session-local ref was not converted to a portable selector.`,{retriable:!1,hint:`Close this session and record the journey again using selectors or resolvable refs.`});if(t.command===`find`&&ht(t)===`mutates-app`)throw new a(`COMMAND_FAILED`,`Cannot publish a recorded mutating find step because its target identity is not replay-verifiable.`,{retriable:!1,hint:`Close this session and record the journey again with an explicit selector-targeted click, press, fill, or focus action.`});let r=e;if(!(!r||!yt(r)||t.targetEvidence))throw new a(`COMMAND_FAILED`,`Cannot publish recorded step "${t.command} ${r}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again from open --save-script so target-v1 evidence is captured before each interaction.`})}}function Qa(e){return eo(e)!==void 0}function $a(e){let t=eo(e);if(!t)return;let n=[t.source,t.destination];for(let t of n){if(t?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": the session-local ref was not converted to a portable selector.`,{retriable:!1});if(!(!t||!yt(t))&&!e.targetEvidences)throw new a(`COMMAND_FAILED`,`Cannot publish recorded drag endpoint "${t}": recording-time target identity evidence is missing.`,{retriable:!1,hint:`Close this session and record the journey again so targets-v1 evidence is captured for both drag endpoints.`})}}function eo(e){return e.command===`gesture`?Ce(e.positionals):void 0}function to(e,t){if(e instanceof a){if(e.details?.reason===`script_target_exists`)return new a(e.code,`A file already exists at ${String(e.details.path)}.`,{...e.details,retriable:!0,hint:`Retry session save-script with another path, or pass --force to replace the existing file. The session remains armed.`});let t=e.details?.retriable===!0;return new a(e.code,e.message,{...e.details,retriable:t,hint:e.details?.hint??(t?`Fix the recorded journey or target, then retry session save-script. The session remains armed.`:`Close this session and start a fresh one with open <app> --save-script[=<path>].`)})}let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to publish the active session script${t?` to ${t}`:``}: ${n}`,{retriable:!0,hint:`Check the target path and permissions, then retry session save-script. The session remains armed.`})}function no(e){if(e.command!==`wait`)return!1;let t=Et(e.positionals);return t?.kind!==`selector`||!yt(t.selectorExpression)?!1:e.targetEvidence?.verification===`verified`}function ro(e){if(e.command===`get`)return e.positionals[1];if(ke(e.command)||e.command===`fill`){let[t,n]=e.positionals;return t!==void 0&&n!==void 0&&io(t)&&io(n)?void 0:t}}function io(e){return e.trim().length>0&&Number.isFinite(Number(e))}function ao(e){let t=e.scriptPublication??R;return t.kind===`repair`?t.status===`committed`||!Ei(t):!1}function oo(e){return!Oi(e.scriptPublication??R)||ao(e)}var so=class{sessionsDir;constructor(e){this.sessionsDir=e}write(e,t){let n=aa(e),r=t?.publication===`active`,i;try{if(oo(e))return{written:!1};let a=co(e,{appendCompleteSentinel:n,activePublication:r});i=this.resolveScriptPath(e);let o=L.dirname(i);return I.existsSync(o)||I.mkdirSync(o,{recursive:!0}),fo({scriptPath:i,script:a.script,force:t?.force}),n&&(e.scriptPublication=Ii(e.scriptPublication??R)),{written:!0,path:i,actionCount:a.actionCount}}catch(t){return lo({session:e,error:t,scriptPath:i,repairArmed:n,activePublication:r})}}resolveScriptPath(e){let t=Vi(e.scriptPublication??R);if(t)return rn(t);let n=un(e.name),r=new Date(e.createdAt).toISOString().replaceAll(/[:.]/g,`-`);return L.join(this.sessionsDir,`${n}-${r}.ad`)}};function co(e,t){let n=po(e,{strictPortableRefs:t.activePublication});return t.activePublication&&Xa(n),{script:wo(e,n,t.appendCompleteSentinel),actionCount:n.length}}function lo(e){let{session:t,error:n,scriptPath:r,repairArmed:i,activePublication:o}=e;if(j({level:`warn`,phase:`session_script_write_failed`,data:{session:t.name,path:r,error:n instanceof Error?n.message:String(n)}}),i)return{written:!1,error:uo(n,r)};if(o)return{written:!1,error:to(n,r)};if(n instanceof a)throw n;return{written:!1}}function uo(e,t){if(e instanceof a)return e;let n=e instanceof Error?e.message:String(e);return new a(`COMMAND_FAILED`,`Failed to write the healed script${t?` to ${t}`:``}: ${n}`,{hint:`The repair transaction completed but the healed .ad could not be published; check the target path and permissions, then retry close --save-script.`})}function fo(e){let{scriptPath:t,script:n,force:r}=e;try{Rt({destination:t,contents:n,publish:r?`replace`:`link-exclusive`})}catch(e){throw e.code===`EEXIST`?new a(`COMMAND_FAILED`,`A file already exists at ${t}; remove it, pass replay --save-script=<other-path>, or pass --force/--overwrite to replace it.`,{reason:`script_target_exists`,path:t}):e}}function po(e,t={}){let n=sa(e),r=n!==void 0,i=e.actions.slice(n??0),a=[];for(let n of i){if(n.command===`snapshot`)continue;let i=go(n);if(i){a.push(i);continue}(r||t.strictPortableRefs)&&mo(n);let o=Co(e,n);o&&a.push(o),a.push(n)}return t.strictPortableRefs&&Za(a),a}function mo(e){let t=e.command===`gesture`?Ce(e.positionals??[]):void 0;if(t){ho(t);return}if(!vo(e.command))return;let n=e.command===`get`?e.positionals?.[1]:e.positionals?.[0];if(n?.startsWith(`@`))throw new a(`COMMAND_FAILED`,`Cannot write recorded step "${e.command} ${n}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function ho(e){let t=[e.source,e.destination].find(e=>e.startsWith(`@`));if(t)throw new a(`COMMAND_FAILED`,`Cannot write recorded drag endpoint "${t}" to a script: it never resolved to a selector, so the ref would not resolve in a fresh replay session.`)}function go(e){let t=_o(e);if(!(!t||!vo(e.command)))return ve(e.command)||e.command===`hover`?{...e,positionals:[t]}:e.command===`longpress`?bo(e,t):e.command===`fill`?yo(e,t):xo(e,t)}function _o(e){let t=Array.isArray(e.result?.selectorChain)&&e.result.selectorChain.every(e=>typeof e==`string`)?e.result.selectorChain:[];return t.length>0?t.join(` || `):void 0}function vo(e){return ke(e)||e===`fill`||e===`get`}function yo(e,t){let n=xi(e);return n.length>0?{...e,positionals:[t,n]}:void 0}function bo(e,t){let n=typeof e.result?.durationMs==`number`?String(e.result.durationMs):So(e.positionals??[]);return{...e,positionals:n?[t,n]:[t]}}function xo(e,t){let n=e.positionals?.[0];return n===`text`||n===`attrs`?{...e,positionals:[n,t]}:void 0}function So(e){let t=e.at(-1);if(!(e.length<=1||t===void 0||t.trim()===``))return Number.isFinite(Number(t))?t:void 0}function Co(e,t){if(!vo(t.command))return;let n=t.result?.refLabel;if(typeof n!=`string`||n.trim().length===0)return;let r=n.trim();return{ts:t.ts,command:`snapshot`,positionals:[],flags:{platform:e.device.platform,snapshotInteractiveOnly:!0,snapshotScope:r},result:{scope:r}}}function wo(e,t,n){let r=[],i=e.device.kind?` kind=${e.device.kind}`:``;r.push(`context platform=${M(e.device)} device=${Le(e.device.name)}${i} theme=unknown`);for(let e of t)e.flags?.noRecord||(r.push(...mi(e)),r.push(To(e)));return n&&r.push(`# agent-device:heal-complete`),`${r.join(`
2
+ `)}\n`}function To(e){return Eo([e.command],e)||pi(e)}function Eo(e,t){if(ve(t.command))return Do(e,t);if(t.command===`fill`)return Oo(e,t);if(t.command===`get`)return ko(e,t)}function Do(e,t){let n=t.positionals?.[0];if(n){if(n.startsWith(`@`))return e.push(O(Oe(n))),Ao(e,t),Te(e,t),e.join(` `);if(t.positionals.length===1)return e.push(O(n)),Te(e,t),e.join(` `)}}function Oo(e,t){let n=t.positionals?.[0];if(!n?.startsWith(`@`))return;e.push(O(Oe(n))),Ao(e,t);let r=t.positionals.slice(1).join(` `);return t.positionals.length>1&&e.push(O(r)),Te(e,t),e.join(` `)}function ko(e,t){let n=t.positionals?.[0],r=t.positionals?.[1];if(!(!n||!r))return e.push(O(n)),e.push(O(Oe(r))),r.startsWith(`@`)&&Ao(e,t),e.join(` `)}function Ao(e,t){let n=t.result?.refLabel;typeof n==`string`&&n.trim().length>0&&e.push(O(n))}const jo=65536;function Mo(e){return ri(`sha256`).update(e,`utf8`).digest(`hex`).slice(0,32)}function No(e,t){let n=Ro(e);if(n===void 0)return!1;try{let e=Io(t),r=Buffer.allocUnsafe(jo),i=0;do if(i=I.readSync(n,r,0,r.length,null),!e.push(r.subarray(0,i)))return!0;while(i>0);return e.end(),!0}finally{I.closeSync(n)}}async function Po(e){let t=await zo(e);if(t===void 0)return{lineCount:0,firstLineDigest:void 0};let n={lineCount:0,firstLineDigest:void 0};try{let e=Io(e=>{n.lineCount===0&&(n.firstLineDigest=Mo(e)),n.lineCount+=1}),r=Buffer.allocUnsafe(jo);for(;;){let{bytesRead:n}=await t.read(r,0,r.length,null);if(e.push(r.subarray(0,n)),n===0)break}return e.end(),n}finally{await t.close()}}function Fo(e){let t;return No(e,e=>(t=Mo(e),!1)),t}function Io(e){let t=new fi(`utf8`),n=``,r=!1;return{push(i){if(r)return!1;let a=`${n}${t.write(i)}`,o=0;for(let t=a.indexOf(`
3
+ `);t!==-1;t=a.indexOf(`
4
+ `,o)){if(Lo(a.slice(o,t),e)===!1)return r=!0,!1;o=t+1}return n=a.slice(o),!0},end(){r||Lo(`${n}${t.end()}`,e)}}}function Lo(e,t){let n=e.endsWith(`\r`)?e.slice(0,-1):e;if(n.trim().length!==0)return t(n)}function Ro(e){try{return I.openSync(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}async function zo(e){try{return await I.promises.open(e,`r`)}catch(e){if(e.code===`ENOENT`)return;throw e}}const Bo=5242880;function Vo(e=process.env){let t=e.AGENT_DEVICE_EVENT_LOG_MAX_BYTES?.trim();if(t===void 0||!/^\d+$/.test(t))return Bo;let n=Number(t);return Number.isSafeInteger(n)&&n>0?n:Bo}function Ho(e){return`${e}.1`}function Uo(e){return`${e}.window.json`}function Wo(e){let t;for(let n=0;n<3;n+=1){let n=$o(e);try{let t=Go(e);if($o(e)===n)return t}catch(r){if(t=r,$o(e)===n)throw r}}throw t??Zo(e,`the window did not settle while reading`)}function Go(e){let t=Ho(e),n=ts(e);if(n===`unverifiable`)throw Zo(e,`window file is invalid`);if(n===void 0)return Ko(e,t);let r=n.at(-1);if(!r)throw Zo(e,`window file records no generation`);let i=is(e),a=qo(e,r),o=[],s=Jo({eventLogPath:e,rotatedPath:t,sidecar:n,activeStart:a,activeExists:i});return s!==void 0&&o.push({path:t,firstLineIndex:s}),i&&o.push({path:e,firstLineIndex:a}),{files:o,earliestCursor:o[0]?.firstLineIndex??a}}function Ko(e,t){if(Fo(t)!==void 0)throw Zo(e,`a rotated event log exists with no window record`);return{files:is(e)?[{path:e,firstLineIndex:0}]:[],earliestCursor:0}}function qo(e,t){let n=Fo(e);return n!==void 0&&n===t.firstLineDigest?t.firstLineIndex:t.firstLineIndex+t.lineCount}function Jo(e){let{eventLogPath:t,rotatedPath:n,sidecar:r,activeStart:i,activeExists:a}=e,o=Fo(n);if(o===void 0)return;let s=r.find(e=>e.firstLineDigest===o);if(!s)throw Zo(t,`the rotated event log matches no window record`);let c=Qo(n);if(c!==s.lineCount)throw Zo(t,`the rotated event log holds ${c} lines, the window recorded ${s.lineCount}`);if(a&&s.firstLineIndex+s.lineCount!==i)throw Zo(t,`retained event log generations are not contiguous`);return s.firstLineIndex}async function Yo(e,t){let n=as(e);if(!n||n.size<t)return!1;let r=ts(e);if(r===`unverifiable`)return await I.promises.rename(e,Ho(e)),!0;let i=await Po(e);if(i.firstLineDigest!==void 0){let t=r??[],n=t.at(-1),a=n&&n.firstLineDigest===i.firstLineDigest?n:{firstLineIndex:n?n.firstLineIndex+n.lineCount:0,lineCount:i.lineCount,firstLineDigest:i.firstLineDigest};await rs(e,(a===n?t:[...t,a]).slice(-2))}return await I.promises.rename(e,Ho(e)),!0}function Xo(e,t){if(!(e>=t))throw new a(`COMMAND_FAILED`,`events cursor ${e} precedes the retained event log window; events before cursor ${t} were rotated out.`,{reason:`EVENT_LOG_CURSOR_EXPIRED`,cursor:e,earliestCursor:t,hint:`Resume with cursor ${t}, the oldest retained event; earlier events are no longer available.`})}function Zo(e,t){return new a(`COMMAND_FAILED`,`Session event log window cannot be verified: ${t}.`,{reason:`EVENT_LOG_WINDOW_UNVERIFIED`,path:e,hint:`Cursor positions for this session cannot be resolved. Delete ${e}, ${Ho(e)}, and ${Uo(e)} to restart the timeline, or read the files directly.`})}function Qo(e){let t=0;return No(e,()=>{t+=1}),t}function $o(e){return[es(Uo(e)),es(e),es(Ho(e))].join(`|`)}function es(e){try{let t=I.lstatSync(e);return`${t.ino}:${t.size}:${t.mtimeMs}`}catch{return`absent`}}function ts(e){let t;try{t=I.readFileSync(Uo(e),`utf8`)}catch(e){return e.code===`ENOENT`?void 0:`unverifiable`}try{let e=JSON.parse(t);if(!de(e)||e.version!==2)return`unverifiable`;let{generations:n}=e;if(!Array.isArray(n)||n.length===0)return`unverifiable`;let r=n.map(ns);return r.every(e=>e!==void 0)?r:`unverifiable`}catch{return`unverifiable`}}function ns(e){if(!de(e))return;let{firstLineIndex:t,lineCount:n,firstLineDigest:r}=e;if(!(!Number.isSafeInteger(t)||t<0)&&!(!Number.isSafeInteger(n)||n<0)&&typeof r==`string`&&r.length!==0)return{firstLineIndex:t,lineCount:n,firstLineDigest:r}}async function rs(e,t){let n=Uo(e),r=`${n}.${process.pid}.tmp`;await I.promises.writeFile(r,JSON.stringify({version:2,generations:t}),`utf8`),await I.promises.rename(r,n)}function is(e){return as(e)!==void 0}function as(e){try{let t=I.lstatSync(e);if(t.isSymbolicLink())throw new a(`COMMAND_FAILED`,`Session event log must not be a symbolic link: ${e}`);return t}catch(e){if(e.code===`ENOENT`)return;throw e}}const os=new Map,ss=new Set;function cs(e){return L.join(e,`events.ndjson`)}function ls(e){return e.command!==me.events}function us(e,t,n){let r=l({version:1,ts:n.ts??new Date().toISOString(),session:t,...n});fs(e,`${JSON.stringify(r)}\n`)}async function ds(e){await(e?os.get(e):Promise.all(os.values()))}function fs(e,t){let n=(os.get(e)??Promise.resolve()).catch(()=>void 0).then(async()=>{await ps(e),await Yo(e,Vo()),await I.promises.appendFile(e,t,`utf8`)}).catch(t=>{j({level:`warn`,phase:`session_event_log_write_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}})}).finally(()=>{os.get(e)===n&&os.delete(e)});os.set(e,n)}async function ps(e){let t=L.dirname(e);if(!ss.has(t))try{await I.promises.mkdir(t,{recursive:!0}),ss.add(t)}catch(t){throw j({level:`warn`,phase:`session_event_log_dir_failed`,data:{path:e,error:t instanceof Error?t.message:String(t)}}),t}}function ms(e,t,n){us(e,t,{kind:`action.recorded`,requestId:A().requestId,command:n.command,summary:Ln(n),details:Bn(n)})}function hs(e){let{req:t}=e;return{kind:`request.started`,requestId:t.meta?.requestId??A().requestId,command:t.command,summary:`Started ${t.command}`}}function gs(e){let{req:t,response:n,durationMs:r}=e;if(n.ok){let e=qn(t,n.data);return{kind:`request.finished`,requestId:t.meta?.requestId??A().requestId,command:t.command,status:`ok`,summary:e.summary??`Finished ${t.command}`,details:{durationMs:r,...e.details}}}return{kind:`request.finished`,requestId:t.meta?.requestId??A().requestId,command:t.command,status:`error`,summary:`Failed ${t.command}: ${n.error.code}`,details:{durationMs:r,code:n.error.code,diagnosticId:n.error.diagnosticId}}}function _s(e,t={}){let n=ys(t.cursor),r=bs(t.limit),i=Wo(e);Xo(n,i.earliestCursor);let a=vs(i.files,n,r),o=a.lines.flatMap(e=>{let t=xs(e);return t?[t]:[]});return{path:e,cursor:String(n),limit:r,events:o,...a.nextCursor===void 0?{}:{nextCursor:String(a.nextCursor)}}}function vs(e,t,n){let r=[],i;for(let a of e){let e=a.firstLineIndex;if(No(a.path,a=>{if(e>=t+n)return i=t+n,!1;e>=t&&r.push(a),e+=1}),i!==void 0)break}return{lines:r,...i===void 0?{}:{nextCursor:i}}}function ys(e){if(e===void 0||e.trim()===``)return 0;let t=Number(e);if(Number.isInteger(t)&&t>=0)return t;throw new a(`INVALID_ARGS`,`events cursor must be a non-negative integer string.`)}function bs(e){if(e===void 0||typeof e==`string`&&e.trim()===``)return 100;let t=typeof e==`string`?Number(e):e;if(Number.isInteger(t)&&t>=1&&t<=500)return t;throw new a(`INVALID_ARGS`,`events limit must be between 1 and 500.`)}function xs(e){try{let t=Ss(JSON.parse(e));return t?Cs(t):void 0}catch{return}}function Ss(e){if(de(e)&&e.version===1&&typeof e.ts==`string`&&typeof e.session==`string`&&ws(e.kind))return e}function Cs(e){let t=de(e.details)?e.details:void 0;return{version:1,ts:e.ts,session:e.session,kind:e.kind,...typeof e.requestId==`string`?{requestId:e.requestId}:{},...typeof e.command==`string`?{command:e.command}:{},...Ts(e.status)?{status:e.status}:{},...typeof e.summary==`string`?{summary:e.summary}:{},...t?{details:t}:{}}}function ws(e){return e===`request.started`||e===`request.finished`||e===`action.recorded`}function Ts(e){return e===`ok`||e===`error`}const Es=36e5;var Ds=class{sessions=new Map;acceptingSessions=!0;runtimeHints=new Map;sessionsDir;scriptWriter;constructor(e){this.sessionsDir=e,this.scriptWriter=new so(e)}get(e){return this.sessions.get(e)?.current}closeAdmission(){this.acceptingSessions=!1}assertAdmissionOpen(e){if(!this.acceptingSessions)throw new a(`COMMAND_FAILED`,`Daemon is shutting down`,{reason:`daemon_shutting_down`,session:e})}assertPublishable(e){if(this.assertAdmissionOpen(e),this.sessions.has(e))throw new a(`COMMAND_FAILED`,`Session address is already occupied`,{reason:`session_address_occupied`,session:e})}publish(e,t){this.assertPublishable(e);let n={current:t};return this.sessions.set(e,n),this.clearIdleExpiryTombstone(e),this.captureRef(e,n)}resolveCurrent(e){let t=this.sessions.get(e.address);return t===e.lifetime?t.current:void 0}refresh(e){let t=this.sessions.get(e.address);return t===e.lifetime?this.captureRef(e.address,t):e}requireCurrent(e){let t=this.resolveCurrent(e);if(!t)throw new a(`COMMAND_FAILED`,`Session lifetime has ended`,{reason:`session_lifetime_ended`,session:e.address,hint:`Open a new session before retrying the command.`});return t}update(e,t){let n=this.requireCurrent(e),r=this.sessions.get(e.address),i=typeof t==`function`?t(n):t,a={...n,...i};return r.current=a,a}retire(e){return this.resolveCurrent(e)?(this.runtimeHints.delete(e.address),this.sessions.delete(e.address)):!1}captureRef(e,t){return Object.freeze({address:e,session:t.current,lifetime:t})}*values(){for(let e of this.sessions.values())yield e.current}toArray(){return Array.from(this.values())}lookup(e){let t=this.sessions.get(e);return t?this.captureRef(e,t):void 0}findByDevice(e){for(let[t,n]of this.sessions)if(n.current.device.id===e)return this.captureRef(t,n)}listRefs(){return Array.from(this.sessions,([e,t])=>this.captureRef(e,t))}getRuntimeHints(e){return this.runtimeHints.get(e)}setRuntimeHints(e,t){t?this.runtimeHints.set(e,t):this.runtimeHints.delete(e)}clearRuntimeHints(e){return this.requireCurrent(e),this.runtimeHints.delete(e.address)}recordAction(e,t){let n=Na(this.requireCurrent(e),t);n&&ms(this.resolveEventLogPath(e.address),e.address,n)}recordEvent(e,t){us(this.resolveEventLogPath(e),e,t)}readEvents(e,t={}){return _s(this.resolveEventLogPath(e),t)}async flushEvents(e){await ds(e?this.resolveEventLogPath(e):void 0)}writeSessionLog(e,t){let n=this.requireCurrent(e),r=this.scriptWriter.write(n,t);return r.written&&j({level:`info`,phase:`session_script_written`,data:{session:n.name,path:r.path}}),r}finalizeRepairTeardown(e){let t=this.resolveCurrent(e);if(!t)return;this.recordRepairFinalizeCloseIfCommitting(e);let n=this.writeSessionLog(e,{force:Zi(t,void 0)});oa(t)&&(!n.written&&n.error?this.writeRepairTombstone(e,Es,{code:String(n.error.code),message:n.error.message}):this.writeRepairTombstone(e))}recordRepairFinalizeCloseIfCommitting(e){let t=this.requireCurrent(e);Ei(t.scriptPublication??R)&&this.recordAction(e,{command:`close`,positionals:[],flags:{},result:{session:t.name,...y(`Closed: ${t.name}`)}})}writeRepairTombstone(e,t=Es,n){let r=this.resolveCurrent(e);if(r)try{let i=this.resolveSessionDir(e.address);I.mkdirSync(i,{recursive:!0});let a={owner:e.address,reapedAt:Date.now(),expiresAt:Date.now()+t,...ca(r)?{sourcePath:ca(r)}:{},...n?{commitFailure:n}:{}};I.writeFileSync(this.repairTombstonePath(e.address),`${JSON.stringify(a)}\n`)}catch(t){j({level:`warn`,phase:`repair_tombstone_write_failed`,data:{session:e.address,error:t instanceof Error?t.message:String(t)}})}}readRepairTombstone(e){return Nn(this.repairTombstonePath(e),e)}clearRepairTombstone(e){An(this.repairTombstonePath(e),e)}noteSessionActivity(e,t=Date.now()){let n=this.get(e);n&&(n.lastActivityAtMs=t)}writeIdleExpiryTombstone(e,t){try{I.mkdirSync(this.resolveSessionDir(e),{recursive:!0}),I.writeFileSync(qa(this.resolveSessionDir(e)),`${JSON.stringify(t)}\n`)}catch(t){j({level:`warn`,phase:`idle_expiry_tombstone_write_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}readIdleExpiryTombstone(e){if(!an(e))return;let t=Ja(qa(this.resolveSessionDir(e)));return t?.owner===e?t:void 0}clearIdleExpiryTombstone(e){try{I.rmSync(qa(this.resolveSessionDir(e)),{force:!0})}catch(t){j({level:`warn`,phase:`idle_expiry_tombstone_clear_failed`,data:{session:e,error:t instanceof Error?t.message:String(t)}})}}repairTombstonePath(e){return kn(this.resolveSessionDir(e))}defaultTracePath(e){let t=un(e.name),n=new Date().toISOString().replaceAll(/[:.]/g,`-`);return L.join(this.sessionsDir,`${t}-${n}.trace.log`)}resolveSessionDir(e){return dn(this.sessionsDir,e)}resolveDaemonStateDir(){return L.dirname(this.sessionsDir)}ensureSessionDir(e){let t=this.resolveSessionDir(e);return I.mkdirSync(t,{recursive:!0}),t}resolveAppLogPath(e){return en(this.sessionsDir,e)}resolveAppLogPidPath(e){return ln(this.sessionsDir,e)}resolveEventLogPath(e){return cs(this.resolveSessionDir(e))}};function Os(e){switch(e){case`INVALID_ARGS`:return 400;case`UNAUTHORIZED`:return 401;case`SESSION_NOT_FOUND`:case`REPAIR_SESSION_EXPIRED`:return 404;default:return 500}}function V(e,t){e.statusCode=Os(t.code),e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.message,code:t.code}))}function ks(e,t){if(e.headersSent){e.destroy(t);return}let n=s(t);e.statusCode=Os(n.code),e.end(n.message)}function As(e,t){return new a(`COMMAND_FAILED`,`${e.label} not found or expired: ${t}`,{reason:`RESOURCE_EXPIRED`,hint:e.expiredHint})}function js(e,t,n,r){let i=e.get(t);if(!i)throw As(r,t);if(i.tenantId&&i.tenantId!==n)throw new a(`UNAUTHORIZED`,`${r.label} ${r.plural?`belong`:`belongs`} to a different tenant`);return i}const Ms=9e5,Ns={label:`Artifact`,expiredHint:`Downloadable artifacts are removed after download or after ${Ms/6e4} minutes. Re-run the command that produced the artifact and download it again.`},Ps=new Map;function Fs(e){let t=F.randomUUID(),n=Date.now(),r=setTimeout(()=>{qs(t)},Ms);return r.unref(),Ps.set(t,{artifactPath:e.artifactPath,tenantId:e.tenantId,artifactType:e.artifactType,fileName:e.fileName,...e.displayRotation===void 0?{}:{displayRotation:e.displayRotation},deleteAfterDownload:e.deleteAfterDownload!==!1,createdAt:n,timer:r}),t}async function Is(e,t){let{entry:n,stat:r}=zs(e,t),i=await Bs(e,n,r);if(!i)throw new a(`COMMAND_FAILED`,`Artifact path is not a regular file or directory: ${n.artifactPath}`);return i}async function Ls(e){let t=[];for(let[n,r]of Ps){if(!Ws(r,e))continue;let i;try{i=I.statSync(r.artifactPath)}catch{qs(n);continue}let a=await Rs(n,r,i);a&&t.push({id:n,...r.artifactType===void 0?{}:{artifactType:r.artifactType},filename:a.fileName??n,mimeType:a.mimeType,sizeBytes:a.sizeBytes,createdAt:new Date(r.createdAt).toISOString(),expiresAt:new Date(r.createdAt+Ms).toISOString(),...r.displayRotation===void 0?{}:{displayRotation:r.displayRotation}})}return t}async function Rs(e,t,n){try{return await Bs(e,t,n)}catch{return null}}function zs(e,t){let n=js(Ps,e,t,Ns),r;try{r=I.statSync(n.artifactPath)}catch{throw qs(e),new a(`COMMAND_FAILED`,`Artifact file is missing: ${n.artifactPath}`)}return{entry:n,stat:r}}async function Bs(e,t,n){if(n.isFile())return{artifactPath:t.artifactPath,fileName:Gs(t.fileName,e),mimeType:`application/octet-stream`,sizeBytes:n.size};if(!n.isDirectory())return null;let r=await Vs(e,t);return{artifactPath:r.archivePath,fileName:r.fileName,mimeType:`application/gzip`,sizeBytes:r.sizeBytes}}async function Vs(e,t){if(t.directoryArchive&&I.existsSync(t.directoryArchive.archivePath))return t.directoryArchive;if(t.directoryArchivePromise)return await t.directoryArchivePromise;let n=Hs(e,t);t.directoryArchivePromise=n;try{return await n}finally{t.directoryArchivePromise===n&&(t.directoryArchivePromise=void 0)}}async function Hs(e,t){Js(t);let n=Us(Gs(t.fileName,L.basename(t.artifactPath)||e)),r=I.mkdtempSync(L.join(ai.tmpdir(),`agent-device-download-${F.randomUUID()}-`)),i=L.join(r,n);try{await Bt(`tar`,[`czf`,i,`-C`,L.dirname(t.artifactPath),`--`,L.basename(t.artifactPath)],{env:{...process.env,COPYFILE_DISABLE:`1`}});let a={archivePath:i,tempDir:r,fileName:n,sizeBytes:I.statSync(i).size};if(Ps.get(e)!==t)throw I.rmSync(r,{recursive:!0,force:!0}),As(Ns,e);return t.directoryArchive=a,a}catch(e){throw I.rmSync(r,{recursive:!0,force:!0}),e instanceof a?e:new a(`COMMAND_FAILED`,`Failed to archive downloadable artifact: ${t.artifactPath}`,{artifactPath:t.artifactPath},e instanceof Error?e:void 0)}}function Us(e){let t=e.toLowerCase();return t.endsWith(`.tar.gz`)||t.endsWith(`.tgz`)?e:`${e}.tar.gz`}function Ws(e,t){return!e.tenantId||e.tenantId===t}function Gs(e,t){let n=e?.trim();return n&&!Ks(n)?n:t}function Ks(e){return e.includes(`/`)||e.includes(`\\`)||e.includes(`\0`)||e.includes(`\r`)||e.includes(`
5
+ `)}function qs(e){let t=Ps.get(e);if(t&&(clearTimeout(t.timer),Ps.delete(e),Js(t),t.deleteAfterDownload))try{I.rmSync(t.artifactPath,{recursive:!0,force:!0})}catch{}}function Js(e){if(e.directoryArchive)try{I.rmSync(e.directoryArchive.tempDir,{recursive:!0,force:!0})}catch{}finally{e.directoryArchive=void 0}}const Ys=3e5,Xs={label:`Uploaded artifact`,expiredHint:`Uploaded artifacts expire ${Ys/6e4} minutes after upload. Upload the file again and retry with the new upload id.`},Zs=new Map;function Qs(e){let t=F.randomUUID(),n=setTimeout(()=>{ec(t)},Ys);return n.unref(),Zs.set(t,{artifactPath:e.artifactPath,tempDir:e.tempDir,tenantId:e.tenantId,timer:n}),t}function $s(e,t){let n=js(Zs,e,t,Xs);return clearTimeout(n.timer),n.artifactPath}function ec(e){let t=Zs.get(e);t&&(clearTimeout(t.timer),Zs.delete(e),I.rmSync(t.tempDir,{recursive:!0,force:!0}))}async function tc(e){let t=L.join(e.tempDir,`extracted`),n=``,r=await nc(e.archivePath);await Cn({archivePath:e.archivePath,outputRoot:t,type:r,validateManifest:t=>{n=rc(t,e.platform,e.expectedRootName)}});let i=L.join(t,n);if(!I.existsSync(i))throw I.rmSync(t,{recursive:!0,force:!0}),new a(`INVALID_ARGS`,`Expected extracted bundle "${n}" not found in archive`);return i}async function nc(e){let t=await I.promises.open(e,`r`);try{let e=Buffer.alloc(2),{bytesRead:n}=await t.read(e,0,e.length,0);return n===e.length&&e[0]===31&&e[1]===139?`tgz`:`tar`}finally{await t.close()}}function rc(e,t,n){if(e.length===0)throw new a(`INVALID_ARGS`,`Uploaded app bundle archive is empty`);let r=new Set(e.map(e=>e.name.split(`/`)[0]).filter(e=>!!e)),i=n??ic([...r],t);if(!r.has(i))throw new a(`INVALID_ARGS`,`Uploaded archive must contain a top-level "${i}" bundle`);for(let t of e)if(t.name!==i&&!t.name.startsWith(`${i}/`))throw new a(`INVALID_ARGS`,`Archive entry must stay inside top-level "${i}" bundle: ${t.name}`);return i}function ic(e,t){if(t===`ios`){let t=e.filter(e=>e.toLowerCase().endsWith(`.app`));if(t.length===1)return t[0];throw t.length===0?new a(`INVALID_ARGS`,`iOS app bundle archives must contain a single top-level .app directory`):new a(`INVALID_ARGS`,`iOS app bundle archives must contain exactly one top-level .app directory, found: ${t.join(`, `)}`)}if(e.length===1)return e[0];throw new a(`INVALID_ARGS`,`Archive must contain a single top-level bundle, found: ${e.join(`, `)}`)}const ac=6e4;function oc(e){let t=e.trim(),n=L.basename(t);if(!n||n===`.`||n===`..`)throw new a(`INVALID_ARGS`,`Invalid artifact filename: ${e}`);return n}function sc(e){let t=dc(e);return I.mkdtempSync(L.join(ai.tmpdir(),`agent-device-artifact-${t}-`))}function cc(e){if(e===void 0)return;let t=String(e);if(!/^\d+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let n=Number(t);if(!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`Invalid content-length header`);if(n>2147483648)throw new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${Sn} bytes`)}function lc(e,t){return new Promise((n,r)=>{let i=!1,o,s=I.createWriteStream(t),c=e=>{if(!i){if(i=!0,o&&clearTimeout(o),e){uc(s,t).finally(()=>r(e));return}n()}},l=()=>{o&&clearTimeout(o),o=setTimeout(()=>{let t=new a(`COMMAND_FAILED`,`Artifact transfer timed out due to inactivity`,{timeoutMs:ac});`destroy`in e&&typeof e.destroy==`function`&&e.destroy(t),u.destroy(t),c(t)},ac)},u=wn({maxBytes:Sn,createLimitError:()=>new a(`INVALID_ARGS`,`Upload exceeds maximum size of ${Sn} bytes`)});u.on(`data`,l),e.on(`aborted`,()=>{c(new a(`COMMAND_FAILED`,`Artifact transfer was interrupted`))}),l(),si(e,u,s).then(()=>c(),e=>c(e))})}async function uc(e,t){if(e.destroy(),!e.closed)try{await di(e,`close`)}catch{}await I.promises.rm(t,{force:!0}).catch(()=>{})}function dc(e){let t=e?.trim();if(!t)return`request`;let n=t.replaceAll(/[^a-zA-Z0-9._-]+/g,`-`).replaceAll(/^-+|-+$/g,``);return n.length>0?n.slice(0,48):`request`}function fc(e,t){let n=Array.isArray(e)?e[0]:e;if(!n)return;let r=n.match(/^bytes (\d+)-(\d+)\/(\d+)$/);r||mc();let i=Number(r[1]),a=Number(r[2]),o=Number(r[3]);return(!Number.isSafeInteger(i)||!Number.isSafeInteger(a)||!Number.isSafeInteger(o)||i<0||a<i||a>=o||o<1||o!==t)&&mc(),{start:i,end:a,size:o,span:a-i+1}}function pc(e){if(e===void 0)return;if(!/^\d+$/.test(e))throw new a(`INVALID_ARGS`,`Invalid content-length header`);let t=Number(e);if(!Number.isSafeInteger(t)||t<0)throw new a(`INVALID_ARGS`,`Invalid content-length header`);return t}function mc(){throw new a(`INVALID_ARGS`,`Invalid content-range header`)}async function hc(e){let t=await _c(e.entry),n=fc(e.req.headers[`content-range`],e.entry.sizeBytes);if(n&&n.start!==t||!n&&t>0)return{complete:!1,offset:t,appended:!1};let r=e.entry.sizeBytes-t,i=n?.span??r,o=pc(e.req.headers[`content-length`]);if(o!==void 0&&o>i)throw new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`);if(n&&o!==void 0&&o!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);let s=wn({maxBytes:i,createLimitError:()=>new a(`INVALID_ARGS`,`Upload chunk exceeds its permitted byte range`)});try{if(await si(e.req,s,I.createWriteStream(e.entry.payloadPath,{flags:`a`})),n&&s.bytesSeen!==n.span)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-range`);if(o!==void 0&&s.bytesSeen!==o)throw new a(`INVALID_ARGS`,`Upload chunk length does not match content-length`)}catch(n){throw await vc(e.entry.payloadPath,t,n,e.invalidate),n}let c=await _c(e.entry);return{complete:c===e.entry.sizeBytes,offset:c,appended:c>t}}async function gc(e){let t=F.createHash(`sha256`);for await(let n of I.createReadStream(e))t.update(n);return t.digest(`hex`)}async function _c(e){let t=(await I.promises.stat(e.payloadPath).catch(e=>{if(e.code!==`ENOENT`)throw e}))?.size??0;if(t>e.sizeBytes)throw new a(`COMMAND_FAILED`,`Upload state is corrupt`,{reason:`UPLOAD_STATE_CORRUPT`});return t}async function vc(e,t,n,r){try{await I.promises.truncate(e,t)}catch(e){let t=new a(`COMMAND_FAILED`,`Upload rollback failed; the upload ticket was invalidated`,{reason:`UPLOAD_ROLLBACK_FAILED`,originalError:String(n)},e);throw await r(t),t}}const yc=3e5,bc={label:`Upload`,expiredHint:`Resumable uploads expire ${yc/6e4} minutes after the last received chunk. Start the upload again from the beginning.`},xc=new Map,Sc=new Map;function Cc(e){Ic(e);let t=Lc(e),n=Sc.get(t),r=(n?xc.get(n):void 0)??Ec(e,t);return{uploadId:r.id,cacheHit:!1,upload:{url:new URL(`upload/direct/${r.id}`,e.baseUrl.endsWith(`/`)?e.baseUrl:`${e.baseUrl}/`).toString(),headers:{...e.tokenHeaders,"content-type":e.contentType||`application/octet-stream`}}}}async function wc(e){let t=Fc(e.uploadId,e.tenantId);return await kc(t,`receive`,e.req,async()=>{let{appended:n,...r}=await hc({entry:t,req:e.req,invalidate:async()=>await Nc(t)});return n&&!t.closed&&Dc(t),r})}async function Tc(e,t){let n=Fc(e,t);return await kc(n,`finalize`,void 0,async()=>{let t=I.statSync(n.payloadPath).size;if(t!==n.sizeBytes)throw new a(`INVALID_ARGS`,`Upload is incomplete`,{uploadId:e,offset:t,sizeBytes:n.sizeBytes});try{let t=await gc(n.payloadPath);if(t!==n.sha256)throw new a(`INVALID_ARGS`,`Upload hash mismatch`,{uploadId:e,expectedSha256:n.sha256,actualSha256:t});let r=await Ac(n);return jc(n),{artifactPath:r,tempDir:n.tempDir}}catch(e){throw await Mc(n,e)}})}function Ec(e,t){let n=F.randomUUID(),r=sc(`upload`),i=L.join(r,`payload`);I.writeFileSync(i,``);let a={id:n,key:t,tempDir:r,payloadPath:i,fileName:oc(e.fileName),sizeBytes:e.sizeBytes,sha256:e.sha256.toLowerCase(),artifactType:e.artifactType,platform:e.platform,tenantId:e.tenantId,generation:0,tail:Promise.resolve(),closed:!1,finalized:!1};return xc.set(n,a),Sc.set(t,n),Dc(a),a}function Dc(e){e.timer&&clearTimeout(e.timer),e.generation+=1;let t=e.generation;e.timer=setTimeout(()=>Oc(e,t),yc),e.timer.unref()}function Oc(e,t){if(e.generation!==t||e.closed)return;Pc(e);let n=e.activeReceive;n?.once(`error`,()=>{}),n?.destroy(new a(`COMMAND_FAILED`,`Upload expired while receiving data`,{reason:`RESOURCE_EXPIRED`})),e.tail=e.tail.then(async()=>{e.finalized||await I.promises.rm(e.tempDir,{recursive:!0,force:!0})}).catch(()=>{})}async function kc(e,t,n,r){let i=e.tail.catch(()=>{}).then(async()=>{e.closed&&Fc(e.id,e.tenantId),t===`receive`&&(e.activeReceive=n);try{return await r()}finally{t===`receive`&&(e.activeReceive=void 0)}});return e.tail=i.then(()=>{},()=>{}),await i}async function Ac(e){if(e.artifactType===`file`){let t=L.join(e.tempDir,e.fileName);return await I.promises.rename(e.payloadPath,t),t}let t=await tc({archivePath:e.payloadPath,tempDir:e.tempDir,platform:e.platform===`android`?`android`:`ios`,expectedRootName:e.fileName});return await I.promises.rm(e.payloadPath,{force:!0}),t}function jc(e){e.finalized=!0,Pc(e)}async function Mc(e,t){Pc(e);try{return await I.promises.rm(e.tempDir,{recursive:!0,force:!0}),t}catch(e){return new a(`COMMAND_FAILED`,`Upload finalize cleanup failed`,{reason:`UPLOAD_FINALIZE_CLEANUP_FAILED`,originalError:String(t)},e)}}async function Nc(e){Pc(e),await I.promises.rm(e.tempDir,{recursive:!0,force:!0}).catch(()=>{})}function Pc(e){e.closed=!0,e.timer&&clearTimeout(e.timer),xc.delete(e.id),Sc.delete(e.key)}function Fc(e,t){return js(xc,e,t,bc)}function Ic(e){if(!/^[a-f0-9]{64}$/i.test(e.sha256))throw new a(`INVALID_ARGS`,`Invalid upload sha256`);if(!Number.isSafeInteger(e.sizeBytes)||e.sizeBytes<0)throw new a(`INVALID_ARGS`,`Invalid upload sizeBytes`);if(cc(String(e.sizeBytes)),oc(e.fileName),!e.uploadAttemptId.trim())throw new a(`INVALID_ARGS`,`uploadAttemptId is required`)}function Lc(e){return[e.tenantId??``,e.uploadAttemptId,e.sha256.toLowerCase(),String(e.sizeBytes),oc(e.fileName),e.artifactType,e.platform??``].join(`\0`)}async function Rc(e){let t=e.headers[`x-artifact-type`],n=e.headers[`x-artifact-filename`];if(!t||!n)throw new a(`INVALID_ARGS`,`Missing required headers: x-artifact-type and x-artifact-filename`);if(t!==`file`&&t!==`app-bundle`)throw new a(`INVALID_ARGS`,`Invalid x-artifact-type: ${t}. Must be "file" or "app-bundle".`);cc(e.headers[`content-length`]);let r=oc(n),i=sc(`upload`);try{if(t===`file`){let t=L.join(i,r);return await lc(e,t),{artifactPath:t,tempDir:i}}let n=L.join(i,`artifact.tar`);await lc(e,n);let a=await tc({archivePath:n,tempDir:i,platform:`ios`,expectedRootName:r});return I.rmSync(n,{force:!0}),{artifactPath:a,tempDir:i}}catch(e){throw I.rmSync(i,{recursive:!0,force:!0}),e}}function zc(e){let{req:t,res:n,authorize:r,token:i}=e,a=Vc(t);return a!==null&&(Bc(a,t,n,r,i),!0)}async function Bc(e,t,n,r,i){switch(e.kind){case`preflight`:await Uc(t,n,r,i);return;case`direct`:await Wc(e.uploadId,t,n,r);return;case`finalize`:await Gc(t,n,r);return;case`upload`:await Hc(t,n,r);return}}function Vc(e){return e.method===`POST`&&e.url===`/upload/preflight`?{kind:`preflight`}:e.method===`PUT`&&e.url?.startsWith(`/upload/direct/`)?{kind:`direct`,uploadId:e.url.slice(15).replace(/\?.*$/,``)}:e.method===`POST`&&e.url===`/upload/finalize`?{kind:`finalize`}:e.method===`POST`&&e.url===`/upload`?{kind:`upload`}:null}async function Hc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[]}});if(!r)return;qc(t,await Rc(e),r.tenantId)}catch(e){V(t,s(e))}}async function Uc(e,t,n,r){try{let i=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`preflight`]}});if(!i)return;let a=Yc(await Jc(e,65536));Kc(t,{ok:!0,...Cc({baseUrl:nl(e),tokenHeaders:tl(r),...a,tenantId:i.tenantId})})}catch(e){V(t,s(e))}}async function Wc(e,t,n,r){try{let i=await r({req:t,res:n,daemonRequest:{command:`upload`,positionals:[`direct`,e]}});if(!i)return;let a=await wc({uploadId:e,req:t,tenantId:i.tenantId});if(a.complete){n.statusCode=200,n.end(`ok`);return}n.statusCode=308,a.offset>0&&n.setHeader(`range`,`bytes=0-${a.offset-1}`),n.setHeader(`x-upload-offset`,String(a.offset)),n.end()}catch(e){V(n,s(e))}}async function Gc(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`upload`,positionals:[`finalize`]}});if(!r)return;qc(t,await Tc(Xc(await Jc(e,65536)).uploadId,r.tenantId),r.tenantId)}catch(e){V(t,s(e))}}function Kc(e,t){e.statusCode=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function qc(e,t,n){Kc(e,{ok:!0,uploadId:Qs({artifactPath:t.artifactPath,tempDir:t.tempDir,tenantId:n})})}async function Jc(e,t){let n=(await Qt(e,t,`Request body is too large.`)).toString(`utf8`);try{let e=JSON.parse(n);if(!e||typeof e!=`object`||Array.isArray(e))throw Error(`expected object`);return e}catch(e){throw new a(`INVALID_ARGS`,`Invalid JSON request body`,{},e)}}function Yc(e){return{sha256:Zc(e,`sha256`),uploadAttemptId:Zc(e,`uploadAttemptId`),fileName:Zc(e,`fileName`),sizeBytes:$c(e,`sizeBytes`),artifactType:el(e),platform:Qc(e,`platform`),contentType:Qc(e,`contentType`)}}function Xc(e){return{uploadId:Zc(e,`uploadId`)}}function Zc(e,t){let n=Qc(e,t)?.trim();if(!n)throw new a(`INVALID_ARGS`,`${t} is required`);return n}function Qc(e,t){let n=e[t];return typeof n==`string`?n:void 0}function $c(e,t){let n=e[t];if(typeof n!=`number`||!Number.isSafeInteger(n))throw new a(`INVALID_ARGS`,`${t} must be an integer`);return n}function el(e){let t=Zc(e,`artifactType`);if(t===`file`||t===`app-bundle`)return t;throw new a(`INVALID_ARGS`,`artifactType must be "file" or "app-bundle"`)}function tl(e){return{authorization:`Bearer ${e}`,"x-agent-device-token":e}}function nl(e){let t=typeof e.headers.host==`string`?e.headers.host:``;if(!t)throw new a(`INVALID_ARGS`,`Missing host header`);let n=e.headers[`x-forwarded-proto`];return`${(Array.isArray(n)?n[0]:n)||`http`}://${t}`}function rl(e){try{return decodeURIComponent(e)}catch{return``}}function il(e){let{req:t,res:n,authorize:r,retainArtifacts:i}=e,a=ol(t);return a!==null&&(al(a,t,n,r,{retainArtifacts:i}),!0)}async function al(e,t,n,r,i){switch(e.kind){case`inventory`:await cl(t,n,r);return;case`download`:await sl(e.artifactId,t,n,r,i);return}}function ol(e){if(e.method!==`GET`)return null;let t=ul(e.url);return t===`/artifacts`||t===`/artifacts/`?{kind:`inventory`}:t.startsWith(`/artifacts/`)?{kind:`download`,artifactId:ll(t)}:null}async function sl(e,t,n,r,i){if(!e){n.statusCode=400,n.end(`Missing artifact id`);return}try{let a=await r({req:t,res:n,daemonRequest:{command:`download_artifact`,positionals:[e]}});if(!a)return;let o=await Is(e,a.tenantId),s=i.retainArtifacts===!0,c=I.createReadStream(o.artifactPath);n.statusCode=200,n.setHeader(`content-type`,o.mimeType),n.setHeader(`content-length`,String(o.sizeBytes)),o.fileName&&n.setHeader(`content-disposition`,`attachment; filename="${o.fileName.replace(/"/g,``)}"`),c.on(`error`,e=>{ks(n,e)});let l=!1,u=()=>{l||s||(l=!0,qs(e))},d=0;c.on(`data`,e=>{d+=e.length,d>=o.sizeBytes&&u()}),c.on(`end`,u),n.on(`finish`,u),n.on(`close`,()=>{n.writableFinished&&u()}),c.pipe(n)}catch(e){V(n,s(e))}}async function cl(e,t,n){try{let r=await n({req:e,res:t,daemonRequest:{command:`list_artifacts`,positionals:[]}});if(!r)return;t.statusCode=200,t.setHeader(`content-type`,`application/json`),t.end(JSON.stringify({artifacts:await Ls(r.tenantId)}))}catch(e){V(t,s(e))}}function ll(e){let t=e.slice(11);return!t||t.includes(`/`)?``:rl(t)}function ul(e){let t=e||`/`,n=t.indexOf(`?`);return n>=0?t.slice(0,n)||`/`:t}function dl(e,t){return fl(e,t)?t:`${e}:${t}`}function fl(e,t){return t.startsWith(`${e}:`)}function pl(e,t){return!e.partitioned||fl(e.tenant,t)}const ml=[``,`sessions`,null,`requests`,null,`diagnostics`];function hl(e){let t=gl(e.req);return t!==null&&(_l(t,e),!0)}function gl(e){if(e.method!==`GET`)return null;let t=(e.url??``).split(`?`,1)[0].split(`/`);return t.length!==ml.length||!ml.every((e,n)=>e===null||t[n]===e)?null:{session:rl(t[2]??``),requestId:rl(t[4]??``)}}async function _l(e,t){let{req:n,res:r,authorize:i,resolveRecordPath:o}=t;try{if(!an(e.session)||!an(e.requestId)){V(r,s(new a(`INVALID_ARGS`,`Invalid session or request id in diagnostics route`)));return}let t=await i({req:n,res:r,daemonRequest:{command:`request_diagnostics`,positionals:[e.session,e.requestId]}});if(!t)return;if(t.sessionNamespace&&!pl(t.sessionNamespace,e.session)){V(r,s(new a(`UNAUTHORIZED`,`Session is outside this tenant`,{session:e.session})));return}let c=o(e),l=await vl(c);if(!l){V(r,s(new a(`SESSION_NOT_FOUND`,`No diagnostics record for request ${e.requestId} in session ${e.session}`,{hint:`The daemon keeps a request record only for the session it ran in; re-run the command against this daemon to produce a fresh one.`})));return}let u=I.createReadStream(c);r.statusCode=200,r.setHeader(`content-type`,`application/x-ndjson`),r.setHeader(`content-length`,String(l.size)),u.on(`error`,e=>{ks(r,e)}),u.pipe(r)}catch(e){V(r,s(e))}}async function vl(e){try{let t=await I.promises.stat(e);return t.isFile()?t:null}catch{return null}}function yl(e){return(e??``).trim().toLowerCase()===`tenant`?`tenant`:`none`}function bl(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}const xl=`default`;function Sl(e){let t=Number.isInteger(e.defaultLeaseTtlMs)?Math.max(1,Number(e.defaultLeaseTtlMs)):6e4,n=Number.isInteger(e.minLeaseTtlMs)?Math.max(1,Number(e.minLeaseTtlMs)):Ie,r=Number.isInteger(e.maxLeaseTtlMs)?Math.max(n,Number(e.maxLeaseTtlMs)):6e5;return e=>{if(!Number.isInteger(e))return t;let i=Number(e);if(i<n||i>r)throw new a(`INVALID_ARGS`,`Lease ttlMs must be between ${n} and ${r}.`);return i}}function Cl(e){if(!e)return;let t=e.trim();if(t&&/^[a-zA-Z0-9._-]{1,128}$/.test(t))return t}function wl(e){if(!e)return;let t=e.trim();if(t&&/^[a-f0-9]{16,128}$/i.test(t))return t.toLowerCase()}function Tl(e){let t=wl(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid lease id.`);return t}function El(e){let t=(e??``).trim().toLowerCase();if(!t)return`ios-simulator`;let n=_.find(e=>e===t);if(n)return n;throw new a(`INVALID_ARGS`,`Unsupported lease backend: ${e??``}`)}function Dl(e){if(e===void 0)return;let t=e.trim();if(!t||t.length>256||!/^[\u0020-\u007E]+$/.test(t))throw new a(`INVALID_ARGS`,`Invalid device key. Use 1-256 printable characters.`);return t}function Ol(e){return Al(e,`client id`,128)}function kl(e){return Al(e,`lease provider`,64)}function Al(e,t,n){if(e===void 0)return;let r=e.trim();if(!r||r.length>n||!/^[a-zA-Z0-9._-]+$/.test(r))throw new a(`INVALID_ARGS`,`Invalid ${t}. Use 1-${String(n)} chars: letters, numbers, dot, underscore, hyphen.`);return r}function jl(e){let t=bl(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Ml(e){let t=Cl(e);if(!t)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Nl(e){return{backend:El(e.leaseBackend),leaseProvider:kl(e.leaseProvider),deviceKey:Dl(e.deviceKey),clientId:Ol(e.clientId),tenantId:jl(e.tenantId),runId:Ml(e.runId),ttlMs:e.ttlMs,retainOnClose:e.retainOnClose}}function Pl(e){return!!(e.leaseProvider??e.deviceKey??e.clientId)}function Fl(e,t){return!t.tenantId||!t.runId?!1:[[e.leaseProvider,t.leaseProvider],[e.deviceKey,t.deviceKey],[e.clientId,t.clientId]].every(([e,t])=>!e||!!t)}function Il(e,t){let n=Rl(t);if(n.tenantId&&e.tenantId!==n.tenantId||n.runId&&e.runId!==n.runId||n.leaseBackend&&e.backend!==n.leaseBackend||n.leaseProvider&&e.leaseProvider!==n.leaseProvider||n.deviceKey&&e.deviceKey!==n.deviceKey||n.clientId&&e.clientId!==n.clientId)throw new a(`UNAUTHORIZED`,`Lease does not match tenant/run scope`,{reason:`LEASE_SCOPE_MISMATCH`})}function Ll(e){let t=El(e.leaseBackend),n=bl(e.tenantId);if(!n)throw new a(`INVALID_ARGS`,`tenant isolation requires tenant id.`);let r=Cl(e.runId);if(!r)throw new a(`INVALID_ARGS`,`tenant isolation requires run id.`);let i=wl(e.leaseId);if(!i)throw new a(`INVALID_ARGS`,`tenant isolation requires lease id.`);return{...e,tenantId:n,runId:r,leaseId:i,leaseBackend:t}}function Rl(e){let t=bl(e.tenantId),n=Cl(e.runId);if(e.tenantId&&!t)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(e.runId&&!n)throw new a(`INVALID_ARGS`,`Invalid run id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return{tenantId:t,runId:n,leaseBackend:e.leaseBackend?El(e.leaseBackend):void 0,leaseProvider:kl(e.leaseProvider),deviceKey:Dl(e.deviceKey),clientId:Ol(e.clientId)}}function zl(e,t){if(Pl(e)&&!Fl(e,t))throw new a(`UNAUTHORIZED`,`Lease owner scope is required`,{reason:`LEASE_SCOPE_REQUIRED`})}function Bl(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.backend===t.backend&&e.leaseProvider===t.leaseProvider&&e.deviceKey===t.deviceKey&&e.clientId===t.clientId}function H(e){if(e.deviceKey)return JSON.stringify([e.backend,e.leaseProvider??xl,e.deviceKey])}function Vl(e){return JSON.stringify([e.tenantId,e.runId,e.backend,e.leaseProvider??xl,e.deviceKey??`*`])}function Hl(e,t,n){return{leaseId:F.randomBytes(16).toString(`hex`),tenantId:e.tenantId,runId:e.runId,backend:e.backend,...e.leaseProvider?{leaseProvider:e.leaseProvider}:{},...e.deviceKey?{deviceKey:e.deviceKey}:{},...e.clientId?{clientId:e.clientId}:{},...e.retainOnClose?{retainOnClose:!0}:{},createdAt:n,heartbeatAt:n,expiresAt:n+t}}function Ul(e){return e.expiresAt-e.heartbeatAt}function Wl(e){return new a(`DEVICE_IN_USE`,`Device is already leased`,{reason:`DEVICE_LEASE_BUSY`,deviceKey:e.deviceKey,backend:e.backend,leaseProvider:e.leaseProvider,expiresAt:e.expiresAt,hint:`Retry after the lease expires or close the owning session.`})}function Gl(e){return k({leaseId:e.leaseId,tenantId:e.tenantId,runId:e.runId,leaseBackend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey,clientId:e.clientId})}function Kl(e){let t=Jl(e,`Human-control request body`),n=t.reason;if(n!==void 0&&(typeof n!=`string`||n.trim().length>512))throw new a(`INVALID_ARGS`,`Human-control reason must be at most 512 characters.`);let r=t.ttlMs;if(r!==void 0&&(typeof r!=`number`||!Number.isInteger(r)||r<1e3||r>864e5))throw new a(`INVALID_ARGS`,`Human-control ttlMs must be between 1000 and 86400000.`);return{...t.scope===void 0?{}:{scope:ql(t.scope)},...typeof n==`string`&&n.trim()?{reason:n.trim()}:{},...typeof r==`number`?{ttlMs:r}:{}}}function ql(e){let t=Jl(e,`Host human-control scope`);if(typeof t.backend!=`string`||!t.backend.trim()||typeof t.deviceKey!=`string`)throw new a(`INVALID_ARGS`,`Host human control requires scope.backend and scope.deviceKey.`);if(t.leaseProvider!==void 0&&typeof t.leaseProvider!=`string`)throw new a(`INVALID_ARGS`,`scope.leaseProvider must be a string.`);let n=kl(t.leaseProvider);return{backend:El(t.backend),deviceKey:Dl(t.deviceKey),...n?{leaseProvider:n}:{}}}function Jl(e,t){if(!e||typeof e!=`object`||Array.isArray(e))throw new a(`INVALID_ARGS`,`${t} must be an object.`);return e}function Yl(e){let t=typeof e==`string`?e.trim():``;if(!/^[a-zA-Z0-9._-]{1,128}$/.test(t))throw new a(`INVALID_ARGS`,`Invalid human-control hold id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);return t}function Xl(e){return{...e,scope:{...e.scope}}}function Zl(e){return new a(`DEVICE_IN_USE`,`A human is interacting with this simulator or device; agent interactions are temporarily disabled.`,{reason:`human_control_active`,blockedBy:`human_control`,holdId:e.id,deviceKey:e.scope.deviceKey,pausedAt:new Date(e.createdAt).toISOString(),...e.expiresAt===void 0?{}:{expiresAt:new Date(e.expiresAt).toISOString()},...e.reason?{humanReason:e.reason}:{},hint:`Wait until the human-control hold is released before retrying.`})}function Ql(e){let t=iu(e.req);return t?($l(t,e),!0):!1}async function $l(e,t){let{req:n,res:r,expectedToken:i}=t;try{cu(n,i),await eu(e,t)}catch(e){V(r,s(e))}}async function eu(e,t){switch(e.kind){case`list`:U(t.res,{ok:!0,holds:t.registry.listHumanControlHolds({kind:`host`})});return;case`upsert`:await tu(e.holdId,t);return;case`remove`:nu(e.holdId,t);return;case`unsupported`:ru(t.res);return;case`invalid`:throw new a(`INVALID_ARGS`,`Invalid request URL.`)}}async function tu(e,t){let{req:n,res:r}=t,a=new AbortController,o=()=>{r.writableFinished||a.abort(i())};n.once(`aborted`,o),r.once(`close`,o),(n.aborted||r.destroyed)&&o();try{let i=await su(n);U(r,{ok:!0,hold:await t.registry.putHumanControlHold({kind:`host`},e,i,a.signal),state:`active`})}finally{n.off(`aborted`,o),r.off(`close`,o)}}function nu(e,t){let n=t.registry.removeHumanControlHold({kind:`host`},e);U(t.res,{ok:!0,released:!!n,...n?{hold:n}:{}})}function ru(e){e.statusCode=405,e.setHeader(`allow`,`GET, PUT, DELETE`),U(e,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`})}function iu(e){let t=ou(e.url);return t===null?{kind:`invalid`}:au(t,e.method)}function au(e,t){if(e===`/admin/human-control/holds`)return t===`GET`?{kind:`list`}:{kind:`unsupported`};if(!e.startsWith(`/admin/human-control/holds/`))return null;let n=e.slice(27);return!n||n.includes(`/`)?{kind:`unsupported`}:t===`PUT`?{kind:`upsert`,holdId:n}:t===`DELETE`?{kind:`remove`,holdId:n}:{kind:`unsupported`}}function ou(e){try{return new URL(e??`/`,`http://127.0.0.1`).pathname}catch{return null}}async function su(e){return Kl(await lu(e,`Human-control`))}function cu(e,t){let n=typeof e.headers.authorization==`string`?e.headers.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):``,i=(typeof e.headers[`x-agent-device-token`]==`string`?e.headers[`x-agent-device-token`]:``)||r;if(!i||!hn(i,t))throw new a(`UNAUTHORIZED`,`Invalid token`)}async function lu(e,t){let n=await Qt(e,16384,`${t} request body is too large.`);try{return JSON.parse(n.toString(`utf8`))}catch(e){throw new a(`INVALID_ARGS`,`${t} request body must be valid JSON.`,{},e)}}function U(e,t){e.statusCode||=200,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}const uu=Ct(xt),du=Au(uu);function fu(e){return W(e)?.route??`generic`}function pu(e){return W(e)?.sessionKind}function mu(e){return W(e)?.leaseAdmissionExempt===!0}function hu(e){return W(e)?.appLease===`allowed`}function gu(e){return W(e)?.selectorValidationExempt!==!0}function _u(e){return W(e)?.sessionExecutionLockExempt!==!0}function vu(e){return W(e)?.replayScopedAction===!0}function yu(e){return W(e)?.allowInvalidRecording!==!0}function bu(e){return W(e)?.saveScriptFlagOwner===!0}function xu(){return uu.filter(e=>e.saveScriptFlagOwner===!0).map(e=>e.command).sort()}function Su(e){return W(e)?.lockPolicySelectorOverride===!0}function Cu(e){return W(e)?.androidBlockingDialogGuard===!0}function wu(e){if(e.command===`human_control`||e.command===`lease_heartbeat`)return!1;let t=ht(e);return t===void 0?pu(e.command)!==`observability`&&vt(e.command)!==`observe`:t!==`observes-app`}function Tu(e){return W(e.command)?.preferExplicitDeviceOverExistingSession===!0}function Eu(e){let t=W(e.command)?.allowSessionlessDefaultDevice;return typeof t==`function`&&t(e)}function Du(e){return W(e.command)?.sessionlessLeaseAdmissionExemption?.(e)}function Ou(e){let t=W(e.command)?.refFrameEffect;return typeof t==`function`?t(e):t}function ku(e,t){return t.hasExistingSession?Tu(e)&&t.hasExplicitDeviceIdentity?`explicit-device`:`existing-session`:ju(e)?`skip`:t.hasDeviceSelectionInput?`explicit-device`:Eu(e)?`sessionless-default-device`:`skip`}function W(e){return du.descriptorsByCommand.get(e)}function Au(e){let t=new Map;for(let n of e){if(t.has(n.command))throw Error(`Duplicate daemon command descriptor: ${n.command}`);t.set(n.command,n)}return{descriptorsByCommand:t}}function ju(e){let t=W(e.command);if(t?.route===`lease`)return!0;let n=t?.skipSessionlessProviderDevice;return typeof n==`function`&&n(e)}const Mu=/^[A-Za-z0-9_-]+(?:\.[A-Za-z0-9_-]+)+$/,Nu=/^[1-9][0-9]{0,9}$/;function Pu(e){let t=e?.trim()??``,n=t.lastIndexOf(`@`),r=n<0?t:t.slice(0,n),i=n<0?void 0:t.slice(n+1);if(!Mu.test(r)||i!==void 0&&!Nu.test(i))throw new a(`INVALID_ARGS`,`A macos-app lease device key must be <bundleId> or <bundleId>@<pid>.`,{deviceKey:t});return i===void 0?{bundleId:r}:{bundleId:r,pid:Number(i)}}const Fu=new Set([`open`,`batch`]),Iu=[`out`,`saveScript`,`sessionSaveScript`,`baseline`,`launchConsole`,`launchArgs`,`launchUrl`,`bundleUrl`,`artifactsDir`,`stepsFile`,`searchPath`,`retainPaths`,`installSource`,`metroProjectRoot`,`metroRuntimeFile`,`iosXctestrunFile`,`iosXctestDerivedDataPath`,`iosXctestEnvDir`],Lu=[`device`,`udid`,`serial`,`target`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function G(e,t,n={}){return new a(`UNAUTHORIZED`,t,{...n,reason:`MACOS_APP_LEASE_DENIED`,rule:e,retriable:!1,hint:`This lease is limited to one macOS app; retrying will not help. Use an allowed command on the leased app.`})}function Ru(e,t,n){if(e.backend!==`macos-app`)return;let r=Pu(e.deviceKey);if(Bu(r,t.command,t.positionals??[],zu(t.runtime,{...t.input,...t.flags})),(t.command===`open`||t.command===`batch`)&&t.flags?.platform!==`macos`)throw G(`device`,`A macos-app lease needs platform macos on ${t.command}.`);if(t.command===`batch`)for(let e of t.flags?.batchSteps??[]){let t=Array.isArray(e.positionals)?e.positionals.map(String):[];Bu(r,Tt(e.command),t,zu(e.runtime,{...e.input,...e.flags}))}if(n)qu(r,n);else if(!Fu.has(t.command))throw G(`session`,`A macos-app lease runs ${t.command} only in a session of ${r.bundleId}; open it first.`,{command:t.command,bundleId:r.bundleId})}function zu(e,t){return{...t,...e?.launchUrl?{launchUrl:e.launchUrl}:{},...e?.bundleUrl?{bundleUrl:e.bundleUrl}:{}}}function Bu(e,t,n,r){if(!hu(t))throw G(`command`,`A macos-app lease does not allow ${t}.`,{command:t});if(Wu(r),Uu(r),t===`screenshot`?Vu(n,r):Hu(r),t===`open`&&Gu(e,n),t===`close`&&n.length>0&&n[0]!==e.bundleId)throw G(`app`,`A macos-app lease only closes ${e.bundleId}.`,{bundleId:e.bundleId})}function Vu(e,t){if(t.screenshotFullscreen===!0)throw G(`capture`,`A macos-app lease captures only the app window.`);let{out:n,...r}=t;Hu(r);for(let t of[e[0],n])if(!(t===void 0||typeof t==`string`&&Kt(t,`screenshot`,`.png`)))throw G(`host-path`,`A macos-app lease does not write files on the host.`)}function Hu(e){let t=Iu.find(t=>e[t]!==void 0&&e[t]!==!1);if(t)throw G(`host-path`,`A macos-app lease does not accept ${t}, which names a host path or launch.`,{field:t})}function Uu(e){let t=Lu.find(t=>e[t]!==void 0&&e[t]!==``);if(t)throw G(`device`,`A macos-app lease does not accept the ${t} device selector.`,{field:t})}function Wu(e){if(e.surface!==void 0&&e.surface!==`app`)throw G(`surface`,`A macos-app lease is limited to the app surface, not ${String(e.surface)}.`,{surface:e.surface});if(e.platform!==void 0&&e.platform!==`macos`)throw G(`app`,`A macos-app lease only drives a macOS app.`,{platform:e.platform})}function Gu(e,t){if(t.length!==1||t[0]!==e.bundleId)throw G(`app`,`A macos-app lease only opens ${e.bundleId}.`,{bundleId:e.bundleId});Ku()}function Ku(){if(Nt(Ft)!==`native`)throw G(`backend`,`A macos-app lease needs the native macOS app backend (AGENT_DEVICE_MACOS_APP_BACKEND=native).`)}function qu(e,t){if(!et(t.device)||(t.surface??`app`)!==`app`||t.appBundleId!==e.bundleId)throw G(`app`,`This session is not the leased app ${e.bundleId}.`,{bundleId:e.bundleId})}const Ju=/bundleID="([^"]+)"/,Yu=async e=>{if(!Lt(e))return;let t=await Bt(`/usr/bin/lsappinfo`,[`info`,`-only`,`bundleid`,String(e)],{allowFailure:!0,timeoutMs:5e3});return Ju.exec(t.stdout)?.[1]};async function Xu(e,t=Yu){if(e.backend!==`macos-app`)return;let n=Pu(e.deviceKey);if(n.pid!==void 0&&await t(n.pid)!==n.bundleId)throw G(`process`,`The leased app process ${n.bundleId}@${n.pid} is no longer running.`,{bundleId:n.bundleId,pid:n.pid})}const Zu=[`sessionStateDir`,`runnerLogPath`,`requestLogPath`,`eventLogPath`,`device`,`id`,`kind`,`serial`,`device_udid`,`ios_simulator_device_set`],Qu=/(?<![\p{L}\p{N}_./])\/(?:Users|home|private|var|tmp|Volumes|Library|Applications|opt|System|usr|etc|Network|cores)(?:\/[\p{L}\p{N}_.@%+~-]+)*\/?/gu;function $u(){return{hostName:ai.hostname(),homeDirectory:ai.homedir()}}function ed(e,t,n=$u()){return t.ok?{ok:!0,data:td(e,t.data,n)}:{ok:!1,error:nd(t.error,n)}}function td(e,t,n){if(!t)return t;let{fallbackScreenshotPath:r,...i}=t;if(e!==`open`)return i;for(let e of Zu)delete i[e];let{snapshot:a,initialSnapshotError:o,warnings:s,...c}=i;return{...c,...a===void 0?{}:{snapshot:td(`snapshot`,a,n)},...o===void 0?{}:{initialSnapshotError:nd(o,n)},...s===void 0?{}:{warnings:rd(s,n)}}}function nd(e,t){let{logPath:n,diagnosticsRecord:r,...i}=e;return rd(i,t)}function rd(e,t){return typeof e==`string`?id(e,t):Array.isArray(e)?e.map(e=>rd(e,t)):typeof e!=`object`||!e?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[e,rd(n,t)]))}function id(e,t){let n=e;if(t.homeDirectory.length>1){let e=t.homeDirectory.replaceAll(/[.*+?^${}()|[\]\\]/g,String.raw`\$&`);n=n.replaceAll(RegExp(`${e}[\\w.@%+~/-]*`,`g`),`<host-path>`)}for(let e of new Set([t.hostName,t.hostName.split(`.`)[0]]))e.length>=4&&(n=n.replaceAll(e,`<host>`));return n.replace(Qu,`<host-path>`)}function ad(e,t){if(!(t===void 0||!e.hasHeldMacOsAppLease(t)))throw G(`diagnostics`,`A macos-app lease does not serve request diagnostics.`)}const od=new Set([`tenantId`,`runId`,`clientId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`ttlMs`,`retainOnClose`]);function sd(e){return cd(e)||Ql(e)}function cd(e){let t=dd(e.req);return t?(ld(t,e).catch(t=>{V(e.res,s(t))}),!0):!1}async function ld(e,t){let{req:n,res:r,registry:i}=t;switch(cu(n,t.expectedToken),e.kind){case`list`:U(r,{ok:!0,leases:i.listActiveLeases().filter(ud)});return;case`put`:{let t=md(await lu(n,`Host lease`));U(r,{ok:!0,lease:i.putHostLease(e.leaseId,t)});return}case`remove`:{let t=Tl(e.leaseId),n=i.listActiveLeases().find(e=>e.leaseId===t),a=n?i.releaseLease(Gl(n)).released:!1;U(r,{ok:!0,released:a,...n&&a?{lease:n}:{}});return}case`unsupported`:r.statusCode=405,r.setHeader(`allow`,`GET, PUT, DELETE`),U(r,{ok:!1,error:`Method not allowed`,code:`INVALID_ARGS`});return}}function ud(e){return e.backend===`macos-app`}function dd(e){let t=URL.parse(e.url??`/`,`http://127.0.0.1`)?.pathname??``;return t===`/admin/leases`?e.method===`GET`?{kind:`list`}:{kind:`unsupported`}:t.startsWith(`/admin/leases/`)?fd(t.slice(14),e.method):null}function fd(e,t){let n=pd[t??``];return!n||!e||e.includes(`/`)?{kind:`unsupported`}:{kind:n,leaseId:e}}const pd={PUT:`put`,DELETE:`remove`};function md(e){let t=hd(e);return Pu(vd(t,`deviceKey`)),{tenantId:vd(t,`tenantId`)??``,runId:vd(t,`runId`)??``,clientId:vd(t,`clientId`),leaseBackend:`macos-app`,leaseProvider:vd(t,`leaseProvider`),deviceKey:vd(t,`deviceKey`),ttlMs:gd(t),retainOnClose:_d(t)}}function hd(e){if(typeof e!=`object`||!e||Array.isArray(e))throw new a(`INVALID_ARGS`,`Host lease request body must be a JSON object.`);let t=e,n=Object.keys(t).filter(e=>!od.has(e));if(n.length>0)throw new a(`INVALID_ARGS`,`Unknown host lease field(s): ${n.join(`, `)}.`);if(t.leaseBackend!==`macos-app`)throw new a(`INVALID_ARGS`,`The host lease route allocates only macos-app leases.`);return t}function gd(e){if(e.ttlMs===void 0||Number.isInteger(e.ttlMs))return e.ttlMs;throw new a(`INVALID_ARGS`,`Host lease ttlMs must be an integer.`)}function _d(e){if(e.retainOnClose===void 0)return!0;if(typeof e.retainOnClose==`boolean`)return e.retainOnClose;throw new a(`INVALID_ARGS`,`Host lease retainOnClose must be a boolean.`)}function vd(e,t){let n=e[t];if(n!==void 0){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Host lease ${t} must be a string.`);return n}}function yd(e){let{hookConfigured:t,hookAttestedTenant:n,clientDeclaredTenant:r}=e;return n?{trusted:!0,tenantId:n,attested:!0}:t?{trusted:!1}:{trusted:!0,tenantId:r,attested:!1}}function bd(){return s(new a(`UNAUTHORIZED`,`Request tenant is not attested by the auth hook`))}function xd(e,t,n,r){let i=e.headers[Jt];return typeof i!=`string`||!i||i===r?!1:(t.statusCode=409,t.setHeader(`content-type`,`application/json`),t.setHeader(qt,`true`),t.end(JSON.stringify(Yt(n,`Daemon instance changed`,s(new a(`COMMAND_FAILED`,`Daemon instance changed`,{reason:`remote_instance_mismatch`}))))),!0)}function K(e,t,n,r){return{jsonrpc:`2.0`,id:e,error:{code:t,message:n,data:r}}}function q(e,t,n=200){e.statusCode=n,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify(t))}function Sd(e,t){e.destroyed||e.writableEnded||e.write(on(t))}function Cd(e,t){e.destroyed||(e.write(mn(t)),e.end())}function wd(e){return e===`INVALID_ARGS`?-32602:-32e3}function Td(e){return e.code===`DEVICE_IN_USE`&&e.details?.reason===`human_control_active`?423:Os(e.code)}function Ed(e,t,n){if(n!==void 0&&n!==`public-only`)throw new a(`INVALID_ARGS`,`Invalid daemon HTTP network access marker`);if(!t&&n===void 0)return e;let r=e.meta?.installSource,i=e.meta?.uploadedArtifactId;if(r?.kind===`path`&&!(typeof i==`string`&&i.length>0))throw new a(`INVALID_ARGS`,`Invalid params: path install sources are disabled on the remote HTTP surface`);let{developerDir:o,providerCredentialFingerprint:s,...c}=e.meta??{};return{...e,...e.meta?{meta:c}:{},internal:{...e.internal,publicNetworkOnly:!0}}}async function Dd(e,t){if(!e)return{ok:!0};let n=await e(t);if(n===void 0||n===!0)return{ok:!0};let r=(e,n,r)=>{let i=s(r);return{ok:!1,statusCode:e,response:K(t.rpcRequest.id??null,n,i.message,i)}};if(n===!1||n.ok===!1){let e=n===!1?{}:n;return r(401,-32001,new a(p(e.code,`UNAUTHORIZED`),e.message??`Request rejected by auth hook`,e.details))}if(typeof n.tenantId==`string`&&n.tenantId.length>0){let e=bl(n.tenantId);return e?{ok:!0,tenantId:e}:r(500,-32e3,new a(`INVALID_ARGS`,`Auth hook returned invalid tenantId`))}return{ok:!0}}async function Od(e=process.env){let t=e.AGENT_DEVICE_HTTP_AUTH_HOOK;if(!t)return null;let n=e.AGENT_DEVICE_HTTP_AUTH_EXPORT||`default`,r=L.isAbsolute(t)?t:L.resolve(t),i;try{i=await import(li(r).href)}catch(e){throw new a(`COMMAND_FAILED`,`Failed to load AGENT_DEVICE_HTTP_AUTH_HOOK module`,{hookPath:r,error:e instanceof Error?e.message:String(e)})}let o=i[n];if(typeof o!=`function`)throw new a(`INVALID_ARGS`,`Auth hook export ${n} is not a function`,{hookPath:r,exportName:n});return o}function kd(e,t){let n=typeof t.authorization==`string`?t.authorization:``,r=n.toLowerCase().startsWith(`bearer `)?n.slice(7):void 0,i=typeof t[`x-agent-device-token`]==`string`?t[`x-agent-device-token`]:void 0;return(typeof e.token==`string`?e.token:void 0)??i??r??``}async function Ad(e){let{req:t,res:n,authHook:r,expectedToken:i,daemonRequest:a}=e,o=kd({},t.headers),s=bl(Nd(t.headers,Gt)),c=Pd(o,i);if(c)return V(n,c),null;let l=await Dd(r,{headers:t.headers,rpcRequest:{jsonrpc:`2.0`,id:null,method:`agent_device.command`},daemonRequest:{token:o,session:`default`,command:a.command,positionals:a.positionals,...s?{meta:{tenantId:s}}:{}}});if(!l.ok)return Md(n,l),null;let u=yd({hookConfigured:r!==null,hookAttestedTenant:l.tenantId,clientDeclaredTenant:s});if(!u.trusted)return V(n,bd()),null;let d=u.tenantId;return{tenantId:d,...d?{sessionNamespace:{tenant:d,partitioned:u.attested}}:{}}}async function jd(e){let{leaseRegistry:t,...n}=e,r=await Ad(n);if(!r||!t)return r;try{ad(t,r.tenantId)}catch(e){return V(n.res,s(e)),null}return r}function Md(e,t){e.statusCode=t.statusCode,e.setHeader(`content-type`,`application/json`),e.end(JSON.stringify({ok:!1,error:t.response.error?.data?.message??t.response.error?.message??`Unauthorized`}))}function Nd(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Pd(e,t){return!t||hn(e,t)?null:s(new a(`UNAUTHORIZED`,`Invalid token`))}const Fd=new Set([`agent_device.command`,`agent-device.command`]),Id=new Set([`agent_device.install_from_source`,`agent-device.install_from_source`]),Ld=new Set([`agent_device.release_materialized_paths`,`agent-device.release_materialized_paths`]),Rd={"agent_device.lease.allocate":`lease_allocate`,"agent-device.lease.allocate":`lease_allocate`,"agent_device.lease.heartbeat":`lease_heartbeat`,"agent-device.lease.heartbeat":`lease_heartbeat`,"agent_device.lease.release":`lease_release`,"agent-device.lease.release":`lease_release`},zd=new Set([...Fd,...Id,...Ld,...Object.keys(Rd)]);function Bd(e,t){return{token:kd(e,t),session:e.session??`default`,command:e.command??``,positionals:e.positionals??[],input:e.input,flags:e.flags,runtime:e.runtime,meta:e.meta}}function J(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Vd(e,t){let n=e[t];return Number.isInteger(n)?Number(n):void 0}function Hd(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function Ud(e,t){let n=typeof e[t]==`string`?e[t].trim():``;if(!n)throw new a(`INVALID_ARGS`,`Invalid params: source.${t} is required for github-actions-artifact sources`);return n}function Wd(e,t){let n=e[t],r=typeof n==`number`?n:typeof n==`string`?Number(n):NaN;if(!Number.isInteger(r))throw new a(`INVALID_ARGS`,`Invalid params: source.${t} must be an integer`);return r}function Gd(e){let t=Ud(e,`owner`),n=Ud(e,`repo`),r=e.artifactId!==void 0,i=e.runId!==void 0,o=e.artifactName!==void 0;if(r&&(i||o))throw new a(`INVALID_ARGS`,`Invalid params: source must specify either artifactId or artifactName, not both`);if(!r&&i&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source.artifactName is required when source.runId is specified`);if(!r&&!o)throw new a(`INVALID_ARGS`,`Invalid params: source must specify artifactId or artifactName`);if(r)return{kind:`github-actions-artifact`,owner:t,repo:n,artifactId:Wd(e,`artifactId`)};let s;return i&&(s=Wd(e,`runId`)),{kind:`github-actions-artifact`,owner:t,repo:n,...i?{runId:s}:{},artifactName:Ud(e,`artifactName`)}}function Kd(e,t,n){return{token:kd(t,n),session:J(t,`session`)??`default`,command:e,positionals:[],flags:e===`lease_allocate`?Be(t):void 0,meta:{tenantId:J(t,`tenantId`)??J(t,`tenant`),runId:J(t,`runId`),leaseId:J(t,`leaseId`),leaseTtlMs:Vd(t,`ttlMs`),leaseRetainOnClose:Hd(t,`retainOnClose`),leaseBackend:J(t,`backend`),leaseProvider:J(t,`leaseProvider`)??J(t,`provider`),deviceKey:J(t,`deviceKey`),clientId:J(t,`clientId`),providerCredentialFingerprint:e===`lease_allocate`?J(t,`providerCredentialFingerprint`):void 0}}}function qd(e){let t=e.source;if(!t||typeof t!=`object`)throw new a(`INVALID_ARGS`,`Invalid params: source is required`);let n=t;if(n.kind===`url`){let e=typeof n.url==`string`?n.url.trim():``;if(!e)throw new a(`INVALID_ARGS`,`Invalid params: source.url is required for url sources`);let t=n.headers,r={};if(t!==void 0){if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`Invalid params: source.headers must be a string map`);for(let[e,n]of Object.entries(t)){if(typeof n!=`string`)throw new a(`INVALID_ARGS`,`Invalid params: source.headers values must be strings`);r[e]=n}}return Object.keys(r).length>0?{kind:`url`,url:e,headers:r}:{kind:`url`,url:e}}if(n.kind===`path`)throw new a(`INVALID_ARGS`,`Invalid params: source.kind "path" names a file on the daemon host and is not accepted over HTTP`,{hint:`Use a "url" or "github-actions-artifact" source.`});if(n.kind===`github-actions-artifact`)return Gd(n);throw new a(`INVALID_ARGS`,`Invalid params: source.kind must be "url" or "github-actions-artifact"`)}function Jd(e,t){let n=J(e,`platform`);if(n!==`ios`&&n!==`android`)throw new a(`INVALID_ARGS`,`Invalid params: platform must be "ios" or "android"`);return{token:kd(e,t),session:J(e,`session`)??`default`,command:`install_source`,positionals:[],flags:{platform:n},meta:{requestId:J(e,`requestId`),installSource:qd(e),retainMaterializedPaths:Hd(e,`retainPaths`),materializedPathRetentionMs:Vd(e,`retentionMs`)}}}function Yd(e,t){let n=J(e,`materializationId`)?.trim();if(!n)throw new a(`INVALID_ARGS`,`Invalid params: materializationId is required`);return{token:kd(e,t),session:J(e,`session`)??`default`,command:`release_materialized_paths`,positionals:[],meta:{requestId:J(e,`requestId`),materializationId:n}}}function Xd(e){let t=e.indexOf(`: `);if(t===-1||!e.startsWith(`$`))return e;let n=e.slice(0,t).replace(/^\$\.?/,``),r=e.slice(t+2);return n?`${n}: ${r}`:r}function Zd(e){try{return c.parse(e)}catch(e){let t=e instanceof Error?Xd(e.message):`invalid command params`;throw new a(`INVALID_ARGS`,`Invalid params: ${t}`)}}function Qd(e,t,n){if(Fd.has(e))return Bd(Zd(t),n);if(Id.has(e))return Jd(t,n);if(Ld.has(e))return Yd(t,n);let r=Rd[e];if(r)return Kd(r,t,n);throw new a(`INVALID_ARGS`,`Method not found: ${e}`)}function $d(e){return Fd.has(e)}async function ef(e){let t=ii(),n=await Pt(),r=_.filter(e=>e!==`macos-app`||process.platform===`darwin`),i=await Od(e.env??process.env),{handleRequest:a,token:o,retainArtifacts:c=!1,resolveRequestDiagnosticsPath:l}=e;return ui.createServer((u,d)=>{if(u.method===`GET`&&u.url===`/health`){d.statusCode=200,d.setHeader(`content-type`,`application/json`),d.end(JSON.stringify(Xt(`agent-device-daemon`,yn(),{instanceId:t,hostArch:n,leaseBackends:r})));return}if(o&&e.leaseRegistry&&sd({req:u,res:d,expectedToken:o,registry:e.leaseRegistry})||zc({req:u,res:d,token:kd({},u.headers),authorize:async e=>await Ad({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})||il({req:u,res:d,retainArtifacts:c,authorize:async e=>await Ad({req:e.req,res:e.res,authHook:i,expectedToken:o,daemonRequest:e.daemonRequest})})||l&&hl({req:u,res:d,resolveRecordPath:l,authorize:async t=>await jd({...t,authHook:i,expectedToken:o,leaseRegistry:e.leaseRegistry})}))return;if(u.method!==`POST`||u.url!==`/rpc`){d.statusCode=404,d.end(`Not found`);return}let f=``;u.setEncoding(`utf8`),u.on(`data`,e=>{f+=e,f.length>1048576&&u.destroy(Error(`request too large`))}),u.on(`error`,()=>{d.headersSent||q(d,K(null,-32700,`Parse error`),400)}),u.on(`end`,async()=>{let e;try{e=JSON.parse(f)}catch{q(d,K(null,-32700,`Parse error`),400);return}if(e.jsonrpc!==`2.0`||typeof e.method!=`string`){q(d,K(e.id??null,-32600,`Invalid Request`),400);return}if(!zd.has(e.method)){q(d,K(e.id??null,-32601,`Method not found: ${e.method}`),404);return}if(!e.params||typeof e.params!=`object`){q(d,K(e.id??null,-32602,`Invalid params`),400);return}let n,r,c=!1;try{let s=e.params,l=Qd(e.method,s,u.headers);if($d(e.method)&&(typeof l.command!=`string`||l.command.length===0)){q(d,K(e.id??null,-32602,`Invalid params: command is required`),400);return}n=Qn(l.meta?.requestId,e.id),l.meta={...l.meta,requestId:n},r=Zn(n);let f=l.meta?.tenantId??l.flags?.tenant,p=await Dd(i,{headers:u.headers,rpcRequest:e,daemonRequest:l});if(!p.ok){q(d,p.response,p.statusCode);return}let m=yd({hookConfigured:i!==null,hookAttestedTenant:p.tenantId,clientDeclaredTenant:f});if(!m.trusted){let t=bd();q(d,K(e.id??null,-32001,t.message,t),401);return}let h=Pd(l.token,o);if(h){q(d,K(e.id??null,-32e3,h.message,h),401);return}if(xd(u,d,e.id??null,t))return;l.meta={...l.meta,tenantId:m.tenantId,sessionIsolation:m.attested?`tenant`:l.meta?.sessionIsolation},l.flags?.tenant!==void 0&&(l.flags={...l.flags,tenant:m.tenantId}),m.attested&&l.flags?.sessionIsolation!==void 0&&(l.flags={...l.flags,sessionIsolation:`tenant`}),l=Ed(l,i!==null,u.headers[Zt]);let g=!1,_=()=>{c||d.writableFinished||g||(g=!0,Jn(n),j({level:`warn`,phase:`request_client_disconnected`,data:{requestId:n}}))};if(u.on(`aborted`,_),d.on(`close`,_),(u.aborted||d.destroyed)&&_(),gn(l)){d.statusCode=200,d.setHeader(`content-type`,`application/x-ndjson`);let t=await er(e=>Sd(d,e),async()=>await a(l));c=!0,Cd(d,t.ok?{jsonrpc:`2.0`,id:e.id??null,result:t}:K(e.id??null,-32e3,t.error.message,t.error));return}let v=await a(l);if(c=!0,v.ok){q(d,{jsonrpc:`2.0`,id:e.id??null,result:v});return}q(d,K(e.id??null,-32e3,v.error.message,v.error),Td(v.error))}catch(t){c=!0;let n=s(t),r=wd(n.code);if(d.headersSent){Cd(d,K(e.id??null,r,n.message,n));return}q(d,K(e.id??null,r,n.message,n),Os(n.code))}finally{$n(r)}})})}function tf(e,t){if(nf(e,t.command,t.flags??{}),t.command===`batch`)for(let n of t.flags?.batchSteps??[])nf(e,Tt(n.command),{...n.input,...n.flags})}function nf(e,t,n){if(lf(e,t),t===`close`&&n.shutdown===!0&&of(e,`device-shutdown`),e.deviceIds)for(let t of[n.udid,n.serial]){let n=typeof t==`string`?t.trim():``;if(!(!n||e.deviceIds.has(n)))throw uf(e,`device`,`Device ${n} is outside this daemon's policy.`,{deviceId:n})}}function rf(e,t){return!e.deviceIds||e.deviceIds.has(t.id)}function af(e,t){if(!rf(e,t))throw uf(e,`device`,`Device ${t.id} is outside this daemon's policy.`,{deviceId:t.id})}function of(e,t){if(e.deniedCapabilities.has(t))throw uf(e,`capability`,`This daemon's policy denies ${t}.`,{capability:t})}function sf(e,t){let n=e.requiredLeaseBackend;if(!(!n||t?.backend===n))throw uf(e,`lease`,`This daemon's policy requires a ${n} lease.`,{leaseBackend:n})}function cf(e,t){if(!t.deviceIds)return e;let n=e=>e.filter(e=>rf(t,e)),r=Object.freeze({discover:async(t,r)=>n(await e.localOnly.discover(t,r))}),i=async(t,i)=>{let a=await e.providerFirst.discoverWithSource(t,i),o=n(a.devices);return o.length>0||a.source===`local`?{...a,devices:o}:{devices:await r.discover(t,i),source:`local`}},a=Object.freeze({discover:async(e,t)=>(await i(e,t)).devices,discoverWithSource:i});return Object.freeze({...e,localOnly:r,providerFirst:a})}function lf(e,t){let n=e.commands;if(!n)return;let r=cr(t);if(r===void 0)return;let i=n.names.has(r);if(!(n.mode===`allow`?i:!i))throw uf(e,`command`,`This daemon's policy denies the ${r} command.`,{command:r})}function uf(e,t,n,r){return new a(`UNAUTHORIZED`,n,{...r,reason:`DAEMON_POLICY_DENIED`,rule:t,policyDigest:e.digest,retriable:!1,hint:`The daemon operator's policy denies this request; retrying will not help. Use an allowed command and device, or ask the operator to change the policy.`})}let df={resolve:async()=>{throw new a(`COMMAND_FAILED`,`Interactor resolution is not composed for this process.`,{reason:`interactor-resolution-missing`})}};function ff(e){df=e}function pf(){return df}function mf(){return Object.freeze({toolchainCheck:async(e,t)=>{if(e===`android`){let{androidToolchainCheck:e}=await xn();return await e(process.env,process.platform)}if(e===`vega`){let{vegaToolchainCheck:e}=await import(`../platform-runtime.js`).then(e=>e.G);return await e(t)}if(e===`harmonyos`){let{harmonyToolchainCheck:e}=await import(`../platform-runtime.js`).then(e=>e.U);return await e()}if(e===`ios`||e===`macos`||e===`apple`){let{appleToolchainCheck:e}=await import(`../doctor-facade.js`);return await e()}},deviceChecks:async(e,t)=>{if(e.platform!==`android`)return[];let{androidDeviceChecks:n}=await xn();return await n(e,t)},ambientChecks:async e=>{let{webBrowserLifecycleCheck:t}=await import(`../src2.js`).then(e=>e.i);return[await t(e.stateDir)]},warmupCheck:async(e,t)=>{if(e.platform!==`apple`)return;let{appleRunnerWarmupCheck:n}=await import(`../doctor-facade.js`);return await n(e,t)}})}const hf=Object.freeze([...hr,`limrun`]);function gf(e){return Object.freeze(e.flatMap(e=>yf(e)?[{runtime:e,module:xf(e)}]:[]))}async function _f(e=process.env){let t=await vf(e);try{let[{loadProviderPlugins:n},{RESERVED_PLUGIN_PROVIDERS:r}]=await Promise.all([import(`../load.js`).then(e=>e.t),import(`../store.js`).then(e=>e.o)]),i=await n(e,r);return Object.freeze({...t,runtimes:Object.freeze([...t.runtimes,...i.map(({runtime:e})=>e)]),platformModules:Object.freeze([...t.platformModules,...i.map(({runtime:e,platformModule:t})=>({runtime:e,module:t}))])})}catch(e){throw await Promise.allSettled(t.runtimes.map(async e=>await e.shutdown())),e}}async function vf(e=process.env){let t=mr(e),n=[...gf(t)],i;try{i=gr(e)}catch(e){return Object.freeze({runtimes:t,platformModules:Object.freeze(n),skipped:[{provider:`limrun`,error:r(e)}]})}if(!i)return Object.freeze({runtimes:t,platformModules:Object.freeze(n)});let[a,o]=await Promise.all([import(`../src.js`).then(e=>e.t),import(`../limrun-runtime-dependencies.js`).then(e=>e.n)]),s=a.createLimrunRuntime(i,o.createLimrunRuntimeDependencies(),{includePlatformModule:!0});return Object.freeze({runtimes:Object.freeze([...t,s.runtime]),platformModules:Object.freeze([...n,{runtime:s.runtime,module:s.platformModule}])})}function yf(e){if(!(`owner`in e)||!(`loadRuntime`in e))return!1;let t=e.owner;return typeof e.loadRuntime==`function`&&bf(t)&&t.provider===e.provider}function bf(e){return typeof e==`object`&&!!e&&`kind`in e&&e.kind===`provider-runtime`&&`provider`in e&&typeof e.provider==`string`&&`instance`in e&&typeof e.instance==`string`}function xf(e){return Object.freeze({owner:e.owner,loadRuntime:async t=>await e.loadRuntime(t)})}function Sf(e){let t=e?.providerSessionId;return typeof t==`string`&&t.trim().length>0?t.trim():void 0}var Cf=class{records=new Map;now;retentionMs;constructor(e={}){this.now=e.now??(()=>Date.now()),this.retentionMs=Number.isInteger(e.retentionMs)?Math.max(0,Number(e.retentionMs)):3e5}record(e,t){let n=e.leaseProvider?.trim(),r=t.trim();if(!n||!r)return;this.prune();let i={provider:n,providerSessionId:r,leaseId:e.leaseId,tenantId:e.tenantId};this.records.set(this.key(n,r),i)}markLeaseReleased(e,t=this.now()){let n=e.leaseProvider?.trim();if(!n)return;this.prune();let r=t+this.retentionMs;for(let[t,i]of this.records)i.provider===n&&i.leaseId===e.leaseId&&this.records.set(t,{...i,retainedUntil:r})}resolve(e){let t=e.provider?.trim(),n=e.providerSessionId?.trim(),r=e.tenantId?.trim();if(!t||!n||!r)return;this.prune();let i=this.records.get(this.key(t,n));if(!(!i||i.tenantId!==r))return{...i}}prune(){let e=this.now();for(let[t,n]of this.records)n.retainedUntil!==void 0&&n.retainedUntil<=e&&this.records.delete(t)}key(e,t){return JSON.stringify([e,t])}},wf=class{active=new Map;waiters=new Map;async run(e,t){this.active.set(e,(this.active.get(e)??0)+1);try{return await t()}finally{let t=(this.active.get(e)??1)-1;if(t>0)this.active.set(e,t);else{this.active.delete(e);let t=this.waiters.get(e);this.waiters.delete(e);for(let e of t??[])e()}}}async wait(e,t){if(t?.throwIfAborted(),!this.active.has(e))return;let n=this.waiters.get(e)??new Set,r=()=>{},i=()=>{};try{await new Promise((a,o)=>{r=a,i=()=>o(t?.reason),n.add(r),this.waiters.set(e,n),t?.addEventListener(`abort`,i,{once:!0})})}finally{t?.removeEventListener(`abort`,i),n.delete(r),n.size===0&&this.waiters.get(e)===n&&this.waiters.delete(e)}}},Tf=class{entriesByLeaseId=new Map;retain(e,t){let n={wanted:t,released:!1},r=this.entriesByLeaseId.get(e)??new Set;return r.add(n),this.entriesByLeaseId.set(e,r),{leaseId:e,release:()=>this.releasePass(e,r,n)}}forget(e){let t=this.entriesByLeaseId.get(e);if(t){for(let e of t)e.released=!0;this.entriesByLeaseId.delete(e)}}isDeferred(e){let t=this.entriesByLeaseId.get(e);if(!t)return!1;for(let e of t)e.wanted()||t.delete(e);return t.size>0||(this.entriesByLeaseId.delete(e),!1)}releasePass(e,t,n){return!n.released&&(n.released=!0,t.delete(n),t.size===0&&this.entriesByLeaseId.delete(e),n.wanted())}},Ef=class{holdsByDevice=new Map;mutations=new wf;inFlightWork=new Tf;leases=new Map;runBindings=new Map;deviceBindings=new Map;hostTtlMsByLeaseId=new Map;macOsAppTenantIds=new Set;maxActiveSimulatorLeases;resolveLeaseTtlMs;now;onLeaseExpired;providerSessionOwnership;constructor(e={}){this.maxActiveSimulatorLeases=Number.isInteger(e.maxActiveSimulatorLeases)?Math.max(0,Number(e.maxActiveSimulatorLeases)):0,this.resolveLeaseTtlMs=Sl(e),this.now=e.now??(()=>Date.now()),this.onLeaseExpired=e.onLeaseExpired,this.providerSessionOwnership=new Cf({now:this.now,retentionMs:e.providerSessionRetentionMs})}allocateLease(e){let t=Nl(e);this.cleanupExpiredLeases();let n=this.resolveLeaseTtlMs(t.ttlMs);this.assertHumanControlAdmission(t);let r=this.refreshExistingRunBinding(t,n);if(r)return r;this.assertDeviceAvailable(t),this.enforceCapacity(t.backend);let i=Hl(t,n,this.now());return this.leases.set(i.leaseId,i),this.bindLease(i),{...i}}putHostLease(e,t){let n=Tl(e),r=Nl(t);this.cleanupExpiredLeases();let i=this.resolveLeaseTtlMs(r.ttlMs),o=this.leases.get(n);if(o){if(!Bl(o,r))throw new a(`INVALID_ARGS`,`Lease id already names a lease with another scope.`,{reason:`LEASE_SCOPE_MISMATCH`});return this.hostTtlMsByLeaseId.set(n,i),this.refreshLease(o,i)}if(this.assertHumanControlAdmission(r),this.assertDeviceAvailable(r),r.backend===`macos-app`&&this.macOsAppTenantIds.add(r.tenantId),this.runBindings.has(Vl(r)))throw new a(`DEVICE_IN_USE`,`This tenant run already holds a lease for the device.`,{reason:`DEVICE_LEASE_BUSY`});this.enforceCapacity(r.backend);let s={...Hl(r,i,this.now()),leaseId:n};return this.leases.set(s.leaseId,s),this.hostTtlMsByLeaseId.set(n,i),this.bindLease(s),{...s}}refreshExistingRunBinding(e,t){let n=Vl(e),r=this.runBindings.get(n);if(!r)return;let i=this.leases.get(r);if(!i){this.runBindings.delete(n);return}if(i.clientId===e.clientId)return this.refreshLease(e.retainOnClose?{...i,retainOnClose:!0}:i,t);if(i.deviceKey)throw Wl(i);return Il(i,e),this.refreshLease(i,t)}heartbeatLease(e){let t=Tl(e.leaseId);this.cleanupExpiredLeases();let n=this.getActiveLease(t);zl(n,e),Il(n,e);let r=e.ttlMs===void 0?Ul(n):this.resolveLeaseTtlMs(e.ttlMs),i=this.hostTtlMsByLeaseId.get(t);return this.refreshLease(n,i===void 0?r:Math.min(r,i))}retainLeaseWork(e,t){let n=this.inFlightWork.retain(e.leaseId,t);return{leaseId:n.leaseId,release:()=>{let t=n.release();return t&&this.refreshProtectedLease(e.leaseId,this.now()),t}}}releaseLease(e){let t=this.getLease(e);return t?(this.leases.delete(t.leaseId),this.unbindLease(t),this.inFlightWork.forget(t.leaseId),{released:!0,lease:t}):{released:!1}}getLease(e){let t=Tl(e.leaseId);this.cleanupExpiredLeases();let n=this.leases.get(t);if(n)return zl(n,e),Il(n,e),{...n}}assertLeaseAdmission(e){let t=Ll(e);this.cleanupExpiredLeases(),Il(this.getActiveLease(t.leaseId),t)}hasHeldMacOsAppLease(e){return this.macOsAppTenantIds.has(e)}findActiveLeaseBackend(e){let t=wl(e);if(t)return this.cleanupExpiredLeases(),this.leases.get(t)?.backend}hasRetainedLeases(){let e=this.now();return this.listActiveLeases().some(t=>t.retainOnClose===!0&&t.expiresAt>e)}listActiveLeases(){return this.cleanupExpiredLeases(),Array.from(this.leases.values()).map(e=>({...e}))}recordProviderSession(e,t){this.cleanupExpiredLeases();let n=e.expiresAt<=this.now()?e.expiresAt:void 0;this.providerSessionOwnership.record(e,t),this.leases.has(e.leaseId)||this.providerSessionOwnership.markLeaseReleased(e,n)}resolveProviderSession(e){return this.cleanupExpiredLeases(),this.providerSessionOwnership.resolve(e)}listHumanControlHolds(e){this.cleanupExpiredLeases();let t=e.kind===`lease`?H(this.requireHumanControlLease(e.leaseId)):void 0;return[...this.holdsByDevice.entries()].filter(([e])=>t===void 0||t===e).flatMap(([,e])=>[...e.values()].map(({hold:e})=>Xl(e))).sort((e,t)=>e.id.localeCompare(t.id))}async putHumanControlHold(e,t,n,r){r?.throwIfAborted();let i=Yl(t),o=Kl(n);this.cleanupExpiredLeases();let s=this.resolveHumanControlScope(e,o),c=H(s),l=this.findHumanControlHold(i);if(l&&(this.assertHoldAuthority(e,l),H(l.hold.scope)!==c))throw new a(`INVALID_ARGS`,`Release a hold before changing its device scope.`);let u=this.now(),d={...e.kind===`lease`?{ownerLeaseId:e.leaseId}:{},hold:{id:i,scope:s,state:`activating`,...o.reason?{reason:o.reason}:{},createdAt:l?.hold.createdAt??u,updatedAt:u}},f=this.holdsByDevice.get(c)??new Map;return this.holdsByDevice.set(c,f),f.set(i,d),await this.activateHumanControlHold(c,d,o.ttlMs,r)}async activateHumanControlHold(e,t,n,r){let i=this.holdsByDevice.get(e),{id:o}=t.hold;try{if(await this.mutations.wait(e,r),r?.throwIfAborted(),i.get(o)!==t)throw new a(`COMMAND_FAILED`,`Human-control hold changed before activation completed.`,{holdId:o});let s=this.now();return t.hold={...t.hold,state:`active`,updatedAt:s,...n===void 0?{}:{expiresAt:s+n}},this.refreshHeldLease(e,s),Xl(t.hold)}catch(n){throw i.get(o)===t&&this.deleteHumanControlHold(e,o),n}}removeHumanControlHold(e,t){let n=Yl(t);this.cleanupExpiredLeases();let r=this.findHumanControlHold(n);if(!r)return;this.assertHoldAuthority(e,r);let i=H(r.hold.scope);return this.deleteHumanControlHold(i,n),Xl(r.hold)}deleteHumanControlHold(e,t){let n=this.holdsByDevice.get(e);n.delete(t),n.size===0&&(this.holdsByDevice.delete(e),this.refreshHeldLease(e,this.now()))}assertHumanControlAdmission(e){this.expireHumanControlHolds();let t=H(e),n=t===void 0?void 0:this.holdsByDevice.get(t)?.values().next().value;if(n)throw Zl(n.hold)}async runDeviceMutation(e,t){if(!e)return await t();this.cleanupExpiredLeases();let n=this.getActiveLease(e.leaseId);this.assertHumanControlAdmission(n);let r=H(n);return r===void 0?await t():await this.mutations.run(r,t)}requireHumanControlLease(e){let t=this.getActiveLease(e);if(!t.deviceKey)throw new a(`UNSUPPORTED_OPERATION`,`Human control requires a device-scoped remote lease.`);return{...t,deviceKey:t.deviceKey}}resolveHumanControlScope(e,t){if(e.kind===`host`){if(!t.scope)throw new a(`INVALID_ARGS`,`Host human control requires a lease device scope.`);return t.scope}if(t.scope)throw new a(`INVALID_ARGS`,`Lease-owner human control uses the admitted lease device; do not supply scope.`);let n=this.requireHumanControlLease(e.leaseId);return{backend:n.backend,leaseProvider:n.leaseProvider,deviceKey:n.deviceKey}}assertHoldAuthority(e,t){if(e.kind===`host`)return;let n=this.requireHumanControlLease(e.leaseId);if(t.ownerLeaseId!==n.leaseId||H(n)!==H(t.hold.scope))throw new a(`UNAUTHORIZED`,`Human-control hold does not belong to the admitted lease.`,{reason:`LEASE_SCOPE_MISMATCH`})}findHumanControlHold(e){for(let t of this.holdsByDevice.values()){let n=t.get(e);if(n)return n}}hasHumanControl(e){let t=H(e);return t!==void 0&&this.holdsByDevice.has(t)}isLeaseProtected(e,t){return e.expiresAt>t||this.hasHumanControl(e)||this.inFlightWork.isDeferred(e.leaseId)}expireHumanControlHolds(){let e=this.now();for(let[t,n]of this.holdsByDevice){let r=0;for(let[t,{hold:i}]of n)i.expiresAt===void 0||i.expiresAt>e||(r=Math.max(r,i.expiresAt),n.delete(t));n.size===0&&(this.holdsByDevice.delete(t),this.refreshHeldLease(t,r))}}refreshHeldLease(e,t){this.refreshProtectedLease(this.deviceBindings.get(e),t)}refreshProtectedLease(e,t){let n=e?this.leases.get(e):void 0;n&&this.refreshLease(n,Ul(n),Math.max(t,n.heartbeatAt))}consumeExpiredLeases(){this.expireHumanControlHolds();let e=this.now(),t=[];for(let n of this.leases.values()){if(this.isLeaseProtected(n,e))continue;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};t.push(r),this.onLeaseExpired?.(r)}return t}consumeExpiredLease(e){this.expireHumanControlHolds();let t=wl(e);if(!t)return;let n=this.leases.get(t);if(!n||this.isLeaseProtected(n,this.now()))return;this.leases.delete(n.leaseId),this.unbindLease(n,n.expiresAt);let r={...n};return this.onLeaseExpired?.(r),r}cleanupExpiredLeases(){this.consumeExpiredLeases()}enforceCapacity(e){if(e!==`ios-simulator`||this.maxActiveSimulatorLeases<=0)return;let t=Array.from(this.leases.values()).filter(e=>e.backend===`ios-simulator`).length;if(!(t<this.maxActiveSimulatorLeases))throw new a(`DEVICE_IN_USE`,`No simulator lease capacity available`,{reason:`LEASE_CAPACITY_EXCEEDED`,activeLeases:t,maxActiveLeases:this.maxActiveSimulatorLeases,backend:e,hint:`Retry after releasing another simulator lease.`})}getActiveLease(e){let t=this.leases.get(e);if(t)return t;throw new a(`UNAUTHORIZED`,`Lease is not active`,{reason:`LEASE_NOT_FOUND`})}refreshLease(e,t,n=this.now()){let r={...e,heartbeatAt:n,expiresAt:n+t};return this.leases.set(r.leaseId,r),this.bindLease(r),{...r}}bindLease(e){this.runBindings.set(Vl(e),e.leaseId);let t=H(e);t&&this.deviceBindings.set(t,e.leaseId)}unbindLease(e,t=this.now()){this.hostTtlMsByLeaseId.delete(e.leaseId),this.runBindings.delete(Vl(e));let n=H(e);n&&this.deviceBindings.delete(n),this.providerSessionOwnership.markLeaseReleased(e,t)}assertDeviceAvailable(e){let t=H({backend:e.backend,leaseProvider:e.leaseProvider,deviceKey:e.deviceKey});if(!t)return;let n=this.deviceBindings.get(t);if(!n)return;let r=this.leases.get(n);if(!r){this.deviceBindings.delete(t);return}throw Wl(r)}};function Df(e){return Ne(e)}function Of(e,t){let n=Df(e),r=n.leaseId??t?.leaseId,i=n.tenantId??t?.tenantId,a=n.runId??t?.runId;if(!(!i||!a||!r))return le({tenantId:i,runId:a,leaseId:r,leaseBackend:n.leaseBackend??t?.backend,leaseProvider:n.leaseProvider??t?.leaseProvider,deviceKey:n.deviceKey??t?.deviceKey,clientId:n.clientId??t?.clientId,expiresAt:t?.expiresAt})}function kf(e,t){let n=Df(e),r=t?.lease??t?.deviceLease??void 0;return le({tenantId:n.tenantId??r?.tenantId,runId:n.runId??r?.runId,leaseId:n.leaseId??r?.leaseId,leaseTtlMs:n.leaseTtlMs,leaseBackend:n.leaseBackend??r?.leaseBackend,leaseProvider:n.leaseProvider??r?.leaseProvider,deviceKey:n.deviceKey??r?.deviceKey,clientId:n.clientId??r?.clientId})}function Af(e){let t=e.meta,n=le({leaseId:jf(t?.leaseId),clientId:jf(t?.clientId),tenantId:jf(t?.tenantId),runId:jf(t?.runId),leaseProvider:jf(t?.leaseProvider),deviceKey:jf(t?.deviceKey)});return Object.keys(n).length>0?n:void 0}function jf(e){return typeof e==`string`&&e.trim().length>0?e.trim():void 0}function Mf(e){let t=yl(e.meta?.sessionIsolation??e.flags?.sessionIsolation),n=e.meta?.tenantId??e.flags?.tenant,r=bl(n);if(n&&!r)throw new a(`INVALID_ARGS`,`Invalid tenant id. Use 1-128 chars: letters, numbers, dot, underscore, hyphen.`);if(t!==`tenant`)return e;if(!r)throw new a(`INVALID_ARGS`,`session isolation mode tenant requires --tenant (or meta.tenantId).`);let i=e.session||`default`;return fl(r,i)?{...e,meta:{...e.meta,tenantId:r,sessionIsolation:t}}:{...e,session:dl(r,i),meta:{...e.meta,tenantId:r,sessionIsolation:t}}}function Nf(e,t,n,r={}){if(Ff(e,t,n,r.daemonPolicy))return;let i=Df(e);zf(e,i);let o=n?.lease;if(r.daemonPolicy?.requiredLeaseBackend){let i=kf(e,n).leaseId?Pf(e,t,n):void 0;return sf(r.daemonPolicy,i),i}if(!(n===void 0&&!i.leaseId&&Lf(e,r.providerAppCatalog))){if(e.command===`human_control`&&!o&&!i.leaseId)throw new a(`UNSUPPORTED_OPERATION`,`Takeover requires an active remote device lease. Local takeover is not supported.`);if(!(e.command!==`human_control`&&!o&&e.meta?.sessionIsolation!==`tenant`&&(!i.leaseId||!i.tenantId&&!i.runId)))return Pf(e,t,n)}}function Pf(e,t,n){Bf(Df(e),n?.lease);let r=kf(e,n);t.assertLeaseAdmission(Fe(r));let i=t.heartbeatLease(Fe(r));return Ru(i,e,n),wu(e)&&t.assertHumanControlAdmission(i),i}function Ff(e,t,n,r){return mu(e.command)?hu(e.command)?!0:!If(e,t,n,r):!1}function If(e,t,n,r){if(r?.requiredLeaseBackend)return!0;let i=kf(e,n);return i.leaseBackend===`macos-app`||i.leaseId!==void 0&&t.findActiveLeaseBackend(i.leaseId)===`macos-app`}function Lf(e,t){let n=Du(e);return n?.kind===`unconditional`||n?.kind===`provider-app-catalog`&&t?.supports(n.provider)===!0}function Rf(e){mu(e.command)||zf(e,Df(e))}function zf(e,t){if(e.command!==`open`)return;let n=Re(t);if(n.length!==0)throw new a(`INVALID_ARGS`,`Proxy open requires leaseId, tenantId, runId, clientId, and deviceKey lease metadata.`,{missing:n})}function Bf(e,t){t&&(Vf(`leaseId`,e.leaseId,t.leaseId),Vf(`tenantId`,e.tenantId,t.tenantId),Vf(`runId`,e.runId,t.runId),Vf(`leaseProvider`,e.leaseProvider,t.leaseProvider),Vf(`clientId`,e.clientId,t.clientId),Vf(`deviceKey`,e.deviceKey,t.deviceKey))}function Vf(e,t,n){if(!(!t||!n||t===n))throw new a(`UNAUTHORIZED`,`Lease does not match session owner (${e})`,{reason:`LEASE_SESSION_MISMATCH`,field:e})}async function Hf(e,t){if(!t.leaseProvider||!e)return!1;try{return await e(t),j({level:`info`,phase:`provider_lease_expired_released`,data:{leaseId:t.leaseId,provider:t.leaseProvider}}),!0}catch(e){return j({level:`error`,phase:`provider_lease_expiry_release_failed`,data:{leaseId:t.leaseId,provider:t.leaseProvider,error:e instanceof Error?e.message:String(e)}}),!1}}async function Uf(e){let t=e.sessionStore.lookup(e.sessionName),n=t?.session,r=n?.lease;return!t||!n||!r||!e.leaseRegistry.consumeExpiredLease(r.leaseId)?!1:(j({level:`info`,phase:`leased_session_expired`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,deviceKey:r.deviceKey}}),await e.teardownSession(t).catch(e=>{j({level:`debug`,phase:`leased_session_expiry_cleanup_failed`,data:{reason:`LEASE_EXPIRED`,leaseId:r.leaseId,session:n.name,error:e instanceof Error?e.message:String(e)}})}),await wr(n.deviceClaim).catch(e=>{j({level:`warn`,phase:`leased_session_expiry_device_claim_clear_failed`,data:{session:n.name,deviceKey:n.deviceClaim?.deviceKey,error:e instanceof Error?e.message:String(e)}})}),e.sessionStore.retire(t),!0)}function Wf(e){let{sessionName:t,sessionStore:n,leaseRegistry:r}=e,i=n.lookup(t),a=i?.session,o=Nf(e.req,r,a,{providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy});if(!o)return e.req;let s={...e.req,internal:{...e.req.internal,admittedLease:o}};return i&&a?.lease&&n.update(i,e=>({lease:{...e.lease,leaseBackend:o.backend,expiresAt:o.expiresAt}})),s}function Gf(e){return Of(e.req,e.req.internal?.admittedLease)??e.existingLease}async function Kf(e){let t=e.session.lease;if(!t)return;let n=k({leaseId:t.leaseId,tenantId:t.tenantId,runId:t.runId,leaseBackend:t.leaseBackend,leaseProvider:t.leaseProvider,deviceKey:t.deviceKey,clientId:t.clientId}),r=e.leaseRegistry.getLease(n);if(r?.retainOnClose){j({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:!1,retained:!0}});return}let i=r?await e.leaseLifecycleProvider?.release?.(r):void 0,a=Sf(i);r&&a&&e.leaseRegistry.recordProviderSession(r,a);let o=e.leaseRegistry.releaseLease(n);return j({level:`info`,phase:`session_lease_released`,data:{session:e.session.name,leaseId:t.leaseId,released:o.released}}),i}const qf=[`leaseId`,`tenantId`,`runId`,`backend`,`leaseProvider`],Jf=[`createdAt`,`heartbeatAt`,`expiresAt`];function Yf(e){let t=new Map,n=np(e.stateDir),r=new Set(n.keys()),i=e.retryDelayMs??1e3,a,o=new Map,s=!1,c=new Map,l=e=>{s&&c.set(e.leaseId,e)},u=()=>{if(!e.stateDir)return tp(n.size,Error(`daemon state directory is unavailable`)),!1;let t=ip(e.stateDir);try{if(n.size===0)I.rmSync(t,{force:!0});else{I.mkdirSync(e.stateDir,{recursive:!0,mode:448});let r={version:1,leases:[...n.values()]};Rt({destination:t,contents:`${JSON.stringify(r)}\n`,mode:384}),I.chmodSync(t,384)}r.clear();for(let e of n.keys())r.add(e);return!0}catch(e){return tp(n.size,e),!1}},d=()=>{a||!Zf(t,e.providerRuntimeIds)&&!Qf(n,e.recoverableProviderIds)||(a=setTimeout(()=>{a=void 0,h()},i),a.unref?.(),j({level:`warn`,phase:`provider_lease_expiry_retry_scheduled`,data:{pendingLiveLeaseCount:t.size,pendingRecoveryLeaseCount:n.size,retryDelayMs:i}}))},f=(e,r)=>{o.set(e,r);let i=()=>{o.get(e)===r&&o.delete(e),t.size===0&&n.size===0&&a?(clearTimeout(a),a=void 0):d()};return r.then(i,i),r},p=n=>{if(!$f(n,e.providerRuntimeIds))return;let r=`live:${n.leaseId}`,i=o.get(r);if(i)return i;let a=(async()=>{await Xf(e.leaseLifecycleProvider,n)&&(t.delete(n.leaseId),l(n))})();return f(r,a)},m=t=>{if(!ep(t,e.recoverableProviderIds)||!r.has(t.leaseId)&&!u())return;let i=`recovery:${t.leaseId}`,a=o.get(i);if(a)return a;let s=(async()=>{await Hf(e.recoverExpiredLease,t)&&(n.delete(t.leaseId),l(t),u())})();return f(i,s)},h=async()=>{let e=[...[...t.values()].map(p),...[...n.values()].map(m)].filter(e=>e!==void 0);if(e.length===0){d();return}await Promise.all(e)};return{beginShutdown:()=>{c.clear(),s=!0},release:async r=>{if(r.leaseProvider){if(ep(r,e.recoverableProviderIds)){n.set(r.leaseId,r),u()?await m(r):d();return}$f(r,e.providerRuntimeIds)&&e.leaseLifecycleProvider?.release&&(t.set(r.leaseId,r),await p(r),t.has(r.leaseId)&&d())}},retryPending:h,drain:async e=>{await Promise.race([h(),Ht(Math.max(0,e))]);let r={pending:[...t.values(),...n.values()],released:[...c.values()]};return s=!1,c.clear(),r},shutdown:()=>{a&&clearTimeout(a),a=void 0}}}async function Xf(e,t){return await Hf(e?.release?async t=>{await e.release?.(t)}:void 0,t)}function Zf(e,t){return[...e.values()].some(e=>$f(e,t))}function Qf(e,t){return[...e.values()].some(e=>ep(e,t))}function $f(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function ep(e,t){return e.leaseProvider!==void 0&&t?.includes(e.leaseProvider)===!0}function tp(e,t){j({level:`error`,phase:`provider_lease_expiry_record_write_failed`,data:{pendingLeaseCount:e,error:t instanceof Error?t.message:String(t)}})}function np(e){if(!e)return new Map;let t=ip(e);try{let e=JSON.parse(I.readFileSync(t,`utf8`));if(e.version!==1||!Array.isArray(e.leases))throw Error(`unsupported expiry release record`);return new Map(e.leases.filter(rp).map(e=>[e.leaseId,e]))}catch(e){return e.code===`ENOENT`||j({level:`warn`,phase:`provider_lease_expiry_record_read_failed`,data:{error:e instanceof Error?e.message:String(e)}}),new Map}}function rp(e){if(!e||typeof e!=`object`)return!1;let t=e;return qf.every(e=>typeof t[e]==`string`)&&Jf.every(e=>typeof t[e]==`number`)}function ip(e){return L.join(e,`expired-provider-leases.json`)}function ap(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.nodes)?e.nodes:[],r=n.filter(e=>e.hittable===!0&&e.interactionBlocked!==`covered`).slice(0,12).map(e=>({ref:e.ref,label:e.label??e.value??e.identifier})),i=Object.fromEntries([`visibility`,`viewport`,`snapshotQuality`,`targetActivation`,`observation`,`warnings`,`fallbackScreenshotPath`,`artifacts`,`refsGeneration`].filter(t=>e[t]!==void 0).map(t=>[t,e[t]]));return{nodeCount:n.length,refs:r,truncated:e.truncated,...i}}const op=[`width`,`height`,`logicalWidth`,`logicalHeight`,`pixelDensity`];function sp(e,t){if(t!==`digest`)return e;let n=Array.isArray(e.overlayRefs)?e.overlayRefs:[],r=n.slice(0,12).map(e=>({ref:e.ref,label:e.label}));return{...cp(e),overlayCount:n.length,overlayRefs:r,...e.warnings===void 0?{}:{warnings:e.warnings},...e.artifacts===void 0?{}:{artifacts:e.artifacts}}}function cp(e){let t={};typeof e.path==`string`&&(t.path=e.path),D(e.displayRotation)&&(t.displayRotation=e.displayRotation);for(let n of op)typeof e[n]==`number`&&(t[n]=e[n]);return t}const lp=[`role`,`type`,`subrole`,`label`,`value`,`contentDescription`,`identifier`,`enabled`,`selected`,`checked`,`focused`,`heading`,`roleDescription`,`editable`,`password`,`hintShowing`,`placeholder`,`selectionStart`,`selectionEnd`,`hittable`];function up(e){let t={ref:e.ref};for(let n of lp){let r=e[n];r!==void 0&&(t[n]=r)}return t}function dp(e,t){if(t!==`digest`)return e;let n=e.node;if(!n||typeof n!=`object`)return e;if(typeof e.text==`string`){let{node:t,...n}=e;return n}return{...e,node:up(n)}}function fp(e,t){return t===`digest`?mp(pp(e)):e}function pp(e){let t=e.resolution;if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=t;if(n.kind!==`disambiguated`)return e;let{alternatives:r,...i}=n;return{...e,resolution:i}}function mp(e){let t=e.settle;if(!t||typeof t!=`object`||Array.isArray(t))return e;let{diff:n,tail:r,...i}=t;if(!n||typeof n!=`object`||Array.isArray(n))return e;let a=n,o=a.summary,s=gp(a.lines);return{...e,settle:{...i,...s.length>0?{refs:s}:{},...hp(r),diff:{summary:o}}}}function hp(e){return!Array.isArray(e)||e.length===0?{}:{tail:e.slice(0,12)}}function gp(e){return Array.isArray(e)?e.flatMap(_p).slice(0,12):[]}function _p(e){let t=yp(e);return t?.kind===`added`?vp(t.ref):[]}function vp(e){return typeof e==`string`&&e.length>0?[{ref:e}]:[]}function yp(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:void 0}const bp=[`headers`,`requestHeaders`,`responseHeaders`,`requestBody`,`responseBody`,`raw`];function xp(e,t){if(t!==`digest`)return e;let n=e.entries;return Array.isArray(n)?{...e,entries:n.map(Sp)}:e}function Sp(e){let t=yp(e);if(!t)return e;let n={};for(let[e,r]of Object.entries(t))bp.includes(e)||(n[e]=r);return n}const Cp={snapshot:ap,screenshot:sp,find:dp,get:dp,press:fp,click:fp,fill:fp,longpress:fp,hover:fp,network:xp},wp=[`platform`,`target`],Tp=[`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];function Ep(e){return nt({deviceName:e?.device,udid:e?.udid,serial:e?.serial})}function Dp(e){return Ep(e)||Ap(e,wp)}function Op(e){return Dp(e)||Ap(e,Tp)}function kp(e){return typeof e==`string`&&e.trim().length>0}function Ap(e,t){return e?t.some(t=>kp(e[t])):!1}async function jp(e){let t=await Mp(e.req,e.existingSession);if(t)return{device:t,...e.req.session===void 0?{}:{requestedSession:e.req.session},...e.req.meta?.requestId===void 0?{}:{requestId:e.req.meta.requestId},...e.existingSession?{session:{name:e.existingSession.name,device:e.existingSession.device,...e.existingSession.appBundleId?{appBundleId:e.existingSession.appBundleId}:{},...e.existingSession.appName?{appName:e.existingSession.appName}:{},...e.existingSession.surface?{surface:e.existingSession.surface}:{}}}:{},...e.useDefaultWebProvider?{useDefaultWebProvider:!0}:{}}}async function Mp(e,t){switch(ku(e,{hasExistingSession:!!t,hasExplicitDeviceIdentity:Ep(e.flags),hasDeviceSelectionInput:Dp(e.flags)})){case`existing-session`:return t?.device;case`explicit-device`:case`sessionless-default-device`:try{return await Np(e)}catch{return}case`skip`:return}}async function Np(e){let t=e.command===`open`?zn(e.positionals?.[0]):void 0;return await In(e.flags??{},t)}var Pp=class e{#e;constructor(e){this.#e=e}get state(){return this.#e.state}get scope(){return this.#e.scope}get tree(){return this.#e.tree}get generation(){return this.#e.generation}static expire(t){return t.#e.state===`expired`?t:new e({...t.#e,state:`expired`})}};const Fp=new Pp({state:`active`,scope:`all`,tree:void 0,generation:void 0});function Ip(e){return new Pp({state:`active`,...e})}function Lp(e){return Pp.expire(e)}const Rp=new WeakMap,zp=new WeakSet;function Bp(e){return e.refFrame??Fp}function Vp(e){return Bp(e).generation??e.snapshotGeneration}function Hp(e){return Bp(e).tree}function Up(e){Kp(e),Wp(e),e.refFrame=Lp(Bp(e)),e.snapshotScopeSource=void 0}function Wp(e){e.snapshot&&zp.add(e.snapshot)}function Gp(e){return zp.has(e)}function Kp(e){let t=qp(e)+1;return Rp.set(e,t),t}function qp(e){return Rp.get(e)??0}function Jp(e){Xp(e,`all`)}function Yp(e,t){Xp(e,t)}function Xp(e,t){e.refFrame=Ip({scope:t,tree:e.snapshot,generation:e.snapshotGeneration})}function Zp(e){return Bp(e).state}function Qp(e){return Bp(e).scope}function $p(e){let t=e.ref.startsWith(`@`)?e.ref.slice(1):e.ref;return{admission:em({session:e.session,refBody:t,mintedGeneration:e.mintedGeneration}),scope:Qp(e.session),currentGeneration:Vp(e.session)}}function em(e){let{session:t,refBody:n,mintedGeneration:r}=e;if(Zp(t)===`expired`)return{admitted:!1,reason:`ref_frame_expired`};if(r!==void 0&&r!==Vp(t))return{admitted:!1,reason:`ref_generation_mismatch`};let i=Qp(t);if(i!==`all`){if(r===void 0)return{admitted:!1,reason:`plain_ref_requires_complete_frame`};if(!i.has(n))return{admitted:!1,reason:`ref_not_issued`}}return{admitted:!0}}const tm=/\bis(?:n(?:'|&apos;|&#39;)?t| not)\s+responding\b/i,nm=/^close app$/i,rm=`Wait for Android to recover, close the dialog, restart the app, or reboot the emulator, then retry.`;function im(e){if(!e)throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`);return e}async function am(e){let{session:t}=e;if(t.device.platform!==`android`||!t.screenRecording||xm(t))return{status:`absent`};let n=im(e.observation),r;try{r=await mm(t,n)}catch(e){let n=s(e);return j({level:`warn`,phase:`android_blocking_dialog_inspection_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`unknown`,reason:`inspection-failed`,warning:fm(n)}}let i=gm(r);if(!i?.rect)return{status:`absent`};try{let e=await hm(t,i,n);return e.ok?await vm(t,n)?t.appBundleId&&(await n.openApp(t.device,t.appBundleId),!await ym(t,t.appBundleId,n))?(j({level:`warn`,phase:`android_blocking_dialog_relaunch_unfocused`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId}}),{status:`failed`,reason:`relaunch-failed`}):(j({level:`warn`,phase:`android_blocking_dialog_recovered`,data:{session:t.name,deviceId:t.device.id,appBundleId:t.appBundleId,x:e.x,y:e.y}}),{status:`recovered`}):(j({level:`warn`,phase:`android_blocking_dialog_still_present`,data:{session:t.name,deviceId:t.device.id}}),{status:`failed`,reason:`dismiss-failed`}):(j({level:`warn`,phase:`android_blocking_dialog_tap_failed`,data:{session:t.name,deviceId:t.device.id,exitCode:e.exitCode,stdout:e.stdout.trim(),stderr:e.stderr.trim()}}),{status:`failed`,reason:`tap-failed`})}catch(e){return j({level:`warn`,phase:`android_blocking_dialog_recovery_failed`,data:{session:t.name,deviceId:t.device.id,error:e instanceof Error?e.message:String(e)}}),{status:`failed`,reason:`error`}}}async function om(e){let{session:t,command:n}=e;if(t.device.platform!==`android`||xm(t))return{status:`clear`};let r=im(e.observation),i=await r.readBlockingDialog(t.device);if(i.status!==`dialog`)return i.status===`unknown`&&j({level:`warn`,phase:`android_blocking_dialog_unobserved`,data:{session:t.name,deviceId:t.device.id,command:n,commandPhase:e.phase}}),{status:`clear`};let a=i.focus;if(cm(t,a)){if(await sm(t,r)){let r=`Recovered Android app ANR before ${n}: closed and relaunched ${t.appBundleId}.`;if(e.phase===`before-command`)return{status:`recovered`,warning:r};throw um({session:t,command:n,focus:a,message:`Android app ANR appeared after ${n}; ${t.appBundleId} was closed and relaunched. Retry the command against the fresh app session.`,hint:`Retry the command. If the ANR returns, inspect app logs or restart the emulator.`})}throw um({session:t,command:n,focus:a,message:`Android app ANR blocked ${n}: ${dm(a)}. Automatic recovery failed.`,hint:rm})}throw um({session:t,command:n,focus:a,message:`Android system dialog is blocking ${n}: ${dm(a)}.`,hint:rm})}async function sm(e,t){try{return await lm(e,t)}catch(t){return j({level:`warn`,phase:`android_app_anr_recovery_failed`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,error:t instanceof Error?t.message:String(t)}}),!1}}function cm(e,t){return!!(e.appBundleId&&t.package===e.appBundleId)}async function lm(e,t){if(!e.appBundleId)return!1;let n=gm(await mm(e,t),{requireDialogSignal:!1});if(!n?.rect)return!1;let r=await hm(e,n,t);if(!r.ok)return!1;await t.openApp(e.device,e.appBundleId);let i=await ym(e,e.appBundleId,t,{requireNoBlockingDialog:!0});return i&&j({level:`warn`,phase:`android_app_anr_recovered`,data:{session:e.name,deviceId:e.device.id,appBundleId:e.appBundleId,x:r.x,y:r.y}}),i}function um(e){let{session:t,command:n,focus:r,message:i,hint:o}=e;return new a(`COMMAND_FAILED`,i,{command:n,expectedPackage:t.appBundleId,focusedPackage:r.package,focusedWindow:r.focusedWindow,rawFocus:r.raw,hint:o})}function dm(e){return e.package?`${e.focusedWindow} (package ${e.package})`:e.focusedWindow}function fm(e){let t=[`Inspection error: ${pm(e.message)}`];return e.hint&&t.push(`Hint: ${pm(e.hint)}`),[`Android blocking-dialog readiness could not be inspected; the command continued.`,...t].join(` `)}function pm(e){let t=e.replaceAll(/\s+/g,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}async function mm(e,t){return await t.readSnapshotNodes(e.device)}async function hm(e,t,n){if(!t.rect)return{ok:!1,exitCode:1,stdout:``,stderr:`button has no rect`};let{x:r,y:i}=u(t.rect);Up(e);let a=await n.tap(e.device,r,i);return a.exitCode===0?{ok:!0,x:r,y:i}:{ok:!1,exitCode:a.exitCode,stdout:a.stdout.trim(),stderr:a.stderr.trim()}}function gm(e,t={}){if(!(t.requireDialogSignal!==!1&&!wm(e)))return e.filter(_m).find(e=>Cm(e).some(e=>nm.test(e))&&e.rect)}function _m(e){return!Dn(e)}async function vm(e,t){for(let n=0;n<12;n+=1){if(!wm(await mm(e,t)))return!0;await Ht(500)}return!wm(await mm(e,t))}async function ym(e,t,n,r={}){for(let i=0;i<12;i+=1){if(await bm(e,t,n,r))return!0;await Ht(500)}return await bm(e,t,n,r)}async function bm(e,t,n,r){return await n.readAppFocus(e.device,t,r)}function xm(e){return!!e.lease?.leaseProvider||ar(e.device)}function Sm(e){return Cm(e).join(` `).trim()}function Cm(e){let t=[e.label,e.identifier];return typeof e.value==`string`&&e.value.trim().length>0&&t.push(e.value),t.filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim())}function wm(e){return e.filter(_m).some(e=>{let t=Sm(e);return t.length>0&&tm.test(t)})}function Tm(e,t,n=e.snapshot){if(e.device.platform!==`android`)return;let r=Em(e,n),i=r?.comparisonSafe===!0;e.androidSnapshotFreshness={action:t,markedAt:Date.now(),baselineCount:(r??n)?.nodes.length??0,baselineSignatures:i?Fr(r?.nodes??[]):void 0,routeComparable:i}}function Em(e,t){if(t?.comparisonSafe===!0)return t;let n=e.lastComparisonSafeSnapshot;return!n||n.comparisonSafe!==!0?t:Date.now()-n.createdAt<=5e3?n:t}function Dm(e){if(!e||e.device.platform!==`android`)return;let t=e.androidSnapshotFreshness;if(t){if(Date.now()-t.markedAt>2500){delete e.androidSnapshotFreshness;return}return t}}function Om(e){!e||e.device.platform!==`android`||delete e.androidSnapshotFreshness}async function km(e,t){return Wr({capture:e.capture,classify:n=>Ir({snapshot:n.snapshot,rawNodeCount:n.annotations.analysis?.rawNodeCount},t,{interactiveOnly:e.interactiveOnly,mode:e.androidFreshnessMode}),window:t,retry:{retryBudgetMs:Pr,delaysMs:Ur},onTrustworthyCapture:()=>Om(e.session)})}function Am(e){let t=new Map,n=[],r=Pn(e);for(let i of e){let e=Vm(i,t,r);e&&n.push(e)}return n}function jm(e){return e?.comparisonKey??e?.snapshotQuality?.backend}function Mm(e,t){return Math.abs(e.x-t.x)<=1&&Math.abs(e.y-t.y)<=1&&Math.abs(e.width-t.width)<=1&&Math.abs(e.height-t.height)<=1}function Nm(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n+=1){let r=e[n],i=t[n];if(!r||!i||r.key!==i.key||!Mm(r,i))return!1}return!0}function Pm(e,t){let n=Fm(e),r=Fm(t);if(n.size===0||r.size===0)return`ambiguous`;let i=0,a=!1;for(let[e,t]of n){let n=r.get(e);if(!n){a=!0;continue}if(i+=1,!Mm(t,n))return`changed`}if(i===0)return`ambiguous`;let o=r.size>i;return a&&o?`changed`:`unchanged`}function Fm(e){let t=new Map;for(let n of e)!n.identity||!n.discriminating||t.has(n.identity)||t.set(n.identity,n);return t}function Im(e,t){let n=e.filter(e=>e.discriminating),r=t.filter(e=>e.discriminating);if(n.length===0||n.length!==r.length)return!1;let i=new Map(r.map(e=>[e.key,e]));for(let e of n){let t=i.get(e.key);if(!t||!Mm(e,t))return!1}return!0}function Lm(e,t){let n=new Map(t.filter(e=>e.discriminating).map(e=>[e.key,e])),r=0,i=0,a=0;for(let t of e){if(!t.discriminating)continue;let e=n.get(t.key);if(!e){r+=1;continue}n.delete(t.key),a+=1,Mm(t,e)||(i+=1)}return{onlyInBaseline:r,onlyInCurrent:n.size,rectMismatched:i,shared:a}}function Rm(e,t,n){let r=zm(Bm(e,n)),i=zm(Bm(t,n));for(let[e,t]of r){let n=i.get(e);if(!n||!Mm(t,n))return!0;i.delete(e)}return i.size>0}function zm(e){let t=new Map,n=new Map;for(let r of e){let e=t.get(r.content)??0;t.set(r.content,e+1),n.set(`${r.content}|#${e}`,r)}return n}function Bm(e,t){return e.filter(e=>e.discriminating&&e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height)}function Vm(e,t,n){if(!e.rect||!Km(e.rect)||qm(e))return;let r=Gm(e);if(!r)return;let i=t.get(r)??0;t.set(r,i+1);let a=Um(e);return{key:`${r}|#${i}`,...a?{identity:a}:{},content:Hm(e,a),x:Math.round(e.rect.x),y:Math.round(e.rect.y),width:Math.round(e.rect.width),height:Math.round(e.rect.height),discriminating:!Wm(e,n)}}function Hm(e,t){return t??`${e.type??``}|${e.role??``}`}function Um(e){let t=[e.identifier,e.label,e.value].map(e=>typeof e==`string`?e.trim():``).join(`|`);if(t.replaceAll(`|`,``))return`${t}|${e.type??``}`}function Wm(e,t){return ot(e)||e.ref!==void 0&&t.has(e.ref)}function Gm(e){let t=[e.identifier,e.label,e.value,e.type,e.role,...Ae(e),e.hittable===!0?`hittable`:`not-hittable`].map(e=>typeof e==`string`?e.trim():``).join(`|`);return t.replaceAll(`|`,``)?t:void 0}function Km(e){return[e.x,e.y,e.width,e.height].every(e=>Number.isFinite(e))&&e.width>0&&e.height>0}function qm(e){return`${e.label??``} ${e.identifier??``}`.toLowerCase().includes(`scroll bar`)}function Jm(e){let{session:t,command:n,action:r=n,positionals:i,flags:a,androidFreshnessBaseline:o}=e;Br(r)&&Tm(t,r,o??t.snapshot),Ym(t,r,i,a)}function Ym(e,t,n=[],r){if(!oh(e.device)||!ah(t,n,r))return;let i=sh(e.device)?Am(e.snapshot?.nodes??[]):void 0;e.postGestureStabilization={action:t,positionals:n,markedAt:Date.now(),...i?.length?{baselineSignature:i,baselineBackend:jm(e.snapshot)}:{}}}function Xm(e,t){$e(e.device.platform)&&oh(e.device)&&t!==void 0&&t!==`observable`&&(e.postGestureStabilization={action:`open`,positionals:[],markedAt:Date.now()})}function Zm(e){e?.postGestureStabilization&&(e.postGestureStabilization=void 0)}function Qm(e){return!!e?.postGestureStabilization}async function $m(e){if(Ze(e.device)&&e.session&&Qm(e.session))return await eh({...e,session:e.session});let t=Dm(e.session);if(t&&e.device.platform===`android`){let n=await km(e,t);return{snapshot:n.snapshot,...n.annotations}}}async function eh(e){return rh(await nh({session:e.session,capture:async()=>await th(e),readSnapshot:e=>e.snapshot}))}async function th(e){let t=Dm(e.session);return t&&e.device.platform===`android`?await km(e,t):await e.capture()}async function nh(e){let{session:t,capture:n,readSnapshot:r}=e,i=t?.postGestureStabilization;if(!t||!oh(t.device)||!i)return{value:e.initial??await n()};try{return await Hr({pending:{action:i.action,positionals:i.positionals??[],baselineSignature:i.baselineSignature,baselineBackend:i.baselineBackend},needsBaselineDistrust:sh(t.device),initial:e.initial,hooks:{capture:n,readSurface:e=>{let t=r(e);return{signature:Am(t.nodes),backend:jm(t)}},signaturesStable:Nm,classifyBaselineEvidence:Pm,surfacesIdentical:Im,summarizeDivergence:Lm}})}finally{Zm(t)}}function rh(e){let{snapshot:t,annotations:n}=e.value;return e.postGestureOutcome&&(t.postGestureOutcome=e.postGestureOutcome),{snapshot:t,...n}}function ih(e){if(!e?.postGestureStabilization)return e;let{postGestureStabilization:t,...n}=e;return n}function ah(e,t,n){return n?.postGestureStabilization===!1?!1:n?.postGestureStabilization===!0||e===`swipe`||e===`scroll`||e===`gesture`&&t[0]===`swipe`}function oh(e){return Ze(e)}function sh(e){return $e(e.platform)}function ch(e){if(typeof e.gestureClockOriginAtMs==`number`&&typeof e.gestureClockOriginUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`){let t=e.gestureClockOriginAtMs+(e.gestureStartUptimeMs-e.gestureClockOriginUptimeMs);return Math.max(0,t-e.recordingStartedAt)}if(typeof e.runnerStartedAtUptimeMs==`number`&&typeof e.gestureStartUptimeMs==`number`)return Math.max(0,e.gestureStartUptimeMs-e.runnerStartedAtUptimeMs);if(typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`){let t=e.fallbackFinishedAtMs-(e.gestureEndUptimeMs-e.gestureStartUptimeMs);return Math.max(0,t-e.recordingStartedAt)}return Math.max(0,e.fallbackStartedAtMs-e.recordingStartedAt)}function lh(e){return typeof e.gestureStartUptimeMs==`number`&&typeof e.gestureEndUptimeMs==`number`?Math.max(0,e.gestureEndUptimeMs-e.gestureStartUptimeMs):typeof e.reportedDurationMs==`number`?Math.max(0,e.reportedDurationMs):Math.max(0,e.fallbackFinishedAtMs-e.fallbackStartedAtMs)}function uh(e){let t=Math.max(0,e.gestureDurationMs);if(t<600)return ch(e);let n=Math.min(Math.max(t*.15,120),260);return Math.max(0,e.fallbackFinishedAtMs-n-e.recordingStartedAt)}function Y(e){if(typeof e==`number`&&Number.isFinite(e))return e;if(typeof e!=`string`||e.trim().length===0)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function dh(e,t,n){for(let r of[e,...t,n]){let e=Y(r);if(e!==void 0&&e>=1)return Math.floor(e)}return n}function fh(e,t,n,r,i){switch(t.kind){case`pan`:case`fling`:case`rotate`:case`transform`:{let e=gh(t.from),a=gh(t.to);if(!e||!a)return[];let o=(t.kind===`pan`||t.kind===`fling`)&&Y(t.pointerCount)!==2;return[ph(n,e.x,e.y,a.x,a.y,dh(r,[t.durationMs],250),{referenceFrame:i,classifyBackSwipe:o})]}case`pinch`:{let a=gh(t.from),o=Y(t.scale)??Y(e[1]);return!a||o===void 0||o<=0?[]:[{kind:`pinch`,tMs:n,x:a.x,y:a.y,...i,scale:o,durationMs:dh(r,[t.durationMs],280)}]}default:return[]}}function ph(e,t,n,r,i,a,o={}){let{referenceFrame:s,classifyBackSwipe:c=!0}=o,l=c?mh(t,n,r,i,s):`swipe`;return l===`back-swipe`?{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a,edge:hh(t,r,s)}:{kind:l,tMs:e,x:t,y:n,x2:r,y2:i,...s,durationMs:a}}function mh(e,t,n,r,i){if(!i||Math.abs(n-e)<=Math.abs(r-t)*1.25)return`swipe`;let a=i.referenceWidth*.08;return e<=a&&n>e||e>=i.referenceWidth-a&&n<e?`back-swipe`:`swipe`}function hh(e,t,n){if(n){let t=n.referenceWidth*.08;if(e<=t)return`left`;if(e>=n.referenceWidth-t)return`right`}return t>=e?`left`:`right`}function gh(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e,n=Y(t.x),r=Y(t.y);if(n!==void 0&&r!==void 0)return{x:n,y:r}}const _h={referenceWidth:1e3,referenceHeight:1e3};function vh(e,t,n,r,i={},a=Date.now(),o=Date.now()){let s=e.screenRecording?.handle;if(!s)return;let c=s.inspect(),l={...i,...r??{}},u=Y(l.effectiveDurationMs)??Y(l.durationMs),d={recordingStartedAt:c.startedAt,gestureClockOriginAtMs:c.gestureClockOriginAtMs,gestureClockOriginUptimeMs:c.gestureClockOriginUptimeMs,runnerStartedAtUptimeMs:c.runnerStartedAtUptimeMs,gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),fallbackStartedAtMs:a,fallbackFinishedAtMs:o},f=lh({gestureStartUptimeMs:Y(l.gestureStartUptimeMs),gestureEndUptimeMs:Y(l.gestureEndUptimeMs),reportedDurationMs:u,fallbackStartedAtMs:a,fallbackFinishedAtMs:o}),p=N(e.device)&&Y(l.gestureStartUptimeMs)===void 0&&Ch(t,l)?uh({...d,gestureDurationMs:f}):ch(d),m=xh(t,n,l,p,f,Mh(e.snapshot,l));m.length!==0&&(s.appendGestureEvents(m),j({level:`debug`,phase:`record_touch_visualization_event`,data:{session:e.name,command:t,count:m.length,tMs:p,gestureDurationMs:f,kinds:m.map(e=>e.kind)}}))}function yh(e,t,n,r){if(t!==`scroll`)return r;let i=Gn(e.snapshot),a={...r??{}},o=Nh(a.direction)??Nh(n[0]);if(!o)return r;let s=Y(a.amount)??Y(n[1]),c=Y(a.pixels),l=Y(a.durationMs)??bh(e),u=Fh(a,[]),d=Y(a.referenceWidth),f=Y(a.referenceHeight),p=d!==void 0&&d>0&&f!==void 0&&f>0?{referenceWidth:d,referenceHeight:f}:i??_h;if(u&&(u.x1!==u.x2||u.y1!==u.y2))return{...a,x1:u.x1,y1:u.y1,x2:u.x2,y2:u.y2,contentDirection:o,...s===void 0?{}:{amount:s},...c===void 0?{}:{pixels:c},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l};let m=ae({direction:o,amount:s,pixels:c,referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight});return{...a,x1:m.x1,y1:m.y1,x2:m.x2,y2:m.y2,contentDirection:o,...s===void 0?{}:{amount:s},...m.pixels===void 0?{}:{pixels:m.pixels},referenceWidth:p.referenceWidth,referenceHeight:p.referenceHeight,durationMs:l}}function bh(e){return e.device.target===`desktop`||e.device.target===`tv`?250:300}function xh(e,t,n,r,i,a){let o=Sh[e];return o?.(t,n,r,i,a)??[]}const Sh={click:(e,t,n,r,i)=>wh(e,t,n,i),press:(e,t,n,r,i)=>wh(e,t,n,i),"react-native":(e,t,n,r,i)=>e[0]===`dismiss-overlay`?wh(e,t,n,i):[],fill:(e,t,n,r,i)=>Th(e,t,n,i),focus:(e,t,n,r,i)=>Th(e,t,n,i),longpress:Eh,scroll:kh,gesture:fh,swipe:Dh};function Ch(e,t){switch(e){case`click`:case`fill`:case`focus`:return!0;case`press`:{let e=X(Y(t.count),1)??1,n=t.doubleTap===!0,r=X(Y(t.holdMs),1);return e===1&&!n&&r===void 0}case`react-native`:return t.action===`dismiss-overlay`;default:return!1}}function wh(e,t,n,r){let i=Ph(t,e);if(!i)return[];let{x:a,y:o}=i,s=X(Y(t.count),1)??1,c=X(Y(t.intervalMs),0)??0,l=t.doubleTap===!0,u=X(Y(t.holdMs),1),d=[];for(let e=0;e<s;e+=1){let t=n+e*c;if(u!==void 0&&u>0){d.push(jh(t,a,o,u,r));continue}d.push(Ah(t,a,o,r)),l&&d.push(Ah(t+90,a,o,r))}return d}function Th(e,t,n,r){let i=Ph(t,e);if(!i)return[];let{x:a,y:o}=i;return[Ah(n,a,o,r)]}function Eh(e,t,n,r,i){let a=Ph(t,e);if(!a)return[];let{x:o,y:s}=a;return[jh(n,o,s,dh(r,[Y(t.durationMs),Y(e[2])],800),i)]}function Dh(e,t,n,r,i){let a=Fh(t,e);if(!a)return[];let{x1:o,y1:s,x2:c,y2:l}=a,u=dh(r,[Y(t.effectiveDurationMs),Y(t.durationMs)],250),d=X(Y(t.count),1)??1,f=X(Y(t.pauseMs),0)??0,p=t.pattern===`ping-pong`?`ping-pong`:`one-way`;return Array.from({length:d},(e,t)=>{let{startX:r,startY:a,endX:d,endY:m}=Oh(t,p,o,s,c,l);return ph(n+t*(u+f),r,a,d,m,u,{referenceFrame:i})})}function Oh(e,t,n,r,i,a){return t===`ping-pong`&&e%2==1?{startX:i,startY:a,endX:n,endY:r}:{startX:n,startY:r,endX:i,endY:a}}function kh(e,t,n,r,i){let a=Fh(t,e),o=Nh(t.contentDirection)??Nh(t.direction);if(!a||!o)return[];let{x1:s,y1:c,x2:l,y2:u}=a,d=dh(r,[],250),f=Y(t.amount)??Y(e[1]),p=Y(t.pixels);return[{kind:`scroll`,tMs:n,x:s,y:c,x2:l,y2:u,...i,durationMs:d,contentDirection:o,...f===void 0?{}:{amount:f},...p===void 0?{}:{pixels:p}}]}function Ah(e,t,n,r){return{kind:`tap`,tMs:e,x:t,y:n,...r}}function jh(e,t,n,r,i){return{kind:`longpress`,tMs:e,x:t,y:n,...i,durationMs:r}}function Mh(e,t){let n=Y(t.referenceWidth),r=Y(t.referenceHeight);return n!==void 0&&n>0&&r!==void 0&&r>0?{referenceWidth:n,referenceHeight:r}:Gn(e)}function Nh(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();switch(t){case`up`:case`down`:case`left`:case`right`:return t;default:return}}function X(e,t){if(e===void 0)return;let n=Math.floor(e);return n>=t?n:void 0}function Ph(e,t,n=0){let r=Y(e.x)??Y(t[n]),i=Y(e.y)??Y(t[n+1]);if(r!==void 0&&i!==void 0)return{x:r,y:i}}function Fh(e,t){let n=Ih(e.x1,e.x,t[0]),r=Ih(e.y1,e.y,t[1]),i=Ih(e.x2,t[2]),a=Ih(e.y2,t[3]);if(n!==void 0&&r!==void 0&&i!==void 0&&a!==void 0)return{x1:n,y1:r,x2:i,y2:a}}function Ih(...e){return e.map(Y).find(e=>e!==void 0)}var Lh=e({dispatchGenericCommand:()=>Rh});async function Rh(e){let{req:t,ref:n,logPath:r,sessionStore:i,contextFromFlags:a}=e,o=i.requireCurrent(n),s=t.command,c=await Wh(o,s,e.androidObservation);if(c.response)return c.response;let l=await Vh({sessionRef:n,req:t,session:o,sessionName:e.sessionName,logPath:r,sessionStore:i,contextFromFlags:a,platformServices:e.platformServices,command:s,flags:t.flags,createCommandSurface:e.createCommandSurface});if(`response`in l)return l.response;let u=await Uh(o,s,e.androidObservation);if(`response`in u)return u.response;let d=t.positionals??[],f=e.recordedRequest??{positionals:d,flags:t.flags??{}},p=Date.now(),m=i.requireCurrent(n),h={...a(t.flags,m.appBundleId,m.trace?.outPath),surface:m.surface};return Ou(t)===`may-invalidate`&&Up(m),await zh({req:t,ref:n,sessionStore:i,command:s,resolvedPositionals:d,recorded:f,data:await e.executePlatformCommand({session:m,sessionName:e.sessionName,logPath:r,command:s,request:t,positionals:d,out:t.flags?.out,dispatchContext:h}),actionStartedAt:p,readinessWarnings:[c.warning,u.status===`recovered`?u.warning:void 0],observeSettle:l.observe,androidObservation:e.androidObservation})}async function zh(e){let{req:t,ref:n,sessionStore:r,command:i}=e,a=await Uh(r.requireCurrent(n),i,e.androidObservation,`after-command`);if(`response`in a)return a.response;let o=Bh(e.data,e.readinessWarnings);if(Gh({ref:n,sessionStore:r,command:i,resolvedPositionals:e.resolvedPositionals,recorded:e.recorded,data:o,actionStartedAt:e.actionStartedAt,actionFinishedAt:Date.now(),flags:t.flags??{},clientArtifactPaths:t.meta?.clientArtifactPaths}),Jm({session:r.requireCurrent(n),command:i,positionals:e.resolvedPositionals,flags:t.flags}),e.observeSettle){let t=await e.observeSettle();t&&(o={...o??{},settle:t})}return{ok:!0,data:o??{}}}function Bh(e,t){let n=t.filter(e=>typeof e==`string`&&e.length>0);if(n.length===0||e&&typeof e!=`object`)return e;let r=e&&typeof e.warning==`string`&&e.warning.length>0?[e.warning]:[];return{...e??{},warning:[...r,...n].join(` `)}}async function Vh(e){return!wt(e.command)||!Hh(e.flags)?{}:(await import(`../generic-settle.js`)).planGenericSettleObservation(e)}function Hh(e){return e?.settle===!0||e?.settleQuietMs!==void 0}async function Uh(e,t,n,r=`before-command`){if(e.device.platform!==`android`||!Cu(t)||ar(e.device))return{status:`clear`};try{return await om({session:e,command:t,phase:r,observation:n})}catch(e){return{response:{ok:!1,error:s(e)}}}}async function Wh(e,t,n){if(e.device.platform!==`android`||ar(e.device)||!e.screenRecording||t===`record`)return{};let r=await am({session:e,observation:n});return r.status===`failed`?{response:{ok:!1,error:{code:`COMMAND_FAILED`,message:`Android system dialog blocked the recording session`}}}:r.status===`unknown`?{warning:r.warning}:{}}function Gh(e){let{ref:t,sessionStore:n,command:r,resolvedPositionals:i,recorded:a,data:o,actionStartedAt:s,actionFinishedAt:c,flags:l,clientArtifactPaths:u}=e,d=n.requireCurrent(t);vh(d,r,i,yh(d,r,i,o),l,s,c),n.recordAction(t,{command:r,positionals:a.positionals,flags:a.flags,result:Fn({command:r,meta:{clientArtifactPaths:u}},o??{})})}function Kh(e){let t=e.now??Date.now,n=e.undurableCleanupTtlMs??3e5,r=new Map;return Object.freeze({blockUndurableCleanup(e,i){let a=qe(e);r.set(Je(a),{device:a,reason:i,expiresAt:t()+n})},clearUndurableCleanup(e){r.delete(Je(qe(e)))},assertStartAllowed(n){let i=Je(qe(n)),o=r.get(i);if(o){if(t()>o.expiresAt){r.delete(i),e.onUndurableCleanupExpired?.({device:o.device,reason:o.reason});return}throw new a(`COMMAND_FAILED`,`The existing ${e.displayName.toLowerCase()} resource has process-local unconfirmed ownership`,{reason:`cleanup-unconfirmed`,hint:`Do not start a replacement in this daemon process: ${o.reason}`})}}})}function qh(){return Kh({displayName:`audio probe`})}function Jh(){return Kh({displayName:`perf capture`})}function Yh(){return Kh({displayName:`screen recording`})}const Xh={humanControl:Z({load:()=>import(`../human-control.js`),run:$h}),lease:Z({load:()=>import(`../lease.js`),run:eg}),session:Z({load:()=>import(`../session2.js`),run:tg}),snapshot:Z({load:()=>import(`../snapshot3.js`),run:ng}),reactNative:Z({load:()=>import(`../react-native.js`),run:rg}),recordTrace:Z({load:()=>import(`../record-trace.js`),run:ig}),find:Z({load:()=>import(`../interaction.js`),run:ag}),interaction:Z({load:()=>import(`../interaction.js`),run:og}),generic:Z({load:async()=>Lh,run:async()=>null})};async function Zh(e){let t=fu(e.req.command);return await Xh[t].run(e)}async function Qh(){return await Xh.generic.loadModule()}async function $h({handleHumanControlCommand:e},t){return await e({req:t.req,registry:t.leaseRegistry})}async function eg({handleLeaseCommands:e},t){return cg(t.req.command,`lease`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,leaseRegistry:t.leaseRegistry,providerRuntimeIds:t.providerRuntimeIds,providerRuntimeRequiredIds:t.providerRuntimeRequiredIds,providerCredentials:t.providerCredentials,leaseLifecycleProvider:t.leaseLifecycleProvider,cloudArtifactProvider:t.cloudArtifactProvider}))}async function tg({handleSessionCommands:e},t){return cg(t.req.command,`session`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,leaseRegistry:t.leaseRegistry,leaseLifecycleProvider:t.leaseLifecycleProvider,providerAppCatalog:t.providerAppCatalog,invoke:t.invoke,invokeReplayAction:t.invokeReplayAction,androidAdbExecutor:t.providerScope.androidAdbExecutor,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:t.reconcileOrphanedDeviceClaim,appLogAdmissionLedger:t.appLogAdmissionLedger,audioProbeAdmissionLedger:t.audioProbeAdmissionLedger,perfCaptureAdmissionLedger:t.perfCaptureAdmissionLedger,screenRecordingAdmissionLedger:t.screenRecordingAdmissionLedger,hostDiagnostics:t.hostDiagnostics,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,platformResourceCleanup:t.platformResourceCleanup}))}async function ng({handleSnapshotCommands:e},t){return cg(t.req.command,`snapshot`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,platformResourceCleanup:t.platformResourceCleanup}))}async function rg({handleReactNativeCommands:e},t){return cg(t.req.command,`react-native`,await e({req:t.req,createCommandSurface:t.createCommandSurface,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function ig({handleRecordTraceCommands:e},t){return cg(t.req.command,`record-trace`,await e({req:t.req,sessionName:t.sessionName,sessionStore:t.sessionStore,logPath:t.logPath,bindDevice:t.bindDevice,platformServices:t.platformServices,bindExactDevice:t.bindExactDevice,admissionLedger:t.screenRecordingAdmissionLedger,requestScope:t.requestScope,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled}))}async function ag({handleFindCommands:e},t){return cg(t.req.command,`find`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,invoke:t.invoke,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice}))}async function og({handleInteractionCommands:e},t){return cg(t.req.command,`interaction`,await e({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:t.sessionStore,createCommandSurface:t.createCommandSurface,contextFromFlags:t.contextFromFlags,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,androidObservation:t.androidObservation}))}function Z(e){let t=sg(e.load);return{loadModule:t,run:async n=>await e.run(await t(),n)}}function sg(e){let t;return()=>(t??=e(),t)}function cg(e,t,n){if(n)return n;throw new a(`UNKNOWN`,`Daemon handler routing mismatch: ${t} handler matched command "${e}" but returned no response.`,{hint:`This is a daemon-internal routing bug in agent-device — please report it.`})}const lg=`activity.launchConsole.launchArgs.clearAppState.verbose.iosXctestrunFile.iosXctestDerivedDataPath.iosXctestEnvDir.snapshotInteractiveOnly.snapshotPreferredBackend.snapshotDepth.snapshotScope.snapshotRaw.snapshotCustomActions.snapshotIncludeHiddenContentHints.count.intervalMs.delayMs.durationMs.holdMs.jitterPx.pixels.until.doubleTap.backMode.pauseMs.pattern`.split(`.`);function ug(e){return Object.fromEntries(lg.map(t=>[t,e?.[t]]))}function dg(e,t,n,r,i,a){return{requestId:i??A().requestId,appBundleId:n,runnerLeaseContext:Af({meta:a}),logPath:e,traceLogPath:r,...ug(t),screenshotCaptureBackend:t?.maestro?.screenshotCaptureBackend,...oe(t),clickButton:je(t)}}function fg(e){return`${e.device.platform} device "${e.device.name.trim()}" (${e.device.id})`}function pg(e,t,n={}){return e.session.screenRecording?gg(e.address,t):vg(e,t,n)}function mg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by session "${e.address}".`,{session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:pg(e,`device-in-use`,n)})}function hg(e,t,n={}){return g(`DEVICE_IN_USE`,`Device is already in use by workspace session "${e.address}".`,{reason:`WORKSPACE_SESSION_SCOPE_CONFLICT`,session:e.address,deviceId:t.id,deviceName:t.name,...n.waitedMs===void 0?{}:{waitedMs:n.waitedMs},hint:_g(e.address,n)})}function gg(e,t){let n=Tn(e),r=`agent-device close --session ${n}`;return`Recording session "${e}" owns this device. Run ${`agent-device record stop --session ${n}`}; if the session still appears in agent-device session list, run ${r}. ${t===`selector-conflict`?`To keep using this device, rerun the command with --session ${n} and remove conflicting device selectors.`:`To keep using this device, reuse --session ${n} for commands that should attach to the recording session.`} Run agent-device session list to inspect active sessions.`}function _g(e,t){let n=Tn(e);return`${yg(t)}Session "${e}" belongs to another workspace. Run agent-device close --session ${n} to release this device from that workspace, agent-device devices to choose another device. ${bg(t)}Run agent-device session list to inspect active sessions.`}function vg(e,t,n){let r=e.address,i=Tn(r),a=`agent-device close --session ${i}`;return t===`selector-conflict`?`Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i} and remove conflicting device selectors. To switch devices, first run ${a}, then open the desired device with a different --session name.`+xg(e,n):`${yg(n)}Run agent-device session list to inspect active sessions. To reuse this device, rerun the command with --session ${i}. To open a new session on this device, first run ${a}. `+`${bg(n)}`.trimEnd()}function yg(e){return e.waitedMs===void 0?``:`Waited ${Math.round(e.waitedMs)}ms for this device and it stayed busy. `}function bg(e){return e.offersDeviceWait&&e.waitedMs===void 0?`To wait for the device to free up, run the same open with --wait <ms>. `:``}function xg(e,t){return t.offersPlatformSession===!0&&e.session.sessionScope?.kind===`cwd`?` Or name the other platform with --platform to open its own session for this workspace.`:``}function Sg(e,t){let{address:n,session:r}=e,i=Cg(r,t);if(i.length!==0)throw new a(`INVALID_ARGS`,`Session "${n}" is already bound to ${fg(r)}, but this request selected ${i.map(wg).join(`, `)}.`,{session:n,conflicts:i.map(wg),hint:pg(e,`selector-conflict`,{offersPlatformSession:i.some(e=>e.key===`platform`)})})}function Cg(e,t){if(!t)return[];let n=[],r=e.device,i=t.platform;if(i&&!rt(r,i)&&n.push({key:`platform`,value:t.platform}),t.target&&t.target!==(r.target??`mobile`)&&n.push({key:`target`,value:t.target}),t.udid&&(!N(r)||t.udid!==r.id)&&n.push({key:`udid`,value:t.udid}),t.serial&&(!Qe(r.platform)||t.serial!==r.id)&&n.push({key:`serial`,value:t.serial}),t.device&&!Ye(r,t.device)&&n.push({key:`device`,value:t.device}),t.iosSimulatorDeviceSet){let e=t.iosSimulatorDeviceSet.trim(),i=r.simulatorSetPath?.trim();(!N(r)||r.kind!==`simulator`||e!==i)&&n.push({key:`iosSimulatorDeviceSet`,value:t.iosSimulatorDeviceSet})}if(t.androidDeviceAllowlist){let e=Mr(t.androidDeviceAllowlist);(r.platform!==`android`||!e.has(r.id))&&n.push({key:`androidDeviceAllowlist`,value:t.androidDeviceAllowlist})}return n}function wg(e){return`${Tg(e.key)}=${e.value}`}function Tg(e){switch(e){case`iosSimulatorDeviceSet`:return`--ios-simulator-device-set`;case`androidDeviceAllowlist`:return`--android-device-allowlist`;default:return`--${e}`}}const Eg=`default`,Dg=new Set(tt);function Og(e,t,n={}){let r=e.session||Eg;if(Pg(e))return r;let i=jg(e);return i.kind===`cwd`?Ig(e,t,i.id,n):r}function kg(e){return e.session||Eg}function Ag(e){let t=jg(e);return t.kind===`cwd`?t:void 0}function jg(e){if(e.meta?.sessionIsolation===`tenant`||e.flags?.sessionIsolation===`tenant`){let t=e.meta?.tenantId;if(!t)throw new a(`INTERNAL_ERROR`,`Tenant-scoped request reached session routing without an admitted tenant id`);return{kind:`tenant`,id:t}}if(Pg(e)||(e.session||Eg)!==Eg)return{kind:`named-local`};let t=Jg(e.meta?.cwd);return t?{kind:`cwd`,id:qg(t)}:{kind:`global-default`}}function Mg(e,t){let n=e.sessionScope;return n?t.kind===`tenant`?n.kind===`tenant`&&n.id===t.id:n.kind===`tenant`?!1:t.kind!==`cwd`||n.kind===`named-local`||n.kind===`cwd`&&n.id===t.id:!1}function Ng(e,t){let n=Ag(e);return!n||t.sessionScope?.kind!==`cwd`?!1:t.sessionScope.id!==n.id}function Pg(e){if(e.meta?.sessionExplicit===!0)return!0;let t=e.flags?.session;return typeof t==`string`&&t.trim().length>0}function Fg(e,t){return`cwd:${e}:${t}`}function Ig(e,t,n,r){let i=Hg(t,n),a=Ug(e);return a?Lg(e,t,n,a,i,r):Vg(n,i,r)}function Lg(e,t,n,r,i,a){let o=Fg(n,r);if(t.get(o))return o;let s=Bg(e.flags,r),c=i.map(e=>({ref:e,conflicts:Cg(e.session,s)})),l=c.filter(e=>e.conflicts.length===0),[u]=l;return u&&l.length===1?u.ref.address:l.length>1?(Gg(a,l.map(e=>e.ref)),o):Rg(c)?.address??o}function Rg(e){return e.find(e=>!zg(e.conflicts))?.ref}function zg(e){return e.some(e=>e.key===`platform`)}function Bg(e,t){return{...e,platform:t}}function Vg(e,t,n){let[r]=t;return r&&t.length===1?r.address:(Gg(n,t),Fg(e,Eg))}function Hg(e,t){let n=new Set,r=[];for(let i of e.listRefs()){let e=i.session.sessionScope;e?.kind===`cwd`&&e.id===t&&(n.has(i.session)||(n.add(i.session),r.push(i)))}return r}function Ug(e){return Wg(e.flags?.platform)??Wg(e.meta?.lockPlatform)}function Wg(e){if(typeof e!=`string`)return;let t=e.trim().toLowerCase();return Dg.has(t)?t:void 0}function Gg(e,t){if(t.length>1&&e.attachesToSession===!0)throw Kg(t)}function Kg(e){let t=e.map(e=>e.address),n=e.map(e=>M(e.session.device)),r=n.map(e=>`--platform ${e}`).join(` or `);return new a(`AMBIGUOUS_MATCH`,`This workspace has ${e.length} implicit sessions (${t.join(`, `)}); select one explicitly.`,{sessions:t,platforms:n,hint:`Run agent-device session list to inspect them. Add ${r} to run in that platform's session, or pass --session <address> copied from that list.`})}function qg(e){return F.createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function Jg(e){if(!e||e.trim().length===0)return;let t=Yg(e);return Xg(t)??t}function Yg(e){let t=L.resolve(e);try{return I.realpathSync.native(t)}catch{return t}}function Xg(e){let t=e;for(;;){if(I.existsSync(L.join(t,`.git`)))return t;let e=L.dirname(t);if(e===t)return;t=e}}const Zg=new Set([`udid`,`serial`,`device`]);function Qg(e){return Zg.has(e.key)}function $g(e,t){let n=e.meta?.lockPolicy;if(!n)return e;let r={...e.flags??{}},i=Su(e.command),o=i?[]:t?Cg(t.session,r):a_(r,e.meta?.lockPlatform),s=e.meta?.lockPlatform;if(o.length===0)return r_(i,t,r,s)&&(r.platform=s),{...e,flags:r};let c=o.filter(Qg);if(n===`strip`&&c.length===0)return i_(r,o,s,t?.session),{...e,flags:r};throw new a(`INVALID_ARGS`,t_(e,o,t),{session:t?.address??e.session,conflicts:o.map(wg),...e_(c,t?.session),hint:n_(e,t,c)})}function e_(e,t){return e.length===0?{}:{requestedDevice:Object.fromEntries(e.map(e=>[e.key,e.value])),...t?{boundDevice:{platform:t.device.platform,name:t.device.name,id:t.device.id}}:{}}}function t_(e,t,n){let r=t.map(wg).join(`, `);if(n)return`Session "${n.address}" is already bound to ${fg(n.session)}, but ${e.command} selected ${r}.`;let i=e.meta?.lockPlatform,a=i?` for ${i}`:``;return`${e.command} is using a bound-session lock${a}, but this request selected ${r}.`}function n_(e,t,n){if(t)return pg(t,`selector-conflict`);let r=e.meta?.lockPlatform,i=e.session?` --session ${Tn(e.session)}`:``,a=r?`Run agent-device open <app>${i} --platform ${r} first if no session is active. `:`Run agent-device open <app>${i} first if no session is active. `;return n.length>0?`Remove ${n.map(wg).join(`, `)} and rerun to use the session-lock device, or drop --session so this command binds to the device you selected. `+a+`Run agent-device session list to inspect active sessions.`:`Remove conflicting device selectors from this command, or use --session-lock strip to let agent-device ignore them. `+a+`Run agent-device session list to inspect active sessions.`}function r_(e,t,n,r){return!r||t||n.platform!==void 0?!1:!e||!Op(n)}function i_(e,t,n,r){if(r){f_(e,t),e.platform=M(r.device);return}f_(e,t),n&&e.platform===void 0&&(e.platform=n)}function a_(e,t){let n=[],r=t;return e.platform!==void 0&&r&&Xe(e.platform,r)&&n.push({key:`platform`,value:e.platform}),r?(o_(n,e,r),c_(n,e,r),n):n}function o_(e,t,n){let r=t.target;r&&s_(r,n)&&e.push({key:`target`,value:r})}function s_(e,t){switch(t){case`android`:case`harmonyos`:case`ios`:return e===`desktop`;case`vega`:return e!==`tv`;case`macos`:case`linux`:case`web`:return e!==`desktop`;case`apple`:return!1;default:return p_(t)}}function c_(e,t,n){for(let r of l_(n,t)){let n=t[r];kp(n)&&e.push({key:r,value:n})}}function l_(e,t){if(u_(e))return[`udid`,`iosSimulatorDeviceSet`];switch(e){case`vega`:return[`udid`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];case`ios`:return[`serial`,`androidDeviceAllowlist`];case`apple`:return d_(t)?[`udid`,`serial`,`androidDeviceAllowlist`,`iosSimulatorDeviceSet`]:[`serial`,`androidDeviceAllowlist`];case`macos`:case`linux`:case`web`:return[`udid`,`serial`,`iosSimulatorDeviceSet`,`androidDeviceAllowlist`];default:return p_(e)}}function u_(e){return e===`android`||e===`harmonyos`}function d_(e){return e.target===`desktop`||e.platform===`macos`}function f_(e,t){for(let n of t)delete e[n.key]}function p_(e){throw Error(`Unhandled lock platform: ${String(e)}`)}async function m_(e){if(e.command!==`replay`||e.flags?.replayFrom!==void 0)return;let t=e.flags?.replayScriptSource;if(t)return __(async()=>{let n=t.entry,r=Hn(t,n),i=be(n,e.flags?.replayBackend);return i===`ad`?g_(r,e.flags):await h_(i,r,n,e.flags)})}async function h_(e,t,n,r){let i=await(await import(`../replay-backend-registry.js`).then(e=>e.n)).getReplayBackend(e);return{flags:r??{},options:Vn(i.inspectSource(t,n).appTarget,r?.platform)}}function g_(e,t){let n=Si(e,t),r=Rn(n.actions);if(!r.appTarget)return;let i=Wn(t,n.actions),a=i.platform??n.metadata.platform;return{flags:a&&i.platform===void 0?{...i,platform:a}:i,options:a===`ios`?Kn(r.appTarget):void 0}}async function __(e){try{return await e()}catch{return}}function v_(e,t){return k_([D_(e),O_(t)])}async function y_(e){let{req:t,sessionName:n,sessionStore:r}=e,i=r.get(n);if(i)return{keys:v_(n,i.device.id),deviceId:i.device.id};let a=new Set([D_(n)]),o=await C_(t);return o&&a.add(O_(o.id)),{keys:k_(a),deviceId:o?.id}}function b_(e){let{existingRef:t}=e;return{req:$g(e.req,t),existingRef:t}}function x_(e){if(!e.meta?.lockPolicy)return e;try{return $g(e)}catch{return e}}async function S_(e){return e.command===`open`?w_(e):e.command===`replay`?await T_(e):E_(e)}async function C_(e){let t=await S_(x_(e));if(t)try{return await In(t.flags,t.options)}catch{return}}function w_(e){let t=zn(e.positionals?.[0]);return t?{flags:e.flags??{},options:t}:void 0}async function T_(e){return await m_(e)??E_(e)}function E_(e){return Dp(e.flags)?{flags:e.flags??{},options:{}}:void 0}function D_(e){return`session:${e}`}function O_(e){return`device:${e}`}function k_(e){return Array.from(e).sort((e,t)=>{let n=A_(e)-A_(t);return n===0?e.localeCompare(t):n})}function A_(e){return+!e.startsWith(`session:`)}function j_(e){let t=e.flags??{};if(t.waitMs===void 0)return;let[n]=we(`waitMs`);if(!n)throw new a(`INTERNAL_ERROR`,`The waitMs option has no flag declaration whose bounds the daemon can enforce.`);return ue(t,`waitMs`,{min:n.min,max:n.max})}function M_(e){let t=e.internal?.openDeviceWait?.waitedMs;return t===void 0?{}:{waitedMs:t}}function N_(e){return{...M_(e),offersDeviceWait:e.command===`open`&&typeof e.flags?.waitMs!=`number`}}function P_(e){let{req:t,budgetMs:n,sessionName:r,sessionStore:i,deviceId:a}=e;if(t.command===`open`&&n!==void 0&&!(a===void 0||i.get(r)))return I_({req:t,sessionName:r,sessionStore:i,deviceId:a,budgetMs:n})}function F_(e,t,n){let r=e.findByDevice(t);if(!(!r||r.address===n))return r}function I_(e){let{req:t,sessionName:n,sessionStore:r,deviceId:i,budgetMs:a}=e,o=Wt.fromTimeoutMs(a),s=()=>F_(r,i,n),c=async()=>{for(;;){let e=s();if(!e||o.isExpired())return;tr({type:`command`,status:`progress`,message:`Waiting for ${e.session.device.name}: held by session "${e.address}" (${Math.round(o.elapsedMs())}ms of the ${Math.round(a)}ms wait budget used)`}),await Ht(Math.min(250,o.remainingMs())),Yn(t.meta?.requestId)}};return{waitForDeviceOutsideLocks:c,runWhenDeviceIsUnheld:async e=>{let{acquireLocks:n,task:r}=e;for(;;){let e=await n(async()=>{if(s()){if(!o.isExpired())return{ran:!1};L_(t,o.elapsedMs())}return{ran:!0,outcome:await r()}});if(e.ran)return e.outcome;await c()}}}}function L_(e,t){if(t<=0)return;let n=e.internal??={};n.openDeviceWait={waitedMs:t}}function R_(e){let{locks:t,initialKeys:n}=e,r=new Set(n),i=new Map,a=!1,o=async()=>{let e=[...i.values()];for(let t of e)t.release();await Promise.all(e.map(async e=>await e.completion)),i.clear()};return{run:async e=>{if(a)throw Error(`Request execution locks cannot run the same scope concurrently.`);a=!0;try{return await z_(t,n,e)}finally{try{await o()}finally{a=!1}}},retainDevice:async e=>{if(!a)throw Error(`A device execution lock can only be retained by a running request.`);let n=`device:${e}`;if(r.has(n))return;let o=i.get(n);o||(o=B_(t,n),i.set(n,o)),await o.acquired}}}async function z_(e,t,n){let[r,...i]=t;return r?await En(e,r,async()=>await z_(e,i,n)):await n()}function B_(e,t){let n=()=>{},r=()=>{},i=new Promise(e=>{n=e}),a=new Promise(e=>{r=e});return{acquired:i,completion:En(e,t,async()=>{n(),await a}),release:r}}function V_(e,t,n){let r=A();if(!t.ok){j({level:`error`,phase:`request_failed`,data:{code:t.error.code,message:t.error.message}});let e=He({force:!0});return{ok:!1,error:s(new a(p(t.error.code),t.error.message,{...t.error.details??{},hint:t.error.hint??(typeof t.error.details?.hint==`string`?t.error.details.hint:void 0),diagnosticId:t.error.diagnosticId,logPath:t.error.logPath,diagnosticsRecord:t.error.diagnosticsRecord,retriable:t.error.retriable??(typeof t.error.details?.retriable==`boolean`?t.error.details.retriable:void 0),supportedOn:t.error.supportedOn??(typeof t.error.details?.supportedOn==`string`?t.error.details.supportedOn:void 0)}),{diagnosticId:r.diagnosticId,logPath:e?.path,diagnosticsRecord:e?.ref})}}return j({level:`info`,phase:`request_success`}),He(),{ok:!0,data:H_(e,t.data,n)}}function H_(e,t,n){if(!t)return t;let r=U_(e,t);return r.length===0?t:{...t,artifacts:r.map(t=>{let r=t.path;return{field:t.field,...t.artifactType===void 0?{}:{artifactType:t.artifactType},artifactId:n({artifactPath:r,tenantId:e.meta?.tenantId,artifactType:t.artifactType,fileName:t.fileName,...D(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),fileName:t.fileName,localPath:t.localPath}})}}function U_(e,t){let n=Array.isArray(t.artifacts)?[...t.artifacts]:[];return e.command===`screenshot`&&!(e=>n.some(t=>t?.field===e))(`path`)&&typeof t.path==`string`&&n.push({field:`path`,artifactType:`screenshot`,path:t.path,localPath:e.meta?.clientArtifactPaths?.path,fileName:L.basename(e.meta?.clientArtifactPaths?.path??t.path),...D(t.displayRotation)?{displayRotation:t.displayRotation}:{}}),n.filter(e=>!!(e&&typeof e.field==`string`&&typeof e.path==`string`&&(typeof e.localPath==`string`&&e.localPath.length>0||e.field===`fallbackScreenshotPath`&&e.artifactType===`screenshot`)))}async function W_(e,t,n){let r=e.requireCurrent(t);if(!G_(r))return;let i=r.screenRecording,a=i.handle,o=await n.appleSessionObservation.observeRunnerSession(r.device.id);if(e.resolveCurrent(t)?.screenRecording!==i)return;let s=a.inspect();if(!s.runnerSessionId){o?.alive&&a.setRunnerSessionId(o.sessionId);return}if(!o?.alive){a.invalidate(`iOS runner session exited during recording`);return}o.sessionId!==s.runnerSessionId&&a.invalidate(`iOS runner session restarted during recording`)}function G_(e){let t=e.screenRecording?.handle.inspect();return!t||!N(e.device)?!1:t.backend===`runner AVAssetWriter`&&t.showTouches!==!1}async function K_(e){let{leaseRegistry:t,req:n,task:r}=e,i=n.internal?.admittedLease;if(!i)return await r();let a=n.meta?.requestId,o=t.retainLeaseWork(i,()=>!Xn(a));try{return await(wu(n)?t.runDeviceMutation(i,r):r())}finally{o.release()}}const q_={label:`Materialized paths`,plural:!0,expiredHint:`Materialized paths are released automatically when their TTL expires; re-run the command that materialized them if the paths are still needed.`},J_=new Map;async function Y_(e){let t=await oi.mkdtemp(L.join(ai.tmpdir(),`agent-device-materialized-`));try{let n=await ev(e.installablePath,L.join(t,`installable`)),r=e.archivePath?await ev(e.archivePath,L.join(t,`archive`)):void 0,i=F.randomUUID(),a=e.ttlMs??9e5,o=Date.now()+a,s=setTimeout(()=>{Q_(i)},a);return J_.set(i,{rootPath:t,installablePath:n,archivePath:r,tenantId:e.tenantId,sessionName:e.sessionName,expiresAt:o,timer:s}),{materializationId:i,installablePath:n,...r?{archivePath:r}:{},expiresAt:new Date(o).toISOString()}}catch(e){throw await oi.rm(t,{recursive:!0,force:!0}),e}}async function X_(e,t){await $_(e,js(J_,e,t,q_))}async function Z_(e){let t=Array.from(J_.entries()).filter(([,t])=>t.sessionName===e);await Promise.all(t.map(async([e,t])=>{await $_(e,t)}))}async function Q_(e){let t=J_.get(e);if(t)try{await $_(e,t)}catch{}}async function $_(e,t){clearTimeout(t.timer),J_.delete(e),await oi.rm(t.rootPath,{recursive:!0,force:!0})}async function ev(e,t){let n=await oi.stat(e);await oi.mkdir(t,{recursive:!0});let r=L.join(t,L.basename(e));return n.isDirectory()?(await oi.cp(e,r,{recursive:!0}),r):(await oi.copyFile(e,r),r)}function tv(e){return e.device.platform===`web`}function nv(e){return e.toArray().filter(e=>e.device.platform===`web`).map(e=>e.name)}async function rv(e){let t=e.sessionStore.refresh(e.ref);if(!t.session.appLog)return;let{forceCleanupSessionAppLog:n}=await import(`../platform-request-scope.js`).then(e=>e.u);await n({...e,ref:t})}async function iv(e){let t=qr(e.sessionStore,e.ref);t.read()&&await Tr({binding:t,intent:`disposal`})}async function av(e,t){await t.stopSnapshotHelper(e.device)}async function ov(e){let{ref:t,sessionStore:n,platformCleanup:r}=e,i=n.resolveCurrent(t)??t.session,a=t.address;await r.closeManagedBrowser({device:i.device,sessionName:a,stateDir:n.resolveDaemonStateDir(),openSessionNames:()=>nv(n)})}async function sv(e){let t=[];for(let{step:n,run:r}of e)try{await r()}catch(e){t.push({step:n,error:e})}return t}function cv(e){if(e.failures.length===0)return;let t=e.failures.map(({step:e})=>e),n=e.failures.map(({step:e,error:t})=>`${e}: ${t instanceof Error?t.message:String(t)}`);return j({level:`error`,phase:e.phase,data:{session:e.sessionName,failedSteps:t,errors:n}}),new a(`COMMAND_FAILED`,`Session cleanup left ${e.failures.length} resource(s) unreleased: ${n.join(`; `)}`,{reason:`session_cleanup_incomplete`,session:e.sessionName,failedSteps:t,hint:`Some session resources failed to release; inspect the session log for per-resource diagnostics. The session was still deleted, so retrying is safe.`})}async function lv(e){let{ref:t,sessionStore:n}=e,r=n.resolveCurrent(t)??t.session,i=t.address;if(!e.platformCleanup)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);let o=e.platformCleanup,s=[{step:`recording`,run:()=>uv({ref:t,sessionStore:n})},...e.appLog===`run`?[{step:`app_log`,run:()=>rv({ref:t,sessionStore:n})}]:[],{step:`audio_probe`,run:()=>dv({ref:t,sessionStore:n})},{step:`perf_capture`,run:()=>iv({ref:t,sessionStore:n})},{step:`platform_snapshot_helper`,run:()=>av(r,o)},{step:`web_browser`,run:()=>ov({ref:t,sessionStore:n,platformCleanup:o})}];s.push({step:`materialized_paths`,run:()=>Z_(i)});let c=cv({sessionName:i,phase:`session_teardown_cleanup_failed`,failures:await sv(s)});if(c)throw c}async function uv(e){let t=Jr(e.sessionStore,e.ref);t.read()&&await jr({binding:t,intent:`disposal`})}async function dv(e){let t=Kr(e.sessionStore,e.ref);t.read()&&await Er({binding:t,intent:`disposal`})}async function fv(e){let{inspectFacts:t,bind:n,session:r,stateDir:i,runtimeHints:a}=e,o={...gv(r,i),...e.daemonShutdown?{daemonShutdown:!0}:{}};if(!_v(r,a)){let e=lt;hv(await t(r.device),e.required,r),await(await n(r.device,e)).operations.finalizeApplicationClose(o);return}let s=gt;hv(await t(r.device),s.required,r);let c=await n(r.device,s);await c.operations.finalizeApplicationClose(o),await c.operations.clearRuntimeHints({appId:r.appBundleId,values:a})}async function pv(e){await fv({...e,bind:e.bindDevice})}async function mv(e){let{gateway:t,scope:n,session:r,stateDir:i,runtimeHints:a}=e,s;try{await fv({inspectFacts:async e=>await t.inspectFacts(e),bind:async(e,r)=>(s??=await t.bind({device:e,intent:{kind:`ordinary`},scope:n}),_t(s,r)),session:r,stateDir:i,runtimeHints:a,...e.daemonLeaving===!1?{}:{daemonShutdown:!0}})}catch(e){try{await s?.[Symbol.asyncDispose]()}catch(t){n.diagnostics.emit({level:`error`,phase:`daemon_lifecycle_binding_cleanup_failed`,data:{session:r.name,error:o(t),operationError:o(e)}})}throw e}await s?.[Symbol.asyncDispose]()}function hv(e,t,n){for(let r of t){let t=e.operations[r];if(!t?.available)throw new a(`UNSUPPORTED_OPERATION`,`Session lifecycle ${r} is not supported on this device.`,{reason:t?.reason,...t?.hint===void 0?{}:{hint:t.hint},deviceId:n.device.id})}}function gv(e,t){return{appBundleId:e.appBundleId,surface:e.surface??`app`,retainRunner:!1,stateDir:t}}function _v(e,t){return e.appBundleId!==void 0&&pr(t)}function vv(e){return N(e)&&e.kind===`simulator`}function yv(e){return e.platform===`android`&&e.kind===`emulator`}const bv=[`platform`,`metroHost`,`metroPort`,`bundleUrl`,`launchUrl`];function xv(e){return e?[e.metroHost,e.metroPort,e.bundleUrl,e.launchUrl].filter(e=>e!==void 0&&e!==``).length:0}function Sv(e){if(!e)return{};let t={};return e.metroHost!==void 0&&(t.metroHost=e.metroHost),e.metroPort!==void 0&&(t.metroPort=String(e.metroPort)),e.bundleUrl!==void 0&&(t.bundleUrl=e.bundleUrl),e.launchUrl!==void 0&&(t.launchUrl=e.launchUrl),t}function Cv(e){return pr(Sv(e))}function wv(e,t){if(e!==void 0){if(typeof e!=`string`)throw new a(`INVALID_ARGS`,`Invalid open runtime ${t}: expected string.`);return bn(e)}}function Tv(e){if(e!==void 0){if(!Number.isInteger(e)||e<1||e>65535)throw new a(`INVALID_ARGS`,`Invalid runtime metroPort: ${String(e)}. Use an integer between 1 and 65535.`);return e}}function Ev(e){if(e!==void 0){if(typeof e!=`number`)throw new a(`INVALID_ARGS`,`Invalid open runtime metroPort: expected integer.`);return Tv(e)}}function Dv(e,t,n){if(e===void 0)return n;if(!h(e))throw new a(`INVALID_ARGS`,`Invalid open runtime platform: ${String(e)}. Use "ios", "android", or "harmonyos".`);if(n&&e!==n)throw new a(`INVALID_ARGS`,`open runtime targets ${e}, but session "${t}" is bound to ${n}.`);return e}function Ov(e){if(h(e))return e}function kv(e,t){return{platform:t,metroHost:bn(e?.metroHost),metroPort:Tv(e?.metroPort),bundleUrl:bn(e?.bundleUrl),launchUrl:bn(e?.launchUrl)}}function Av(e,t){return{platform:t.platform??e?.platform,metroHost:t.metroHost??e?.metroHost,metroPort:t.metroPort??e?.metroPort,bundleUrl:t.bundleUrl??e?.bundleUrl,launchUrl:t.launchUrl??e?.launchUrl}}function jv(e){if(yv(e))return`10.0.2.2`;if(vv(e))return`127.0.0.1`}function Mv(e,t){if(!e||bn(e.metroHost)||bn(e.bundleUrl)||e.metroPort===void 0)return e;let n=jv(t);return n?{...e,metroHost:n}:e}function Nv(e){let{runtime:t,sessionName:n,platform:r}=e;if(t===void 0)return;if(!t||typeof t!=`object`||Array.isArray(t))throw new a(`INVALID_ARGS`,`open runtime must be an object.`);let i=t,o=Object.keys(i).find(e=>!bv.includes(e));if(o)throw new a(`INVALID_ARGS`,`Invalid open runtime field: ${o}. Supported fields are ${bv.join(`, `)}.`);return{platform:Dv(i.platform,n,r),metroHost:wv(i.metroHost,`metroHost`),metroPort:Ev(i.metroPort),bundleUrl:wv(i.bundleUrl,`bundleUrl`),launchUrl:wv(i.launchUrl,`launchUrl`)}}function Pv(e,t,n){if(n){if(xv(n)===0){e.setRuntimeHints(t,void 0);return}return e.setRuntimeHints(t,n),n}}function Fv(e,t,n,r){let i=e.getRuntimeHints(t);if(!i)return;let o=n?M(n):void 0,s=Ov(o)??r;if(i.platform&&n&&!s)throw new a(`INVALID_ARGS`,`Session runtime hints are only supported on iOS, Android, and HarmonyOS sessions, but session "${t}" is bound to ${o}.`);if(i.platform&&s&&i.platform!==s)throw new a(`INVALID_ARGS`,`Session runtime hints target ${i.platform}, but session "${t}" is bound to ${o}. Clear the runtime hints or use a different session.`);return s&&i.platform!==s?{...i,platform:s}:i}function Iv(e){let{req:t,sessionStore:n,sessionName:r,device:i}=e,a=i?Ov(M(i)):e.platform,o=n.getRuntimeHints(r),s=Nv({runtime:t.runtime,sessionName:r,platform:a});if(t.runtime===void 0){let e=Fv(n,r,i,a);return{runtime:i?Mv(e,i):e,previousRuntime:o,replacedStoredRuntime:!1}}let c=s&&xv(s)>0?s:void 0;return{runtime:i?Mv(c,i):c,previousRuntime:o,replacedStoredRuntime:!0}}function Lv(e){return Iv(e).runtime}function Rv(e){try{return{ok:!0,data:Iv(e)}}catch(e){let t=r(e);return g(t.code,t.message,t.details)}}async function zv(e){let{previousRuntime:t,clearRuntimeHints:n}=e;if(!Bv(e))return;let r=e.session;r?.appBundleId&&await n({appId:r.appBundleId,values:Sv(t)})}function Bv(e){return e.replacedStoredRuntime&&!!e.session?.appBundleId&&Cv(e.previousRuntime)&&!Cv(e.runtime)}function Vv(e,t,n=`status`){let r=t.claim,i=M(r?{platform:r.device.family,appleOs:r.device.appleOs}:e),a=$e(e.platform)?`--udid`:`--serial`;return[`agent-device device ${n}`,`--platform ${Tn(i)}`,`${a} ${Tn(e.id)}`,...n===`release`||yr(t.classification)?[`--stale`]:[]].join(` `)}function Hv(e,t){let n=t.claim,r=Vv(e,t,br(t.classification)?`release`:`status`),i=M(n?{platform:n.device.family,appleOs:n.device.appleOs}:e);return new a(`DEVICE_IN_USE`,n?`${i} device ${e.id} is owned by session "${n.session}" in workspace "${n.workspace}".`:`${e.name} has an ownership claim that could not be verified.`,{reason:Gv(t.classification),classification:t.classification,deviceKey:t.deviceKey,...n?{owner:{session:n.session,workspace:n.workspace,stateDir:n.stateDir}}:{},recovery:{command:r},hint:br(t.classification)?`The recorded owner can no longer release this device; settle its resources and release the claim with: ${r}`:`Inspect the owner with: ${r}`,retriable:!1})}function Uv(e,t){return Wv(Hv(e,t))}function Wv(e){let{hint:t,retriable:n,...r}=e.details??{};return g(e.code,e.message,r,{hint:t,retriable:n})}function Gv(e){switch(e){case`live`:return`DEVICE_CLAIM_LIVE_OWNER`;case`owner-process-dead`:case`owner-daemon-superseded`:return`DEVICE_CLAIM_RECOVERY_PENDING`;case`owner-process-reused`:case`owner-state-dir-gone`:case`unknown`:case`inconsistent`:return`DEVICE_CLAIM_OWNER_UNCERTAIN`}}function Kv(e,t){if(t?.backend===`macos-app`)return`none`;switch(e.kind){case`local-family`:return`ordinary`;case`provider-runtime`:return`none`}}function qv(e){let t=[];async function n(n){if(e.policy!==`transient-exclusive`)return;let r=await Cr({device:n,command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:e.reconcileOrphanedDeviceClaim});if(r.status===`conflict`)throw Hv(n,r.conflict);r.status===`acquired`&&t.push(r.ownership)}return{admit:async(e,t)=>{switch(Kv(t)){case`none`:return;case`ordinary`:return await n(e)}},[Symbol.asyncDispose]:async()=>{for(let n of t.splice(0))try{await wr(n)}catch(t){j({level:`error`,phase:`transient_device_claim_release_failed`,data:{command:e.command,deviceKey:n.deviceKey,error:t instanceof Error?t.message:String(t)}})}}}}const Jv=new WeakMap,Yv=new WeakMap,Xv=async()=>{throw new a(`COMMAND_FAILED`,`Device runtime gateway is not configured for this request scope`,{reason:`runtime-gateway-missing`})};async function Zv(e){let{sessionStore:t,leaseRegistry:n}=e,r=ty(Mf(e.req)),i=r.command,a=Date.now(),o=_u(i),c=Og(r,t,{attachesToSession:pu(i)!==`inventory`}),l=A(),u=t.resolveSessionDir(c),d=nn({sessionDir:u,session:c,requestId:r.meta?.requestId??l.requestId}),f=d.path,p=pn(u);Ge({session:c,logPath:d.path,logRecord:d.ref}),j({level:`info`,phase:`request_start`,data:{publicSession:r.session,effectiveSession:c,command:r.command,tenant:r.meta?.tenantId,isolation:r.meta?.sessionIsolation,requestLogPath:f,runnerLogPath:p}});let m=ls(r);m&&t.recordEvent(c,hs({req:r}));try{e.daemonPolicy&&tf(e.daemonPolicy,r),Rf(r);let s=r.command===`open`?j_(r):void 0,l=_u(i)?await y_({req:r,sessionName:c,sessionStore:t}):{keys:[],deviceId:void 0},u=P_({req:r,budgetMs:s,sessionName:c,sessionStore:t,deviceId:l.deviceId});await u?.waitForDeviceOutsideLocks();let d=R_({locks:ay(n),initialKeys:l.keys}),h=Yr(r),{claimAdmission:g,runtimeBindings:_}=Qv({command:i,dispatchLedger:h,workspace:r.meta?.cwd??process.cwd(),stateDir:t.resolveDaemonStateDir(),deviceRuntimeGateway:e.deviceRuntimeGateway,platformRequestScope:e.platformRequestScope,daemonPolicy:e.daemonPolicy,claimRecoveryGateway:e.claimRecoveryGateway}),v={req:r,command:i,sessionName:c,requestLogPath:f,runnerLogPath:p,startedAtMs:a,retainDeviceExecutionLock:async e=>await d.retainDevice(e),bindDevice:_?.bindDevice??Xv,inspectFacts:_?.inspectFacts??Xv,bindExactDevice:_?.bindExactDevice??Xv,platformServices:e.platformServices,dispatchLedger:h,throwIfCanceled:()=>Yn(r.meta?.requestId),runAdmitted:async i=>{Yn(r.meta?.requestId);try{await Uf({sessionName:c,sessionStore:t,leaseRegistry:n,teardownSession:async n=>await $v({ref:n,sessionStore:t,inspectFacts:v.inspectFacts,bindDevice:v.bindDevice,platformCleanup:ey(e.platformResourceCleanup)})}),r=Wf({req:r,sessionName:c,sessionStore:t,leaseRegistry:n,providerAppCatalog:e.providerAppCatalog,daemonPolicy:e.daemonPolicy}),v.req=r;let a=r.internal?.admittedLease;return a&&await Xu(a),await K_({leaseRegistry:n,req:r,task:i})}finally{o&&!Xn(r.meta?.requestId)&&t.noteSessionActivity(c)}},runLocked:async e=>(Yn(r.meta?.requestId),u?await u.runWhenDeviceIsUnheld({acquireLocks:d.run,task:async()=>await v.runAdmitted(e)}):await d.run(async()=>await v.runAdmitted(e))),[Symbol.asyncDispose]:async()=>{try{await _?.[Symbol.asyncDispose]()}finally{await g?.[Symbol.asyncDispose]()}}};return Yv.set(v,e=>(m&&t.recordEvent(c,gs({req:r,response:e,durationMs:Math.max(0,Date.now()-a)})),e)),v}catch(e){throw m&&t.recordEvent(c,gs({req:r,response:{ok:!1,error:s(e,{diagnosticId:A().diagnosticId,logPath:f})},durationMs:Math.max(0,Date.now()-a)})),e}}function Qv(e){let{deviceRuntimeGateway:t,platformRequestScope:n,daemonPolicy:r}=e;if(!t||!n)return{claimAdmission:void 0,runtimeBindings:void 0};let i=qv({policy:vt(e.command),command:e.command,workspace:e.workspace,stateDir:e.stateDir,reconcileOrphanedDeviceClaim:Or({scope:n,composeGateway:e.claimRecoveryGateway})});return{claimAdmission:i,runtimeBindings:Qr({gateway:t,scope:n,dispatchLedger:e.dispatchLedger,admitDeviceClaim:i.admit,admitDevice:r?e=>af(r,e):void 0})}}async function $v(e){let{ref:t,sessionStore:n,inspectFacts:r,bindDevice:i,platformCleanup:a}=e,o=n.resolveCurrent(t)??t.session,s=t.address,c=Sv(n.getRuntimeHints(t.address)),l;try{await lv({appLog:`run`,ref:t,sessionStore:n,platformCleanup:a})}catch(e){l=e}try{await pv({inspectFacts:r,bindDevice:i,session:o,stateDir:n.resolveDaemonStateDir(),runtimeHints:c})}catch(e){if(l!==void 0)j({level:`error`,phase:`expired_session_lifecycle_cleanup_failed`,data:{session:s,error:e instanceof Error?e.message:String(e),primaryError:l instanceof Error?l.message:String(l)}});else throw e}if(l!==void 0)throw l}function ey(e){if(!e)throw new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`);return e}function ty(e){let t={...e.flags??{}};return kt(e.command,t)?{...e,flags:t}:e}async function ny(e){let{scope:t,sessionStore:n,trackDownloadableArtifact:r}=e,i=t.runnerLogPath;t.throwIfCanceled();let a=n.lookup(t.sessionName);a&&(await W_(n,a,t.platformServices),t.throwIfCanceled(),n.requireCurrent(a));let o=b_({req:t.req,existingRef:a?n.refresh(a):void 0}),s=o.req,c=o.existingRef,l=c?.session;Ge({traceLogPath:l?.trace?.outPath}),Yv.set(t,e=>{let i=V_(s,e,r);return ls(s)&&n.recordEvent(t.sessionName,gs({req:s,response:i,durationMs:Math.max(0,Date.now()-t.startedAtMs)})),i});let u=l?.screenRecording?.handle.inspect().invalidatedReason;if(u&&yu(t.command))return{type:`response`,response:{ok:!1,error:{code:`COMMAND_FAILED`,message:u}}};c&&!s.meta?.lockPolicy&&gu(t.command)&&Sg(c,s.flags);let d=(e,t,n)=>iy(i,e,t,n,s.meta);return{type:`scope`,scope:{req:s,sessionName:t.sessionName,logPath:i,existingSession:l,retainDeviceExecutionLock:t.retainDeviceExecutionLock,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,dispatchLedger:t.dispatchLedger,throwIfCanceled:t.throwIfCanceled,contextFromFlags:d,handlerContextFromFlags:(e,r,i)=>({...d(e,r,i),surface:(a?n.resolveCurrent(a):n.get(t.sessionName))?.surface})}}}function ry(e,t){let n=Yv.get(e);return Yv.delete(e),n?n(t):t}function iy(e,t,n,r,i){let a=A().requestId;return{...dg(e,t,n,r,a,i),requestId:a}}function ay(e){let t=Jv.get(e);return t||(t=new Map,Jv.set(e,t)),t}const oy=`--save-script is supported only by ${xu().join(`, `)}.`;function sy(e){if(e.flags?.saveScript===void 0||bu(e.command))return;j({level:`warn`,phase:`save_script_flag_rejected`,data:{command:e.command}});let t=A(),n=He({force:!0});return{ok:!1,error:s(new a(`INVALID_ARGS`,oy,{hint:`Arm publication on the session instead: open/close --save-script, replay --save-script, or session save-script to publish an armed recording without closing its session.`}),{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}const cy=`AGENT_DEVICE_SESSION_IDLE_TIMEOUT_MS`;function ly(e=process.env){let t=e[cy]?.trim();if(!t)return 0;let n=Number(t);return!Number.isFinite(n)||n<=0?0:Math.max(1,Math.floor(n))}function uy(e){return e.lastActivityAtMs??e.createdAt}function dy(e){return e.deviceClaim!==void 0&&e.lease===void 0&&e.screenRecording===void 0&&e.appLog===void 0&&e.audioProbe===void 0&&e.perfCapture===void 0&&e.trace===void 0}function fy(e,t,n=Date.now()){return t<=0?!1:n-uy(e)>=t}function py(e,t,n=Date.now()){return dy(e)&&fy(e,t,n)}function my(e,t){if(!(!dy(e)||t<=0))return uy(e)+t}function hy(e,t){return{owner:e,expiredAtMs:t.expiredAtMs,expiresAt:t.expiredAtMs+36e5,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{}}}function gy(e,t,n=Date.now()){let r=Math.max(0,n-t.expiredAtMs);return new a(`SESSION_NOT_FOUND`,`Session "${t.owner}" expired ${_y(r)} ago for idleness (window ${_y(t.idleExpiryMs)}). Run open again to start a new session.`,{reason:`SESSION_IDLE_EXPIRED`,session:e,idleExpiryMs:t.idleExpiryMs,...t.deviceKey?{deviceKey:t.deviceKey}:{},hint:t.deviceKey?`Run open again to claim ${t.deviceKey} and start a new session. Set ${cy}=0 to keep sessions open indefinitely.`:`Run open again to start a new session. Set ${cy}=0 to keep sessions open indefinitely.`})}function _y(e){let t=e/1e3;if(t<90)return`${Math.round(t)}s`;let n=t/60;return n<90?`${Math.round(n)}m`:`${Math.round(n/60)}h`}function vy(e,t,n){let r;for(let[i,a]of e)if(!(!a.device||Je(a.device)!==t)){if(!n(i)){e.delete(i);continue}r??=a}return r}function yy(e={}){let t=e.markerExists??I.existsSync,n=Kh({displayName:`app-log`,now:e.now,undurableCleanupTtlMs:e.undurableCleanupTtlMs,onUndurableCleanupExpired:e.onUndurableCleanupExpired}),r=new Map;return Object.freeze({...n,retainLegacyMarkers(e){for(let t of e)t.device&&r.set(t.markerPath,t)},assertStartAllowed(e){let i=Je(qe(e));if(vy(r,i,t))throw new a(`COMMAND_FAILED`,`A retained legacy app-log marker prevents replacement capture`,{reason:`cleanup-unconfirmed`,hint:`Inspect and remove the retained app-log.pid only after manually confirming its process is gone.`});n.assertStartAllowed(e)}})}function by(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} is not supported on this device`,{reason:t.reason},t.hint?{hint:t.hint}:void 0)}async function xy(e){let t=await Cy(e.inspectFacts)(e.device);for(let n of e.required){let r=t.operations[n];if(!r.available)return{type:`response`,response:e.unavailableResponse?e.unavailableResponse(r):by(e.command,r)}}return{type:`admitted`,bind:wy(e.bindDevice)}}async function Sy(e){let t=await xy({...e,required:e.use.required});if(t.type===`response`)return t;let n=await t.bind(e.device,e.use);return e.readiness&&await Xr(n,e.platformServices),{type:`runtime`,runtime:n}}async function Q(e,t){let n=await Sy(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 Cy(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime facts inspection is unavailable.`,{reason:`runtime-gateway-missing`})}function wy(e){if(e)return e;throw new a(`COMMAND_FAILED`,`Device runtime binding is unavailable.`,{reason:`runtime-gateway-missing`})}function Ty(e){let{flags:t,logPath:n,meta:r,session:i,snapshotScope:a}=e,{appBundleId:o,trace:s,surface:c}=i??{},l=e.context??dg(n??``,t,o,s?.outPath,r?.requestId,r);return{options:{appBundleId:o,...m(t,f),scope:a,includeRects:e.includeRects,surface:c},execution:$(l),...e.signal===void 0?{}:{signal:e.signal}}}function $(e){return{requestId:e.requestId,verbose:e.verbose,logPath:e.logPath,traceLogPath:e.traceLogPath,iosXctestrunFile:e.iosXctestrunFile,iosXctestDerivedDataPath:e.iosXctestDerivedDataPath,iosXctestEnvDir:e.iosXctestEnvDir,runnerLeaseContext:e.runnerLeaseContext}}function Ey(e){return zr(e,`focus requires x y`)}function Dy(e,t){return{point:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Oy(e){let t=Ey(e.positionals);return await Q({command:`focus`,device:e.device,use:At,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>ky(e,t,n))}async function ky(e,t,n){return await e.operations.focusPoint(Dy(t,n)),{x:t.x,y:t.y,...y(`Focused (${t.x}, ${t.y})`)}}function Ay(e){if(e===`down`)return`bottom`;if(e===`up`)return`top`}async function jy(e){let{edge:t,target:n={},scope:r,captureNodes:i}=e;try{let e=await i(r),{analyzeScrollEdgeState:a}=await import(`../selection.js`),o=a(e,t,n);return r&&o.emptySnapshot?await jy({edge:t,target:n,captureNodes:i}):o}catch(e){throw Vy(t,r,e)}}async function My(e,t,n={}){let{analyzeScrollEdgeState:r}=await import(`../selection.js`);return r(e,t,n)}async function Ny(e,t){return(await My(e,t)).canScroll}async function Py(e,t){let{analyzeScrollEdgeState:n}=await import(`../selection.js`);return n(e,t).fingerprint??``}function Fy(e){if(e.length<4)return!1;let t=e.slice(-6);if(new Set(t).size>2)return!1;let n=t.at(-1);return n!==void 0&&t.slice(0,-1).includes(n)}function Iy(e,t,n){t&&(e.push(t),e.length>n&&e.shift())}async function Ly(e){let{edge:t,captureState:n,scroll:r,settleAfterPass:i=async()=>{}}=e,o=await n();o.scope&&(o=await n(o.scope));let s=0,c,l=[];for(Iy(l,o.fingerprint,6);o.canScroll;){if(s>=40)throw new a(`COMMAND_FAILED`,`scroll ${t} reached the safety limit before the snapshot showed the edge`,{reason:`scroll_edge_pass_limit`,edge:t,passes:s,hint:`The scoped scroll container still reports hidden content. Run scroll <dir> --until <selector> to stop on the element you are after, or snapshot -i to inspect the current state.`});if(c=await r(),s+=1,await i(),o=await n(o.scope),Iy(l,o.fingerprint,6),o.canScroll&&Fy(l))throw zy(t,s)}return{passes:s,result:c}}function Ry(e){let{direction:t,edge:n,passes:r,amount:i,pixels:a,honoredPixels:o,movement:s}=e;if(n&&r===0)return`Already at ${n}; no hidden content ${n===`bottom`?`below`:`above`} detected`;if(n)return`Scrolled to ${n} with ${r} ${t} passes`;let c=Ay(t);return s===`at-edge`&&c?`Scrolled ${t} and no hidden content ${c===`bottom`?`below`:`above`} was detected`:s===`unchanged`?`Scrolled ${t} and the visible content did not change`:a===void 0?i===void 0?`Scrolled ${t}`:o===void 0?`Scrolled ${t} by ${i}`:`Scrolled ${t} by ${i} of the viewport (${o}px)`:`Scrolled ${t} by ${o??a}px`}function zy(e,t){let n=`${t} ${t===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} moved nothing across ${n}: the container still reports hidden content but its contents never shifted`,{reason:`scroll_edge_no_progress`,edge:e,passes:t,hint:By({targetDirectly:`with scroll <dir> --until <selector>`})})}function By(e={}){let t=`The scroll is not reaching this container. If a field is focused, dismiss the keyboard first; if it is nested inside another scroller, ${e.targetDirectly===void 0?`target it directly`:`target it directly ${e.targetDirectly}`}.`;return e.rawDrag===!1?t:t+` Some lists ignore synthesized scrolls — a raw drag moves them: swipe x1 y1 x2 y2 started inside the list.`}function Vy(e,t,n){return t?new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state for scoped container`,{scope:t,hint:`scroll ${e} could not verify the scoped scroll container. Run snapshot -i for the current screen and retry with a visible scroll target.`},n):new a(`COMMAND_FAILED`,`Failed to verify scroll ${e} state`,{hint:`scroll ${e} needs a snapshot showing hidden content ${e===`bottom`?`below`:`above`} before it will move.`},n)}async function Hy(e){let{selector:t,direction:r,platform:i,capture:o,scroll:s}=e,c=e.passLimit??12,l=Ay(r),u=0,d,f=[],p=!1;try{for(;;){if((await Uy({captured:await o(),selector:t,direction:r,platform:i,edge:l,passes:u,passLimit:c,recentSignatures:f})).visible)return{passes:u,...d===void 0?{}:{result:d}};p=!0,d=await s(),p=!1,u+=1}}catch(e){throw u===0&&!p&&e instanceof a?n(e,`no`):e}}async function Uy(e){let{captured:t,selector:n,direction:r,platform:i,edge:a,passes:o,passLimit:s,recentSignatures:c}=e,l=Ky(t);if(l)throw Yy(r,n,l);let u=t.nodes??[];if(await Gy(u,n,i))return{visible:!0};if(a&&!await Ny(u,a))throw qy(r,n,`edge-reached`,o);if(o>=s)throw qy(r,n,`pass-limit`,o);if(a&&(Iy(c,await Py(u,a),6),Fy(c)))throw Jy(r,n,o);return{visible:!1}}function Wy(e,t,n){return n===0?`${t} was already visible; no ${e} scroll needed`:`Scrolled ${e} ${n} ${n===1?`pass`:`passes`} until ${t} was visible`}async function Gy(e,t,n){let r=await Lr(Vr.wait,e,t,{platform:n}),i=r.kind===`target`||r.kind===`ambiguous`?r.matchedNodes:r.kind===`occluded`?[r.node]:[],a=ct(e);return i.some(e=>St({predicate:`visible`,node:e,visibility:a,platform:n}).pass)}function Ky(e){let t=e.nodes;if(t===void 0)return{reason:`no-capture`,detail:`the capture returned no accessibility tree`};if(t.length===0)return{reason:`no-capture`,detail:`the capture returned an empty accessibility tree`};let n=Pe({backend:e.backend,nodes:t,...e.quality?{snapshotQuality:e.quality}:{}});if(n)return{reason:`sparse-tree`,detail:n.reason??`the capture backend reported a sparse tree`}}function qy(e,t,n,r){let i=`${r} ${r===1?`pass`:`passes`}`;return n===`edge-reached`?new a(`COMMAND_FAILED`,`scroll ${e} reached the end of the scrollable content after ${i} without ${t} becoming visible`,{reason:`scroll_until_edge_reached`,selector:t,direction:e,passes:r,hint:`The content ends here, so no further ${e} scroll can reveal it. Run snapshot -i to see what is on screen, scroll the opposite direction, or check the selector — the element may be on another screen.`}):new a(`COMMAND_FAILED`,`scroll ${e} spent its ${r}-pass budget without ${t} becoming visible`,{reason:`scroll_until_pass_limit`,selector:t,direction:e,passes:r,hint:`Raise the step with an amount (scroll ${e} 0.8 --until <selector>), or run snapshot -i to confirm the selector matches something on this screen.`})}function Jy(e,t,n){let r=`${n} ${n===1?`pass`:`passes`}`;return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} moved nothing across ${r}: the on-screen content never shifted`,{reason:`scroll_until_no_progress`,selector:t,direction:e,passes:n,hint:By()})}function Yy(e,t,n){return new a(`COMMAND_FAILED`,`scroll ${e} --until ${t} could not read the screen: ${n.detail}`,{reason:`scroll_until_capture_unreadable`,selector:t,direction:e,captureRefusal:n.reason,hint:n.reason===`no-capture`?`Run snapshot -i to see whether the app is producing an accessibility tree at all, and retry once it does.`:`The accessibility tree came back sparse, so its refs and selectors are not trustworthy. Run screenshot, inspect the image, and navigate by coordinates until snapshot -i reports a full tree.`})}const Xy={intervalMs:200,budgetMs:1500};function Zy(e){return Ze(e.device)?e.flags?.postGestureStabilization===!1?{kind:`declined`,reason:`caller-declined-observation`}:e.flags?.settle===!0?{kind:`declined`,reason:`settle-observer-owns-outcome`}:$y(e.session):{kind:`declined`,reason:`non-swipe-platform`}}function Qy(e){if(!e||e.nodes.length===0)return;let t=Am(e.nodes);if(t.length!==0)return{signature:t,presentationKey:e.presentationKey,comparisonKey:jm(e),nodes:e.nodes}}function $y(e){let t=Qy(e.snapshot);return t?Zp(e)===`active`?Qm(e)?{kind:`unobservable`,reason:`prior-gesture-unsettled`}:{kind:`observe`,baseline:t}:{kind:`unobservable`,reason:`stored-surface-not-current`}:{kind:`unobservable`,reason:`stored-surface-unusable`}}async function eb(e){let{direction:t,baseline:n,swipe:r}=e,i=await nb(n,e);switch(i.kind){case`moved`:return await lb({...i,direction:t,baseline:n,swipe:r});case`blind`:return gb(t,i.reason,{swipe:r});case`settled`:return await ub({...i,direction:t,baseline:n,swipe:r})}}function tb(e,t){if(e.presentationKey!==t.presentationKey)return`baseline-presentation-drift`;if(e.comparisonKey!==t.comparisonKey)return`capture-lineage-drift`}async function nb(e,t){let n,r,i=await Gr({capture:async()=>{let n=await ab(e,t.capture);return n.kind===`changed`&&(r??=await ib(e,t.direction,t.swipe)),n},schedule:{intervalMs:t.pollMs??Xy.intervalMs,budgetMs:t.budgetMs??Xy.budgetMs},verdict:e=>{if(e.kind===`blind`)return{kind:`done`,result:{kind:`blind`,reason:e.reason}};let t=rb(e,{previous:n,changeNeedsRest:r===!0});return n=e.observed.signature,t?{kind:`done`,result:t}:{kind:`continue`}},...t.clock?{clock:t.clock}:{}}),a=i.polls.length;if(i.kind===`failed`)throw i.error;if(i.kind!==`done`)return ob(t,a,i.waitedMs);let o=Date.now()-i.waitedMs;return i.result.kind===`blind`?i.result:{...i.result,attempts:a,startedAt:o}}function rb(e,t){let n=sb(t.previous,e.observed.signature);if(e.kind===`changed`)return!t.changeNeedsRest||n?{kind:`moved`,observed:e.observed}:void 0;if(n)return{kind:`settled`,observed:e.observed,evidence:e.evidence}}async function ib(e,t,n){let r=Ay(t);if(!r)return!1;let i=await My(e.nodes,r,{point:n.midpoint}),a=i.containerRect!==void 0&&!i.canScroll;return a&&j({level:`debug`,phase:`scroll_movement_edge_rest_required`,data:{direction:t,containerRect:i.containerRect}}),a}async function ab(e,t){let n=await cb(t);if(!n)return{kind:`blind`,reason:`capture-unreadable`};let r=tb(e,n);if(r)return{kind:`blind`,reason:r};let i=Pm(e.signature,n.signature);return i===`changed`?{kind:`changed`,observed:n}:{kind:`unchanged`,observed:n,evidence:i}}function ob(e,t,n){return j({level:`warn`,phase:`scroll_movement_budget_expired`,data:{direction:e.direction,attempts:t,durationMs:n,...e.swipe.pixels===void 0?{}:{requestedPixels:e.swipe.pixels}}}),{kind:`blind`,reason:`surface-unsettled`}}function sb(e,t){return e!==void 0&&Nm(e,t)}async function cb(e){let t;try{t=await e()}catch{return}let n=On(t,void 0);return{signature:Am(n.nodes),presentationKey:n.presentationKey,comparisonKey:jm(n),nodes:n.nodes}}async function lb(e){let{direction:t,baseline:n,swipe:r,observed:i}=e,a=Ay(t),o=a?(await My(i.nodes,a)).containerRect:void 0;return o&&!Rm(n.signature,i.signature,o)?gb(t,`change-outside-container`,{swipe:r,containerRect:o}):_b(t,`moved`,r,e.attempts,e.startedAt)}async function ub(e){let{direction:t,baseline:n,observed:r,evidence:i,swipe:a}=e,o=db(n,r,i);return o?gb(t,o.reason,{swipe:a,divergence:o.divergence}):await fb(e)}function db(e,t,n){if(n===`ambiguous`)return{reason:`no-comparable-content`};if(!Im(e.signature,t.signature))return{reason:`surface-divergence`,divergence:Lm(e.signature,t.signature)}}async function fb(e){let{direction:t,observed:n,swipe:r}=e,i=Ay(t);if(!i)return _b(t,`unchanged`,r,e.attempts,e.startedAt);let a=await My(n.nodes,i),o=a.containerRect;if(!o)return gb(t,`no-scroll-container`,{swipe:r});if(r.midpoint&&!pb(o,r.midpoint))return gb(t,`container-outside-swipe`,{swipe:r,containerRect:o});if(a.canScroll)throw mb(t,i,r,o);return _b(t,`at-edge`,r,e.attempts,e.startedAt)}function pb(e,t){return dt(e,t.x,t.y)}function mb(e,t,r,i){let o=new a(`COMMAND_FAILED`,`scroll ${e} moved nothing: the container still reports hidden content ${t===`bottom`?`below`:`above`} and its contents never shifted`,{reason:`scroll_no_progress`,direction:e,hiddenContentAt:t,containerRect:i,...r.pixels===void 0?{}:{requestedPixels:r.pixels},hint:By({targetDirectly:`with scroll ${e} --until <selector>`,rawDrag:r.midpoint!==void 0})});return n(o,`unknown`)}function hb(e,t){j({level:`debug`,phase:`scroll_movement_not_applicable`,data:{direction:e,reason:t}})}function gb(e,t,n){return j({level:`info`,phase:`scroll_movement_unobserved`,data:{direction:e,reason:t,...n.swipe.pixels===void 0?{}:{requestedPixels:n.swipe.pixels},...n.divergence??{},...n.containerRect===void 0?{}:{containerRect:n.containerRect}}}),`unobserved`}function _b(e,t,n,r,i){return j({level:t===`moved`?`debug`:`info`,phase:`scroll_movement_observed`,data:{direction:e,movement:t,attempts:r,durationMs:Date.now()-i,...n.pixels===void 0?{}:{requestedPixels:n.pixels}}}),t}function vb(e){return e===`bottom`?{direction:`down`,edge:`bottom`}:e===`top`?{direction:`up`,edge:`top`}:{direction:T(e)}}function yb(e,t,n){if(e!==void 0&&!Number.isFinite(e))throw new a(`INVALID_ARGS`,`scroll amount must be a number`);te(n),w({amount:e,pixels:t})}async function bb(e){let t=e.positionals[0],n=e.positionals[1]?Number(e.positionals[1]):void 0,r=e.context.pixels,i=e.context.durationMs,o=e.context.until;if(!t)throw new a(`INVALID_ARGS`,`scroll requires direction`);yb(n,r,i);let s=vb(t),c={...s.edge===void 0?{}:{edge:s.edge},...o===void 0?{}:{until:o}};b(c);let l=ne({amount:n,pixels:r,durationMs:i},s.edge),u=pt(c),d={command:`scroll`,device:e.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice};switch(u.kind){case`direction`:{let t=Zy({device:e.device,flags:e.flags,session:e.session});return await Q({...d,use:u.use},async(e,n)=>await Sb(e,s,l,n,t))}case`edge`:{let e=u.edge;return await Q({...d,unavailableResponse:t=>xb(`scroll ${e}, which verifies hidden content before scrolling,`,t.hint),use:u.use},async(t,n)=>await Eb(t,e,s,l,n))}case`until`:{let t=u.until;return await Q({...d,unavailableResponse:e=>xb(`scroll --until, which checks whether the selector became visible,`,e.hint),use:u.use},async(n,r)=>await Db(n,e.device,t,s,l,r))}}}function xb(e,t){return g(`UNSUPPORTED_OPERATION`,`${e} requires snapshot support`,void 0,t===void 0?void 0:{hint:t})}async function Sb(e,t,n,r,i){let a=await kb(e,t,n,r)??{};return jb(t,n,1,a,await Cb(e,t.direction,r,i,a))}async function Cb(e,t,n,r,i){if(r.kind===`declined`){hb(t,r.reason);return}let a=e.operations.captureSnapshot;if(!a){hb(t,`owner-without-capture`);return}return r.kind===`unobservable`?gb(t,r.reason,{swipe:Tb(i)}):await eb({direction:t,baseline:r.baseline,swipe:Tb(i),capture:async()=>await a(wb(n))})}function wb(e,t){return{options:{...e.appBundleId===void 0?{}:{appBundleId:e.appBundleId},...t},execution:$(e)}}function Tb(e){let t=ee(e),n=re(e);return{...t===void 0?{}:{midpoint:t},...n===void 0?{}:{pixels:n}}}async function Eb(e,t,n,r,i){let a,o=await Ly({edge:t,captureState:async n=>{let r=await Ob(e,t,n,i);return a=r.scope??a,r},scroll:async()=>await kb(e,n,r,i),settleAfterPass:async()=>{await Ab(async()=>(await e.operations.captureSnapshot(wb(i,{scope:a}))).nodes??[],t)}});return jb(n,r,o.passes,o.result??{})}async function Db(e,t,n,r,i,a){let o=await Hy({selector:n,direction:r.direction,platform:M(t),capture:async()=>await e.operations.captureSnapshot(wb(a)),scroll:async()=>await kb(e,r,i,a)});return S({direction:r.direction,until:n,passes:o.passes,...i.amount===void 0?{}:{amount:i.amount},...i.pixels===void 0?{}:{pixels:i.pixels},...o.result??{}},Wy(r.direction,n,o.passes))}async function Ob(e,t,n,r){return await jy({edge:t,scope:n,captureNodes:async t=>(await e.operations.captureSnapshot(wb(r,{scope:t}))).nodes??[]})}async function kb(e,t,n,r){return await e.operations.scrollDirection(Mb(t.direction,n,r))}async function Ab(e,t,n=1200,r=120){let i,a=Date.now()+n;for(;Date.now()<a;){let n=await Py(await e(),t);if(n===i)return;i=n,await new Promise(e=>setTimeout(e,r))}}function jb(e,t,n,r,i){let a=x(r),o=re(r);return S({direction:e.direction,...e.edge?{edge:e.edge,passes:n}:{},...t.amount===void 0?{}:{amount:t.amount},...t.pixels===void 0?{}:{pixels:t.pixels},...a===void 0?{}:{durationMs:a},...r,...i===void 0?{}:{movement:i}},Ry({direction:e.direction,edge:e.edge,passes:n,amount:t.amount,pixels:t.pixels,honoredPixels:o,...i===void 0?{}:{movement:i}}))}function Mb(e,t,n){return{direction:e,options:t,...n.appBundleId===void 0?{}:{target:{appBundleId:n.appBundleId}},execution:$(n)}}async function Nb(e){let t=Me(e.positionals),n=await Sy({command:`viewport`,device:e.device,use:ut,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});return n.type===`response`?{ok:!1,response:n.response}:{ok:!0,execute:async()=>(await n.runtime.operations.setViewport(t),{...t,message:`Viewport set: ${t.width}x${t.height}`})}}function Pb(e,t){return{mode:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Fb(e){return await Q({command:`back`,device:e.device,use:bt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},Ib)}async function Ib(e,t){return await e.operations.back(Pb(t.backMode,t)),{action:`back`,mode:t.backMode??`in-app`,...y(`Back`)}}const Lb={home:{use:jt,message:`Home`},"app-switcher":{use:Dt,message:`Opened app switcher`},"action-button":{use:it,message:`Pressed Action Button`}};function Rb(e){return Object.hasOwn(Lb,e)}function zb(e){return{...e.appBundleId===void 0?{}:{options:{appBundleId:e.appBundleId}},execution:$(e)}}async function Bb(e,t){let n=Lb[e];return await Q({command:e,device:t.device,use:n.use,inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice},async(t,r)=>{let[i]=n.use.required;return await t.operations[i](zb(r)),{action:e,...y(n.message)}})}function Vb(e){return ce(e[0])}function Hb(e,t){return{rotation:e,...t.appBundleId===void 0?{}:{options:{appBundleId:t.appBundleId}},execution:$(t)}}async function Ub(e){let t=Vb(e.positionals);return await Q({command:`orientation`,device:e.device,use:st,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,n)=>Wb(e,t,n))}async function Wb(e,t,n){let r=(await e.operations.setOrientation(Hb(t,n)))?.orientation;return r?{action:`orientation`,orientation:r,...y(`Rotated to ${r}`)}:{action:`orientation`,orientation:t,confirmed:!1,warning:`Requested ${t}; the device owner reported no resulting orientation, so the rotation is unconfirmed.`,...y(`Rotation requested: ${t} (unconfirmed)`)}}function Gb(e){return ie(e[0])}async function Kb(e){let t=e.keyframes===void 0?{pose:Gb(e.positionals)}:C({pose:e.positionals[0],keyframes:se(e.keyframes)});return await Q({command:`fold`,device:e.device,use:Mt,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},e=>qb(e,t))}async function qb(e,t){let n=await e.operations.setFoldPose(t),r=n.screen;return{action:`fold`,pose:n.pose,hingeAngleDegrees:n.hingeAngleDegrees,...r?{screen:r}:{},...y(r?`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°, ${r.display} native panel ${r.widthPt}x${r.heightPt}pt, not snapshot coordinates); refs from before the pose change are stale`:`Folded to ${n.pose} (hinge ${n.hingeAngleDegrees}°); refs from before the pose change are stale`)}}function Jb(e){if(e.length!==1)throw new a(`INVALID_ARGS`,`tv-remote requires exactly one button`);return E(e[0])}function Yb(e,t,n){return{button:e,durationMs:t,...n.appBundleId===void 0?{}:{options:{appBundleId:n.appBundleId}},execution:$(n)}}async function Xb(e){let t=Jb(e.positionals),n=e.durationMs===void 0?void 0:Rr(e.durationMs,`durationMs`,0,1e4);return await Q({command:`tv-remote`,device:e.device,use:ft,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice},(e,r)=>Zb(e,t,n,r))}async function Zb(e,t,n,r){return await e.operations.tvRemote(Yb(t,n,r)),{action:`tv-remote`,button:t,...n===void 0?{}:{durationMs:n},...y(`Pressed TV remote ${t}`)}}async function Qb(e){if(Rb(e.req.command))return await Bb(e.req.command,{device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});switch(e.req.command){case`screenshot`:{let{resolveScreenshotGenericExecution:t}=await import(`../screenshot-runtime.js`).then(e=>e.r);return await t(e)}case`focus`:return await Oy({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`scroll`:return await bb({device:e.session.device,positionals:e.req.positionals??[],context:e.context,session:e.session,flags:e.req.flags,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`viewport`:return await Nb({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`back`:return await Fb({device:e.session.device,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`orientation`:return await Ub({device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`fold`:return await Kb({keyframes:e.req.flags?.keyframes,device:e.session.device,positionals:e.req.positionals??[],inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});case`tv-remote`:return await Xb({device:e.session.device,positionals:e.req.positionals??[],durationMs:e.req.flags?.durationMs,inspectFacts:e.inspectFacts,platformServices:e.platformServices,bindDevice:e.bindDevice});default:return{ok:!1,response:g(`COMMAND_FAILED`,`${e.req.command} has no runtime execution on the generic route`,{reason:`generic-route-runtime-missing`})}}}async function $b(e,t,n){let i=ht(e);try{let e=await n();if(!e||e.ok)return e;let r=ex(i,e.error.details,t);return r===e.error.details?e:{...e,error:{...e.error,details:r}}}catch(e){let n=r(e),a=ex(i,n.details,t);throw a===n.details?e:(n.details=a,n)}}function ex(e,t,n){return n.dispatchedSteps>0?v(t,n.dispatchedSteps):e===void 0?t:e===`observes-app`?t?.dispatched===`no`?t:{...t,dispatched:`no`}:t?.dispatched===void 0?{...t,dispatched:`unknown`}:t}function tx(e){return e.ok?e:{...e,error:{...e.error,details:{...e.error.details,dispatched:`no`}}}}function nx(e){return n(r(e),`no`)}const rx=new Proxy({},{get(){return async()=>{throw new a(`INTERNAL_ERROR`,`Android observation was not supplied by root runtime composition`)}}});function ix(){return new a(`INTERNAL_ERROR`,`Platform resource cleanup was not supplied by root runtime composition`)}const ax=Object.freeze({stopSnapshotHelper:async()=>{throw ix()},closeManagedBrowser:async()=>{throw ix()},cleanupSessionlessExecutionHost:async()=>{throw ix()},retainExecutionHostAfterClose:()=>{throw ix()}});function ox(e){let{logPath:t,token:n,requestPlatformProviders:r=cx,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,appLogAdmissionLedger:s=yy(),audioProbeAdmissionLedger:c=qh(),perfCaptureAdmissionLedger:l=Jh(),screenRecordingAdmissionLedger:u=Yh(),hostDiagnostics:d,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,leaseLifecycleProvider:h,cloudArtifactProvider:g,providerAppCatalog:_,androidObservation:v=rx,createCommandSurface:ee,platformResourceCleanup:y=ax,providerDeviceRuntimeScope:te,trackDownloadableArtifact:ne,daemonPolicy:b}=e,{sessionStore:x,leaseRegistry:re}=e,ie=b?cf(e.deviceInventoryGateways,b):e.deviceInventoryGateways;async function S(e){let n=Date.now(),r=!!(e.meta?.debug||e.flags?.verbose);return await Ue({session:e.session,requestId:e.meta?.requestId,command:e.command,debug:r,logPath:t},async()=>{let t=await Vt(sx(e),async()=>await C(e));return t.ok?Mx(e,t,n):{ok:!1,error:yx(e,jx(Ox(e,Dx(e,t.error,x),x)))}})}async function C(e){if(!hn(e.token,n))return ux();_x(e);let t=px(e);if(t)return t;let r=hx(e);if(r)return r;let s=sy(e);if(s)return s;let c,l,u=Dr(e);try{l=await Nr({...ie,requestScope:u},async()=>await Un(async()=>(c=await Zv({req:e,sessionStore:x,leaseRegistry:re,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:u,platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),await T(c))))}catch(e){l=Tx(e)}return w(e,c,await Ex(c,l))}function w(e,t,n){let r=t?x.lookup(t.sessionName)?.session:void 0;return If(t?.req??e,re,r,b)?ed(e.command,n):n}async function T(e,t){let n=async()=>{let n=await ny({scope:e,sessionStore:x,trackDownloadableArtifact:ne});if(n.type===`response`)return n.response;let i=n.scope,a=async e=>{let n=async()=>await E({lockedScope:i,providerScope:e,allowReplayActions:t===void 0});return te?await te(n):await n()};if(t)return await a(t);let o=lx(i);if(!r.hasConfiguredResolvers&&!o)return await a({});let s=await jp({req:i.req,existingSession:i.existingSession,useDefaultWebProvider:o});return s?await r.run(s,a):await a({})};return t?await e.runAdmitted(n):await e.runLocked(n)}async function E(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e;return await $b(t.req,t.dispatchLedger,async()=>await ae({lockedScope:t,providerScope:n,allowReplayActions:r}))}async function ae(e){let{lockedScope:t,providerScope:n,allowReplayActions:r}=e,{dispatchLedger:i}=t,a=Dr(t.req);return await Zh({req:t.req,sessionName:t.sessionName,logPath:t.logPath,sessionStore:x,leaseRegistry:re,leaseLifecycleProvider:h,providerRuntimeIds:f,providerRuntimeRequiredIds:p,providerCredentials:m,cloudArtifactProvider:g,providerAppCatalog:_,invoke:Zr(S,i),invokeReplayAction:r?Zr(D(t,n),i):void 0,providerScope:n,androidObservation:v,createCommandSurface:ee,platformResourceCleanup:y,bindDevice:t.bindDevice,platformServices:t.platformServices,inspectFacts:t.inspectFacts,bindExactDevice:t.bindExactDevice,reconcileOrphanedDeviceClaim:Or({scope:a,composeGateway:o}),appLogAdmissionLedger:s,audioProbeAdmissionLedger:c,perfCaptureAdmissionLedger:l,screenRecordingAdmissionLedger:u,hostDiagnostics:d,requestScope:a,retainDeviceExecutionLock:t.retainDeviceExecutionLock,throwIfCanceled:t.throwIfCanceled,contextFromFlags:t.handlerContextFromFlags})||await Sx({lockedScope:t,logPath:t.logPath,sessionStore:x,androidObservation:v,createCommandSurface:ee})}function D(e,t){return async r=>{if(!wx(r,e))return await S(r);if(!hn(r.token,n))return ux();_x(r);let s,c;try{let n=Cx(r,e);s=await Zv({req:n,sessionStore:x,leaseRegistry:re,deviceRuntimeGateway:i,platformServices:a,claimRecoveryGateway:o,platformRequestScope:Dr(n),platformResourceCleanup:y,providerAppCatalog:_,daemonPolicy:b}),c=s.sessionName===e.sessionName?await T(s,t):await T(s)}catch(e){c=Tx(e)}return xx(r,await Ex(s,c))}}return S}function sx(e){let t=e.meta?.developerDir;return typeof t==`string`?{DEVELOPER_DIR:t}:void 0}const cx=Object.freeze({hasConfiguredResolvers:!1,run:async(e,t)=>await t({})});function lx(e){return e.existingSession!==void 0&&tv(e.existingSession)||e.req.flags?.platform===`web`}function ux(){return{ok:!1,error:s(new a(`UNAUTHORIZED`,`Invalid token`))}}function dx(){return g(`INVALID_ARGS`,`--record and --no-record are mutually exclusive; pass at most one.`)}const fx=[[`recordAs`,`--record-as`,`string`],[`textStdin`,`--text-stdin`,`boolean`]];function px(e){if(e.flags?.record&&e.flags?.noRecord)return dx();if(e.command===`fill`)return mx(e);let t=fx.find(([t])=>e.flags?.[t]!==void 0);if(t)return g(`INVALID_ARGS`,`${t[1]} is supported only by fill.`)}function mx(e){let t=fx.find(([t,,n])=>{let r=e.flags?.[t];return r!==void 0&&typeof r!==n});if(t)return g(`INVALID_ARGS`,`${t[1]} must be a ${t[2]}.`)}function hx(e){if(e.flags?.snapshotCustomActions===!0&&e.flags?.snapshotRaw===!0)return g(`INVALID_ARGS`,`--actions and --raw are mutually exclusive: custom actions are only readable through the private-AX snapshot path, which a raw capture does not use.`)}function gx(e){if(!(e.command!==`fill`||!_i(e.flags)))return xi({ts:0,command:`fill`,positionals:e.positionals??[],flags:e.flags})}function _x(e){let t=gx(e);t!==void 0&&We(t)}const vx=new Set([`message`,`hint`,`cause`,`details`]);function yx(e,t){let n=gx(e);if(!n)return t;let r=vi(e.flags),i=e=>Ea(e,n,r);return Object.fromEntries(Object.entries(t).map(([e,t])=>[e,vx.has(e)?bx(t,i):t]))}function bx(e,t){return typeof e==`string`?t(e):Array.isArray(e)?e.map(e=>bx(e,t)):!e||typeof e!=`object`?e:Object.fromEntries(Object.entries(e).map(([e,n])=>[t(e),bx(n,t)]))}function xx(e,t){return t.ok?t:{...t,error:yx(e,t.error)}}async function Sx(e){let{lockedScope:t,logPath:n,sessionStore:r,androidObservation:i,createCommandSurface:a}=e,o=r.lookup(t.sessionName);if(!o)return d();let s=r.requireCurrent(o),c=await Qb({req:t.req,session:s,context:t.contextFromFlags(t.req.flags,s.appBundleId,s.trace?.outPath),inspectFacts:t.inspectFacts,platformServices:t.platformServices,bindDevice:t.bindDevice,createCommandSurface:a});if(!c.ok)return tx(c.response);let{dispatchGenericCommand:l}=await Qh();return await l({req:t.req,ref:o,sessionName:t.sessionName,logPath:n,sessionStore:r,contextFromFlags:t.contextFromFlags,platformServices:t.platformServices,executePlatformCommand:c.execute,androidObservation:i,createCommandSurface:a,...c.recorded?{recordedRequest:c.recorded}:{}})}function Cx(e,t){if(e.command!==`open`)return e;let n=e.internal?.retainDeviceExecutionLock;return{...e,internal:{...e.internal,retainDeviceExecutionLock:async e=>{await t.retainDeviceExecutionLock(e),await n?.(e)}}}}function wx(e,t){return e.session===t.sessionName&&vu(e.command)}function Tx(e){j({level:`error`,phase:`request_failed`,data:{error:e instanceof Error?e.message:String(e)}});let t=A(),n=He({force:!0});return{ok:!1,error:s(e,{diagnosticId:t.diagnosticId,logPath:n?.path,diagnosticsRecord:n?.ref})}}async function Ex(e,t){if(!e)return t;let n=t;try{await e[Symbol.asyncDispose]()}catch(e){t.ok?n=Tx(e):(j({level:`error`,phase:`request_binding_cleanup_failed`,data:{primaryCode:t.error.code,cleanupError:e instanceof Error?e.message:String(e)}}),He({force:!0}))}return ry(e,n)}function Dx(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=kx(e,n);if(r===void 0)return t;let i=n.readRepairTombstone(r);if(!i)return t;let o=i.sourcePath?`re-run: replay ${i.sourcePath} --save-script`:`re-run your replay <script> --save-script from the start`;return i.commitFailure?s(new a(`REPAIR_COMMIT_FAILED`,`The repair transaction for session "${e.session}" completed, but committing its healed script failed at teardown: ${i.commitFailure.message}. ${o}.`)):s(new a(`REPAIR_SESSION_EXPIRED`,`The --save-script repair session "${e.session}" was reaped before it was finalized (idle-reap); ${o}.`))}function Ox(e,t,n){if(t.code!==`SESSION_NOT_FOUND`)return t;let r=Ax(e,n);return r?s(gy(r.owner,r)):t}function kx(e,t){try{return Og(Mf(e),t,{attachesToSession:!1})}catch{return}}function Ax(e,t){let n=kx(e,t);if(n!==void 0)try{return t.readIdleExpiryTombstone(n)}catch{return}}function jx(e){let n=e.retriable??t(e.code);return n===void 0?e:{...e,retriable:n}}function Mx(e,t,n){let r=Nx(e,t);if(!e.meta?.includeCost)return r;let i=Fx(t.data,n);return{ok:!0,data:{...r.data??{},cost:i}}}function Nx(e,t){let n=e.meta?.responseLevel??`default`;if(n==="default")return t;let r=Cp[e.command];return r?{ok:!0,data:r(t.data??{},n)}:t}const Px=[`ios_runner_command_send`,`ios_runner_readiness_preflight`];function Fx(e,t){let n={wallClockMs:Date.now()-t,runnerRoundTrips:Ke(Px)},r=e?.nodes;return Array.isArray(r)&&(n.nodeCount=r.length),n}function Ix(e){let t=5e3;return e.screenRecording&&(t+=11e3),tv(e)&&(t+=3e4),t}function Lx(e){e.destroyConnections?.();let t=`closeAllConnections`in e?e.closeAllConnections:void 0;if(typeof t==`function`){t.call(e);return}let n=`closeIdleConnections`in e?e.closeIdleConnections:void 0;typeof n==`function`&&n.call(e)}async function Rx(e,t=5e3){await Promise.all(e.map(async e=>{let n;await new Promise(r=>{n=setTimeout(()=>{Lx(e),r()},t);try{e.close(()=>r())}catch{r()}}),n&&clearTimeout(n)}))}function zx(e=process.env){let t=e.AGENT_DEVICE_DAEMON_IDLE_TIMEOUT_MS?.trim();if(t){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.floor(e)}return 3e5}function Bx(e){return e.toArray().some(e=>!Vx(e))}function Vx(e){return oa(e)}function Hx(e){return e.toArray().some(e=>!!e.screenRecording)}function Ux(e){return e.inFlightRequestCount>0||Bx(e.sessionStore)?!1:!Hx(e.sessionStore)}function Wx(e){let t=zx(e.env),n,r=()=>Ux({sessionStore:e.sessionStore,inFlightRequestCount:e.getInFlightRequestCount()}),i=()=>{n&&=(clearTimeout(n),void 0)},a=()=>{i(),!(t<=0)&&(n=setTimeout(()=>{if(n=void 0,r()){if(e.hasRetainedLeases()){a();return}j({level:`info`,phase:`daemon_idle_reap`,data:{idleMs:t}}),e.onIdleReap()}},t),n.unref?.())};return{noteActivity:()=>{r()?a():i()},cancel:i,idleMs:t}}const Gx=`claim-clear-failed`,Kx=Object.freeze({deleted:!0,absent:!0,"ownership-changed":!0,unattributable:!1}),qx=2147483647;function Jx(e){let{sessionStore:t,idleExpiryMs:n}=e,r=e.now??Date.now,i,a=!1,o=!1,s=new Set,c=new Map,l=()=>{i&&=(clearTimeout(i),void 0)},u=()=>{o=!0,l()},d=()=>{let e,r=new Set;for(let i of t.listRefs()){r.add(i.address);let t=my(i.session,n);if(t===void 0)continue;let a=c.get(i.address),o=a===void 0?t:Math.max(t,a);(e===void 0||o<e)&&(e=o)}for(let e of c.keys())r.has(e)||c.delete(e);return e},f=()=>{if(l(),o||n<=0||a)return;let e=r(),t=d();if(t===void 0)return;let s=Math.max(0,t-e),c=s>qx;i=setTimeout(()=>{i=void 0,c?f():p()},Math.min(s,qx)),i.unref?.()},p=async()=>{a=!0;let t=async()=>{try{await Yx({...e,now:r,retryNotBeforeMs:c,settling:s,closing:()=>o,notifyExpired:e.onSessionExpired})}catch(e){j({level:`warn`,phase:`session_idle_expiry_sweep_failed`,data:{idleExpiryMs:n,error:e instanceof Error?e.message:String(e)}})}};try{await(e.withinDiagnosticsScope?e.withinDiagnosticsScope(t):t())}finally{a=!1,f()}};return{noteSessionsChanged:f,cancel:u,idleExpiryMs:n}}async function Yx(e){for(let t of e.sessionStore.listRefs())if(dy(t.session)){if(e.closing())return;await Xx({...e,ref:t})}}async function Xx(e){let{address:t}=e.ref;if(e.settling.has(t)){e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs);return}let n=v_(t,e.ref.session.device.id),r=$x({...e,lockKeys:n}),i=e.settleBudgetMs?.(e.ref.session);if(i===void 0)return void await r;let a=Qx(i);try{if(await Promise.race([r,a.promise])!==Zx)return}finally{a.cancel()}j({level:`warn`,phase:`session_idle_expiry_settle_timeout`,data:{session:t,idleExpiryMs:e.idleExpiryMs,settleBudgetMs:i,...e.ref.session.deviceClaim?{deviceKey:e.ref.session.deviceClaim.deviceKey}:{}}}),e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}const Zx=Symbol(`session-idle-settle-budget-elapsed`);function Qx(e){let t;return{promise:new Promise(n=>{t=setTimeout(()=>n(Zx),e),t.unref?.()}),cancel:()=>clearTimeout(t)}}async function $x(e){let{address:t,session:n}=e.ref;e.settling.add(t);let r;try{r=await z_(e.executionLocks,e.lockKeys,async()=>{if(e.closing())return eS;let t=e.sessionStore.resolveCurrent(e.ref);if(!t||t.device.id!==n.device.id)return eS;let r=e.now();return py(t,e.idleExpiryMs,r)?{outcome:await nS({ref:e.sessionStore.refresh(e.ref),idleExpiryMs:e.idleExpiryMs,expiredAtMs:r,sessionStore:e.sessionStore,settleSession:e.settleSession}),retry:!0}:eS}),r.retry?tS(e,t,r.outcome):e.retryNotBeforeMs.delete(t)}catch(n){j({level:`warn`,phase:`session_idle_expiry_settle_failed`,data:{session:t,idleExpiryMs:e.idleExpiryMs,error:n instanceof Error?n.message:String(n)}}),tS(e,t,void 0);return}finally{e.settling.delete(t)}return r.outcome&&e.notifyExpired?.(r.outcome),r.outcome}const eS=Object.freeze({outcome:void 0,retry:!1});function tS(e,t,n){if(n){e.retryNotBeforeMs.delete(t);return}e.retryNotBeforeMs.set(t,e.now()+e.idleExpiryMs)}async function nS(e){let{ref:t,idleExpiryMs:n,expiredAtMs:r}=e,{address:i,session:a}=t,o=a.deviceClaim?.deviceKey,s={session:i,idleExpiryMs:n,...o?{deviceKey:o}:{}};if(!await rS(e,s))return;let c=await iS(i,a.deviceClaim);if(c===Gx||!Kx[c]){j({level:`warn`,phase:`session_idle_expiry_device_claim_unconfirmed`,data:s});return}if(e.sessionStore.finalizeRepairTeardown(t),!e.sessionStore.retire(t)){j({level:`info`,phase:`session_idle_expiry_superseded`,data:s});return}e.sessionStore.writeIdleExpiryTombstone(i,hy(i,{expiredAtMs:r,idleExpiryMs:n,deviceKey:o}));let l=r-uy(a);return j({level:`info`,phase:`session_idle_expired`,data:{...s,idleForMs:l,claim:c}}),{sessionName:i,idleExpiryMs:n,idleForMs:l,claim:c,...o?{deviceKey:o}:{}}}async function rS(e,t){try{return await e.settleSession(e.ref),!0}catch(e){return j({level:`warn`,phase:`session_idle_expiry_cleanup_failed`,data:{...t,error:e instanceof Error?e.message:String(e)}}),!1}}async function iS(e,t){if(!t)return`absent`;try{return await wr(t)}catch(n){return j({level:`warn`,phase:`session_idle_expiry_device_claim_clear_failed`,data:{session:e,deviceKey:t.deviceKey,error:n instanceof Error?n.message:String(n)}}),Gx}}async function aS(e){let{leaseRegistry:t,expiredProviderLeaseReleaser:n,timeoutMs:r}=e;await Promise.all(t.listActiveLeases().map(async e=>{try{let i=await oS(n.release(e),r);t.releaseLease(Gl(e)),i||j({level:`warn`,phase:`daemon_shutdown_lease_release_timed_out`,data:{leaseId:e.leaseId,timeoutMs:r}})}catch(t){j({level:`warn`,phase:`daemon_shutdown_lease_release_failed`,data:{leaseId:e.leaseId,error:t instanceof Error?t.message:String(t)}})}}))}async function oS(e,t){return await new Promise((n,r)=>{let i=setTimeout(()=>n(!1),t);e.then(()=>{clearTimeout(i),n(!0)},e=>{clearTimeout(i),r(e)})})}const sS=`clear-unrecorded`;function cS(){let e={released:[],orphaned:[],superseded:[],unattributable:[]},t=new Map;return{claims:e,releaseClaim:async e=>{if(e.deviceClaim)try{t.set(e.name,await wr(e.deviceClaim))}catch(n){t.set(e.name,sS),j({level:`warn`,phase:`daemon_shutdown_device_claim_release_failed`,data:{session:e.name,deviceKey:e.deviceClaim.deviceKey,error:n instanceof Error?n.message:String(n)}})}},finalize:n=>{let r=n.deviceClaim;if(!r)return;let i={deviceKey:r.deviceKey,session:n.name,platform:M(n.device),deviceId:n.device.id},a=t.get(n.name);switch(a){case`deleted`:case`absent`:e.released.push(i);return;case`ownership-changed`:e.superseded.push(i);return;case`unattributable`:e.unattributable.push(i);return;case sS:case void 0:e.orphaned.push(i);return;default:lS(a)}}}}function lS(e){throw Error(`Undeclared device-claim outcome: ${String(e)}`)}function uS(e){if(e===void 0)return;let t=Number(e);if(Number.isInteger(t))return t}const dS=Object.freeze({match:!1,replaced:!0,absent:!0,unreadable:!1,ownerless:!1,unproven:!1});function fS(e){let t=vr(e.infoPath,e.owner);if(dS[t.state]&&!(t.state===`absent`&&mS(e.stateDir)))return t.state===`replaced`?{state:`replaced`,registeredPid:t.identity.pid}:{state:`absent`}}function pS(e){let t,n=()=>{t&&=(clearInterval(t),void 0)};return t=setInterval(()=>{if(mS(e.stateDir)){n();return}let t=fS(e);t&&(n(),e.onLoss(t))},15e3),t.unref?.(),n}function mS(e){try{return zt(e)===void 0}catch{return!1}}function hS(e){let t=new Set,n=ci.createServer(n=>{t.add(n),n.on(`close`,()=>t.delete(n));let r=``,a=0,o=new Set,c=!1,l=()=>{if(!(c||a===0)){c=!0;for(let e of o)Jn(e);j({level:`warn`,phase:`request_client_disconnected`,data:{inFlightRequests:a}})}};n.setEncoding(`utf8`),n.on(`close`,l),n.on(`error`,l),n.on(`data`,async t=>{let c=tn(r,t);r=c.buffer;for(let t of c.lines){let r;a+=1;let c,l,u=!1;try{let a=gS(t);if(u=gn(a),c=Qn(a.meta?.requestId,`socket`),a.meta={...a.meta,requestId:c},l=Zn(c),o.add(c),Xn(c))throw i();r=await er(u?e=>{n.destroyed||n.write(on(e))}:void 0,async()=>await e(a))}catch(e){r={ok:!1,error:s(e)}}finally{--a,l&&o.delete(l.requestId),$n(l)}n.destroyed||n.write(u?$t(r):`${JSON.stringify(r)}\n`)}})});return n.destroyConnections=()=>{for(let e of t)e.destroy();t.clear()},n}function gS(e){let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return t;let{internal:n,...r}=t;return r}function _S(e){return yS(e,`Failed to bind socket server`)}function vS(e){return yS(e,`Failed to bind HTTP server`)}function yS(e,t){return new Promise((n,r)=>{e.once(`error`,r),e.listen(0,`127.0.0.1`,()=>{e.off(`error`,r);let i=e.address();if(typeof i==`object`&&i?.port){n(i.port);return}r(new a(`COMMAND_FAILED`,t))})})}async function bS(){let{resetAndroidSnapshotHelperSessions:e}=await xn();await e()}async function xS(e){let{stopAndroidSnapshotHelperSessionForDevice:t}=await xn();await t(e)}async function SS(e){if(process.platform!==`darwin`)return;let{restoreLegacyXctestDeviceSetRedirect:t}=await import(`../runner-owner-facade.js`);await t(e)}async function CS(e){let{getManagedAgentBrowserStatus:t}=await import(`../src2.js`).then(e=>e.i),n=await t({stateDir:e.stateDir});if(!n.installed)return;let{cleanupManagedAgentBrowserOrphans:r}=await import(`../src2.js`).then(e=>e.i);await r(n,`daemon-startup`,{openWebSessionNames:e.openWebSessionNames,...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}async function wS(e){let{createAgentBrowserWebProvider:t}=await import(`../src2.js`).then(e=>e.i);await(await t({session:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openWebSessionNames})).close()}const TS=Object.freeze({async stopSnapshotHelper(e){e.platform===`android`&&await xS(e)},async closeManagedBrowser(e){e.device.platform===`web`&&await wS({sessionName:e.sessionName,stateDir:e.stateDir,openWebSessionNames:e.openSessionNames})},async cleanupSessionlessExecutionHost(e){if(!N(e))return;let{resolveRunnerAppBundleId:t,stopIosRunnerSession:n}=await import(`../runner-operations-facade.js`);await n(e.id);let r=await t(),{closeIosApp:i}=await import(`../app-lifecycle-facade.js`);await i(e,r).catch(t=>{j({level:`debug`,phase:`ios_sessionless_runner_host_close_failed`,data:{deviceId:e.id,bundleId:r,error:t instanceof Error?t.message:String(t)}})})},retainExecutionHostAfterClose(e){return N(e.device)&&e.device.kind===`simulator`&&!e.shutdownRequested&&!e.hasScreenRecording&&!e.hasLease}});async function ES(e){let{setRunnerLeaseOwnerStateDir:t}=await import(`../runner-owner-facade.js`);t(e)}async function DS(e){let{setRunnerDeviceClaimAuthorityProbe:t}=await import(`../runner-owner-facade.js`);t(e)}const OS=Object.freeze({configureForDaemonLock:async e=>{await ES(e.stateDir),await DS(e.hasDeviceClaimAuthority),await SS(e.onDiagnostic)},clearDaemonLockConfiguration:async()=>{await ES(void 0),await DS(void 0)},recoverLegacyAppLogMarkers:async e=>{let{recoverLegacyAppLogMarkersAfterDaemonLock:t}=await import(`../platform-runtime-operation-host.js`);return await t(e)},cleanupManagedWebOrphans:async e=>{await CS(e)},resetAndroidSnapshotHelper:async()=>{await bS()}});async function kS(e){let{session:t,stderr:n,resource:r,teardown:i}=e;try{return await i(),!0}catch(e){return n.write(`Daemon ${r} teardown error (${t.name}): ${e instanceof Error?e.message:String(e)}\n`),!1}}async function AS(e){let{ref:t,sessionStore:n,stderr:r,finalizeApplicationLifecycle:i,afterSuccessfulTeardown:a}=e,o=n.resolveCurrent(t),s=o??t.session,c=Sv(o?n.getRuntimeHints(t.address):void 0),l=Ix(s),u=await kS({session:s,stderr:r,resource:`app-log`,teardown:async()=>await rv({ref:t,sessionStore:n})}),d=n.resolveCurrent(t)??s,f=(async()=>{let e=await kS({session:s,stderr:r,resource:`session`,teardown:async()=>await lv({appLog:`already-settled`,ref:t,sessionStore:n,platformCleanup:TS})}),a=!i||await kS({session:s,stderr:r,resource:`lifecycle`,teardown:async()=>await i(d,c)});return e&&a})(),p=await Promise.race([f,Ht(l).then(()=>(r.write(`Daemon session teardown timed out (${s.name}).\n`),!1))]),m=u&&p;n.finalizeRepairTeardown(t),m&&await a?.(s),n.retire(t)}async function jS(e,t){t.length!==0&&await P({logPath:e,command:`daemon-startup`,debug:!1},()=>{for(let e of t)j({level:`warn`,phase:e.phase,data:{resourcePath:e.resourcePath,...e.data}})})}async function MS(e,t){for(let{provider:n,error:r}of t??[])await NS(e,`provider_runtime_skipped`,{provider:n,code:r.code,message:r.message,hint:r.details?.hint})}async function NS(e,t,n){await P({logPath:e},()=>{j({level:`warn`,phase:t,data:n})})}async function PS(e){try{let t=await e.registration.finish(e.outcome);t.state!==`removed`&&t.state!==`absent`&&await NS(e.logPath,`daemon_info_removal_declined`,{infoPath:e.infoPath,removed:!1,reason:t.state,...t.state===`replaced`?{registeredPid:t.identity.pid}:{}})}catch(t){await NS(e.logPath,`daemon_registration_finish_failed`,{error:s(t)})}}async function FS(e){await NS(e.logPath,`daemon_metadata_lost`,{infoPath:e.infoPath,...e.loss})}function IS(e,t,n,r){return pS({infoPath:t,stateDir:e,owner:r,onLoss:e=>void FS({infoPath:t,logPath:n,loss:e}).catch(()=>{})})}async function LS(e){let t=e.env??process.env,n=e.stdout??process.stdout,i=e.stderr??process.stderr,o=e.exit??(e=>process.exit(e)),s=fn(t.AGENT_DEVICE_STATE_DIR),{baseDir:c,infoPath:l,logPath:u,sessionsDir:d}=s,f=cn(t.AGENT_DEVICE_DAEMON_SERVER_MODE),p=Ut(t.AGENT_DEVICE_RETAIN_ARTIFACTS),m;try{m=sr(t)}catch(e){return i.write(`Daemon error: ${r(e).message}\n`),o(1),null}let h=new Ds(d),g=_n({stateDir:c,sessionsDir:d,resolveSessionDir:e=>h.resolveSessionDir(e)}),_=yy(),v=qh(),ee=Jh(),y=mf(),te=Yh(),ne=yn(),b=F.randomBytes(24).toString(`hex`),x=It(),re=$r(),ie=ei(),S=await _f(t),C=[...S.runtimes],w=dr({assertShutdownAllowed:m?()=>of(m,`device-shutdown`):void 0,providerRuntimes:C,providerModules:S.platformModules,sessionsDir:d,ownedProcesses:g,resolveSessionArtifacts:e=>({outputPath:h.resolveAppLogPath(e),pidPath:h.resolveAppLogPidPath(e)})}),T=w.applicationLifecycle;if(!T)throw new a(`COMMAND_FAILED`,`Platform lifecycle gateway is not configured.`,{reason:`runtime-gateway-missing`});let E=rr(C,{providerRuntimeRequiredIds:hf});or({isActive:e=>nr(e)}),ff({resolve:ir});let ae=lr({providers:{appleRunnerProvider:E.appleRunnerProvider,appleRunnerScreenRecordingTransport:E.appleRunnerScreenRecordingTransport},defaultWebProvider:{stateDir:c,openWebSessionNames:()=>nv(h),ownedProcessRecords:g}}),D=Yf({leaseLifecycleProvider:E.leaseLifecycleProvider,providerRuntimeIds:E.providerRuntimeIds,recoverExpiredLease:E.recoverExpiredLease,stateDir:c,recoverableProviderIds:E.recoverableProviderIds});D.retryPending();let oe=new Ef({maxActiveSimulatorLeases:uS(t.AGENT_DEVICE_MAX_SIMULATOR_LEASES),defaultLeaseTtlMs:uS(t.AGENT_DEVICE_LEASE_TTL_MS),minLeaseTtlMs:uS(t.AGENT_DEVICE_LEASE_MIN_TTL_MS),maxLeaseTtlMs:uS(t.AGENT_DEVICE_LEASE_MAX_TTL_MS),onLeaseExpired:e=>{D.release(e)}}),se=E.cloudArtifactProvider,ce=E.providerAppCatalog,le=ur(E.deviceInventorySource),{createDaemonPlatformServices:ue}=await import(`../platform-runtime-daemon-services.js`),{createClaimRecoveryGateway:de}=await import(`../platform-runtime-claim-recovery.js`),fe=ox({logPath:u,token:b,sessionStore:h,leaseRegistry:oe,leaseLifecycleProvider:E.leaseLifecycleProvider,cloudArtifactProvider:se,providerAppCatalog:ce,deviceInventoryGateways:le,deviceRuntimeGateway:w,platformServices:ue(),claimRecoveryGateway:de,appLogAdmissionLedger:_,audioProbeAdmissionLedger:v,perfCaptureAdmissionLedger:ee,hostDiagnostics:y,screenRecordingAdmissionLedger:te,requestPlatformProviders:ae,androidObservation:fr,platformResourceCleanup:TS,providerRuntimeIds:E.providerRuntimeIds,providerRuntimeRequiredIds:E.providerRuntimeRequiredIds,providerCredentials:_r(t,c),providerDeviceRuntimeScope:E.providerDeviceRuntimeScope,trackDownloadableArtifact:Fs,daemonPolicy:m,createCommandSurface:e.createCommandSurface}),pe=()=>{},me=async e=>{await P({logPath:u},()=>{j({level:`error`,phase:`daemon_fatal`,data:{error:e instanceof Error?e.message:String(e)}})})},he=cS(),ge=async e=>{let t=h.resolveCurrent(e)??e.session;try{await AS({ref:e,sessionStore:h,stderr:i,finalizeApplicationLifecycle:async(e,t)=>await mv({gateway:w,scope:Ar(),session:e,stateDir:c,runtimeHints:t}),afterSuccessfulTeardown:he.releaseClaim})}finally{he.finalize(t)}},_e=async()=>{h.closeAdmission();let e=h.listRefs();await Promise.all(e.map(ge))},ve=Jx({sessionStore:h,idleExpiryMs:ly(t),executionLocks:ay(oe),settleSession:async e=>{let t=h.resolveCurrent(e)??e.session,n=e.address,r=Sv(h.getRuntimeHints(n));await lv({appLog:`run`,ref:e,sessionStore:h,platformCleanup:TS}),await mv({gateway:w,scope:Ar(),session:t,stateDir:c,runtimeHints:r,daemonLeaving:!1})},settleBudgetMs:e=>Ix(e),withinDiagnosticsScope:async e=>await P({logPath:u},e),onSessionExpired:()=>{be.noteActivity()}}),O=!1,ye=new Set,be=Wx({sessionStore:h,getInFlightRequestCount:()=>ye.size,hasRetainedLeases:()=>oe.hasRetainedLeases(),onIdleReap:()=>{k()},env:t}),xe=async e=>{if(O)return{ok:!1,error:{code:`COMMAND_FAILED`,message:`Daemon is shutting down.`,details:{reason:`daemon_shutting_down`}}};be.cancel();let t=fe(e);ye.add(t);try{return await t}finally{ye.delete(t),be.noteActivity(),ve.noteSessionsChanged()}},Se=async()=>{let e=[],n,r,i=f!==`http`,a=f!==`socket`;if(i){let t=hS(xe);e.push(t),n=await _S(t)}if(a){let n=await ef({handleRequest:xe,leaseRegistry:oe,token:b,retainArtifacts:p,env:t,resolveRequestDiagnosticsPath:m?.requiredLeaseBackend?void 0:e=>sn(h.resolveSessionDir(e.session),e.requestId)});e.push(n),r=await vS(n)}return{servers:e,socketPort:n,httpPort:r}},Ce=(e,t)=>{Ee.publish({socketPort:e,httpPort:t,token:b,version:ne,codeOrigin:re,codeSignature:ie,policyDigest:m?.digest}),e&&n.write(`AGENT_DEVICE_DAEMON_PORT=${e}\n`),t&&n.write(`AGENT_DEVICE_DAEMON_HTTP_PORT=${t}\n`)},we=e=>{for(let t of e)try{t.close(()=>{})}catch{}},Te=await jn(s);if(Te.status!==`acquired`)return await Promise.allSettled(C.map(async e=>await e.shutdown())),i.write(`Daemon registration ${Te.status}; exiting.\n`),o(Mn[Te.status]),null;let Ee=Te.owner,De=[],Oe,ke,Ae=[];try{await OS.configureForDaemonLock({stateDir:c,hasDeviceClaimAuthority:xr,onDiagnostic:e=>Ae.push(e)});let e=await OS.recoverLegacyAppLogMarkers(d);_.retainLegacyMarkers(e.retained);for(let t of e.recovered)Ae.push({phase:`app_log_legacy_marker_recovered`,resourcePath:t,data:{}});for(let t of e.retained)Ae.push({phase:`app_log_legacy_marker_retained`,resourcePath:t.markerPath,data:{reason:t.reason,...t.message===void 0?{}:{message:t.message}}});await kr({sessionsDir:d,gateway:w,scope:Ar(),onDiagnostic:e=>Ae.push(e)}),await vn(g,{openWebSessionNames:nv(h),purposes:[`simctl-screen-recording`],termTimeoutMs:5e3}),await zS({stateDir:c,sessionStore:h,ownedProcessRecords:g}),T.recoverStartupResources({stateDir:c}).catch(e=>{j({level:`warn`,phase:`daemon_lifecycle_startup_recovery_failed`,data:{error:e instanceof Error?e.message:String(e)}})});let t=await Se();De=t.servers,Oe=t.socketPort,ke=t.httpPort,Ce(Oe,ke),pe=IS(c,l,u,x),await jS(u,Ae),await MS(u,S.skipped),await RS(u,Or({scope:Ar(),composeGateway:de}),c),be.noteActivity()}catch(e){let t=r(e);return i.write(`Daemon error: ${t.message}\n`),we(De),pe(),await Promise.allSettled(C.map(async e=>await e.shutdown())),await PS({registration:Ee,infoPath:l,logPath:u}),await OS.clearDaemonLockConfiguration(),o(1),null}ti();let k=async(e={})=>{if(be.cancel(),ve.cancel(),O)return;O=!0,pe(),e.cause&&await me(e.cause),await Rx(De),await Promise.allSettled(ye);try{await P({logPath:u},async()=>{await T.detachForDaemonShutdown()})}catch{}D.beginShutdown(),await _e(),await P({logPath:u},async()=>{await aS({leaseRegistry:oe,expiredProviderLeaseReleaser:D,timeoutMs:1e3})});try{await OS.resetAndroidSnapshotHelper()}catch(e){j({level:`warn`,phase:`daemon_shutdown_android_snapshot_helper_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}let t=await D.drain(2e3);j({level:t.pending.length===0?`info`:`warn`,phase:`daemon_shutdown_provider_release_drain`,data:{releasedLeaseIds:t.released.map(e=>e.leaseId),pendingLeaseIds:t.pending.map(e=>e.leaseId),releasedDeviceKeys:he.claims.released.map(e=>e.deviceKey),orphanedDeviceKeys:he.claims.orphaned.map(e=>e.deviceKey)}}),D.shutdown(),await w.shutdown(),await Promise.allSettled(C.map(async e=>await e.shutdown())),await T.finalizeDaemonShutdown(),await Promise.race([ni().catch(()=>{}),Ht(1e3)]),await PS({registration:Ee,infoPath:l,logPath:u,outcome:{providerReleases:t,claims:he.claims}}),await OS.clearDaemonLockConfiguration(),o(e.exitCode??0)};return e.registerProcessHandlers!==!1&&(process.on(`SIGINT`,()=>{k()}),process.on(`SIGTERM`,()=>{k()}),process.on(`SIGHUP`,()=>{k()}),process.on(`uncaughtException`,e=>{let t=e instanceof a?e:r(e);i.write(`Daemon error: ${t.message}\n`),k({exitCode:1,cause:e})}),process.on(`unhandledRejection`,e=>{let t=e instanceof Error?e:Error(String(e)),n=t instanceof a?t:r(t);i.write(`Daemon error: ${n.message}\n`),k({exitCode:1,cause:t})})),{httpPort:ke,shutdown:k,socketPort:Oe,token:b}}async function RS(e,t,n){await P({logPath:e},async()=>{try{let e=await Sr(t,n);e.examined>0&&j({phase:`device_claim_reconcile`,data:e})}catch(e){j({level:`warn`,phase:`device_claim_reconcile_failed`,data:{error:e instanceof Error?e.message:String(e)}})}})}async function zS(e){try{await OS.cleanupManagedWebOrphans({stateDir:e.stateDir,openWebSessionNames:nv(e.sessionStore),...e.ownedProcessRecords===void 0?{}:{ownedProcessRecords:e.ownedProcessRecords}})}catch(e){j({level:`warn`,phase:`web_agent_browser_orphan_cleanup_failed`,data:{error:e instanceof Error?e.message:String(e)}})}}LS({createCommandSurface:async e=>(await import(`../runtime-command-surface.js`)).createCommandSurfaceAgentDevice(e)}).catch(e=>{let t=r(e);process.stderr.write(`Daemon error: ${t.message}\n`),process.exit(1)});export{Jp as $,bi as $t,Z_ as A,ra as At,mg as B,Wi as Bt,uv as C,El as Ct,av as D,Ua as Dt,iv as E,$s as Et,kg as F,ta as Ft,Jm as G,Yi as Gt,dg as H,Ui as Ht,jg as I,na as It,ih as J,R as Jt,Xm as K,Xi as Kt,Mg as L,sa as Lt,N_ as M,ia as Mt,Pg as N,aa as Nt,tv as O,Pa as Ot,Ng as P,oa as Pt,am as Q,_i as Qt,Sg as R,ea as Rt,dv as S,Gl as St,rv as T,Ls as Tt,vh as U,Ki as Ut,hg as V,Zi as Vt,Qm as W,Qi as Wt,Dm as X,Vi as Xt,Om as Y,Hi as Yt,om as Z,xi as Zt,Sv as _,Ef as _t,$ as a,qp as at,Ov as b,Ou as bt,by as c,Zp as ct,kv as d,Ep as dt,vi as en,Yp as et,xv as f,Kf as ft,Lv as g,Af as gt,Av as h,kf as ht,Ty as i,$p as it,Y_ as j,$i as jt,X_ as k,ma as kt,Kv as l,Hp as lt,zv as m,Df as mt,nx as n,Gp as nt,xy as o,Bp as ot,Cv as p,Gf as pt,$m as q,Ji as qt,ky as r,Wp as rt,Sy as s,Vp as st,tx as t,gi as tn,Up as tt,Uv as u,Dp as ut,Pv as v,Sf as vt,cv as w,ec as wt,Rv as x,Kl as xt,Bv as y,pf as yt,Cg as z,Gi as zt};