agent-device 0.21.23 → 0.21.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/README.md +6 -6
  2. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.apk → agent-device-android-ime-helper-0.21.25.apk} +0 -0
  3. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  4. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.23.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  7. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  8. package/apple/macos-helper/Sources/AgentDeviceMacOSHelper/SnapshotTraversal.swift +12 -6
  9. package/apple/macos-helper/Tests/AgentDeviceMacOSHelperTests/RectResponseTests.swift +21 -0
  10. package/apple/snapshot-bridge/README.md +9 -7
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandDispatch.swift +56 -0
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+CommandExecution.swift +14 -5
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Lifecycle.swift +8 -0
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Models.swift +12 -0
  20. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  21. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotCaptureTarget.swift +1 -1
  22. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SnapshotExecution.swift +29 -5
  23. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  24. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +35 -13
  25. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  26. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryFocus.swift +19 -5
  27. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +50 -106
  28. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  29. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  30. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  31. package/dist/src/absence-observation-errors.js +1 -0
  32. package/dist/src/adapter.js +1 -1
  33. package/dist/src/adb-executor.js +2 -2
  34. package/dist/src/adb-failure.js +2 -2
  35. package/dist/src/adb.js +1 -1
  36. package/dist/src/agent-browser-lifecycle.js +1 -1
  37. package/dist/src/agent-browser-process-record.js +1 -1
  38. package/dist/src/agent-browser-provider.js +1 -1
  39. package/dist/src/agent-browser-tool.js +1 -1
  40. package/dist/src/agent-device-client.js +2 -2
  41. package/dist/src/alert.js +1 -1
  42. package/dist/src/android-adb.d.ts +3 -2
  43. package/dist/src/android-adb.js +1 -1
  44. package/dist/src/android-input-ownership.js +1 -1
  45. package/dist/src/android-system-surface-disclosure.js +1 -0
  46. package/dist/src/android-text-entry.js +1 -0
  47. package/dist/src/android.js +1 -1
  48. package/dist/src/app-backend.js +1 -1
  49. package/dist/src/app-helpers.js +1 -1
  50. package/dist/src/app-inventory.d.ts +4 -0
  51. package/dist/src/app-launch.js +1 -1
  52. package/dist/src/app-lifecycle.js +4 -3
  53. package/dist/src/app-lifecycle2.js +2 -2
  54. package/dist/src/app-log-files.js +1 -1
  55. package/dist/src/app-log-reconnect.js +1 -1
  56. package/dist/src/app-log-runtime2.js +3 -3
  57. package/dist/src/app-resolution-facade.js +1 -1
  58. package/dist/src/app-resolution.js +2 -2
  59. package/dist/src/app-state-runtime.d.ts +15 -0
  60. package/dist/src/apple-runner-platform.js +1 -1
  61. package/dist/src/application-lifecycle-interaction.js +1 -1
  62. package/dist/src/artifact-download.js +1 -1
  63. package/dist/src/auth.js +1 -1
  64. package/dist/src/aws-device-farm-connection.js +1 -0
  65. package/dist/src/back-mode.js +1 -1
  66. package/dist/src/backend-snapshot-options.js +1 -1
  67. package/dist/src/boot-diagnostics.js +1 -1
  68. package/dist/src/browserstack-connection.js +1 -0
  69. package/dist/src/capture-disclosure.js +1 -0
  70. package/dist/src/cli-config.js +1 -1
  71. package/dist/src/cli-help.js +36 -17
  72. package/dist/src/cli-output.js +1 -1
  73. package/dist/src/cli-runner.js +3 -1
  74. package/dist/src/cli.js +3 -4
  75. package/dist/src/client-companion-tunnel.js +1 -0
  76. package/dist/src/client-metro.js +1 -1
  77. package/dist/src/client-types.d.ts +15 -7
  78. package/dist/src/cloud-artifacts.d.ts +3 -2
  79. package/dist/src/code-signature-cache.js +1 -1
  80. package/dist/src/code-signature.js +1 -1
  81. package/dist/src/command-metadata.js +73 -1
  82. package/dist/src/command-policy.js +1 -0
  83. package/dist/src/command-schema.js +3 -3
  84. package/dist/src/command-surface.js +1 -1
  85. package/dist/src/command-tools.js +2 -2
  86. package/dist/src/connection-runtime.js +1 -1
  87. package/dist/src/connection-verification.js +1 -0
  88. package/dist/src/connection.js +5 -5
  89. package/dist/src/contracts.d.ts +1 -1
  90. package/dist/src/contracts.js +1 -1
  91. package/dist/src/daemon-client-lease-beat.js +1 -1
  92. package/dist/src/daemon-client-lifecycle.js +1 -1
  93. package/dist/src/daemon-client-liveness-probe.js +1 -1
  94. package/dist/src/daemon-policy-file.js +1 -1
  95. package/dist/src/daemon-registration-owner.js +1 -1
  96. package/dist/src/daemon-registration.js +1 -1
  97. package/dist/src/daemon-resolution.js +3 -1
  98. package/dist/src/debug-symbols-facade.js +1 -1
  99. package/dist/src/device-claim-inspection.js +1 -1
  100. package/dist/src/device-input-state.d.ts +6 -17
  101. package/dist/src/device-inventory-context.js +1 -1
  102. package/dist/src/device-readiness-runtime.js +1 -1
  103. package/dist/src/device-release.js +1 -1
  104. package/dist/src/device-selection-resolver.js +1 -1
  105. package/dist/src/device-shell.js +1 -1
  106. package/dist/src/device.js +3 -1
  107. package/dist/src/devicectl.js +1 -1
  108. package/dist/src/diagnostics.js +1 -1
  109. package/dist/src/doctor-facade.js +1 -1
  110. package/dist/src/durable-capture-resource.js +1 -1
  111. package/dist/src/durable-resource.js +1 -1
  112. package/dist/src/engine-eval-script.js +1 -1
  113. package/dist/src/error.js +1 -1
  114. package/dist/src/exec.js +1 -1
  115. package/dist/src/expo-dev-client-launch.js +1 -0
  116. package/dist/src/file.js +3 -1
  117. package/dist/src/find.js +1 -1
  118. package/dist/src/finders.js +1 -1
  119. package/dist/src/generic-settle.js +1 -1
  120. package/dist/src/generic.js +1 -1
  121. package/dist/src/gesture-admission.js +1 -1
  122. package/dist/src/gesture-plan-types.d.ts +2 -5
  123. package/dist/src/gesture-plan.js +1 -1
  124. package/dist/src/gesture-runtime.js +1 -1
  125. package/dist/src/harmonyos.js +1 -1
  126. package/dist/src/hdc.js +1 -1
  127. package/dist/src/helper.js +2 -2
  128. package/dist/src/human-control.js +1 -1
  129. package/dist/src/ime-rebind.js +1 -1
  130. package/dist/src/ime-state.js +1 -1
  131. package/dist/src/index.d.ts +4 -4
  132. package/dist/src/index.js +1 -1
  133. package/dist/src/input-actions.js +1 -1
  134. package/dist/src/input-actions2.js +2 -2
  135. package/dist/src/install-source-network-transport.js +1 -1
  136. package/dist/src/install-source2.js +1 -1
  137. package/dist/src/interaction-error.js +1 -0
  138. package/dist/src/interaction-positionals.js +1 -1
  139. package/dist/src/interaction.js +1 -1
  140. package/dist/src/interaction2.js +1 -1
  141. package/dist/src/interactor-operation-catalog.js +1 -1
  142. package/dist/src/interactor.js +5 -5
  143. package/dist/src/interactor2.js +1 -1
  144. package/dist/src/interactors.js +1 -1
  145. package/dist/src/internal/bin.js +1 -1
  146. package/dist/src/internal/daemon.js +5 -1
  147. package/dist/src/internal/png-worker.js +1 -1
  148. package/dist/src/inventory.js +2 -2
  149. package/dist/src/inventory2.js +1 -1
  150. package/dist/src/inventory6.js +1 -1
  151. package/dist/src/io.d.ts +2 -2
  152. package/dist/src/ios-client.js +1 -1
  153. package/dist/src/ios-settings.js +1 -1
  154. package/dist/src/ios-snapshot-acquisition.js +1 -1
  155. package/dist/src/ios-snapshot-adapter.js +1 -1
  156. package/dist/src/ios-snapshot-engine.js +1 -1
  157. package/dist/src/ios-snapshot-runtime.js +1 -1
  158. package/dist/src/keyed-lock.js +1 -1
  159. package/dist/src/launch-confirmation.js +1 -1
  160. package/dist/src/lease.js +1 -1
  161. package/dist/src/limrun-runtime-dependencies.js +1 -1
  162. package/dist/src/limrun.d.ts +5 -564
  163. package/dist/src/limrun.js +1 -1
  164. package/dist/src/linux.js +1 -1
  165. package/dist/src/load.js +1 -1
  166. package/dist/src/local-interactor-operation-set.js +1 -1
  167. package/dist/src/log-stream.js +9 -9
  168. package/dist/src/mechanics.js +16 -16
  169. package/dist/src/metro.js +1 -1
  170. package/dist/src/metro2.js +1 -1
  171. package/dist/src/mobile-snapshot-semantics.js +1 -1
  172. package/dist/src/observability.js +1 -1
  173. package/dist/src/observation.js +1 -2
  174. package/dist/src/open-target-resolution.js +1 -1
  175. package/dist/src/output-path.js +1 -1
  176. package/dist/src/overlay.js +1 -3
  177. package/dist/src/perf-facade.js +1 -1
  178. package/dist/src/perf-runtime-operation-builder.js +1 -1
  179. package/dist/src/perf-runtime.js +1 -1
  180. package/dist/src/perf-target.js +1 -1
  181. package/dist/src/physical-device-control.js +1 -1
  182. package/dist/src/platform-request-scope.js +1 -1
  183. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  184. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  185. package/dist/src/platform-runtime-apple-resources.js +1 -0
  186. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  187. package/dist/src/platform-runtime-daemon-services.js +1 -0
  188. package/dist/src/platform-runtime-host.js +1 -1
  189. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  190. package/dist/src/platform-runtime-open-target.js +1 -1
  191. package/dist/src/platform-runtime-operation-host.js +4 -4
  192. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  193. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  194. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  195. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  196. package/dist/src/platform-runtime-screen-recording-finalizer-host.js +1 -1
  197. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  198. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  199. package/dist/src/platform-runtime-unavailable.js +1 -1
  200. package/dist/src/platform-runtime.js +1 -1
  201. package/dist/src/platform-runtime2.js +1 -1
  202. package/dist/src/plugin.js +1 -0
  203. package/dist/src/plugins/webdriver.d.ts +111 -0
  204. package/dist/src/plugins/webdriver.js +1 -0
  205. package/dist/src/plugins.d.ts +2 -1
  206. package/dist/src/plugins2.js +1 -1
  207. package/dist/src/png-crop-bytes.js +1 -1
  208. package/dist/src/png-resize.js +1 -0
  209. package/dist/src/png-worker-client.js +1 -1
  210. package/dist/src/png-worker-contract.js +1 -1
  211. package/dist/src/process-entry.js +1 -1
  212. package/dist/src/process-exit.js +1 -1
  213. package/dist/src/process.js +1 -1
  214. package/dist/src/provider-credential-fingerprint.js +1 -1
  215. package/dist/src/provider-device-admission.js +1 -1
  216. package/dist/src/provider-device-runtime.d.ts +556 -0
  217. package/dist/src/provider-policy.js +1 -0
  218. package/dist/src/provider-profile-fields.js +1 -1
  219. package/dist/src/provider-webdriver.js +1 -2
  220. package/dist/src/proxy.js +2 -2
  221. package/dist/src/quality-warnings.js +1 -1
  222. package/dist/src/react-devtools.js +2 -0
  223. package/dist/src/react-native-overlay2.js +3 -0
  224. package/dist/src/react-native.js +1 -1
  225. package/dist/src/record-runtime.js +1 -1
  226. package/dist/src/record-trace.js +1 -1
  227. package/dist/src/recording.js +2 -2
  228. package/dist/src/register-builtins.js +1 -1
  229. package/dist/src/remote-bridge.js +1 -0
  230. package/dist/src/remote-config-core.js +1 -0
  231. package/dist/src/remote-config.js +1 -1
  232. package/dist/src/remote-config2.js +1 -1
  233. package/dist/src/replay-backend-registry.js +1 -0
  234. package/dist/src/replay-divergence.js +1 -1
  235. package/dist/src/replay-maestro-backend.js +117 -0
  236. package/dist/src/replay-script-selection.js +1 -0
  237. package/dist/src/replay.js +1 -3
  238. package/dist/src/replay2.js +1 -0
  239. package/dist/src/reporting.js +3 -3
  240. package/dist/src/request-cancel.js +1 -1
  241. package/dist/src/request-providers.js +1 -1
  242. package/dist/src/request-runtime-binding.js +1 -1
  243. package/dist/src/result-serialization.js +1 -1
  244. package/dist/src/retry.js +1 -1
  245. package/dist/src/retry2.js +1 -0
  246. package/dist/src/runner-artifact-manifest.js +1 -1
  247. package/dist/src/runner-cache-retention.js +1 -0
  248. package/dist/src/runner-cache-trim.js +1 -0
  249. package/dist/src/runner-client.js +1 -1
  250. package/dist/src/runner-dev-tools-security.js +1 -1
  251. package/dist/src/runner-device-readiness.js +1 -1
  252. package/dist/src/runner-device-set.js +1 -0
  253. package/dist/src/runner-error-classification.js +3 -3
  254. package/dist/src/runner-exchange.js +1 -1
  255. package/dist/src/runner-lease.js +1 -0
  256. package/dist/src/runner-operations-facade.js +1 -1
  257. package/dist/src/runner-retention.js +1 -0
  258. package/dist/src/runner-start-budget.js +1 -1
  259. package/dist/src/runner-startup-transport.js +1 -0
  260. package/dist/src/runner-toolchain-probe.js +2 -0
  261. package/dist/src/runner.js +2 -1
  262. package/dist/src/runtime-command-surface.js +1 -0
  263. package/dist/src/runtime-deployment.js +1 -0
  264. package/dist/src/runtime-factory.js +1 -0
  265. package/dist/src/runtime-session.js +1 -0
  266. package/dist/src/runtime-transport-hints.js +1 -1
  267. package/dist/src/runtime.js +2 -1
  268. package/dist/src/runtime10.js +2 -2
  269. package/dist/src/runtime2.js +4 -4
  270. package/dist/src/runtime3.js +1 -1
  271. package/dist/src/runtime4.js +5 -5
  272. package/dist/src/runtime5.js +1 -1
  273. package/dist/src/runtime6.js +1 -1
  274. package/dist/src/runtime7.js +1 -1
  275. package/dist/src/runtime8.js +1 -1
  276. package/dist/src/runtime9.js +1 -1
  277. package/dist/src/screen-recording-transport.js +1 -1
  278. package/dist/src/screenshot-density.js +1 -1
  279. package/dist/src/screenshot-image.js +1 -1
  280. package/dist/src/screenshot-runtime.js +1 -1
  281. package/dist/src/screenshot3.js +5 -5
  282. package/dist/src/sdk-batch-runner.js +2 -2
  283. package/dist/src/sdk-batch.js +2 -2
  284. package/dist/src/sdk-contracts.d.ts +20 -29
  285. package/dist/src/sdk-contracts.js +2 -2
  286. package/dist/src/sdk-device.js +1 -1
  287. package/dist/src/sdk-finders.d.ts +1 -1
  288. package/dist/src/sdk-finders.js +1 -1
  289. package/dist/src/sdk-io.d.ts +4 -2
  290. package/dist/src/sdk-remote-config.d.ts +4 -0
  291. package/dist/src/sdk-remote-config.js +1 -1
  292. package/dist/src/sdk-selectors.d.ts +5 -6
  293. package/dist/src/sdk-selectors.js +1 -1
  294. package/dist/src/selection.js +0 -0
  295. package/dist/src/selector-pipeline-policy.js +1 -1
  296. package/dist/src/selector-runtime.js +1 -1
  297. package/dist/src/selectors.js +1 -1
  298. package/dist/src/server.js +2 -2
  299. package/dist/src/session-allocation.js +1 -1
  300. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  301. package/dist/src/session-runtime-admission.js +1 -1
  302. package/dist/src/session.js +1 -1
  303. package/dist/src/session2.js +5 -5
  304. package/dist/src/settings.js +1 -1
  305. package/dist/src/settings2.js +1 -1
  306. package/dist/src/simctl-settings.js +1 -1
  307. package/dist/src/simctl.js +1 -1
  308. package/dist/src/simulator-boot.js +1 -1
  309. package/dist/src/simulator-state.js +1 -1
  310. package/dist/src/simulator.js +1 -1
  311. package/dist/src/snapshot-capture-annotations.js +1 -1
  312. package/dist/src/snapshot-chrome.js +1 -0
  313. package/dist/src/snapshot-desktop-projection.js +1 -1
  314. package/dist/src/snapshot-evidence.js +1 -0
  315. package/dist/src/snapshot-node-lookup.js +1 -0
  316. package/dist/src/snapshot-occlusion.js +1 -0
  317. package/dist/src/snapshot-quality-verdict.js +1 -0
  318. package/dist/src/snapshot-runtime-binding.js +1 -1
  319. package/dist/src/snapshot-runtime.js +1 -1
  320. package/dist/src/snapshot-state.js +1 -1
  321. package/dist/src/snapshot.js +1 -1
  322. package/dist/src/snapshot2.js +1 -1
  323. package/dist/src/snapshot3.js +1 -1
  324. package/dist/src/src.js +5 -1
  325. package/dist/src/src2.js +1 -1
  326. package/dist/src/src3.js +2 -1
  327. package/dist/src/store.js +1 -1
  328. package/dist/src/surface-snapshot2.js +1 -1
  329. package/dist/src/target-evidence-tree.js +1 -0
  330. package/dist/src/target-evidence.js +1 -1
  331. package/dist/src/text-entry-focus.js +1 -1
  332. package/dist/src/tool-provider2.js +1 -1
  333. package/dist/src/touch-runtime.js +1 -1
  334. package/dist/src/touch-runtime2.js +1 -1
  335. package/dist/src/tree.js +1 -1
  336. package/dist/src/tv-remote.js +1 -1
  337. package/dist/src/type-text-runtime.js +1 -1
  338. package/dist/src/undici.js +8 -8
  339. package/dist/src/update-check.js +1 -1
  340. package/dist/src/vars.js +1 -1
  341. package/dist/src/version.js +1 -1
  342. package/dist/src/video.js +2 -2
  343. package/dist/src/wait.js +1 -0
  344. package/dist/src/web.js +1 -1
  345. package/dist/src/web2.js +1 -1
  346. package/package.json +22 -19
  347. package/server.json +2 -2
  348. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.23.apk.sha256 +0 -1
  349. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk +0 -0
  350. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.apk.sha256 +0 -1
  351. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.23.manifest.json +0 -16
  352. package/dist/src/adb-transport.js +0 -1
  353. package/dist/src/alert-runtime.js +0 -1
  354. package/dist/src/app-deployment-resolution.js +0 -2
  355. package/dist/src/app-inventory-contract.js +0 -1
  356. package/dist/src/app-log-session-resource.js +0 -1
  357. package/dist/src/application-lifecycle-runtime.js +0 -1
  358. package/dist/src/auth-session.js +0 -1
  359. package/dist/src/cache.js +0 -1
  360. package/dist/src/capabilities.js +0 -1
  361. package/dist/src/capture.js +0 -1
  362. package/dist/src/catalog.js +0 -1
  363. package/dist/src/click-button.js +0 -1
  364. package/dist/src/client-metro-companion.js +0 -1
  365. package/dist/src/client-options.js +0 -3
  366. package/dist/src/compatibility-policy.js +0 -1
  367. package/dist/src/daemon-artifacts.js +0 -1
  368. package/dist/src/daemon-client-transport.js +0 -1
  369. package/dist/src/daemon-http.js +0 -1
  370. package/dist/src/device-claim-rule.js +0 -1
  371. package/dist/src/device-rotation.js +0 -1
  372. package/dist/src/device-session.js +0 -3
  373. package/dist/src/device2.js +0 -1
  374. package/dist/src/device3.js +0 -3
  375. package/dist/src/dispatch-resolve.js +0 -4
  376. package/dist/src/format.js +0 -1
  377. package/dist/src/gesture-plan-types.js +0 -1
  378. package/dist/src/host.js +0 -1
  379. package/dist/src/human-control-contract.js +0 -1
  380. package/dist/src/interaction-ref-policy.js +0 -1
  381. package/dist/src/interactor-operation-binding.js +0 -1
  382. package/dist/src/keyboard-actions.js +0 -1
  383. package/dist/src/lease-context.js +0 -1
  384. package/dist/src/lease-registry-scope.js +0 -1
  385. package/dist/src/lease-scope.js +0 -1
  386. package/dist/src/managed-device-scope.js +0 -1
  387. package/dist/src/observe-until.js +0 -1
  388. package/dist/src/output-common.js +0 -5
  389. package/dist/src/owner-identity.js +0 -3
  390. package/dist/src/path-resolution.js +0 -1
  391. package/dist/src/perf-runtime-plan.js +0 -1
  392. package/dist/src/platform-runtime-app-log-process.js +0 -1
  393. package/dist/src/platform-runtime-managed-owner.js +0 -1
  394. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  395. package/dist/src/png.js +0 -1
  396. package/dist/src/prepare-kind.js +0 -1
  397. package/dist/src/provider-device-runtimes.js +0 -1
  398. package/dist/src/provider-session-ownership.js +0 -2
  399. package/dist/src/providers.js +0 -1
  400. package/dist/src/registry.js +0 -68
  401. package/dist/src/request-admission.js +0 -1
  402. package/dist/src/request-cancellation.js +0 -1
  403. package/dist/src/request-progress-protocol.js +0 -1
  404. package/dist/src/runner-cache-metadata.js +0 -3
  405. package/dist/src/runner-disposal.js +0 -1
  406. package/dist/src/runner-session-types.js +0 -1
  407. package/dist/src/runtime-admission.js +0 -1
  408. package/dist/src/screen-recording-admission-ledger.js +0 -1
  409. package/dist/src/screen-recording-resource-recovery.js +0 -1
  410. package/dist/src/screenshot-result.js +0 -1
  411. package/dist/src/script.js +0 -1
  412. package/dist/src/scroll-command.js +0 -1
  413. package/dist/src/scroll-gesture.js +0 -1
  414. package/dist/src/scroll-indicator.js +0 -1
  415. package/dist/src/session-artifact-paths.js +0 -1
  416. package/dist/src/session-paths.js +0 -1
  417. package/dist/src/session-repair-tombstone.js +0 -1
  418. package/dist/src/session-routing.js +0 -1
  419. package/dist/src/session-snapshot.js +0 -1
  420. package/dist/src/snapshot4.js +0 -1
  421. package/dist/src/src4.js +0 -1
  422. package/dist/src/src5.js +0 -1
  423. package/dist/src/src6.js +0 -1
  424. package/dist/src/src7.js +0 -2
  425. package/dist/src/src8.js +0 -115
  426. package/dist/src/string-enum.js +0 -1
  427. package/dist/src/success-text.js +0 -1
  428. package/dist/src/timeouts.js +0 -1
  429. package/dist/src/touch-reference-frame.js +0 -1
  430. package/dist/src/transport.js +0 -3
  431. package/dist/src/ttl-memo.js +0 -1
  432. package/dist/src/verified-file.js +0 -1
  433. package/dist/src/viewport.js +0 -1
  434. package/dist/src/window-state.js +0 -1
  435. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
package/dist/src/cli.js CHANGED
@@ -1,5 +1,4 @@
1
- import{F as e,J as t,P as n,nt as r}from"./sdk-contracts.js";import{t as i}from"./capture.js";import{d as a,f as o,s,u as c}from"./sdk-batch-runner.js";import{a as l,i as u,l as d,n as f,o as p,r as m}from"./diagnostics.js";import"./diagnostics2.js";import{n as h,r as g}from"./agent-device-client.js";import{s as ee,t as te,u as ne}from"./sdk-batch.js";import{i as re,r as _,t as v}from"./catalog.js";import{n as y,r as b}from"./back-mode.js";import{L as ie}from"./registry.js";import{p as ae}from"./exec.js";import{n as oe}from"./command-metadata.js";import"./command.js";import{t as se}from"./session-artifact-paths.js";import{a as ce}from"./version.js";import{t as le}from"./daemon-resolution.js";import{r as x,t as ue}from"./command-schema.js";import{i as S,r as C,t as de}from"./cli-config.js";import{t as fe}from"./update-check.js";import{n as pe,r as me,t as he}from"./cli-command-aliases.js";import{exitAfterFlush as w}from"./process-exit.js";import{A as ge,D as _e,M as ve,f as ye,h as be,j as xe,k as Se,r as Ce}from"./connection-runtime.js";import{i as we}from"./auth-session.js";import T from"node:fs";import{pathToFileURL as Te}from"node:url";const E=`open <app> --relaunch`,Ee={start:{command:`open`,example:E},restart:{command:`open`,example:E},touch:{command:`press`,example:`press`},input:{command:`fill`,example:`fill`},settext:{command:`fill`,example:`fill`},entertext:{command:`fill`,example:`fill`},screencap:{command:`screenshot`,example:`screenshot`},capture:{command:`screenshot`,example:`screenshot`},dismiss:{command:`keyboard`,example:`keyboard dismiss`},"get-text":{command:`get`,example:`get text`},gettext:{command:`get`,example:`get text`},get_text:{command:`get`,example:`get text`},"open-url":{command:`open`,example:`open <url>`},"close-session":{command:`close`,example:`close`}};function D(e){if(e.length<=2)return[];let t=re(),n=t.filter(t=>t.startsWith(e));return n.length>0?n.sort(O).slice(0,3):k(e,t)}function O(e,t){return e.length-t.length||e.localeCompare(t)}function k(e,t){let n=t.map(t=>({name:t,distance:Oe(e,t)})).filter(t=>t.distance<=De(e));if(n.length===0)return[];let r=Math.min(...n.map(e=>e.distance));return n.filter(e=>e.distance===r).sort((e,t)=>e.name.localeCompare(t.name)).slice(0,3).map(e=>e.name)}function De(e){return e.length<4?1:e.length<=6?2:3}function Oe(e,t){return e===t?0:e.startsWith(t)||t.startsWith(e)?Math.abs(e.length-t.length):ke(e,t)}function ke(e,t){let n=e.length+1,r=t.length+1,i=Array.from({length:n},()=>Array(r).fill(0));for(let e=0;e<n;e+=1)i[e][0]=e;for(let e=0;e<r;e+=1)i[0][e]=e;for(let a=1;a<n;a+=1)for(let n=1;n<r;n+=1){let r=e[a-1]===t[n-1]?0:1;i[a][n]=Math.min(i[a-1][n]+1,i[a][n-1]+1,i[a-1][n-1]+r)}return i[n-1][r-1]}function A(e){let t=e.toLowerCase(),n=Ee[t]?.example;if(n)return n;let r=D(t);if(r.length!==0)return r.length===1?r[0]:`one of: ${r.join(`, `)}`}const Ae=new Set([`--bundle-id`,`--bundleid`,`--bundle`,`--package`,`--package-name`,`--packagename`,`--app-id`,`--appid`,`--pkg`]),je=new Set([`--session-locked`,`--session-lock-conflicts`]),Me={"--output":`--out`,"--path":`--out`};function Ne(e,t){let n=e.toLowerCase(),r=Me[n];if(r&&Pe(r,t))return r;let i=Fe(n,t);if(i.length!==0)return i.length===1?i[0]:`one of: ${i.join(`, `)}`}function Pe(e,t){let n=b().find(t=>t.names.includes(e));return n?S(n.key,t):!1}function Fe(e,t){let n=j(e);if(n.length<=2)return[];let r=Ie(t),i=r.filter(e=>j(e).startsWith(n));return i.length>0?i.sort(O).slice(0,3):k(n,r.map(e=>j(e))).map(e=>`--${e}`)}function Ie(e){let t=new Set;for(let n of b()){if(!S(n.key,e))continue;let r=n.names[0];r&&t.add(r)}return[...t]}function j(e){return e.replace(/^--?/,``)}function Le(e,t){let n=e.toLowerCase();if(Ae.has(n))return`Unknown flag: ${e}. The app or bundle id is a positional argument, e.g. ${E}.`;if(je.has(n))return`Unknown flag: ${e}. Use --session-lock reject|strip instead.`;if(n===i.cliToken)return`Unknown flag: ${e}. ${i.migration.screenshot}. ${i.migration.record}.`;let r=Ne(e,t);return r?`Unknown flag: ${e}. Did you mean ${r}?`:`Unknown flag: ${e}`}function M(e){let t={json:!1,help:!1,version:!1},r=null,i=null,a=[],o=[],s=[],c=!0;for(let o=0;o<e.length;o+=1){let l=e[o];if(c&&l===`--`){c=!1;continue}if(!c){r?a.push(l):(i=l,r=L(l));continue}if(Ve(r)){a.push(l);continue}let u=l.startsWith(`--`),d=l.startsWith(`-`)&&l.length>1;if(!u&&!d){r?a.push(l):(i=l,r=L(l));continue}let[f,p]=u?N(l):[l,void 0];if(ze(r,f))continue;let m=He(f,r);if(Be(r,m)){a.push(l);continue}if(!m){if(qe(r,a,l)){r?a.push(l):r=l;continue}throw new n(`INVALID_ARGS`,Le(f,r))}let h=Ge(m,f,p,e[o+1]);h.consumeNext&&(o+=1);let g=t[m.key];if(m.multiple){let e=Array.isArray(g)?[...g,h.value]:g===void 0?[h.value]:[g,h.value];t[m.key]=e}else t[m.key]=h.value;s.push({key:m.key,token:f})}return Re(i,t),{command:r,positionals:a,flags:t,warnings:o,providedFlags:s}}function Re(e,t){if(e)for(let n of he(e)?.impliedFlags??[])t[n]=!0}function ze(e,t){return t===`-c`&&(e===`snapshot`||e===`diff`)}function Be(e,t){return e===`react-devtools`?!t||!S(t.key,e):!1}function Ve(e){return e===`cdp`}function He(e,t){let n=b().filter(t=>t.names.includes(e));if(n.length<=1)return n[0]??y(e);if(t){let e=n.find(e=>S(e.key,t));if(e)return e}return y(e)}function Ue(e,t){let r=t?.strictFlags??!0,i=[...e.warnings],a=C({json:!1,help:!1,version:!1},t?.defaultFlags??{});if(C(a,e.flags),e.command&&!_(e.command)&&!a.help){let t=A(e.command),r=t?`Unknown command: ${e.command}. Did you mean ${t}?`:`Unknown command: ${e.command}`;throw new n(`INVALID_ARGS`,r)}let o=e.providedFlags.filter(t=>!S(t.key,e.command));if(o.length>0){let t=o.map(e=>e.token),s=$e(e.command,t);if(r)throw new n(`INVALID_ARGS`,s);i.push(s);for(let e of o)delete a[e.key]}let s=Ze(e);if(s.length>0){let t=Qe(e.command,e.positionals[0],s);if(r)throw new n(`INVALID_ARGS`,t);i.push(t);for(let e of s)delete a[e.key]}for(let t of Object.keys(a))a[t]!==void 0&&(S(t,e.command)||delete a[t]);Xe(e,a),We(e),ne(e.command,a);let c=Ye({command:e.command,positionals:e.positionals,flags:a,warnings:i});if(ue(c.command,c.positionals),c.command===`batch`&&+!!a.steps+ +!!a.stepsFile!=1)throw new n(`INVALID_ARGS`,`batch requires exactly one step source: --steps or --steps-file.`);return c}function We(e){if(e.command!==`back`)return;let t=e.providedFlags.filter(e=>e.key===`backMode`);if(!(new Set(t.map(e=>e.token)).size<=1))throw new n(`INVALID_ARGS`,`back accepts only one explicit mode flag: use either --in-app or --system.`)}function N(e){let t=e.indexOf(`=`);return t===-1?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function Ge(e,t,r,i){if(e.setValue!==void 0){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if(e.type===`boolean`){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if(e.type===`booleanOrString`){if(r!==void 0){if(r.trim().length===0)throw new n(`INVALID_ARGS`,`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return i===void 0||F(i)?{value:!0,consumeNext:!1}:Ke(i)?{value:i,consumeNext:!0}:{value:!0,consumeNext:!1}}let a=r??i;if(a===void 0||r===void 0&&F(a))throw new n(`INVALID_ARGS`,`Flag ${t} requires a value.`);if(e.type===`string`)return{value:a,consumeNext:r===void 0};if(e.type===`enum`){if(!e.enumValues?.includes(a))throw new n(`INVALID_ARGS`,`Invalid ${P(t)}: ${a}`);return{value:a,consumeNext:r===void 0}}let o=Number(a);if(!Number.isFinite(o)||typeof e.min==`number`&&o<e.min||typeof e.max==`number`&&o>e.max)throw new n(`INVALID_ARGS`,`Invalid ${P(t)}: ${a}`);return{value:e.type===`int`?Math.floor(o):o,consumeNext:r===void 0}}function P(e){return e.replace(/^-+/,``)}function F(e){if(!e.startsWith(`-`)||e===`-`)return!1;let[t]=e.startsWith(`--`)?N(e):[e,void 0];return y(t)!==void 0}function Ke(e){let t=e.trim();return!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t)?!1:!!(t.startsWith(`./`)||t.startsWith(`../`)||t.startsWith(`~/`)||t.startsWith(`/`)||t.includes(`/`)||t.includes(`\\`))}function qe(e,t,n){if(!Je(n)||!e)return!1;let r=x(e);if(!r||r.allowsExtraPositionals)return!0;let i=r.positionalArgs??[];return i.length===0?!1:t.length<i.length||i.some(e=>e.includes(`?`))}function Je(e){return/^-\d+(\.\d+)?$/.test(e)}function Ye(e){if(e.flags.help)return e;if(e.command===`snapshot`&&e.flags.snapshotDiff){let{snapshotDiff:t,...n}=e.flags;return{command:`diff`,positionals:[`snapshot`,...e.positionals],flags:n,warnings:e.warnings}}return e}function Xe(e,t){let n=x(e.command)?.explicitOnlyFlags;if(n===void 0)return;let r=new Set(e.providedFlags.map(e=>e.key));for(let e of n)r.has(e)||delete t[e]}function Ze(e){let t=x(e.command)?.flagsByAction,n=e.positionals[0];if(t===void 0||n===void 0||!Object.hasOwn(t,n))return[];let r=t[n];if(r===void 0)return[];let i=new Set(Object.values(t).flat());return e.providedFlags.filter(e=>i.has(e.key)&&!r.includes(e.key))}function Qe(e,t,n){return`${e} ${t} does not read ${n.map(e=>e.token).join(`, `)}. Run \`${e} ${t} --help\` for the options it reads.`}function $e(e,t){return e?t.length===1?`Flag ${t[0]} is not supported for command ${e}.`:`Flags ${t.join(`, `)} are not supported for command ${e}.`:t.length===1?`Flag ${t[0]} requires a command that supports it.`:`Flags ${t.join(`, `)} require a command that supports them.`}async function I(){let{buildUsageText:e}=await import(`./cli-help.js`).then(e=>e.n);return e()}async function et(e){let{buildCommandUsageText:t}=await import(`./cli-help.js`).then(e=>e.n);return t(L(e))}function L(e){let t=me(e);if(t)throw new n(`INVALID_ARGS`,t);return pe(e)}function tt(){return{renderedToStderr:!1}}function nt(e){return t=>{t.type===`command`&&(e.renderedToStderr=!0,process.stderr.write(`${t.message}\n`))}}function rt(e){return oe(e)}const it={connect:async()=>(await import(`./connection.js`)).connectCommand,disconnect:async()=>(await import(`./connection.js`)).disconnectCommand,connection:async()=>(await import(`./connection.js`)).connectionCommand,auth:async()=>(await import(`./auth.js`)).authCommand,plugins:async()=>(await import(`./plugins2.js`)).pluginsCommand,daemon:async()=>(await import(`./daemon.js`)).daemonCommand,device:async()=>(await import(`./device3.js`)).deviceCommand,proxy:async()=>(await import(`./proxy.js`)).proxyCommand,takeover:async()=>(await import(`./takeover.js`)).takeoverCommand,replay:async()=>(await import(`./replay.js`)).replayCommand,screenshot:async()=>(await import(`./screenshot3.js`)).screenshotCommand,diff:async()=>(await import(`./screenshot3.js`)).diffCommand,record:async()=>(await import(`./recording.js`)).recordingCommand};async function R(e){let t={...e.flags},n=it[e.command];return n&&await(await n())({...e,flags:t})?!0:rt(e.command)?await at({...e,command:e.command,flags:t}):!1}async function at(e){let{runGenericClientBackedCommand:t}=await import(`./generic.js`);return await t(e)}function ot(e){return[`exec`,`--yes`,`--package`,`agent-react-devtools@0.5.0`,`--`,`agent-react-devtools`,...e]}function st(e){return e===`ios-instance`}function ct(e){return e[0]===`wait`&&e.includes(`--connected`)}function lt(e,t,n){n===0||!ct(e)||!st(t?.leaseBackend)||process.stderr.write([`Hint: Remote iOS React DevTools connects during JavaScript startup.`,"If the app was already open before `agent-device react-devtools start`, relaunch it with `agent-device open <bundle-id> --platform ios --relaunch`, then retry `agent-device react-devtools wait --connected`.",``].join(`
2
- `))}function z(e,t,n){return n||(e.push(t),``)}function ut(e){if(!e?.metroProxyBaseUrl||!ge(e.leaseBackend))return null;let t=[],r={serverBaseUrl:z(t,`metroProxyBaseUrl`,e.metroProxyBaseUrl),bearerToken:z(t,`metroBearerToken`,e.metroBearerToken),tenantId:z(t,`tenant`,e.tenant),runId:z(t,`runId`,e.runId),leaseId:z(t,`leaseId`,e.leaseId)};if(t.length>0)throw new n(`INVALID_ARGS`,`react-devtools remote bridge requires ${t.join(`, `)}.`,{missing:t});return r}async function dt(e,t,n){let{flags:r}=t,i=ut(r);if(!i)return n();let a=t.stateDir??process.cwd(),o=t.session??r?.session??`default`,s=r?.remoteConfig??`${i.tenantId}:${i.runId}:${i.leaseId}`;if(e[0]===`stop`)try{return await n()}finally{await ve({projectRoot:t.cwd??process.cwd(),stateDir:a,profileKey:s,consumerKey:o})}return await xe({projectRoot:t.cwd??process.cwd(),stateDir:a,serverBaseUrl:i.serverBaseUrl,bearerToken:i.bearerToken,bridgeScope:{tenantId:i.tenantId,runId:i.runId,leaseId:i.leaseId},session:o,profileKey:s,consumerKey:o,env:t.env??process.env}),await n()}function ft(e,t){if(e[0]!==`start`)return!1;let{flags:n}=t;return n?ye(n.leaseProvider).supportsDirectPortReverse&&n.leaseBackend===`android-instance`&&n.metroProxyBaseUrl===void 0&&t.configureDirectPortReverse!==void 0:!1}async function pt(e,t={}){let n=t.cwd??process.cwd(),r=t.env??process.env,i=await dt(e,t,async()=>(ft(e,t)&&await t.configureDirectPortReverse?.(),(await ae(`npm`,ot(e),{cwd:n,env:r,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode));return lt(e,t.flags,i),i}const B=`${s} Run agent-device help batch for the commands batch accepts and for runnable step examples.`,mt=`${te} Run agent-device help batch for the commands batch accepts and for runnable step examples.`;function ht(e){let t;try{t=JSON.parse(e)}catch{throw new n(`INVALID_ARGS`,`Batch steps must be valid JSON.`)}if(!Array.isArray(t)||t.length===0)throw new n(`INVALID_ARGS`,`Batch steps must be a non-empty JSON array.`);return t.map((e,t)=>gt(e,t+1))}function gt(e,t){let r=o(e,t,B),i=[`positionals`,`flags`].filter(e=>e in r);if(i.length>0){let e=i.map(e=>`"${e}"`).join(`, `);throw new n(`INVALID_ARGS`,`Batch step ${t} uses removed field(s): ${e}. Use {"command":"...","input":{...}}. Example: {"command":"open","input":{"app":"settings","platform":"ios"}}.`,{hint:B})}ie(r,[`command`,`input`,`runtime`],`Batch step ${t}`,B);let s=c(r.runtime,t);return{command:ee(r.command,t,mt),input:a(r,t,B),...s===void 0?{}:{runtime:s}}}function V(e,t={}){let n=H(t),r={...e};return n.defaultPlatform&&r.platform===void 0&&(r.platform=n.defaultPlatform),r}function H(e){let t=e.env??process.env,n=e.inheritedPlatform??e.configuredPlatform??vt(t.AGENT_DEVICE_PLATFORM),r=bt(e.configuredSession??t.AGENT_DEVICE_SESSION);return{defaultPlatform:n,lockPolicy:_t(e.policyOverrides,t,r)}}function _t(e,t,n){let r=e?.sessionLock??yt(t.AGENT_DEVICE_SESSION_LOCK);if(r)return r;if(n)return`reject`}function vt(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(t){if(t===`ios`||t===`android`||t===`apple`)return t;throw new n(`INVALID_ARGS`,`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}function yt(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(t){if(t===`reject`||t===`strip`)return t;throw new n(`INVALID_ARGS`,`Invalid session lock mode: ${e}. Use reject or strip.`)}}function bt(e){return typeof e==`string`&&e.trim().length>0}function xt(e,t){let n=M(e),r=t?.env??process.env,i=t?.cwd??process.cwd(),a=St(n.command)?be({remoteConfig:n.flags.remoteConfig,cwd:i,env:r}):{},o=C(de({command:n.command,cwd:i,cliFlags:n.flags,env:r}),a);return{...Ue(n,{strictFlags:t?.strictFlags,defaultFlags:o}),providedFlags:n.providedFlags}}function St(e){return e!==null}v.runtime;async function Ct(e){let{command:t,request:n,transport:r,transportOptions:i}=e;return await r({...n,command:t},i)}const U=(e,t={})=>import(`./error.js`).then(e=>e.t).then(({printHumanError:n})=>n(e,t)),W=e=>import(`./json.js`).then(({printJson:t})=>t(e)),wt={sendToDaemon:g},Tt=new Set([`launchUrl`,`kind`,`metroBearerToken`,`metroKind`,`metroListenHost`,`metroNoInstallDeps`,`metroNoReuseExisting`,`metroPreparePort`,`metroProbeTimeoutMs`,`metroProjectRoot`,`metroProxyBaseUrl`,`metroPublicBaseUrl`,`metroRuntimeFile`,`metroStartupTimeoutMs`,`metroStatusHost`]),Et=new Set([`connect`,`connection`,`close`,`daemon`,`plugins`,`device`,`disconnect`,`metro`,`proxy`,`session`,`takeover`]);async function G(e,t=wt){let n=f(),r=ce(),i=It(e),a=e.includes(`--json`),o=Jt(e)??process.env.AGENT_DEVICE_SESSION??`default`;await d({session:o,requestId:n,command:e[0],debug:i},async()=>{let{parsed:o,command:s,positionals:c}=await Dt(e,{version:r,jsonRequested:a,debugEnabled:i}),l=Z(s,o.providedFlags),u=await Ot(o,{command:s,positionals:c,requestId:n,debugOutputEnabled:l});K(u.effectiveFlags);let d=null;try{if(s===`react-devtools`){await w(await kt(u,t));return}if(s===`web`){let{runWebCommand:e}=await import(`./web.js`);await w(await e(c,{flags:u.effectiveFlags,stateDir:u.daemonPaths.baseDir}));return}if(fe({command:s,currentVersion:r,stateDir:u.daemonPaths.baseDir,flags:u.effectiveFlags}),await At(u,t),K(u.effectiveFlags),s===`cdp`){await w(await Se(c,{flags:u.effectiveFlags,runtime:u.resolvedRuntime,cwd:process.cwd(),env:process.env}));return}d=jt(u);let e=await Mt(u),n=tt();await Nt(u,h(q(u),{transport:qt({command:s,flags:u.effectiveFlags,replayTestReporterRuntime:e,commandProgress:n,transport:t.sendToDaemon})}),e,n)}catch(e){await Pt(e,u,d)}finally{d&&d()}})}function K(e){e.daemonAuthToken&&p(e.daemonAuthToken)}async function Dt(e,r){let i;try{i=xt(e,{cwd:process.cwd(),env:process.env})}catch(e){m({level:`error`,phase:`cli_parse_failed`,data:{error:e instanceof Error?e.message:String(e)}});let n=t(e,{diagnosticId:l().diagnosticId,logPath:u({force:!0})?.path});return r.jsonRequested?await W({success:!1,error:n}):await U(n,{showDetails:r.debugEnabled}),w(1)}for(let e of i.warnings)process.stderr.write(`Warning: ${e}\n`);if(i.flags.version)return process.stdout.write(`${r.version}\n`),w(0);let a=i.command===`help`,o=i.flags.help;if(a||o){if(a&&i.positionals.length>1)return await U(new n(`INVALID_ARGS`,`help accepts at most one command.`)),w(1);let e=a?i.positionals[0]:i.command;if(!e)return process.stdout.write(`${await I()}\n`),w(0);let t=await et(e);return t?(process.stdout.write(t),w(0)):(await U(new n(`INVALID_ARGS`,X(e))),process.stdout.write(`${await I()}\n`),w(1))}return i.command?{parsed:i,command:i.command,positionals:i.positionals}:(process.stdout.write(`${await I()}\n`),w(1))}async function Ot(n,r){let i=new Set(n.providedFlags.map(e=>e.key));try{let e=H({policyOverrides:n.flags,configuredPlatform:n.flags.platform,configuredSession:n.flags.session}),t=e.lockPolicy?{...n.flags}:V(n.flags,{policyOverrides:n.flags,configuredPlatform:n.flags.platform,configuredSession:n.flags.session}),a=le(t.stateDir),o=t.session??`default`,s=Bt({command:r.command,explicitFlagKeys:i,stateDir:a.baseDir,session:o,remoteConfig:t.remoteConfig,hasResolvedSession:t.session!==void 0}),c=s?Gt(t,s.flags,i):t;return{...r,binding:e,flags:t,daemonPaths:a,sessionName:o,connectionDefaults:s,explicitFlagKeys:i,effectiveFlags:c,resolvedRuntime:s?.runtime,connectionMetadata:s?.connection,parsedBatchSteps:void 0}}catch(i){let a=e(i),o=t(a,{diagnosticId:l().diagnosticId,logPath:u({force:!0})?.path});return n.flags.json?await W({success:!1,error:o}):await U(o,{showDetails:r.debugOutputEnabled}),w(1)}}async function kt(e,t){let{daemonAuthToken:n,...i}=e.effectiveFlags;return await pt(e.positionals,{flags:{...i,leaseProvider:e.connectionDefaults?.connection?.leaseProvider},stateDir:e.daemonPaths.baseDir,session:e.effectiveFlags.session??e.sessionName,cwd:process.cwd(),env:process.env,configureDirectPortReverse:async()=>{let a=await Ct({route:`react-devtools`,command:v.runtime,request:{positionals:[`port-reverse`],flags:{...i,leaseProvider:e.connectionDefaults?.connection?.leaseProvider,devicePort:8097,hostPort:8097,portReverseName:`react-devtools`},session:e.effectiveFlags.session??e.sessionName},transport:t.sendToDaemon,transportOptions:{authToken:n}});a.ok||r(a.error)}})}async function At(e,t){if(e.command===`batch`){if(e.positionals.length>0)throw new n(`INVALID_ARGS`,`batch does not accept positional arguments.`);e.parsedBatchSteps=Rt(e.flags)}if(Ht(e.command)&&(e.effectiveFlags=(await we({command:e.command,flags:e.effectiveFlags,stateDir:e.daemonPaths.baseDir,env:process.env})).flags),e.effectiveFlags.remoteConfig&&Vt(e.command)){let n=h(q(e),{transport:Q(t.sendToDaemon)}),r=await Ce({command:e.command,flags:e.effectiveFlags,client:n,runtime:e.resolvedRuntime,positionals:e.positionals,batchSteps:e.parsedBatchSteps,forceRuntimePrepare:Kt(e.explicitFlagKeys)});e.effectiveFlags=r.flags,e.resolvedRuntime=r.runtime,e.connectionMetadata=r.connection}Ut({command:e.command,flags:e.effectiveFlags,runtime:e.resolvedRuntime,explicitFlagKeys:e.explicitFlagKeys,hadConnectionDefaults:!!e.connectionDefaults})&&process.stderr.write(`Warning: open is using explicit remote daemon or tenant flags without saved Metro runtime hints. React Native apps may launch without bundle/runtime hints; prefer connect --remote-config <path> first or pass --remote-config <path> on this command.
3
- `)}function q(e){let t=e.effectiveFlags,n=e.connectionMetadata;return{session:t.session,requestId:e.requestId,stateDir:t.stateDir,daemonBaseUrl:t.daemonBaseUrl,daemonAuthToken:t.daemonAuthToken,daemonTransport:t.daemonTransport,daemonServerMode:t.daemonServerMode,tenant:t.tenant,sessionIsolation:t.sessionIsolation,runId:t.runId,leaseId:t.leaseId,leaseBackend:t.leaseBackend,leaseProvider:n?.leaseProvider,clientId:n?.clientId,deviceKey:n?.deviceKey,providerApp:t.providerApp,providerOsVersion:t.providerOsVersion,providerProject:t.providerProject,providerBuild:t.providerBuild,providerSessionName:t.providerSessionName,providerDeviceOrientation:t.providerDeviceOrientation,providerGeoLocation:t.providerGeoLocation,providerTimezone:t.providerTimezone,providerAppiumVersion:t.providerAppiumVersion,providerLanguage:t.providerLanguage,providerLocale:t.providerLocale,providerNetworkProfile:t.providerNetworkProfile,providerCustomNetwork:t.providerCustomNetwork,providerNoResignApp:t.providerNoResignApp,awsProjectArn:t.awsProjectArn,awsDeviceArn:t.awsDeviceArn,awsAppArn:t.awsAppArn,awsRegion:t.awsRegion,awsInteractionMode:t.awsInteractionMode,runtime:e.resolvedRuntime,lockPolicy:e.binding.lockPolicy,lockPlatform:e.binding.defaultPlatform,cwd:process.cwd(),debug:e.debugOutputEnabled,cost:t.cost,responseLevel:t.responseLevel}}function jt(e){let t=e.effectiveFlags.daemonBaseUrl;return e.debugOutputEnabled&&!e.effectiveFlags.json&&!t?Yt(e.daemonPaths.logPath):null}async function Mt(e){if(e.command!==`test`)return;let{createReplayTestReporterRuntime:t}=await import(`./reporting.js`);return t({debug:e.debugOutputEnabled,verbose:e.effectiveFlags.verbose,json:e.effectiveFlags.json,reporter:e.effectiveFlags.reporter,reportJunit:e.effectiveFlags.reportJunit})}async function Nt(e,t,r,i){let{command:a,positionals:o,effectiveFlags:s}=e;if(a===`batch`){if(!e.parsedBatchSteps)throw new n(`INVALID_ARGS`,`batch requires --steps or --steps-file.`);let c=e.parsedBatchSteps.map((t,n)=>({...t,input:e.binding.lockPolicy&&e.flags.platform===void 0?{...t.input}:V(t.input,{policyOverrides:s,configuredPlatform:s.platform,configuredSession:s.session,inheritedPlatform:s.platform})}));if(await R({command:a,positionals:o,flags:{...s,batchSteps:c},client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return}else if(a===`runtime`)throw new n(`INVALID_ARGS`,`runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.`);else if(await R({command:a,positionals:o,flags:s,client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return;throw new n(`INVALID_ARGS`,Lt(a))}async function Pt(n,r,i){let a=e(n),o=t(a,{diagnosticId:l().diagnosticId,logPath:u({force:!0})?.path});if(r.command===`close`&&zt(a)){r.effectiveFlags.json&&await W({success:!0,data:{closed:`session`,source:`no-daemon`}});return}r.effectiveFlags.json?await W({success:!1,error:o}):(await U(o,{showDetails:r.debugOutputEnabled}),r.debugOutputEnabled&&Ft(r,o)),i&&i(),await w(1)}const J=64e3;function Ft(e,t){if(!e.effectiveFlags.daemonBaseUrl){Y(`daemon log`,e.daemonPaths.logPath);return}let n=t.diagnosticsRecord;n&&Y(`remote diagnostics`,se(e.daemonPaths.baseDir,n))}function Y(e,t){try{if(T.existsSync(t)){let n=T.readFileSync(t,`utf8`).split(`
1
+ import{r as e}from"./rolldown-runtime.js";import{I as t,P as n,Y as r,d as i,p as a,rt as o}from"./sdk-contracts.js";import{lt as s}from"./tv-remote.js";import{d as c,f as l,s as u,u as d}from"./sdk-batch-runner.js";import{D as f,O as ee,T as p,b as m,mt as h,pt as te,ut as g,x as _}from"./back-mode.js";import{a as v,i as y,l as ne,n as re,o as ie,r as b}from"./diagnostics.js";import"./diagnostics2.js";import{E as ae,T as oe,s as se}from"./sdk-device.js";import{i as ce,n as le}from"./agent-device-client.js";import{s as ue,t as de,u as fe}from"./sdk-batch.js";import{t as pe}from"./sdk-remote-config.js";import{W as me,n as he}from"./command-metadata.js";import{z as ge}from"./file.js";import{p as _e}from"./exec.js";import{i as ve,t as ye}from"./daemon-resolution.js";import"./command.js";import{a as be}from"./version.js";import{n as xe,r as Se}from"./remote-config-core.js";import{r as x,t as Ce}from"./command-schema.js";import{n as S,r as C,t as we}from"./cli-config.js";import{t as Te}from"./update-check.js";import{n as Ee,r as De,t as Oe}from"./cli-command-aliases.js";import{exitAfterFlush as w}from"./process-exit.js";import{t as ke}from"./remote-bridge.js";import T from"node:crypto";import E from"node:fs";import D from"node:path";import{pathToFileURL as Ae}from"node:url";const O=`open <app> --relaunch`,je={start:{command:`open`,example:O},restart:{command:`open`,example:O},touch:{command:`press`,example:`press`},input:{command:`fill`,example:`fill`},settext:{command:`fill`,example:`fill`},entertext:{command:`fill`,example:`fill`},screencap:{command:`screenshot`,example:`screenshot`},capture:{command:`screenshot`,example:`screenshot`},dismiss:{command:`keyboard`,example:`keyboard dismiss`},"get-text":{command:`get`,example:`get text`},gettext:{command:`get`,example:`get text`},get_text:{command:`get`,example:`get text`},"open-url":{command:`open`,example:`open <url>`},"close-session":{command:`close`,example:`close`}};function Me(e){if(e.length<=2)return[];let t=ee(),n=t.filter(t=>t.startsWith(e));return n.length>0?n.sort(Ne).slice(0,3):Pe(e,t)}function Ne(e,t){return e.length-t.length||e.localeCompare(t)}function Pe(e,t){let n=t.map(t=>({name:t,distance:Ie(e,t)})).filter(t=>t.distance<=Fe(e));if(n.length===0)return[];let r=Math.min(...n.map(e=>e.distance));return n.filter(e=>e.distance===r).sort((e,t)=>e.name.localeCompare(t.name)).slice(0,3).map(e=>e.name)}function Fe(e){return e.length<4?1:e.length<=6?2:3}function Ie(e,t){return e===t?0:e.startsWith(t)||t.startsWith(e)?Math.abs(e.length-t.length):Le(e,t)}function Le(e,t){let n=e.length+1,r=t.length+1,i=Array.from({length:n},()=>Array(r).fill(0));for(let e=0;e<n;e+=1)i[e][0]=e;for(let e=0;e<r;e+=1)i[0][e]=e;for(let a=1;a<n;a+=1)for(let n=1;n<r;n+=1){let r=e[a-1]===t[n-1]?0:1;i[a][n]=Math.min(i[a-1][n]+1,i[a][n-1]+1,i[a-1][n-1]+r)}return i[n-1][r-1]}function Re(e){let t=e.toLowerCase(),n=je[t]?.example;if(n)return n;let r=Me(t);if(r.length!==0)return r.length===1?r[0]:`one of: ${r.join(`, `)}`}const ze=new Set([`--bundle-id`,`--bundleid`,`--bundle`,`--package`,`--package-name`,`--packagename`,`--app-id`,`--appid`,`--pkg`]),Be=new Set([`--session-locked`,`--session-lock-conflicts`]),Ve={"--output":`--out`,"--path":`--out`};function He(e,t){let n=e.toLowerCase(),r=Ve[n];if(r&&Ue(r,t))return r;let i=We(n,t);if(i.length!==0)return i.length===1?i[0]:`one of: ${i.join(`, `)}`}function Ue(e,t){let n=_().find(t=>t.names.includes(e));return n?C(n.key,t):!1}function We(e,t){let n=k(e);if(n.length<=2)return[];let r=Ge(t),i=r.filter(e=>k(e).startsWith(n));return i.length>0?i.sort(Ne).slice(0,3):Pe(n,r.map(e=>k(e))).map(e=>`--${e}`)}function Ge(e){let t=new Set;for(let n of _()){if(!C(n.key,e))continue;let r=n.names[0];r&&t.add(r)}return[...t]}function k(e){return e.replace(/^--?/,``)}function Ke(e,t){let n=e.toLowerCase();if(ze.has(n))return`Unknown flag: ${e}. The app or bundle id is a positional argument, e.g. ${O}.`;if(Be.has(n))return`Unknown flag: ${e}. Use --session-lock reject|strip instead.`;if(n===s.cliToken)return`Unknown flag: ${e}. ${s.migration.screenshot}. ${s.migration.record}.`;let r=He(e,t);return r?`Unknown flag: ${e}. Did you mean ${r}?`:`Unknown flag: ${e}`}function A(e){let t={json:!1,help:!1,version:!1},r=null,i=null,a=[],o=[],s=[],c=!0;for(let o=0;o<e.length;o+=1){let l=e[o];if(c&&l===`--`){c=!1;continue}if(!c){r?a.push(l):(i=l,r=P(l));continue}if(Xe(r)){a.push(l);continue}let u=l.startsWith(`--`),d=l.startsWith(`-`)&&l.length>1;if(!u&&!d){r?a.push(l):(i=l,r=P(l));continue}let[f,ee]=u?j(l):[l,void 0];if(Je(r,f))continue;let p=Ze(f,r);if(Ye(r,p)){a.push(l);continue}if(!p){if(rt(r,a,l)){r?a.push(l):r=l;continue}throw new n(`INVALID_ARGS`,Ke(f,r))}let m=et(p,f,ee,e[o+1]);m.consumeNext&&(o+=1);let h=t[p.key];if(p.multiple){let e=Array.isArray(h)?[...h,m.value]:h===void 0?[m.value]:[h,m.value];t[p.key]=e}else t[p.key]=m.value;s.push({key:p.key,token:f})}return qe(i,t),{command:r,positionals:a,flags:t,warnings:o,providedFlags:s}}function qe(e,t){if(e)for(let n of Oe(e)?.impliedFlags??[])t[n]=!0}function Je(e,t){return t===`-c`&&(e===`snapshot`||e===`diff`)}function Ye(e,t){return e===`react-devtools`?!t||!C(t.key,e):!1}function Xe(e){return e===`cdp`}function Ze(e,t){let n=_().filter(t=>t.names.includes(e));if(n.length<=1)return n[0]??m(e);if(t){let e=n.find(e=>C(e.key,t));if(e)return e}return m(e)}function Qe(e,t){let r=t?.strictFlags??!0,i=[...e.warnings],a=S({json:!1,help:!1,version:!1},t?.defaultFlags??{});if(S(a,e.flags),e.command&&!f(e.command)&&!a.help){let t=Re(e.command),r=t?`Unknown command: ${e.command}. Did you mean ${t}?`:`Unknown command: ${e.command}`;throw new n(`INVALID_ARGS`,r)}let o=e.providedFlags.filter(t=>!C(t.key,e.command));if(o.length>0){let t=o.map(e=>e.token),s=lt(e.command,t);if(r)throw new n(`INVALID_ARGS`,s);i.push(s);for(let e of o)delete a[e.key]}let s=st(e);if(s.length>0){let t=ct(e.command,e.positionals[0],s);if(r)throw new n(`INVALID_ARGS`,t);i.push(t);for(let e of s)delete a[e.key]}for(let t of Object.keys(a))a[t]!==void 0&&(C(t,e.command)||delete a[t]);ot(e,a),$e(e),fe(e.command,a);let c=at({command:e.command,positionals:e.positionals,flags:a,warnings:i});if(Ce(c.command,c.positionals),c.command===`batch`&&+!!a.steps+ +!!a.stepsFile!=1)throw new n(`INVALID_ARGS`,`batch requires exactly one step source: --steps or --steps-file.`);return c}function $e(e){if(e.command!==`back`)return;let t=e.providedFlags.filter(e=>e.key===`backMode`);if(!(new Set(t.map(e=>e.token)).size<=1))throw new n(`INVALID_ARGS`,`back accepts only one explicit mode flag: use either --in-app or --system.`)}function j(e){let t=e.indexOf(`=`);return t===-1?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function et(e,t,r,i){if(e.setValue!==void 0){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:e.setValue,consumeNext:!1}}if(e.type===`boolean`){if(r!==void 0)throw new n(`INVALID_ARGS`,`Flag ${t} does not take a value.`);return{value:!0,consumeNext:!1}}if(e.type===`booleanOrString`){if(r!==void 0){if(r.trim().length===0)throw new n(`INVALID_ARGS`,`Flag ${t} requires a non-empty value when provided.`);return{value:r,consumeNext:!1}}return i===void 0||tt(i)?{value:!0,consumeNext:!1}:nt(i)?{value:i,consumeNext:!0}:{value:!0,consumeNext:!1}}let a=r??i;if(a===void 0||r===void 0&&tt(a))throw new n(`INVALID_ARGS`,`Flag ${t} requires a value.`);if(e.type===`string`)return{value:a,consumeNext:r===void 0};if(e.type===`enum`){if(!e.enumValues?.includes(a))throw new n(`INVALID_ARGS`,`Invalid ${M(t)}: ${a}`);return{value:a,consumeNext:r===void 0}}let o=Number(a);if(!Number.isFinite(o)||typeof e.min==`number`&&o<e.min||typeof e.max==`number`&&o>e.max)throw new n(`INVALID_ARGS`,`Invalid ${M(t)}: ${a}`);return{value:e.type===`int`?Math.floor(o):o,consumeNext:r===void 0}}function M(e){return e.replace(/^-+/,``)}function tt(e){if(!e.startsWith(`-`)||e===`-`)return!1;let[t]=e.startsWith(`--`)?j(e):[e,void 0];return m(t)!==void 0}function nt(e){let t=e.trim();return!t||/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//.test(t)?!1:!!(t.startsWith(`./`)||t.startsWith(`../`)||t.startsWith(`~/`)||t.startsWith(`/`)||t.includes(`/`)||t.includes(`\\`))}function rt(e,t,n){if(!it(n)||!e)return!1;let r=x(e);if(!r||r.allowsExtraPositionals)return!0;let i=r.positionalArgs??[];return i.length===0?!1:t.length<i.length||i.some(e=>e.includes(`?`))}function it(e){return/^-\d+(\.\d+)?$/.test(e)}function at(e){if(e.flags.help)return e;if(e.command===`snapshot`&&e.flags.snapshotDiff){let{snapshotDiff:t,...n}=e.flags;return{command:`diff`,positionals:[`snapshot`,...e.positionals],flags:n,warnings:e.warnings}}return e}function ot(e,t){let n=x(e.command)?.explicitOnlyFlags;if(n===void 0)return;let r=new Set(e.providedFlags.map(e=>e.key));for(let e of n)r.has(e)||delete t[e]}function st(e){let t=x(e.command)?.flagsByAction,n=e.positionals[0];if(t===void 0||n===void 0||!Object.hasOwn(t,n))return[];let r=t[n];if(r===void 0)return[];let i=new Set(Object.values(t).flat());return e.providedFlags.filter(e=>i.has(e.key)&&!r.includes(e.key))}function ct(e,t,n){return`${e} ${t} does not read ${n.map(e=>e.token).join(`, `)}. Run \`${e} ${t} --help\` for the options it reads.`}function lt(e,t){return e?t.length===1?`Flag ${t[0]} is not supported for command ${e}.`:`Flags ${t.join(`, `)} are not supported for command ${e}.`:t.length===1?`Flag ${t[0]} requires a command that supports it.`:`Flags ${t.join(`, `)} require a command that supports them.`}async function N(){let{buildUsageText:e}=await import(`./cli-help.js`).then(e=>e.n);return e()}async function ut(e){let{buildCommandUsageText:t}=await import(`./cli-help.js`).then(e=>e.n);return t(P(e))}function P(e){let t=De(e);if(t)throw new n(`INVALID_ARGS`,t);return Ee(e)}function dt(){return{renderedToStderr:!1}}function ft(e){return t=>{t.type===`command`&&(e.renderedToStderr=!0,process.stderr.write(`${t.message}\n`))}}function pt(e){return he(e)}const mt={connect:async()=>(await import(`./connection.js`)).connectCommand,disconnect:async()=>(await import(`./connection.js`)).disconnectCommand,connection:async()=>(await import(`./connection.js`)).connectionCommand,auth:async()=>(await import(`./auth.js`)).authCommand,plugins:async()=>(await import(`./plugins2.js`)).pluginsCommand,daemon:async()=>(await import(`./daemon.js`)).daemonCommand,device:async()=>(await import(`./device.js`)).deviceCommand,proxy:async()=>(await import(`./proxy.js`)).proxyCommand,takeover:async()=>(await import(`./takeover.js`)).takeoverCommand,replay:async()=>(await import(`./replay.js`)).replayCommand,screenshot:async()=>(await import(`./screenshot3.js`)).screenshotCommand,diff:async()=>(await import(`./screenshot3.js`)).diffCommand,record:async()=>(await import(`./recording.js`)).recordingCommand};async function ht(e){let t={...e.flags},n=mt[e.command];return n&&await(await n())({...e,flags:t})?!0:pt(e.command)?await gt({...e,command:e.command,flags:t}):!1}async function gt(e){let{runGenericClientBackedCommand:t}=await import(`./generic.js`);return await t(e)}function _t(e){return[`exec`,`--yes`,`--package`,`agent-cdp@1.6.1`,`--`,`agent-cdp`,...e]}function vt(e){return e.some(e=>e===`--url`||e.startsWith(`--url=`))}function yt(e){return e[0]===`target`&&(e[1]===`list`||e[1]===`select`)&&!vt(e)}function bt(e){let t=new URL(e);t.search=``,t.hash=``;let n=t.pathname.replace(/\/+$/,``);return t.pathname=n.endsWith(`/index.bundle`)?n.slice(0,-13)||`/`:n||`/`,t.toString().replace(/\/+$/,``)}function xt(e){let t=e?.metroPublicBaseUrl?.trim();return t?bt(t):null}function St(e,t={}){if(!yt(e)||!t.flags?.metroProxyBaseUrl||!ke(t.flags.leaseBackend))return e;let r=xt(t.flags);if(!r)throw new n(`INVALID_ARGS`,`cdp remote bridge target discovery requires a React Native dev-server public base URL.`,{hint:`Include metroPublicBaseUrl in the remote config so cdp can reach the local or tunneled Metro/Re.Pack CDP endpoint without bridge proxy authentication.`});return[...e,`--url`,r]}async function Ct(e,t={}){let n=St(e,t);return(await _e(`npm`,_t(n),{cwd:t.cwd??process.cwd(),env:t.env??process.env,allowFailure:!0,onStdoutChunk:e=>{process.stdout.write(e)},onStderrChunk:e=>{process.stderr.write(e)}})).exitCode}const F=`${u} Run agent-device help batch for the commands batch accepts and for runnable step examples.`,wt=`${de} Run agent-device help batch for the commands batch accepts and for runnable step examples.`;function Tt(e){let t;try{t=JSON.parse(e)}catch{throw new n(`INVALID_ARGS`,`Batch steps must be valid JSON.`)}if(!Array.isArray(t)||t.length===0)throw new n(`INVALID_ARGS`,`Batch steps must be a non-empty JSON array.`);return t.map((e,t)=>Et(e,t+1))}function Et(e,t){let r=l(e,t,F),i=[`positionals`,`flags`].filter(e=>e in r);if(i.length>0){let e=i.map(e=>`"${e}"`).join(`, `);throw new n(`INVALID_ARGS`,`Batch step ${t} uses removed field(s): ${e}. Use {"command":"...","input":{...}}. Example: {"command":"open","input":{"app":"settings","platform":"ios"}}.`,{hint:F})}me(r,[`command`,`input`,`runtime`],`Batch step ${t}`,F);let a=d(r.runtime,t);return{command:ue(r.command,t,wt),input:c(r,t,F),...a===void 0?{}:{runtime:a}}}function Dt(e,t={}){let n=Ot(t),r={...e};return n.defaultPlatform&&r.platform===void 0&&(r.platform=n.defaultPlatform),r}function Ot(e){let t=e.env??process.env,n=e.inheritedPlatform??e.configuredPlatform??At(t.AGENT_DEVICE_PLATFORM),r=Mt(e.configuredSession??t.AGENT_DEVICE_SESSION);return{defaultPlatform:n,lockPolicy:kt(e.policyOverrides,t,r)}}function kt(e,t,n){let r=e?.sessionLock??jt(t.AGENT_DEVICE_SESSION_LOCK);if(r)return r;if(n)return`reject`}function At(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(t){if(t===`ios`||t===`android`||t===`apple`)return t;throw new n(`INVALID_ARGS`,`Invalid AGENT_DEVICE_PLATFORM: ${e}. Use ios, android, or apple.`)}}function jt(e){if(e===void 0)return;let t=e.trim().toLowerCase();if(t){if(t===`reject`||t===`strip`)return t;throw new n(`INVALID_ARGS`,`Invalid session lock mode: ${e}. Use reject or strip.`)}}function Mt(e){return typeof e==`string`&&e.trim().length>0}const Nt=pe.map(e=>e.key);function I(e){let t={};for(let n of Nt){let r=e[n];r!==void 0&&(t[n]=r)}return t}function Pt(e){return e.remoteConfig?{...I(Se({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}).profile),remoteConfig:e.remoteConfig}:{}}function Ft(e,t){let n=A(e),r=t?.env??process.env,i=t?.cwd??process.cwd(),a=It(n.command)?Pt({remoteConfig:n.flags.remoteConfig,cwd:i,env:r}):{},o=S(we({command:n.command,cwd:i,cliFlags:n.flags,env:r}),a);return{...Qe(n,{strictFlags:t?.strictFlags,defaultFlags:o}),providedFlags:n.providedFlags}}function It(e){return e!==null}function Lt(e){let t=ae(e),n=i(t);return{platform:t,target:e.target,leaseBackend:n,identityFlag:n?se(t):void 0,id:e.id}}function Rt(e){return`${e.platform}:${e.target??`mobile`}:${e.id}`}function L(e){let t=[e.leaseBackend?a(e.leaseBackend):void 0,e.recordedPlatform].filter(e=>e!==void 0);if(t.some(e=>t.some(t=>oe(e,t)))||oe(e.requestedPlatform,t[0]??e.recordedPlatform))return{ok:!1,boundPlatform:t[0],requestedPlatform:e.requestedPlatform};let n=[...t,e.requestedPlatform].filter(e=>e!==void 0);return{ok:!0,platform:n.find(e=>e!==`apple`)??n[0]}}function zt(e,t){return t!==void 0&&e.platform===void 0?!1:L({leaseBackend:e.leaseBackend,recordedPlatform:e.platform,requestedPlatform:t}).ok}function R(e){let t=V(e);if(!E.existsSync(t))return null;let n;try{n=JSON.parse(E.readFileSync(t,`utf8`))}catch(t){return Zt(e,t),null}return $t(n)?n:(Zt(e),null)}function Bt(e){let t=V({stateDir:e.stateDir,session:e.state.session});E.mkdirSync(D.dirname(t),{recursive:!0}),Yt(t,e.state),Yt(H(e.stateDir),{session:e.state.session})}function Vt(e){return{baseUrl:Xt(e.daemonBaseUrl),transport:e.daemonTransport,serverMode:e.daemonServerMode}}function z(e){E.rmSync(V(e),{force:!0});let t=H(e.stateDir);Kt(e.stateDir)===e.session&&E.rmSync(t,{force:!0})}function Ht(e){let t=e.validateRemoteConfigHash??!0,r=e.remoteConfig?xe({configPath:e.remoteConfig,cwd:e.cwd,env:e.env}):void 0,i=R(e)??(e.allowActiveFallback?U({stateDir:e.stateDir}):null);if(!i||r&&i.remoteConfigPath!==r)return null;if(t&&B(i.remoteConfigPath)!==i.remoteConfigHash)throw new n(`INVALID_ARGS`,`Active remote connection config changed. Run agent-device connect --force to refresh it.`,{remoteConfig:i.remoteConfigPath});let a=Jt(i,e),o=g(i);return{runtime:i.runtime,connection:h(o),flags:{...a,remoteConfig:i.remoteConfigPath,daemonBaseUrl:i.daemon?.baseUrl??a.daemonBaseUrl,daemonAuthToken:a.daemonAuthToken,daemonTransport:i.daemon?.transport??a.daemonTransport,daemonServerMode:i.daemon?.serverMode??a.daemonServerMode,...te(o),sessionIsolation:`tenant`,session:i.session,platform:i.platform??a.platform,target:i.target??a.target}}}function Ut(e){return h(g(e))}function Wt(e,t){return{leaseProvider:e.leaseProvider??t.leaseProvider,clientId:e.clientId??t.clientId,deviceKey:e.deviceKey??t.deviceKey}}function Gt(e,t){return!t||(t.leaseProvider===void 0||e.leaseProvider===t.leaseProvider)&&(t.clientId===void 0||e.clientId===t.clientId)}function B(e){try{return T.createHash(`sha256`).update(E.readFileSync(e)).digest(`hex`)}catch(t){throw new n(`INVALID_ARGS`,`Remote config file not found: ${e}`,{cause:t instanceof Error?t.message:String(t)})}}function V(e){return D.join(e.stateDir,`remote-connections`,`${Qt(e.session)}.json`)}function H(e){return D.join(e,`remote-connections`,`.active-session.json`)}function U(e){let t=Kt(e.stateDir);return t?R({stateDir:e.stateDir,session:t}):null}function Kt(e){let t=H(e);if(E.existsSync(t))try{let e=JSON.parse(E.readFileSync(t,`utf8`));return typeof e.session==`string`?e.session:void 0}catch{return}}function qt(e){if(e)return T.createHash(`sha256`).update(e).digest(`hex`).slice(0,12)}function Jt(e,t){try{return Se({configPath:e.remoteConfigPath,cwd:t.cwd,env:t.env}).profile}catch(e){if(t.validateRemoteConfigHash===!1)return{};throw e}}function Yt(e,t){ge({destination:e,contents:`${JSON.stringify(t,null,2)}\n`,mode:384})}function Xt(e){if(!e)return;let t=new URL(e);t.username=``,t.password=``;for(let e of Array.from(t.searchParams.keys()))/(auth|key|password|secret|token)/i.test(e)&&t.searchParams.delete(e);return t.toString().replace(/\/+$/,``)}function Zt(e,t){b({level:`warn`,phase:`remote_connection_state_invalid`,data:{session:e.session,cause:t instanceof Error?t.message:t?String(t):void 0}}),z(e)}function Qt(e){let t=e.replaceAll(/[^a-zA-Z0-9._-]/g,`_`);return t?t===e?t:`${t}-${T.createHash(`sha256`).update(e).digest(`hex`).slice(0,8)}`:`default`}function $t(e){if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=e;return t.version===1&&en(t,[`session`,`remoteConfigPath`,`remoteConfigHash`,`tenant`,`runId`,`connectedAt`,`updatedAt`])&&tn(t,[`leaseId`,`leaseBackend`,`leaseProvider`,`deviceKey`,`clientId`])&&nn(t.daemon)}function en(e,t){return t.every(t=>typeof e[t]==`string`)}function tn(e,t){return t.every(t=>e[t]===void 0||typeof e[t]==`string`)}function nn(e){return e===void 0?!0:!e||typeof e!=`object`||Array.isArray(e)?!1:rn(e)}function rn(e){let t=e;return(t.baseUrl===void 0||typeof t.baseUrl==`string`)&&(t.authToken===void 0||typeof t.authToken==`string`)&&(t.transport===void 0||typeof t.transport==`string`)&&(t.serverMode===void 0||typeof t.serverMode==`string`)}async function an(e,t){let r=await e.text(),i={};if(r.trim().length>0)try{i=JSON.parse(r)}catch(r){throw new n(`COMMAND_FAILED`,t.invalidJsonMessage,{status:e.status},r instanceof Error?r:void 0)}if(!e.ok)throw new n(`UNAUTHORIZED`,t.rejectedMessage,{status:e.status,response:i});return i}const on=1e3;async function sn(e){return await cn({command:e.command,flags:e.flags,stateDir:e.stateDir,allowInteractiveLogin:e.command===`connect`&&!e.flags.noLogin,env:e.env})}async function cn(e){let t=e.env??e.io?.env??process.env;if(!e.flags.daemonBaseUrl)return{flags:e.flags,source:`none`};if(X(e.flags.daemonAuthToken))return{flags:e.flags,source:`flag`};if(X(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{flags:e.flags,source:`env`};if(!Sn(e.flags.daemonBaseUrl,t))return{flags:e.flags,source:`none`};let r=await mn({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{flags:{...e.flags,daemonAuthToken:r.accessToken},source:`cli-session`};if(!e.allowInteractiveLogin)throw e.flags.noLogin?new n(`UNAUTHORIZED`,`Remote daemon authentication is required.`,{hint:`Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`}):xn(e.command,t);let i=await W({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});return{flags:{...e.flags,daemonAuthToken:i.accessToken},source:`login`}}async function ln(e){let t=e.env??e.io?.env??process.env;if(X(e.flags.daemonAuthToken))return{accessToken:e.flags.daemonAuthToken,cloudBaseUrl:J(t)};if(X(t.AGENT_DEVICE_DAEMON_AUTH_TOKEN))return{accessToken:t.AGENT_DEVICE_DAEMON_AUTH_TOKEN,cloudBaseUrl:J(t)};let r=await mn({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io});if(r)return{accessToken:r.accessToken,cloudBaseUrl:r.cloudBaseUrl};if(e.flags.noLogin)throw new n(`UNAUTHORIZED`,`Cloud connection profile authentication is required.`,{hint:`Run agent-device auth login, unset --no-login, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`});let i=await W({stateDir:e.stateDir,flags:e.flags,env:t,io:e.io,commandLabel:`agent-device connect`});return{accessToken:i.accessToken,cloudBaseUrl:i.session.cloudBaseUrl}}async function W(e){let t=e.env??e.io?.env??process.env,r=vn(t,e.io);if(r===`non-interactive`)throw xn(e.commandLabel??`agent-device connect`,t);let i=J(t),a=await K({baseUrl:i,pathName:`/api/control-plane/device-auth/start`,body:{client:`agent-device`,tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});await _n(a);let o=X(a.verificationUriComplete)?a.verificationUriComplete:a.verificationUri;if(r===`local-browser`)Y(e.io,`Opening ${a.verificationUri}...\n`),await wn(o,e.io);else{let t=Cn(a.verificationUri,a.userCode);Y(e.io,`Open this URL on your machine:\n${t}\n\nWaiting for approval for 10 minutes...\n`)}let s=await gn({cloudBaseUrl:i,deviceCode:a.deviceCode,expiresIn:a.expiresIn,interval:a.interval,fetchImpl:e.io?.fetch,now:e.io?.now}),c=s.cliSession?.refreshCredential??s.cliSession?.refreshToken;if(!X(s.accessToken)||!X(c))throw new n(`UNAUTHORIZED`,`Device authorization did not return CLI credentials.`);let l=new Date(e.io?.now?.()??Date.now()).toISOString(),u={version:1,id:s.cliSession?.id??`cli-${Date.now().toString(36)}`,cloudBaseUrl:i,workspaceId:s.cliSession?.workspaceId,accountId:s.cliSession?.accountId,name:s.cliSession?.name,refreshCredential:c,createdAt:l,expiresAt:s.cliSession?.expiresAt};return dn({stateDir:e.stateDir,session:u}),{accessToken:s.accessToken,expiresAt:s.expiresAt,session:u}}function un(e){let t=G(e.stateDir);if(!E.existsSync(t))return null;try{let e=JSON.parse(E.readFileSync(t,`utf8`));return e.version!==1||!X(e.id)||!X(e.cloudBaseUrl)||!X(e.refreshCredential)||!X(e.createdAt)?null:e}catch{return null}}function dn(e){let t=G(e.stateDir);E.mkdirSync(D.dirname(t),{recursive:!0,mode:448}),E.writeFileSync(t,`${JSON.stringify(e.session,null,2)}\n`,{mode:384});try{E.chmodSync(t,384)}catch{}}function fn(e){let t=G(e.stateDir);return E.existsSync(t)?(E.rmSync(t,{force:!0}),!0):!1}function G(e){return D.join(e,`auth`,`cli-session.json`)}function pn(e){let t=un({stateDir:e.stateDir});return t?{authenticated:!0,source:`cli-session`,sessionId:t.id,cloudBaseUrl:t.cloudBaseUrl,workspaceId:t.workspaceId,accountId:t.accountId,name:t.name,createdAt:t.createdAt,expiresAt:t.expiresAt,expired:Tn(t.expiresAt,e.now)}:{authenticated:!1,source:`none`}}async function mn(e){let t=un({stateDir:e.stateDir});return!t||Tn(t.expiresAt,e.io?.now)?null:{accessToken:(await hn({session:t,flags:e.flags,env:e.env,io:e.io})).accessToken,cloudBaseUrl:J(e.env,t.cloudBaseUrl)}}async function hn(e){let t=await K({baseUrl:J(e.env,e.session.cloudBaseUrl),pathName:`/api/control-plane/cli-session/refresh`,body:{refreshCredential:e.session.refreshCredential,tenant:e.flags.tenant,runId:e.flags.runId,daemonBaseUrl:e.flags.daemonBaseUrl,session:e.flags.session},fetchImpl:e.io?.fetch});if(X(t.accessToken))return{accessToken:t.accessToken,expiresAt:t.expiresAt};throw t.status===`revoked`||t.error===`revoked`?new n(`UNAUTHORIZED`,`Stored cloud CLI session was revoked.`,{hint:`Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`,status:t.status,error:t.error}):new n(`UNAUTHORIZED`,`Failed to refresh CLI session.`,{hint:`Run agent-device auth login again, or set AGENT_DEVICE_DAEMON_AUTH_TOKEN.`,status:t.status,error:t.error})}async function gn(e){let t=e.now??Date.now,r=Math.min((e.expiresIn??600)*1e3,6e5),i=t()+r,a=Math.max(on,(e.interval??5)*1e3);for(;t()<i;){let t=await K({baseUrl:e.cloudBaseUrl,pathName:`/api/control-plane/device-auth/poll`,body:{deviceCode:e.deviceCode},fetchImpl:e.fetchImpl});if(t.status===`approved`||X(t.accessToken))return t;if(t.status===`slow_down`||t.error===`slow_down`)a+=on;else if(t.status!==`authorization_pending`&&t.error!==`authorization_pending`)throw new n(`UNAUTHORIZED`,`Device authorization was not approved.`,{status:t.status,error:t.error});await En(a)}throw new n(`TIMEOUT`,`Device authorization expired before approval.`)}async function K(e){let t=await(e.fetchImpl??fetch)(new URL(e.pathName,e.baseUrl),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e.body),signal:AbortSignal.timeout(15e3)});return await an(t,{invalidJsonMessage:`Cloud auth endpoint returned invalid JSON (${t.status}).`,rejectedMessage:`Cloud auth endpoint rejected the request.`})}async function _n(e){if(!X(e.deviceCode))throw q(`deviceCode`);if(!X(e.userCode))throw q(`userCode`);if(!X(e.verificationUri))throw q(`verificationUri`);let{isSafeBrowserUrl:t}=await import(`./browser-launch.js`);if(!t(e.verificationUri))throw q(`verificationUri`);if(X(e.verificationUriComplete)&&!t(e.verificationUriComplete))throw q(`verificationUriComplete`)}function q(e){return new n(`COMMAND_FAILED`,`Cloud auth start returned an unusable response.`,{field:e})}function vn(e,t){let n=t?.stdinIsTTY??process.stdin.isTTY,r=t?.stdoutIsTTY??process.stdout.isTTY;return yn(e)||!n||!r?`non-interactive`:bn(e)?`device-code`:`local-browser`}function yn(e){return e.CI===`true`||e.GITHUB_ACTIONS===`true`||e.BUILDKITE===`true`}function bn(e){return!!(e.SSH_TTY||e.SSH_CONNECTION||e.CODESPACES===`true`||e.GITPOD_WORKSPACE_ID||e.REMOTE_CONTAINERS===`true`)}function xn(e,t){let r=J(t);return new n(`UNAUTHORIZED`,`${e} cannot perform interactive login in CI or a non-interactive shell.`,{hint:`Create a service/API token: ${new URL(`/api-keys`,r).toString()} Then set AGENT_DEVICE_DAEMON_AUTH_TOKEN=adc_live_...`})}function J(e,t){let r=e.AGENT_DEVICE_CLOUD_BASE_URL??t??`https://cloud.agent-device.dev`;try{return new URL(r).toString().replace(/\/+$/,``)}catch(e){throw new n(`INVALID_ARGS`,`Invalid AGENT_DEVICE_CLOUD_BASE_URL.`,{cloudBaseUrl:r},e instanceof Error?e:void 0)}}function Sn(e,t){if(t.AGENT_DEVICE_CLOUD_AUTH===`1`||t.AGENT_DEVICE_CLOUD_AUTH===`true`||X(t.AGENT_DEVICE_CLOUD_BASE_URL))return!0;try{let t=new URL(e).hostname.toLowerCase();return t===`agent-device.dev`||t.endsWith(`.agent-device.dev`)}catch{return!1}}function Cn(e,t){let n=new URL(e);return n.searchParams.set(`user_code`,t),n.toString()}async function wn(e,t){if(t?.openBrowser){await t.openBrowser(e);return}let{openUrlInBrowser:n}=await import(`./browser-launch.js`);await n(e)||Y(t,`Open this URL on your machine:\n${e}\n`)}function Y(e,t){(e?.stderr??process.stderr).write(t)}function Tn(e,t){if(!e)return!1;let n=Date.parse(e);return!Number.isFinite(n)||n<=(t?.()??Date.now())}function X(e){return typeof e==`string`&&e.trim().length>0}async function En(e){await new Promise(t=>setTimeout(t,e))}p.runtime;async function Dn(e){let{command:t,request:n,transport:r,transportOptions:i}=e;return await r({...n,command:t},i)}var On=e({runCli:()=>$});const Z=(e,t={})=>import(`./error.js`).then(e=>e.t).then(({printHumanError:n})=>n(e,t)),Q=e=>import(`./json.js`).then(({printJson:t})=>t(e)),kn={sendToDaemon:ce},An=new Set([`launchUrl`,`kind`,`metroBearerToken`,`metroKind`,`metroListenHost`,`metroNoInstallDeps`,`metroNoReuseExisting`,`metroPreparePort`,`metroProbeTimeoutMs`,`metroProjectRoot`,`metroProxyBaseUrl`,`metroPublicBaseUrl`,`metroRuntimeFile`,`metroStartupTimeoutMs`,`metroStatusHost`]),jn=new Set([`connect`,`connection`,`close`,`daemon`,`plugins`,`device`,`disconnect`,`metro`,`proxy`,`session`,`takeover`]);async function $(e,t=kn){let n=re(),r=be(),i=Gn(e),a=e.includes(`--json`),o=sr(e)??process.env.AGENT_DEVICE_SESSION??`default`;await ne({session:o,requestId:n,command:e[0],debug:i},async()=>{let{parsed:o,command:s,positionals:c}=await Nn(e,{version:r,jsonRequested:a,debugEnabled:i}),l=Jn(s,o.providedFlags),u=await Pn(o,{command:s,positionals:c,requestId:n,debugOutputEnabled:l});Mn(u.effectiveFlags);let d=null;try{if(s===`react-devtools`){await w(await Fn(u,t));return}if(s===`web`){let{runWebCommand:e}=await import(`./web.js`);await w(await e(c,{flags:u.effectiveFlags,stateDir:u.daemonPaths.baseDir}));return}if(Te({command:s,currentVersion:r,stateDir:u.daemonPaths.baseDir,flags:u.effectiveFlags}),await In(u,t),Mn(u.effectiveFlags),s===`cdp`){await w(await Ct(c,{flags:u.effectiveFlags,runtime:u.resolvedRuntime,cwd:process.cwd(),env:process.env}));return}d=Rn(u);let e=await zn(u),n=dt();await Bn(u,le(Ln(u),{transport:ir({command:s,flags:u.effectiveFlags,replayTestReporterRuntime:e,commandProgress:n,transport:t.sendToDaemon})}),e,n)}catch(e){await Vn(e,u,d)}finally{d&&d()}})}function Mn(e){e.daemonAuthToken&&ie(e.daemonAuthToken)}async function Nn(e,t){let i;try{i=Ft(e,{cwd:process.cwd(),env:process.env})}catch(e){b({level:`error`,phase:`cli_parse_failed`,data:{error:e instanceof Error?e.message:String(e)}});let n=r(e,{diagnosticId:v().diagnosticId,logPath:y({force:!0})?.path});return t.jsonRequested?await Q({success:!1,error:n}):await Z(n,{showDetails:t.debugEnabled}),w(1)}for(let e of i.warnings)process.stderr.write(`Warning: ${e}\n`);if(i.flags.version)return process.stdout.write(`${t.version}\n`),w(0);let a=i.command===`help`,o=i.flags.help;if(a||o){if(a&&i.positionals.length>1)return await Z(new n(`INVALID_ARGS`,`help accepts at most one command.`)),w(1);let e=a?i.positionals[0]:i.command;if(!e)return process.stdout.write(`${await N()}\n`),w(0);let t=await ut(e);return t?(process.stdout.write(t),w(0)):(await Z(new n(`INVALID_ARGS`,Kn(e))),process.stdout.write(`${await N()}\n`),w(1))}return i.command?{parsed:i,command:i.command,positionals:i.positionals}:(process.stdout.write(`${await N()}\n`),w(1))}async function Pn(e,n){let i=new Set(e.providedFlags.map(e=>e.key));try{let t=Ot({policyOverrides:e.flags,configuredPlatform:e.flags.platform,configuredSession:e.flags.session}),r=t.lockPolicy?{...e.flags}:Dt(e.flags,{policyOverrides:e.flags,configuredPlatform:e.flags.platform,configuredSession:e.flags.session}),a=ye(r.stateDir),o=r.session??`default`,s=Zn({command:n.command,explicitFlagKeys:i,stateDir:a.baseDir,session:o,remoteConfig:r.remoteConfig,hasResolvedSession:r.session!==void 0}),c=s?nr(r,s.flags,i):r;return{...n,binding:t,flags:r,daemonPaths:a,sessionName:o,connectionDefaults:s,explicitFlagKeys:i,effectiveFlags:c,resolvedRuntime:s?.runtime,connectionMetadata:s?.connection,parsedBatchSteps:void 0}}catch(i){let a=t(i),o=r(a,{diagnosticId:v().diagnosticId,logPath:y({force:!0})?.path});return e.flags.json?await Q({success:!1,error:o}):await Z(o,{showDetails:n.debugOutputEnabled}),w(1)}}async function Fn(e,t){let{runReactDevtoolsCommand:n}=await import(`./react-devtools.js`),{daemonAuthToken:r,...i}=e.effectiveFlags;return await n(e.positionals,{flags:{...i,leaseProvider:e.connectionDefaults?.connection?.leaseProvider},stateDir:e.daemonPaths.baseDir,session:e.effectiveFlags.session??e.sessionName,cwd:process.cwd(),env:process.env,configureDirectPortReverse:async()=>{let n=await Dn({route:`react-devtools`,command:p.runtime,request:{positionals:[`port-reverse`],flags:{...i,leaseProvider:e.connectionDefaults?.connection?.leaseProvider,devicePort:8097,hostPort:8097,portReverseName:`react-devtools`},session:e.effectiveFlags.session??e.sessionName},transport:t.sendToDaemon,transportOptions:{authToken:r}});n.ok||o(n.error)}})}async function In(e,t){if(e.command===`batch`){if(e.positionals.length>0)throw new n(`INVALID_ARGS`,`batch does not accept positional arguments.`);e.parsedBatchSteps=Yn(e.flags)}if($n(e.command)&&(e.effectiveFlags=(await sn({command:e.command,flags:e.effectiveFlags,stateDir:e.daemonPaths.baseDir,env:process.env})).flags),e.effectiveFlags.remoteConfig&&Qn(e.command)){let n=le(Ln(e),{transport:ar(t.sendToDaemon)}),{materializeRemoteConnectionForCommand:r}=await import(`./connection-runtime.js`),i=await r({command:e.command,flags:e.effectiveFlags,client:n,runtime:e.resolvedRuntime,positionals:e.positionals,batchSteps:e.parsedBatchSteps,forceRuntimePrepare:rr(e.explicitFlagKeys)});e.effectiveFlags=i.flags,e.resolvedRuntime=i.runtime,e.connectionMetadata=i.connection}er({command:e.command,flags:e.effectiveFlags,runtime:e.resolvedRuntime,explicitFlagKeys:e.explicitFlagKeys,hadConnectionDefaults:!!e.connectionDefaults})&&process.stderr.write(`Warning: open is using explicit remote daemon or tenant flags without saved Metro runtime hints. React Native apps may launch without bundle/runtime hints; prefer connect --remote-config <path> first or pass --remote-config <path> on this command.
2
+ `)}function Ln(e){let t=e.effectiveFlags,n=e.connectionMetadata;return{session:t.session,requestId:e.requestId,stateDir:t.stateDir,daemonBaseUrl:t.daemonBaseUrl,daemonAuthToken:t.daemonAuthToken,daemonTransport:t.daemonTransport,daemonServerMode:t.daemonServerMode,tenant:t.tenant,sessionIsolation:t.sessionIsolation,runId:t.runId,leaseId:t.leaseId,leaseBackend:t.leaseBackend,leaseProvider:n?.leaseProvider,clientId:n?.clientId,deviceKey:n?.deviceKey,providerApp:t.providerApp,providerOsVersion:t.providerOsVersion,providerDeviceType:t.providerDeviceType,providerProject:t.providerProject,providerBuild:t.providerBuild,providerSessionName:t.providerSessionName,providerDeviceOrientation:t.providerDeviceOrientation,providerGeoLocation:t.providerGeoLocation,providerTimezone:t.providerTimezone,providerAppiumVersion:t.providerAppiumVersion,providerLanguage:t.providerLanguage,providerLocale:t.providerLocale,providerNetworkProfile:t.providerNetworkProfile,providerCustomNetwork:t.providerCustomNetwork,providerNoResignApp:t.providerNoResignApp,awsProjectArn:t.awsProjectArn,awsDeviceArn:t.awsDeviceArn,awsAppArn:t.awsAppArn,awsRegion:t.awsRegion,awsInteractionMode:t.awsInteractionMode,runtime:e.resolvedRuntime,lockPolicy:e.binding.lockPolicy,lockPlatform:e.binding.defaultPlatform,cwd:process.cwd(),debug:e.debugOutputEnabled,cost:t.cost,responseLevel:t.responseLevel}}function Rn(e){let t=e.effectiveFlags.daemonBaseUrl;return e.debugOutputEnabled&&!e.effectiveFlags.json&&!t?cr(e.daemonPaths.logPath):null}async function zn(e){if(e.command!==`test`)return;let{createReplayTestReporterRuntime:t}=await import(`./reporting.js`);return t({debug:e.debugOutputEnabled,verbose:e.effectiveFlags.verbose,json:e.effectiveFlags.json,reporter:e.effectiveFlags.reporter,reportJunit:e.effectiveFlags.reportJunit})}async function Bn(e,t,r,i){let{command:a,positionals:o,effectiveFlags:s}=e;if(a===`batch`){if(!e.parsedBatchSteps)throw new n(`INVALID_ARGS`,`batch requires --steps or --steps-file.`);let c=e.parsedBatchSteps.map((t,n)=>({...t,input:e.binding.lockPolicy&&e.flags.platform===void 0?{...t.input}:Dt(t.input,{policyOverrides:s,configuredPlatform:s.platform,configuredSession:s.session,inheritedPlatform:s.platform})}));if(await ht({command:a,positionals:o,flags:{...s,batchSteps:c},client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return}else if(a===`runtime`)throw new n(`INVALID_ARGS`,`runtime command was removed. Use connect --remote-config <path> for remote runs, or metro prepare --remote-config <path> for inspection.`);else if(await ht({command:a,positionals:o,flags:s,client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return;throw new n(`INVALID_ARGS`,qn(a))}async function Vn(e,n,i){let a=t(e),o=r(a,{diagnosticId:v().diagnosticId,logPath:y({force:!0})?.path});if(n.command===`close`&&Xn(a)){n.effectiveFlags.json&&await Q({success:!0,data:{closed:`session`,source:`no-daemon`}});return}n.effectiveFlags.json?await Q({success:!1,error:o}):(await Z(o,{showDetails:n.debugOutputEnabled}),n.debugOutputEnabled&&Un(n,o)),i&&i(),await w(1)}const Hn=64e3;function Un(e,t){if(!e.effectiveFlags.daemonBaseUrl){Wn(`daemon log`,e.daemonPaths.logPath);return}let n=t.diagnosticsRecord;n&&Wn(`remote diagnostics`,ve(e.daemonPaths.baseDir,n))}function Wn(e,t){try{if(E.existsSync(t)){let n=E.readFileSync(t,`utf8`).split(`
4
3
  `),r=n.slice(Math.max(0,n.length-200)).join(`
5
- `);r.length>J&&(r=r.slice(r.length-J)),r.trim().length>0&&process.stderr.write(`\n[${e}]\n${r}\n`)}}catch{}}function It(e){try{let t=M(e);return Z(t.command??``,t.providedFlags)}catch{return e.includes(`--debug`)||e.includes(`-v`)||e.includes(`--verbose`)}}function X(e){let t=A(e);return t?`Unknown command: ${e}. Did you mean ${t}?`:`Unknown command: ${e}`}function Lt(e){return _(e)?(m({level:`error`,phase:`cli_known_command_unhandled`,data:{command:e}}),`Command is registered but no CLI handler accepted it: ${e}`):`Unknown command: ${e}`}function Z(e,t){return t.some(t=>t.key===`verbose`&&(t.token===`--debug`||t.token===`-v`||e!==`test`))}function Rt(e){let t=``;if(e.steps)t=e.steps;else if(e.stepsFile)try{t=T.readFileSync(e.stepsFile,`utf8`)}catch(t){let r=t instanceof Error?t.message:String(t);throw new n(`INVALID_ARGS`,`Failed to read --steps-file ${e.stepsFile}: ${r}`)}return ht(t)}function zt(e){return e.code===`COMMAND_FAILED`?e.details?.kind===`daemon_startup_failed`?!0:e.message.toLowerCase().includes(`failed to start daemon`)?typeof e.details?.infoPath==`string`||typeof e.details?.lockPath==`string`:!1:!1}function Bt(e){return e.command===`connect`||e.command===`connection`||e.command===`daemon`||e.command===`plugins`||e.command===`proxy`?null:_e({stateDir:e.stateDir,session:e.session,remoteConfig:e.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!e.explicitFlagKeys.has(`session`)&&(!e.remoteConfig||e.command===`disconnect`||!e.hasResolvedSession),validateRemoteConfigHash:e.command!==`disconnect`})}function Vt(e){return!Et.has(e)}function Ht(e){return e!==`auth`&&e!==`connection`&&e!==`daemon`&&e!==`plugins`&&e!==`device`&&e!==`proxy`}function Ut(e){return e.command!==`open`||e.runtime||e.flags.bundleUrl||e.flags.metroHost||e.flags.metroPort||e.flags.remoteConfig||e.hadConnectionDefaults?!1:Wt(e.explicitFlagKeys)}function Wt(e){return e.has(`daemonBaseUrl`)||e.has(`daemonTransport`)||e.has(`tenant`)||e.has(`sessionIsolation`)||e.has(`runId`)||e.has(`leaseId`)||e.has(`leaseBackend`)}function Gt(e,t,n){let r={...e};for(let[e,i]of Object.entries(t))i!==void 0&&(n.has(e)||(r[e]=i));return r}function Kt(e){for(let t of Tt)if(e.has(t))return!0;return!1}function qt(e){let{command:t,flags:n,replayTestReporterRuntime:r,transport:i}=e;if(n.json)return Q(i);let a=t===`test`&&r?r.onProgress:nt(e.commandProgress);return async(e,n)=>{let r={...n,onProgress:a};return await $(i,{...e,meta:{...e.meta,requestProgress:t===`test`?`replay-test`:`command`}},r)}}function Q(e){return async(t,n)=>await $(e,t,n)}async function $(e,t,n){return await e(t,n)}function Jt(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.startsWith(`--session=`)){let e=n.slice(10).trim();return e.length>0?e:null}if(n===`--session`){let n=e[t+1]?.trim();return n&&!n.startsWith(`-`)?n:null}}return null}Te(process.argv[1]??``).href===import.meta.url&&G(process.argv.slice(2)).catch(async n=>{let r=e(n);await U(t(r),{showDetails:!0}),await w(1)});function Yt(e){try{let t=T.existsSync(e)?T.statSync(e).size:0,n=!1,r=setInterval(()=>{if(!n&&T.existsSync(e))try{let n=T.statSync(e);if(n.size<t&&(t=0),n.size<=t)return;let r=T.openSync(e,`r`);try{let e=Buffer.alloc(n.size-t);T.readSync(r,e,0,e.length,t),t=n.size,e.length>0&&process.stdout.write(e.toString(`utf8`))}finally{T.closeSync(r)}}catch{}},200);return()=>{n=!0,clearInterval(r)}}catch{return null}}export{G as runCli};
4
+ `);r.length>Hn&&(r=r.slice(r.length-Hn)),r.trim().length>0&&process.stderr.write(`\n[${e}]\n${r}\n`)}}catch{}}function Gn(e){try{let t=A(e);return Jn(t.command??``,t.providedFlags)}catch{return e.includes(`--debug`)||e.includes(`-v`)||e.includes(`--verbose`)}}function Kn(e){let t=Re(e);return t?`Unknown command: ${e}. Did you mean ${t}?`:`Unknown command: ${e}`}function qn(e){return f(e)?(b({level:`error`,phase:`cli_known_command_unhandled`,data:{command:e}}),`Command is registered but no CLI handler accepted it: ${e}`):`Unknown command: ${e}`}function Jn(e,t){return t.some(t=>t.key===`verbose`&&(t.token===`--debug`||t.token===`-v`||e!==`test`))}function Yn(e){let t=``;if(e.steps)t=e.steps;else if(e.stepsFile)try{t=E.readFileSync(e.stepsFile,`utf8`)}catch(t){let r=t instanceof Error?t.message:String(t);throw new n(`INVALID_ARGS`,`Failed to read --steps-file ${e.stepsFile}: ${r}`)}return Tt(t)}function Xn(e){return e.code===`COMMAND_FAILED`?e.details?.kind===`daemon_startup_failed`?!0:e.message.toLowerCase().includes(`failed to start daemon`)?typeof e.details?.infoPath==`string`||typeof e.details?.lockPath==`string`:!1:!1}function Zn(e){return e.command===`connect`||e.command===`connection`||e.command===`daemon`||e.command===`plugins`||e.command===`proxy`?null:Ht({stateDir:e.stateDir,session:e.session,remoteConfig:e.remoteConfig,cwd:process.cwd(),env:process.env,allowActiveFallback:!e.explicitFlagKeys.has(`session`)&&(!e.remoteConfig||e.command===`disconnect`||!e.hasResolvedSession),validateRemoteConfigHash:e.command!==`disconnect`})}function Qn(e){return!jn.has(e)}function $n(e){return e!==`auth`&&e!==`connection`&&e!==`daemon`&&e!==`plugins`&&e!==`device`&&e!==`proxy`}function er(e){return e.command!==`open`||e.runtime||e.flags.bundleUrl||e.flags.metroHost||e.flags.metroPort||e.flags.remoteConfig||e.hadConnectionDefaults?!1:tr(e.explicitFlagKeys)}function tr(e){return e.has(`daemonBaseUrl`)||e.has(`daemonTransport`)||e.has(`tenant`)||e.has(`sessionIsolation`)||e.has(`runId`)||e.has(`leaseId`)||e.has(`leaseBackend`)}function nr(e,t,n){let r={...e};for(let[e,i]of Object.entries(t))i!==void 0&&(n.has(e)||(r[e]=i));return r}function rr(e){for(let t of An)if(e.has(t))return!0;return!1}function ir(e){let{command:t,flags:n,replayTestReporterRuntime:r,transport:i}=e;if(n.json)return ar(i);let a=t===`test`&&r?r.onProgress:ft(e.commandProgress);return async(e,n)=>{let r={...n,onProgress:a};return await or(i,{...e,meta:{...e.meta,requestProgress:t===`test`?`replay-test`:`command`}},r)}}function ar(e){return async(t,n)=>await or(e,t,n)}async function or(e,t,n){return await e(t,n)}function sr(e){for(let t=0;t<e.length;t+=1){let n=e[t];if(n.startsWith(`--session=`)){let e=n.slice(10).trim();return e.length>0?e:null}if(n===`--session`){let n=e[t+1]?.trim();return n&&!n.startsWith(`-`)?n:null}}return null}Ae(process.argv[1]??``).href===import.meta.url&&$(process.argv.slice(2)).catch(async e=>{let n=t(e);await Z(r(n),{showDetails:!0}),await w(1)});function cr(e){try{let t=E.existsSync(e)?E.statSync(e).size:0,n=!1,r=setInterval(()=>{if(!n&&E.existsSync(e))try{let n=E.statSync(e);if(n.size<t&&(t=0),n.size<=t)return;let r=E.openSync(e,`r`);try{let e=Buffer.alloc(n.size-t);E.readSync(r,e,0,e.length,t),t=n.size,e.length>0&&process.stdout.write(e.toString(`utf8`))}finally{E.closeSync(r)}}catch{}},200);return()=>{n=!0,clearInterval(r)}}catch{return null}}export{yt as S,Gt as _,pn as a,Bt as b,Vt as c,qt as d,B as f,R as g,U as h,ln as i,Ut as l,L as m,W as n,an as o,Wt as p,fn as r,$ as runCli,Rt as s,On as t,zt as u,z as v,I as x,Lt as y};
@@ -0,0 +1 @@
1
+ import{D as e,N as t,k as n,y as r}from"./file.js";import{d as i}from"./exec.js";import"./command.js";import"./process.js";import{a,c as o,d as s,f as c,i as l,l as u,m as d,o as f,p,r as m,s as h,t as g,u as _}from"./base-url.js";import{createHash as v}from"node:crypto";import y from"node:fs";import b from"node:path";import{fileURLToPath as x}from"node:url";const S=`companion-tunnel`;function C(e){return v(`sha256`).update(e).digest(`hex`)}function w(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function T(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(typeof t.tenantId==`string`&&typeof t.runId==`string`&&typeof t.leaseId==`string`)return{tenantId:t.tenantId,runId:t.runId,leaseId:t.leaseId}}function E(e,t){return e.tenantId===t.tenantId&&e.runId===t.runId&&e.leaseId===t.leaseId}function D(e,t,n,r){let i=r??b.join(e,`.agent-device`);if(!n)return{statePath:b.join(i,`${t.slug}.json`),logPath:b.join(i,`${t.slug}.log`)};let a=C(n).slice(0,12),o=b.join(i,t.slug);return{statePath:b.join(o,`${t.slug}-${a}.json`),logPath:b.join(o,`${t.slug}-${a}.log`)}}function O(e){try{let t=JSON.parse(y.readFileSync(e,`utf8`));if(!Number.isInteger(t.pid)||Number(t.pid)<=0||typeof t.serverBaseUrl!=`string`||typeof t.localBaseUrl!=`string`||typeof t.tokenHash!=`string`||t.tokenHash.length===0)return null;let n=Array.isArray(t.consumers)?t.consumers.filter(e=>typeof e==`string`&&e.length>0):[];return{pid:Number(t.pid),startTime:typeof t.startTime==`string`?t.startTime:void 0,command:typeof t.command==`string`?t.command:void 0,serverBaseUrl:t.serverBaseUrl,localBaseUrl:t.localBaseUrl,launchUrl:w(t.launchUrl),registerPath:w(t.registerPath),unregisterPath:w(t.unregisterPath),devicePort:Number.isInteger(t.devicePort)?Number(t.devicePort):void 0,session:w(t.session),bridgeScope:T(t.bridgeScope),tokenHash:t.tokenHash,consumers:n}}catch{return null}}function k(e,t){y.mkdirSync(b.dirname(e),{recursive:!0}),y.writeFileSync(e,`${JSON.stringify(t,null,2)}\n`,`utf8`)}function A(e){y.mkdirSync(b.dirname(e),{recursive:!0}),y.closeSync(y.openSync(e,`a`))}function j(e){try{y.unlinkSync(e)}catch{}}function M(e){try{y.readdirSync(e).length===0&&y.rmdirSync(e)}catch{}}function N(e,t){let n=b.dirname(e.statePath),r=b.dirname(e.logPath);j(e.statePath),j(e.logPath),M(n),r!==n&&M(r),b.basename(n)===t.slug&&M(b.dirname(n))}function P(e,t){return e.includes(t.runArg)}function F(t,i){if(!r(t.pid))return!1;if(t.startTime){let e=n(t.pid);if(!e||e!==t.startTime)return!1}let a=e(t.pid);return!a||!P(a,i.definition)||!t.bridgeScope?!1:t.serverBaseUrl===g(i.serverBaseUrl)&&t.localBaseUrl===g(i.localBaseUrl)&&t.launchUrl===w(i.launchUrl)&&t.registerPath===w(i.registerPath)&&t.unregisterPath===w(i.unregisterPath)&&t.devicePort===i.devicePort&&t.session===w(i.session)&&E(t.bridgeScope,i.bridgeScope)&&t.tokenHash===C(i.bearerToken)}function I(e){return w(e.consumerKey)??w(e.profileKey)??null}function L(e,t){return!t||e.consumers.includes(t)?e:{...e,consumers:[...e.consumers,t]}}function R(e,t){return t?{...e,consumers:e.consumers.filter(e=>e!==t)}:{...e,consumers:[]}}async function z(n,i){if(!r(n.pid))return;let a=e(n.pid);if(!(!a||!P(a,i))){try{process.kill(n.pid,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await t(n.pid,1e3)){try{process.kill(n.pid,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await t(n.pid,1e3)}}}function B(e,t,n){n===void 0?delete e[t]:e[t]=n}function V(e,t){let n={...t};return n[s]=g(e.serverBaseUrl),n[m]=e.bearerToken,n[f]=g(e.localBaseUrl),n[p]=D(e.projectRoot,e.definition,e.profileKey,e.stateDir).statePath,n[_]=e.bridgeScope.tenantId,n[u]=e.bridgeScope.runId,n[o]=e.bridgeScope.leaseId,B(n,a,w(e.launchUrl)),B(n,h,w(e.registerPath)),B(n,d,w(e.unregisterPath)),B(n,l,e.devicePort===void 0?void 0:String(e.devicePort)),B(n,c,w(e.session)),n}function H(e){let t=x(import.meta.url),n=b.extname(t)||`.js`,r=[b.join(b.dirname(t),`${S}${n}`),b.join(b.dirname(t),`internal`,`${S}${n}`)].find(e=>y.existsSync(e));if(!r)throw Error(`${e.displayName} entrypoint not found. Rebuild the package to include the companion worker entry.`);return r}function U(t,r){let a=H(t.definition),o=a.endsWith(`.ts`)?[`--experimental-strip-types`]:[];y.mkdirSync(b.dirname(r),{recursive:!0});let s=y.openSync(r,`a`),c=0;try{c=i(process.execPath,[...o,a,t.definition.runArg],{env:V(t,t.env??process.env),stdio:[`ignore`,s,s]})}finally{y.closeSync(s)}if(!Number.isInteger(c)||c<=0)throw Error(`Failed to start ${t.definition.displayName} process.`);return{pid:c,startTime:n(c)??void 0,command:e(c)??void 0,serverBaseUrl:g(t.serverBaseUrl),localBaseUrl:g(t.localBaseUrl),launchUrl:w(t.launchUrl),registerPath:w(t.registerPath),unregisterPath:w(t.unregisterPath),devicePort:t.devicePort,session:w(t.session),bridgeScope:t.bridgeScope,tokenHash:C(t.bearerToken),consumers:[]}}async function W(e){let t=I(e),n=D(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=O(n.statePath);if(r&&F(r,e)){let e=L(r,t);return e!==r&&k(n.statePath,e),{pid:r.pid,spawned:!1,statePath:n.statePath,logPath:n.logPath}}r&&(await z(r,e.definition),N(n,e.definition)),A(n.statePath);let i;try{i=U(e,n.logPath),k(n.statePath,L(i,t))}catch(t){throw i&&await z(i,e.definition).catch(()=>{}),N(n,e.definition),t}return{pid:i.pid,spawned:!0,statePath:n.statePath,logPath:n.logPath}}async function G(e){let t=I(e),n=D(e.projectRoot,e.definition,e.profileKey,e.stateDir),r=O(n.statePath);if(!r)return N(n,e.definition),{stopped:!1,statePath:n.statePath};let i=R(r,t);return i.consumers.length>0?(k(n.statePath,i),{stopped:!1,statePath:n.statePath}):(await z(r,e.definition),N(n,e.definition),{stopped:!0,statePath:n.statePath})}export{G as n,W as t};
@@ -1 +1 @@
1
- import{F as e,P as t}from"./sdk-contracts.js";import{O as n}from"./owner-identity.js";import{n as r}from"./path-resolution.js";import{d as i,m as a}from"./exec.js";import{t as o}from"./timeouts.js";import"./file.js";import"./command.js";import"./process.js";import"./retry.js";import{t as s}from"./base-url.js";import{t as c}from"./client-metro-companion.js";import{n as l,r as u}from"./project-runtime.js";import{t as d}from"./runtime-transport-hints.js";import f from"node:fs";import p from"node:path";function m(e,t,n=`index.bundle`){let r=new URL(`${s(e)}/${n}`);return r.searchParams.set(`platform`,t),r.searchParams.set(`dev`,`true`),r.searchParams.set(`minify`,`false`),r.toString()}const h=8081,g=`.expo/.virtual-metro-entry.bundle`;function _(e,n){if(e==null||e===``)return n;let r=Number.parseInt(String(e),10);if(!Number.isInteger(r)||r<1||r>65535)throw new t(`INVALID_ARGS`,`Invalid Metro port: ${String(e)}. Use 1-65535.`);return r}function v(e){let n=S(e.bundleUrl),r=n??e.runtime?.bundleUrl,i=!!n,a=!!S(r),o=d({metroHost:y(e,i,a),metroPort:b(e,i,a),bundleUrl:r});if(!o)throw new t(`INVALID_ARGS`,`Unable to resolve Metro host and port for reload.`);let s=ee(r);return{reloadUrl:x(o,o.scheme,`${s}/reload`),messageSocketUrl:x(o,o.scheme===`https`?`wss`:`ws`,`${s}/message`)}}function y(e,t,n){return S(e.metroHost)??(t?void 0:S(e.runtime?.metroHost))??(n?void 0:`localhost`)}function b(e,t,n){if(e.metroPort!==void 0)return _(e.metroPort,h);if(!t)return e.runtime?.metroPort??(n?void 0:h)}function ee(e){let t=S(e);if(!t)return``;let n;try{n=new URL(t)}catch{return``}let r=n.pathname.replace(/\/+$/,``),i=`/${g}`;if(r.endsWith(i))return r.slice(0,-i.length);let a=r.lastIndexOf(`/`);return(a>=0?r.slice(a+1):r).endsWith(`.bundle`)&&a>0?r.slice(0,a):``}function x(e,t,n){let r=new URL(`${t}://localhost`);return r.hostname=e.host,r.port=String(e.port),r.pathname=n,r.toString()}function S(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function C(e){return typeof e==`string`&&e.trim()?s(e.trim()):``}function w(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function T(e,t,n){return r(e,{env:t,cwd:n})}function E(e){try{return f.accessSync(e,f.constants.F_OK),!0}catch{return!1}}function D(e){try{return f.statSync(e).isDirectory()}catch{return!1}}function O(e){let n=p.join(e,`package.json`),r=u(e);if(!r)throw new t(`INVALID_ARGS`,`package.json not found at ${n}`);return r}const k=[{file:`pnpm-lock.yaml`,command:`pnpm`},{file:`yarn.lock`,command:`yarn`},{file:`bun.lock`,command:`bun`},{file:`bun.lockb`,command:`bun`},{file:`package-lock.json`,command:`npm`}];function te(e){let t=e;for(;;){for(let{file:e,command:n}of k)if(E(p.join(t,e)))return{command:n,installArgs:[`install`]};if(E(p.join(t,`.git`)))return null;let e=p.dirname(t);if(e===t)return null;t=e}}function A(e){return te(e)??{command:`npm`,installArgs:[`install`]}}function j(e,t){if(t!==`auto`)return t;let n=l(e);return n===`expo`||n===`repack`?n:`react-native`}function M(e,t){return typeof{...e.dependencies??{},...e.devDependencies??{}}[t]==`string`}function N(e,t){return[`js`,`mjs`,`cjs`,`ts`,`mts`,`cts`].some(n=>E(p.join(e,`${t}.config.${n}`)))}function P(e,t){return N(e,`rspack`)?`rspack`:N(e,`webpack`)?`webpack`:M(t,`@rspack/core`)?`rspack`:M(t,`webpack`)?`webpack`:`rspack`}function F(e,t,n){if(e==null||e===``)return t;let r=Number.parseInt(String(e),10);return Number.isInteger(r)?Math.max(r,n):t}function ne(e){return e===`expo`?g:`index.bundle`}function I(e,t,n){return{platform:t,bundleUrl:m(e,t,ne(n))}}function L(e,t){return{platform:t,metroHost:w(e?.metro_host),metroPort:e?.metro_port,bundleUrl:w(e?.metro_bundle_url),launchUrl:w(e?.launch_url)}}function R(e,t){if(D(p.join(e,`node_modules`)))return{installed:!1};let n=A(e);try{a(n.command,n.installArgs,{cwd:e,env:t})}catch(e){throw z(e,n)}return{installed:!0,packageManager:n.command}}function z(n,r){let i=e(n),a=`Dependency install failed using detected package manager "${r.command}". If dependencies are already installed (for example via a monorepo root install), pass --no-install-deps to skip this step, or install manually with "${r.command} ${r.installArgs.join(` `)}" from the project root.`;return new t(i.code,i.message,{...i.details??{},hint:a,packageManager:r.command},i)}async function B(e){await o(e)}async function V(e,n,r={}){try{let t=await fetch(e,{headers:r,signal:AbortSignal.timeout(n)});return{ok:t.ok,status:t.status,body:await t.text()}}catch(r){throw r instanceof Error&&r.name===`TimeoutError`?new t(`COMMAND_FAILED`,`Timed out fetching ${e} after ${n}ms`):r}}async function H(e,t){try{let n=await V(e,t);return n.ok&&n.body.includes(`packager-status:running`)}catch{return!1}}function U(e,t,n,r){return e===`expo`?{command:`npx`,installArgs:[`expo`,`start`,`--host`,`lan`,`--port`,String(n)]}:e===`repack`?{command:`npx`,installArgs:[`react-native`,t===`webpack`?`webpack-start`:`rspack-start`,`--host`,r,`--port`,String(n)]}:{command:`npx`,installArgs:[`react-native`,`start`,`--host`,r,`--port`,String(n)]}}function W(e,n,r,a,o,s,c){let l=U(n,r,a,o);f.mkdirSync(p.dirname(s),{recursive:!0});let u=f.openSync(s,`a`),d=0;try{d=i(l.command,l.installArgs,{cwd:e,env:c,stdio:[`ignore`,u,u]})}finally{f.closeSync(u)}if(!Number.isInteger(d)||d<=0)throw new t(`COMMAND_FAILED`,`Failed to start React Native dev server. Expected a detached child PID.`);return{pid:d}}async function G(e){if(!(!Number.isInteger(e)||e<=0)){try{process.kill(e,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await n(e,1e3)){try{process.kill(e,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await n(e,1e3)}}}function K(e,t){return{Authorization:`Bearer ${t}`,"Content-Type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function q(e,n){let r=new t(`COMMAND_FAILED`,e);return r.retryable=n,r}function J(e,t){return!!(e>=500||e===408||e===425||e===429||JSON.stringify(t).includes(`Metro companion is not connected`))}function Y(e){return!!(e&&typeof e==`object`&&`retryable`in e&&e.retryable===!0)}async function X(e){let t;try{t=await fetch(`${e.baseUrl}/api/metro/bridge`,{method:`POST`,headers:K(e.baseUrl,e.bearerToken),body:JSON.stringify({...e.scope,...e.runtime?{ios_runtime:e.runtime}:{},timeout_ms:e.timeoutMs}),signal:AbortSignal.timeout(e.timeoutMs)})}catch(t){throw t instanceof Error&&t.name===`TimeoutError`?q(`/api/metro/bridge timed out after ${e.timeoutMs}ms calling ${e.baseUrl}/api/metro/bridge`,!0):q(t instanceof Error?t.message:String(t),!0)}let n=Z(await t.text(),t.status,e.baseUrl);if(!t.ok)throw q(`/api/metro/bridge failed (${t.status}): ${JSON.stringify(n)}`,J(t.status,n));return ie(n)}function Z(e,t,n){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Expected a JSON object`);return t}catch(r){let i=e.slice(0,200);throw q(`/api/metro/bridge returned invalid JSON (${t}) from ${n}: ${r instanceof Error?r.message:String(r)}. body=${JSON.stringify(i)}`,J(t,e))}}function re(e){return{enabled:e.enabled,baseUrl:e.base_url,statusUrl:e.status_url??``,bundleUrl:e.bundle_url??``,iosRuntime:L(e.ios_runtime,`ios`),androidRuntime:L(e.android_runtime,`android`),upstream:{bundleUrl:e.upstream.bundle_url??``,host:e.upstream.host??``,port:e.upstream.port??0,statusUrl:e.upstream.status_url??``},probe:{reachable:e.probe.reachable,statusCode:e.probe.status_code,latencyMs:e.probe.latency_ms,detail:e.probe.detail}}}function ie(e){let t=e.data??e;if(!t||typeof t!=`object`||Array.isArray(t))throw q(`/api/metro/bridge returned malformed descriptor: Expected a JSON object.`,!1);try{return re(t)}catch(e){throw q(`/api/metro/bridge returned malformed descriptor: ${e instanceof Error?e.message:String(e)}`,!1)}}function Q(e,t,n,r,i){let a=[`Metro bridge is required for this run but could not be configured via ${e}/api/metro/bridge.`];return t&&a.push(`bridgeError=${t}`),n?.probe.reachable===!1&&a.push(`bridgeProbe=${n.probe.detail||`unreachable (status ${n.probe.statusCode||0})`}`),r&&r!==t&&a.push(`initialBridgeError=${r}`),i&&a.push(`metroCompanionLog=${i}`),a.join(` `)}function ae(e,n){if(!n?.iosRuntime.bundleUrl)throw new t(`COMMAND_FAILED`,Q(e,`bridge descriptor is missing ios_runtime.metro_bundle_url`,n))}function oe(e,n,r){let i=n||w(r.AGENT_DEVICE_METRO_BEARER_TOKEN)||``,a=i||e&&w(r.AGENT_DEVICE_DAEMON_AUTH_TOKEN)||``;if(e&&!a)throw new t(`INVALID_ARGS`,`metro prepare requires proxy auth when --proxy-base-url is provided. Pass --bearer-token or set AGENT_DEVICE_METRO_BEARER_TOKEN or AGENT_DEVICE_DAEMON_AUTH_TOKEN.`);if(!e&&i)throw new t(`INVALID_ARGS`,`metro prepare requires --proxy-base-url when proxy auth is provided.`);return{proxyEnabled:!!(e&&a),proxyBaseUrl:e,proxyBearerToken:a}}function se(e){if(!e?.tenantId||!e.runId||!e.leaseId)throw new t(`INVALID_ARGS`,`metro prepare with proxy requires tenantId, runId, and leaseId bridge scope.`);return e}function ce(e,n){if(!(e||n))throw new t(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`)}function le(e,t,n){return e.runtimeFilePath?T(e.runtimeFilePath,t,n):null}function ue(e,t,n,r){return T(e.logPath??p.join(r,`.agent-device`,`metro.log`),t,n)}function $(e){let t=e.env??process.env,n=process.cwd(),r=T(e.projectRoot??n,t,n),i=e.kind??`auto`,a=null,o;i===`auto`?(a=O(r),o=j(a,i)):o=i;let s=null;o===`repack`&&(a??=O(r),s=P(r,a));let c=C(e.publicBaseUrl),l=C(e.proxyBaseUrl);ce(c,l);let{proxyEnabled:u,proxyBaseUrl:d,proxyBearerToken:f}=oe(l,w(e.proxyBearerToken)??``,t);return{env:t,projectRoot:r,kind:o,repackBundler:s,metroPort:_(e.metroPort??8081,8081),listenHost:w(e.listenHost)??`0.0.0.0`,statusHost:w(e.statusHost)??`127.0.0.1`,publicBaseUrl:c,proxyBaseUrl:d,proxyBearerToken:f,bridgeScope:u?se(e.bridgeScope):null,startupTimeoutMs:F(e.startupTimeoutMs,18e4,3e4),probeTimeoutMs:F(e.probeTimeoutMs,1e4,1e3),reuseExisting:e.reuseExisting??!0,installProjectDeps:e.installDependenciesIfNeeded??!0,runtimeFilePath:le(e,t,n),logPath:ue(e,t,n,r)}}async function de(e,t,n){let r=Date.now()+t;for(;Date.now()<r;){let t=r-Date.now();if(await H(e,Math.min(n,Math.max(t,1))))return!0;let i=Math.min(500,Math.max(r-Date.now(),0));i>0&&await B(i)}return!1}async function fe(e){let n=Date.now()+e.startupTimeoutMs,r=null,i=null;for(;Date.now()<n;){try{let t=await X({baseUrl:e.baseUrl,bearerToken:e.bearerToken,scope:e.scope,runtime:e.runtime,timeoutMs:e.probeTimeoutMs});if(t.probe.reachable!==!1)return t;r=t,i=null}catch(n){if(i=n instanceof Error?n.message:String(n),!Y(n))throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath),void 0,n)}let a=Math.min(1e3,Math.max(n-Date.now(),0));a>0&&await B(a)}throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath))}async function pe(e){let n=`http://${e.statusHost}:${e.metroPort}/status`;if(e.reuseExisting&&await H(n,e.probeTimeoutMs))return{started:!1,reused:!0,pid:0,statusUrl:n};let r=W(e.projectRoot,e.kind,e.repackBundler,e.metroPort,e.listenHost,e.logPath,e.env);if(await de(n,e.startupTimeoutMs,e.probeTimeoutMs))return{started:!0,reused:!1,pid:r.pid,statusUrl:n};throw await G(r.pid).catch(()=>{}),new t(`COMMAND_FAILED`,`React Native dev server did not become ready at ${n} within ${e.startupTimeoutMs}ms. Check ${e.logPath}.`,{logPath:e.logPath})}async function me(e,t){let n=t.bridgeScope;if(!n)return null;let r=null,i=null;try{r=await X({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:n,timeoutMs:t.probeTimeoutMs})}catch(e){if(!Y(e))throw e;i=e instanceof Error?e.message:String(e)}return(!r||r.probe.reachable===!1)&&(r=await he(e,t,n,r,i)),ae(t.proxyBaseUrl,r),r}async function he(e,n,r,i,a){let o;try{o=(await c({projectRoot:n.projectRoot,serverBaseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,bridgeScope:r,localBaseUrl:`http://${n.statusHost}:${n.metroPort}`,launchUrl:w(e.launchUrl),profileKey:w(e.companionProfileKey),consumerKey:w(e.companionConsumerKey),env:n.env})).logPath}catch(e){throw new t(`COMMAND_FAILED`,Q(n.proxyBaseUrl,e instanceof Error?e.message:String(e),i,a),void 0,e)}try{return await fe({baseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,scope:r,probeTimeoutMs:n.probeTimeoutMs,startupTimeoutMs:n.startupTimeoutMs,initialBridgeError:a,companionLogPath:o})}catch(e){throw e instanceof Error?e:Error(String(e))}}function ge(e,t){return{baseIosRuntime:e?I(e,`ios`,t):{platform:`ios`},baseAndroidRuntime:e?I(e,`android`,t):{platform:`android`}}}function _e(e,t){e&&(f.mkdirSync(p.dirname(e),{recursive:!0}),f.writeFileSync(e,JSON.stringify(t,null,2)))}async function ve(e={}){let t=$(e),n=t.installProjectDeps?R(t.projectRoot,t.env):{installed:!1},r=await pe(t),{baseIosRuntime:i,baseAndroidRuntime:a}=ge(t.publicBaseUrl,t.kind),o=await me(e,t),s=o?.iosRuntime??i,c=o?.androidRuntime??a,l={projectRoot:t.projectRoot,kind:t.kind,dependenciesInstalled:n.installed,packageManager:n.packageManager??null,started:r.started,reused:r.reused,pid:r.pid,logPath:t.logPath,statusUrl:r.statusUrl,runtimeFilePath:t.runtimeFilePath,iosRuntime:s,androidRuntime:c,bridge:o};return _e(t.runtimeFilePath,l),l}function ye(e){let t=e.trimStart().slice(0,15).toLowerCase();return t.startsWith(`<!doctype`)||t.startsWith(`<html`)}async function be(e,n){await new Promise((r,i)=>{let a=new WebSocket(e),o=e=>{clearTimeout(s);try{a.close()}catch{}i(new t(`COMMAND_FAILED`,e))},s=setTimeout(()=>{o(`Timed out broadcasting reload to ${e} after ${n}ms`)},n);a.addEventListener(`open`,()=>{a.send(JSON.stringify({version:2,method:`reload`}));let e=()=>{if(a.bufferedAmount===0){clearTimeout(s),a.close(),r();return}setTimeout(e,20)};e()}),a.addEventListener(`error`,()=>{o(`Failed to reach the dev server message socket at ${e}`)})})}async function xe(e={}){let n=F(e.timeoutMs,1e4,1e3),{reloadUrl:r,messageSocketUrl:i}=v(e),a=await V(r,n);if(a.ok&&!ye(a.body))return{reloaded:!0,reloadUrl:r,status:a.status,body:a.body,transport:`http`};try{await be(i,n)}catch(e){throw new t(`COMMAND_FAILED`,`React Native dev server reload failed (${a.status}).`,{reloadUrl:r,status:a.status,body:a.body.slice(0,500),messageSocketUrl:i,hint:`Verify Metro or Re.Pack is running and the target React Native app is connected to this dev server instance.`},e instanceof Error?e:void 0)}return{reloaded:!0,reloadUrl:i,status:a.status,body:``,transport:`message-socket`}}export{xe as n,m as r,ve as t};
1
+ import{I as e,P as t}from"./sdk-contracts.js";import{L as n,N as r}from"./file.js";import{d as i,m as a}from"./exec.js";import{i as o}from"./retry.js";import"./command.js";import"./process.js";import{r as s,t as c}from"./runtime-transport-hints.js";import"./retry2.js";import{h as l,t as u}from"./base-url.js";import{n as d,t as f}from"./client-companion-tunnel.js";import{n as p,r as m}from"./project-runtime.js";import h from"node:fs";import g from"node:path";const _=8081;function v(e,n){if(e==null||e===``)return n;let r=Number.parseInt(String(e),10);if(!Number.isInteger(r)||r<1||r>65535)throw new t(`INVALID_ARGS`,`Invalid Metro port: ${String(e)}. Use 1-65535.`);return r}function y(e){let n=s(e.bundleUrl),r=n??e.runtime?.bundleUrl,i=c({bundleUrl:r,metroHost:s(e.metroHost)??(n?void 0:s(e.runtime?.metroHost))??(r?void 0:`localhost`),metroPort:e.metroPort===void 0?n?void 0:e.runtime?.metroPort??(r?void 0:_):v(e.metroPort,_)});if(!i)throw new t(`INVALID_ARGS`,`Unable to resolve Metro host and port for reload.`);return i}function ee(e){let t=y(e),n=t.pathname.replace(/\/+$/,``),r=new URL(t);r.pathname=`${n}/reload`;let i=new URL(t);return i.protocol=t.protocol===`https:`?`wss:`:`ws:`,i.pathname=`${n}/message`,{reloadUrl:r.toString(),messageSocketUrl:i.toString()}}const b={slug:`metro-companion`,runArg:l,displayName:`Metro companion`};async function te(e){return await f({...e,definition:b,registerPath:e.registerPath??`/api/metro/companion/register`})}async function x(e){return await d({...e,definition:b})}function S(e,t,n=`index.bundle`){let r=new URL(`${u(e)}/${n}`);return r.searchParams.set(`platform`,t),r.searchParams.set(`dev`,`true`),r.searchParams.set(`minify`,`false`),r.toString()}function C(e){return typeof e==`string`&&e.trim()?u(e.trim()):``}function w(e){return typeof e==`string`&&e.trim()?e.trim():void 0}function T(e,t,r){return n(e,{env:t,cwd:r})}function E(e){try{return h.accessSync(e,h.constants.F_OK),!0}catch{return!1}}function D(e){try{return h.statSync(e).isDirectory()}catch{return!1}}function O(e){let n=g.join(e,`package.json`),r=m(e);if(!r)throw new t(`INVALID_ARGS`,`package.json not found at ${n}`);return r}const k=[{file:`pnpm-lock.yaml`,command:`pnpm`},{file:`yarn.lock`,command:`yarn`},{file:`bun.lock`,command:`bun`},{file:`bun.lockb`,command:`bun`},{file:`package-lock.json`,command:`npm`}];function A(e){let t=e;for(;;){for(let{file:e,command:n}of k)if(E(g.join(t,e)))return{command:n,installArgs:[`install`]};if(E(g.join(t,`.git`)))return null;let e=g.dirname(t);if(e===t)return null;t=e}}function j(e){return A(e)??{command:`npm`,installArgs:[`install`]}}function M(e,t){if(t!==`auto`)return t;let n=p(e);return n===`expo`||n===`repack`?n:`react-native`}function N(e,t){return typeof{...e.dependencies??{},...e.devDependencies??{}}[t]==`string`}function P(e,t){return[`js`,`mjs`,`cjs`,`ts`,`mts`,`cts`].some(n=>E(g.join(e,`${t}.config.${n}`)))}function F(e,t){return P(e,`rspack`)?`rspack`:P(e,`webpack`)?`webpack`:N(t,`@rspack/core`)?`rspack`:N(t,`webpack`)?`webpack`:`rspack`}function I(e,t,n){if(e==null||e===``)return t;let r=Number.parseInt(String(e),10);return Number.isInteger(r)?Math.max(r,n):t}function ne(e){return e===`expo`?`.expo/.virtual-metro-entry.bundle`:`index.bundle`}function L(e,t,n){return{platform:t,bundleUrl:S(e,t,ne(n))}}function R(e,t){return{platform:t,metroHost:w(e?.metro_host),metroPort:e?.metro_port,bundleUrl:w(e?.metro_bundle_url),launchUrl:w(e?.launch_url)}}function z(e,t){if(D(g.join(e,`node_modules`)))return{installed:!1};let n=j(e);try{a(n.command,n.installArgs,{cwd:e,env:t})}catch(e){throw B(e,n)}return{installed:!0,packageManager:n.command}}function B(n,r){let i=e(n),a=`Dependency install failed using detected package manager "${r.command}". If dependencies are already installed (for example via a monorepo root install), pass --no-install-deps to skip this step, or install manually with "${r.command} ${r.installArgs.join(` `)}" from the project root.`;return new t(i.code,i.message,{...i.details??{},hint:a,packageManager:r.command},i)}async function V(e){await o(e)}async function H(e,n,r={}){try{let t=await fetch(e,{headers:r,signal:AbortSignal.timeout(n)});return{ok:t.ok,status:t.status,body:await t.text()}}catch(r){throw r instanceof Error&&r.name===`TimeoutError`?new t(`COMMAND_FAILED`,`Timed out fetching ${e} after ${n}ms`):r}}async function U(e,t){try{let n=await H(e,t);return n.ok&&n.body.includes(`packager-status:running`)}catch{return!1}}function W(e,t,n,r){return e===`expo`?{command:`npx`,installArgs:[`expo`,`start`,`--host`,`lan`,`--port`,String(n)]}:e===`repack`?{command:`npx`,installArgs:[`react-native`,t===`webpack`?`webpack-start`:`rspack-start`,`--host`,r,`--port`,String(n)]}:{command:`npx`,installArgs:[`react-native`,`start`,`--host`,r,`--port`,String(n)]}}function G(e,n,r,a,o,s,c){let l=W(n,r,a,o);h.mkdirSync(g.dirname(s),{recursive:!0});let u=h.openSync(s,`a`),d=0;try{d=i(l.command,l.installArgs,{cwd:e,env:c,stdio:[`ignore`,u,u]})}finally{h.closeSync(u)}if(!Number.isInteger(d)||d<=0)throw new t(`COMMAND_FAILED`,`Failed to start React Native dev server. Expected a detached child PID.`);return{pid:d}}async function K(e){if(!(!Number.isInteger(e)||e<=0)){try{process.kill(e,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await r(e,1e3)){try{process.kill(e,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await r(e,1e3)}}}function q(e,t){return{Authorization:`Bearer ${t}`,"Content-Type":`application/json`,...e.includes(`ngrok`)?{"ngrok-skip-browser-warning":`1`}:{}}}function J(e,n){let r=new t(`COMMAND_FAILED`,e);return r.retryable=n,r}function Y(e,t){return!!(e>=500||e===408||e===425||e===429||JSON.stringify(t).includes(`Metro companion is not connected`))}function X(e){return!!(e&&typeof e==`object`&&`retryable`in e&&e.retryable===!0)}async function Z(e){let t;try{t=await fetch(`${e.baseUrl}/api/metro/bridge`,{method:`POST`,headers:q(e.baseUrl,e.bearerToken),body:JSON.stringify({...e.scope,...e.runtime?{ios_runtime:e.runtime}:{},timeout_ms:e.timeoutMs}),signal:AbortSignal.timeout(e.timeoutMs)})}catch(t){throw t instanceof Error&&t.name===`TimeoutError`?J(`/api/metro/bridge timed out after ${e.timeoutMs}ms calling ${e.baseUrl}/api/metro/bridge`,!0):J(t instanceof Error?t.message:String(t),!0)}let n=re(await t.text(),t.status,e.baseUrl);if(!t.ok)throw J(`/api/metro/bridge failed (${t.status}): ${JSON.stringify(n)}`,Y(t.status,n));return ae(n)}function re(e,t,n){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))throw Error(`Expected a JSON object`);return t}catch(r){let i=e.slice(0,200);throw J(`/api/metro/bridge returned invalid JSON (${t}) from ${n}: ${r instanceof Error?r.message:String(r)}. body=${JSON.stringify(i)}`,Y(t,e))}}function ie(e){return{enabled:e.enabled,baseUrl:e.base_url,statusUrl:e.status_url??``,bundleUrl:e.bundle_url??``,iosRuntime:R(e.ios_runtime,`ios`),androidRuntime:R(e.android_runtime,`android`),upstream:{bundleUrl:e.upstream.bundle_url??``,host:e.upstream.host??``,port:e.upstream.port??0,statusUrl:e.upstream.status_url??``},probe:{reachable:e.probe.reachable,statusCode:e.probe.status_code,latencyMs:e.probe.latency_ms,detail:e.probe.detail}}}function ae(e){let t=e.data??e;if(!t||typeof t!=`object`||Array.isArray(t))throw J(`/api/metro/bridge returned malformed descriptor: Expected a JSON object.`,!1);try{return ie(t)}catch(e){throw J(`/api/metro/bridge returned malformed descriptor: ${e instanceof Error?e.message:String(e)}`,!1)}}function Q(e,t,n,r,i){let a=[`Metro bridge is required for this run but could not be configured via ${e}/api/metro/bridge.`];return t&&a.push(`bridgeError=${t}`),n?.probe.reachable===!1&&a.push(`bridgeProbe=${n.probe.detail||`unreachable (status ${n.probe.statusCode||0})`}`),r&&r!==t&&a.push(`initialBridgeError=${r}`),i&&a.push(`metroCompanionLog=${i}`),a.join(` `)}function oe(e,n){if(!n?.iosRuntime.bundleUrl)throw new t(`COMMAND_FAILED`,Q(e,`bridge descriptor is missing ios_runtime.metro_bundle_url`,n))}function se(e,n,r){let i=n||w(r.AGENT_DEVICE_METRO_BEARER_TOKEN)||``,a=i||e&&w(r.AGENT_DEVICE_DAEMON_AUTH_TOKEN)||``;if(e&&!a)throw new t(`INVALID_ARGS`,`metro prepare requires proxy auth when --proxy-base-url is provided. Pass --bearer-token or set AGENT_DEVICE_METRO_BEARER_TOKEN or AGENT_DEVICE_DAEMON_AUTH_TOKEN.`);if(!e&&i)throw new t(`INVALID_ARGS`,`metro prepare requires --proxy-base-url when proxy auth is provided.`);return{proxyEnabled:!!(e&&a),proxyBaseUrl:e,proxyBearerToken:a}}function ce(e){if(!e?.tenantId||!e.runId||!e.leaseId)throw new t(`INVALID_ARGS`,`metro prepare with proxy requires tenantId, runId, and leaseId bridge scope.`);return e}function le(e,n){if(!(e||n))throw new t(`INVALID_ARGS`,`metro prepare requires --public-base-url <url> or --proxy-base-url <url>.`)}function ue(e,t,n){return e.runtimeFilePath?T(e.runtimeFilePath,t,n):null}function de(e,t,n,r){return T(e.logPath??g.join(r,`.agent-device`,`metro.log`),t,n)}function fe(e){let t=e.env??process.env,n=process.cwd(),r=T(e.projectRoot??n,t,n),i=e.kind??`auto`,a=null,o;i===`auto`?(a=O(r),o=M(a,i)):o=i;let s=null;o===`repack`&&(a??=O(r),s=F(r,a));let c=C(e.publicBaseUrl),l=C(e.proxyBaseUrl);le(c,l);let{proxyEnabled:u,proxyBaseUrl:d,proxyBearerToken:f}=se(l,w(e.proxyBearerToken)??``,t);return{env:t,projectRoot:r,kind:o,repackBundler:s,metroPort:v(e.metroPort??8081,8081),listenHost:w(e.listenHost)??`0.0.0.0`,statusHost:w(e.statusHost)??`127.0.0.1`,publicBaseUrl:c,proxyBaseUrl:d,proxyBearerToken:f,bridgeScope:u?ce(e.bridgeScope):null,startupTimeoutMs:I(e.startupTimeoutMs,18e4,3e4),probeTimeoutMs:I(e.probeTimeoutMs,1e4,1e3),reuseExisting:e.reuseExisting??!0,installProjectDeps:e.installDependenciesIfNeeded??!0,runtimeFilePath:ue(e,t,n),logPath:de(e,t,n,r)}}async function pe(e,t,n){let r=Date.now()+t;for(;Date.now()<r;){let t=r-Date.now();if(await U(e,Math.min(n,Math.max(t,1))))return!0;let i=Math.min(500,Math.max(r-Date.now(),0));i>0&&await V(i)}return!1}async function me(e){let n=Date.now()+e.startupTimeoutMs,r=null,i=null;for(;Date.now()<n;){try{let t=await Z({baseUrl:e.baseUrl,bearerToken:e.bearerToken,scope:e.scope,runtime:e.runtime,timeoutMs:e.probeTimeoutMs});if(t.probe.reachable!==!1)return t;r=t,i=null}catch(n){if(i=n instanceof Error?n.message:String(n),!X(n))throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath),void 0,n)}let a=Math.min(1e3,Math.max(n-Date.now(),0));a>0&&await V(a)}throw new t(`COMMAND_FAILED`,Q(e.baseUrl,i,r,e.initialBridgeError,e.companionLogPath))}async function he(e){let n=`http://${e.statusHost}:${e.metroPort}/status`;if(e.reuseExisting&&await U(n,e.probeTimeoutMs))return{started:!1,reused:!0,pid:0,statusUrl:n};let r=G(e.projectRoot,e.kind,e.repackBundler,e.metroPort,e.listenHost,e.logPath,e.env);if(await pe(n,e.startupTimeoutMs,e.probeTimeoutMs))return{started:!0,reused:!1,pid:r.pid,statusUrl:n};throw await K(r.pid).catch(()=>{}),new t(`COMMAND_FAILED`,`React Native dev server did not become ready at ${n} within ${e.startupTimeoutMs}ms. Check ${e.logPath}.`,{logPath:e.logPath})}async function ge(e,t){let n=t.bridgeScope;if(!n)return null;let r=null,i=null;try{r=await Z({baseUrl:t.proxyBaseUrl,bearerToken:t.proxyBearerToken,scope:n,timeoutMs:t.probeTimeoutMs})}catch(e){if(!X(e))throw e;i=e instanceof Error?e.message:String(e)}return(!r||r.probe.reachable===!1)&&(r=await $(e,t,n,r,i)),oe(t.proxyBaseUrl,r),r}async function $(e,n,r,i,a){let o;try{o=(await te({projectRoot:n.projectRoot,serverBaseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,bridgeScope:r,localBaseUrl:`http://${n.statusHost}:${n.metroPort}`,launchUrl:w(e.launchUrl),profileKey:w(e.companionProfileKey),consumerKey:w(e.companionConsumerKey),env:n.env})).logPath}catch(e){throw new t(`COMMAND_FAILED`,Q(n.proxyBaseUrl,e instanceof Error?e.message:String(e),i,a),void 0,e)}try{return await me({baseUrl:n.proxyBaseUrl,bearerToken:n.proxyBearerToken,scope:r,probeTimeoutMs:n.probeTimeoutMs,startupTimeoutMs:n.startupTimeoutMs,initialBridgeError:a,companionLogPath:o})}catch(e){throw e instanceof Error?e:Error(String(e))}}function _e(e,t){return{baseIosRuntime:e?L(e,`ios`,t):{platform:`ios`},baseAndroidRuntime:e?L(e,`android`,t):{platform:`android`}}}function ve(e,t){e&&(h.mkdirSync(g.dirname(e),{recursive:!0}),h.writeFileSync(e,JSON.stringify(t,null,2)))}async function ye(e={}){let t=fe(e),n=t.installProjectDeps?z(t.projectRoot,t.env):{installed:!1},r=await he(t),{baseIosRuntime:i,baseAndroidRuntime:a}=_e(t.publicBaseUrl,t.kind),o=await ge(e,t),s=o?.iosRuntime??i,c=o?.androidRuntime??a,l={projectRoot:t.projectRoot,kind:t.kind,dependenciesInstalled:n.installed,packageManager:n.packageManager??null,started:r.started,reused:r.reused,pid:r.pid,logPath:t.logPath,statusUrl:r.statusUrl,runtimeFilePath:t.runtimeFilePath,iosRuntime:s,androidRuntime:c,bridge:o};return ve(t.runtimeFilePath,l),l}function be(e){let t=e.trimStart().slice(0,15).toLowerCase();return t.startsWith(`<!doctype`)||t.startsWith(`<html`)}async function xe(e,n){await new Promise((r,i)=>{let a=new WebSocket(e),o=e=>{clearTimeout(s);try{a.close()}catch{}i(new t(`COMMAND_FAILED`,e))},s=setTimeout(()=>{o(`Timed out broadcasting reload to ${e} after ${n}ms`)},n);a.addEventListener(`open`,()=>{a.send(JSON.stringify({version:2,method:`reload`}));let e=()=>{if(a.bufferedAmount===0){clearTimeout(s),a.close(),r();return}setTimeout(e,20)};e()}),a.addEventListener(`error`,()=>{o(`Failed to reach the dev server message socket at ${e}`)})})}async function Se(e={}){let n=I(e.timeoutMs,1e4,1e3),{reloadUrl:r,messageSocketUrl:i}=ee(e),a=await H(r,n);if(a.ok&&!be(a.body))return{reloaded:!0,reloadUrl:r,status:a.status,body:a.body,transport:`http`};try{await xe(i,n)}catch(e){throw new t(`COMMAND_FAILED`,`React Native dev server reload failed (${a.status}).`,{reloadUrl:r,status:a.status,body:a.body.slice(0,500),messageSocketUrl:i,hint:`Verify Metro or Re.Pack is running and the target React Native app is connected to this dev server instance.`},e instanceof Error?e:void 0)}return{reloaded:!0,reloadUrl:i,status:a.status,body:``,transport:`message-socket`}}export{y as a,x as i,Se as n,S as r,ye as t};
@@ -1,7 +1,8 @@
1
- import { B as SnapshotViewportSize, D as IosTargetActivation, E as AppleApplicationState, K as DaemonError, L as SnapshotQualityVerdict, M as SnapshotCommandOptionFields, N as SnapshotKeyboardBandFact, P as SnapshotNode, S as DeviceTarget, T as PublicPlatform, V as SnapshotVisibility, Y as NormalizedError, _ as SessionIsolationMode, a as DaemonRequest, f as LeaseBackend, g as ResponseLevel, i as DaemonLockPolicy, m as NetworkIncludeMode, o as DaemonResponse, r as DaemonInstallSource, s as DaemonResponseData, t as DaemonArtifact, v as SessionRuntimeHints, w as PlatformSelector, x as DeviceKind, y as AppleOS, z as SnapshotUnchanged } from "./sdk-contracts.js";
2
- import { n as GesturePointerCount, s as AppsFilter } from "./gesture-plan-types.js";
3
- import { A as BackMode, C as SwipePattern, D as FoldPose, E as DeviceRotation, O as FoldScreenCoordinateSpace, S as ScrollInputDirection, T as TransformGestureParams, _ as TextSizeCategory, c as SnapshotDiagnosticsSummary, d as MOBILE_PERMISSION_TARGETS, f as PermissionAction, i as AndroidSnapshotBackendMetadata, k as SetFoldPoseInput, l as SessionSurface, o as FindLocator, p as PermissionMode, r as CloudProviderSessionResult, s as ScreenshotResultData, t as AgentArtifactsResult, u as MACOS_PERMISSION_TARGETS, v as TvRemoteButton, w as SwipePreset, x as ScrollDirection, y as ScrollCommandResult } from "./cloud-artifacts.js";
1
+ import { B as SnapshotUnchanged, D as IosSnapshotObservation, E as AppleApplicationState, F as SnapshotNode, H as SnapshotVisibility, N as SnapshotCommandOptionFields, O as IosTargetActivation, P as SnapshotKeyboardBandFact, R as SnapshotQualityVerdict, S as DeviceTarget, T as PublicPlatform, V as SnapshotViewportSize, X as NormalizedError, _ as SessionIsolationMode, a as DaemonRequest, f as LeaseBackend, g as ResponseLevel, i as DaemonLockPolicy, m as NetworkIncludeMode, o as DaemonResponse, q as DaemonError, r as DaemonInstallSource, s as DaemonResponseData, t as DaemonArtifact, v as SessionRuntimeHints, w as PlatformSelector, x as DeviceKind, y as AppleOS } from "./sdk-contracts.js";
2
+ import { t as AppsFilter } from "./app-inventory.js";
3
+ import { A as SetFoldPoseInput, C as ScrollInputDirection, D as DeviceRotation, E as TransformGestureParams, O as FoldPose, S as ScrollDirection, T as SwipePreset, a as AndroidSnapshotBackendMetadata, b as ScrollCommandResult, c as ScreenshotResultData, d as MACOS_PERMISSION_TARGETS, f as MOBILE_PERMISSION_TARGETS, i as CloudProviderSessionResult, j as BackMode, k as FoldScreenCoordinateSpace, l as SnapshotDiagnosticsSummary, m as PermissionMode, p as PermissionAction, s as FindLocator, t as AgentArtifactsResult, u as SessionSurface, v as TextSizeCategory, w as SwipePattern, y as TvRemoteButton } from "./cloud-artifacts.js";
4
4
  import { _ as PressCommandResponseData, f as ClickCommandResponseData, g as LongPressCommandResponseData, h as HoverCommandResponseData, m as FindCommandResponseData, p as FillCommandResponseData, v as SettleObservation, y as ClickButton } from "./sdk-selectors.js";
5
+ import { n as GesturePointerCount } from "./gesture-plan-types.js";
5
6
  import { a as RemoteConnectionProfileFields, c as MetroPrepareResult, i as CloudProviderProfileFields, l as MetroReloadOptions, s as MetroPrepareOptions, u as MetroReloadResult } from "./sdk-remote-config.js";
6
7
  import { t as BatchRunResult } from "./sdk-batch-runner.js";
7
8
  //#region packages/contracts/src/json.d.ts
@@ -57,7 +58,7 @@ type AgentDeviceClientConfig = RemoteConnectionProfileFields & CloudProviderProf
57
58
  iosXctestDerivedDataPath?: string;
58
59
  iosXctestEnvDir?: string;
59
60
  };
60
- type AgentDeviceRequestOverrides = Pick<AgentDeviceClientConfig, 'session' | 'lockPolicy' | 'lockPlatform' | 'requestId' | 'daemonBaseUrl' | 'daemonAuthToken' | 'daemonTransport' | 'daemonServerMode' | 'tenant' | 'sessionIsolation' | 'runId' | 'leaseId' | 'leaseBackend' | 'leaseProvider' | 'deviceKey' | 'clientId' | 'providerApp' | 'providerOsVersion' | 'providerProject' | 'providerBuild' | 'providerSessionName' | 'providerDeviceOrientation' | 'providerGeoLocation' | 'providerTimezone' | 'providerAppiumVersion' | 'providerLanguage' | 'providerLocale' | 'providerNetworkProfile' | 'providerCustomNetwork' | 'providerNoResignApp' | 'awsProjectArn' | 'awsDeviceArn' | 'awsAppArn' | 'awsRegion' | 'awsInteractionMode' | 'leaseTtlMs' | 'cwd' | 'debug' | 'cost' | 'responseLevel' | 'iosXctestrunFile' | 'iosXctestDerivedDataPath' | 'iosXctestEnvDir'> & {
61
+ type AgentDeviceRequestOverrides = Pick<AgentDeviceClientConfig, 'session' | 'lockPolicy' | 'lockPlatform' | 'requestId' | 'daemonBaseUrl' | 'daemonAuthToken' | 'daemonTransport' | 'daemonServerMode' | 'tenant' | 'sessionIsolation' | 'runId' | 'leaseId' | 'leaseBackend' | 'leaseProvider' | 'deviceKey' | 'clientId' | 'providerApp' | 'providerOsVersion' | 'providerDeviceType' | 'providerProject' | 'providerBuild' | 'providerSessionName' | 'providerDeviceOrientation' | 'providerGeoLocation' | 'providerTimezone' | 'providerAppiumVersion' | 'providerLanguage' | 'providerLocale' | 'providerNetworkProfile' | 'providerCustomNetwork' | 'providerNoResignApp' | 'awsProjectArn' | 'awsDeviceArn' | 'awsAppArn' | 'awsRegion' | 'awsInteractionMode' | 'leaseTtlMs' | 'cwd' | 'debug' | 'cost' | 'responseLevel' | 'iosXctestrunFile' | 'iosXctestDerivedDataPath' | 'iosXctestEnvDir'> & {
61
62
  /**
62
63
  * Cancels this one call. Already aborted: the call rejects without sending anything
63
64
  * (`details.dispatched: 'no'`). Aborted in flight: the request's connection closes, the daemon
@@ -363,8 +364,9 @@ type SnapshotCaptureAnnotations = {
363
364
  warnings?: string[];
364
365
  /** The Apple runner re-activated the session app while serving this capture (#2682). */
365
366
  targetActivation?: IosTargetActivation;
367
+ observation?: IosSnapshotObservation;
366
368
  };
367
- type PublicSnapshotCaptureAnnotations = Pick<SnapshotCaptureAnnotations, 'androidSnapshot' | 'warnings' | 'targetActivation'> & {
369
+ type PublicSnapshotCaptureAnnotations = Pick<SnapshotCaptureAnnotations, 'androidSnapshot' | 'warnings' | 'targetActivation' | 'observation'> & {
368
370
  snapshotQuality?: SnapshotQualityVerdict;
369
371
  };
370
372
  //#endregion
@@ -582,6 +584,8 @@ type FillOptions = DeviceCommandBaseOptions & SelectorSnapshotCommandOptions & I
582
584
  delayMs?: number;
583
585
  /** Publish this fill value as `${VAR}` when script recording is armed. */
584
586
  recordAs?: string;
587
+ /** The text came from the CLI's stdin; keep it out of diagnostics and recorded actions. */
588
+ textStdin?: boolean;
585
589
  verify?: boolean;
586
590
  };
587
591
  type PinchOptions = DeviceCommandBaseOptions & {
@@ -954,8 +958,12 @@ type SettingsUpdateOptions = (DeviceCommandBaseOptions & {
954
958
  permission: PermissionTarget;
955
959
  mode?: PermissionMode;
956
960
  /**
957
- * The app the permission changes, by bundle id or package name. Without it the app bound to
958
- * the session is used; with it no app has to be running or open, because `simctl privacy` and
961
+ * The app the permission changes, by bundle id, package name, or app name, resolved as `open`
962
+ * resolves it: an iOS simulator matches display names and accepts only an installed bundle
963
+ * id, Android accepts only an installed package and matches other names against installed
964
+ * package names, and a Limrun iOS session resolves only the `settings` alias. One that
965
+ * resolves to nothing is refused with `app_not_installed`. Without it the app bound to the
966
+ * session is used; with it no app has to be running or open, because `simctl privacy` and
959
967
  * Android's `pm` need only the id. macOS permissions are host-level TCC grants, so naming an
960
968
  * app there is refused rather than dropped.
961
969
  */
@@ -1,4 +1,4 @@
1
- import { B as SnapshotViewportSize, L as SnapshotQualityVerdict, P as SnapshotNode, R as SnapshotState, T as PublicPlatform, j as ScreenshotOverlayRef, n as DaemonArtifactType } from "./sdk-contracts.js";
1
+ import { D as IosSnapshotObservation, F as SnapshotNode, M as ScreenshotOverlayRef, R as SnapshotQualityVerdict, T as PublicPlatform, V as SnapshotViewportSize, n as DaemonArtifactType, z as SnapshotState } from "./sdk-contracts.js";
2
2
  import { v as SettleObservation } from "./sdk-selectors.js";
3
3
  //#region packages/contracts/src/back-mode.d.ts
4
4
  declare const BACK_MODES: readonly ['in-app', 'system'];
@@ -295,6 +295,7 @@ type BackendSnapshotResult = {
295
295
  };
296
296
  quality?: SnapshotQualityVerdict;
297
297
  warnings?: string[];
298
+ observation?: IosSnapshotObservation;
298
299
  };
299
300
  type AndroidSnapshotBackendMetadata = {
300
301
  backend: 'android-helper';
@@ -399,4 +400,4 @@ type CloudArtifactProvider = {
399
400
  listCloudArtifacts?: (query: CloudArtifactsQuery) => Promise<CloudArtifactsResult | undefined>;
400
401
  };
401
402
  //#endregion
402
- export { BackMode as A, SwipePattern as C, FoldPose as D, DeviceRotation as E, FoldScreenCoordinateSpace as O, ScrollInputDirection as S, TransformGestureParams as T, TextSizeCategory as _, BackendSnapshotResult as a, ScrollExecutionOptions as b, SnapshotDiagnosticsSummary as c, MOBILE_PERMISSION_TARGETS as d, PermissionAction as f, SettingOptions as g, ReadableSetting as h, AndroidSnapshotBackendMetadata as i, SetFoldPoseInput as k, SessionSurface as l, ReadSettingResult as m, CloudArtifactProvider as n, FindLocator as o, PermissionMode as p, CloudProviderSessionResult as r, ScreenshotResultData as s, AgentArtifactsResult as t, MACOS_PERMISSION_TARGETS as u, TvRemoteButton as v, SwipePreset as w, ScrollDirection as x, ScrollCommandResult as y };
403
+ export { SetFoldPoseInput as A, ScrollInputDirection as C, DeviceRotation as D, TransformGestureParams as E, FoldPose as O, ScrollDirection as S, SwipePreset as T, SettingOptions as _, AndroidSnapshotBackendMetadata as a, ScrollCommandResult as b, ScreenshotResultData as c, MACOS_PERMISSION_TARGETS as d, MOBILE_PERMISSION_TARGETS as f, ReadableSetting as g, ReadSettingResult as h, CloudProviderSessionResult as i, BackMode as j, FoldScreenCoordinateSpace as k, SnapshotDiagnosticsSummary as l, PermissionMode as m, CloudArtifactProvider as n, BackendSnapshotResult as o, PermissionAction as p, CloudArtifactsResult as r, FindLocator as s, AgentArtifactsResult as t, SessionSurface as u, TextSizeCategory as v, SwipePattern as w, ScrollExecutionOptions as x, TvRemoteButton as y };
@@ -1 +1 @@
1
- import{j as e}from"./owner-identity.js";import"./file.js";import{a as t,r as n,s as r,t as i}from"./code-signature.js";import a from"node:crypto";import o from"node:fs";import s from"node:os";import c from"node:path";function l(e,a){let o=t(a),s=t(e),c=v(s,o),l=i(o,s),d=u(c,o,l);if(d)return n(d.files);let p;try{p=r(s,o)}catch{return`unknown`}return f(p.files,l)&&_(c,p),n(p.files)}function u(e,t,n){let r=p(e);if(!(!r||!f(r.files,n))){for(let[e,n,i]of r.files){let r=d(c.resolve(t,e));if(!r?.isFile()||r.size!==n||Math.trunc(r.mtimeMs)!==i)return}for(let e of r.absentPaths)if(d(c.resolve(t,e))?.isFile())return;return r}}function d(e){try{return o.statSync(e)}catch{return}}function f(e,t){return e.some(([e])=>e===t)}function p(e){let t=m(e);if(!t)return;let n=[];for(let e of t.files){let t=g(e);if(!t)return;n.push(t)}if(t.absent.every(e=>typeof e==`string`))return{files:n,absentPaths:t.absent}}function m(e){let t=h(e);if(t===void 0)return;let n;try{n=JSON.parse(t)}catch{return}if(!n||typeof n!=`object`)return;let r=n;if(r.version===2&&!(!Array.isArray(r.files)||!Array.isArray(r.absent)))return{files:r.files,absent:r.absent}}function h(e){let t;try{t=o.openSync(e,`r`)}catch{return}try{let e=process.getuid?.();return e!==void 0&&o.fstatSync(t).uid!==e?void 0:o.readFileSync(t,`utf8`)}catch{return}finally{o.closeSync(t)}}function g(e){if(!Array.isArray(e)||e.length!==3)return;let[t,n,r]=e;if(typeof t==`string`&&typeof n==`number`&&typeof r==`number`)return[t,n,r]}function _(t,n){let r={version:2,files:[...n.files],absent:[...n.absentPaths]};try{o.mkdirSync(c.dirname(t),{recursive:!0,mode:448}),e({destination:t,contents:JSON.stringify(r),mode:384})}catch{}}function v(e,t){let n=a.createHash(`sha1`).update(`${t} ${e}`).digest(`hex`),r=`agent-device-code-signature-${process.getuid?.()??`user`}`;return c.join(s.tmpdir(),r,`${n}.json`)}export{l as resolveCachedDaemonCodeSignature};
1
+ import{z as e}from"./file.js";import{a as t,r as n,s as r,t as i}from"./code-signature.js";import a from"node:crypto";import o from"node:fs";import s from"node:os";import c from"node:path";function l(e,a){let o=t(a),s=t(e),c=v(s,o),l=i(o,s),d=u(c,o,l);if(d)return n(d.files);let p;try{p=r(s,o)}catch{return`unknown`}return f(p.files,l)&&_(c,p),n(p.files)}function u(e,t,n){let r=p(e);if(!(!r||!f(r.files,n))){for(let[e,n,i]of r.files){let r=d(c.resolve(t,e));if(!r?.isFile()||r.size!==n||Math.trunc(r.mtimeMs)!==i)return}for(let e of r.absentPaths)if(d(c.resolve(t,e))?.isFile())return;return r}}function d(e){try{return o.statSync(e)}catch{return}}function f(e,t){return e.some(([e])=>e===t)}function p(e){let t=m(e);if(!t)return;let n=[];for(let e of t.files){let t=g(e);if(!t)return;n.push(t)}if(t.absent.every(e=>typeof e==`string`))return{files:n,absentPaths:t.absent}}function m(e){let t=h(e);if(t===void 0)return;let n;try{n=JSON.parse(t)}catch{return}if(!n||typeof n!=`object`)return;let r=n;if(r.version===2&&!(!Array.isArray(r.files)||!Array.isArray(r.absent)))return{files:r.files,absent:r.absent}}function h(e){let t;try{t=o.openSync(e,`r`)}catch{return}try{let e=process.getuid?.();return e!==void 0&&o.fstatSync(t).uid!==e?void 0:o.readFileSync(t,`utf8`)}catch{return}finally{o.closeSync(t)}}function g(e){if(!Array.isArray(e)||e.length!==3)return;let[t,n,r]=e;if(typeof t==`string`&&typeof n==`number`&&typeof r==`number`)return[t,n,r]}function _(t,n){let r={version:2,files:[...n.files],absent:[...n.absentPaths]};try{o.mkdirSync(c.dirname(t),{recursive:!0,mode:448}),e({destination:t,contents:JSON.stringify(r),mode:384})}catch{}}function v(e,t){let n=a.createHash(`sha1`).update(`${t} ${e}`).digest(`hex`),r=`agent-device-code-signature-${process.getuid?.()??`user`}`;return c.join(s.tmpdir(),r,`${n}.json`)}export{l as resolveCachedDaemonCodeSignature};
@@ -1 +1 @@
1
- import{r as e,s as t}from"./version.js";import n from"node:crypto";import r from"node:fs";import i from"node:path";const a=/(['"])(\.\.?\/[^'"]*)\1/g,o=/(['"])(@[^'"/\s]+\/[^'"\s]+)\1/g,s=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`];function c(){let e=process.argv[1];return e?u(e):`unknown`}function l(n=e()){return t(n)?`checkout`:`installed`}function u(t,n=e()){try{return g(d(t,n).files)}catch{return`unknown`}}function d(e,t){let n=h(t),i=[h(e)],a=new Set,o=[],s=new Set,c={root:n,packages:new Map,absentPaths:s,stamp:e=>{if(a.has(e))return!1;a.add(e);let t=r.statSync(e);if(!t.isFile())return!1;let i=m(n,e);return o.push([i,t.size,Math.trunc(t.mtimeMs)]),!0},follow:e=>{for(let t of e.missedCandidates)s.add(m(n,t));e.filePath&&i.push(e.filePath)}};for(;i.length>0;){let e=i.pop();if(e===void 0||a.has(e)||!c.stamp(e))continue;let t=r.readFileSync(e,`utf8`);for(let n of _(t))c.follow(w(e,n));f(t,c)}return{files:o,absentPaths:[...s]}}function f(e,t){for(let n of v(e)){let{name:e,subpath:r}=y(n),i=p(e,t);if(!i)continue;let a=S(i.manifest,r);a!==void 0&&t.follow(w(i.manifestPath,a))}}function p(e,t){let n=t.packages.get(e);if(n!==void 0)return n;let r=b(t.root,e,t.absentPaths);return t.packages.set(e,r),r&&t.stamp(r.manifestPath),r}function m(e,t){let n=i.resolve(t);return i.relative(i.resolve(e),n)||n}function h(e){try{return r.realpathSync.native(e)}catch{return i.resolve(e)}}function g(e){let t=e.map(([e,t,n])=>`${e}:${t}:${n}`).sort().join(`|`),r=n.createHash(`sha1`).update(t).digest(`hex`);return`graph:${e.length}:${r}`}function _(e){let t=new Set;a.lastIndex=0;let n=null;for(;(n=a.exec(e))!==null;)t.add(n[2]);return[...t]}function v(e){let t=new Set;o.lastIndex=0;let n=null;for(;(n=o.exec(e))!==null;)t.add(n[2]);return[...t]}function y(e){let t=e.split(`/`),n=t.slice(2).join(`/`);return{name:t.slice(0,2).join(`/`),subpath:n?`./${n}`:`.`}}function b(e,t,n){let a=i.join(e,`node_modules`,t,`package.json`);if(!E(a))return n.add(m(e,a)),null;let o=h(a);if(x(e,o))return null;try{return{manifestPath:o,manifest:JSON.parse(r.readFileSync(o,`utf8`))}}catch{return null}}function x(e,t){let n=i.relative(i.join(e,`node_modules`),t);return n!==``&&!n.startsWith(`..`)&&!i.isAbsolute(n)}function S(e,t){if(!e||typeof e!=`object`)return;let n=e.exports;if(!n||typeof n!=`object`)return;let r=n[t],i=typeof r==`string`?r:C(r);return typeof i==`string`&&i.startsWith(`.`)?i:void 0}function C(e){if(!(!e||typeof e!=`object`))return e.default}function w(e,t){let n=i.resolve(i.dirname(e),t),r=[];for(let e of T(n)){if(E(e))return{filePath:e,missedCandidates:r};r.push(e)}return{filePath:null,missedCandidates:r}}function*T(e){yield e;for(let t of s)yield`${e}${t}`;for(let t of s)yield i.join(e,`index${t}`)}function E(e){try{return r.statSync(e).isFile()}catch{return!1}}export{h as a,l as i,u as n,c as o,g as r,d as s,m as t};
1
+ import{c as e,r as t}from"./version.js";import n from"node:crypto";import r from"node:fs";import i from"node:path";const a=/(['"])(\.\.?\/[^'"]*)\1/g,o=/(['"])(@[^'"/\s]+\/[^'"\s]+)\1/g,s=[`.ts`,`.tsx`,`.js`,`.jsx`,`.mjs`,`.cjs`];function c(){let e=process.argv[1];return e?u(e):`unknown`}function l(n=t()){return e(n)?`checkout`:`installed`}function u(e,n=t()){try{return g(d(e,n).files)}catch{return`unknown`}}function d(e,t){let n=h(t),i=[h(e)],a=new Set,o=[],s=new Set,c={root:n,packages:new Map,absentPaths:s,stamp:e=>{if(a.has(e))return!1;a.add(e);let t=r.statSync(e);if(!t.isFile())return!1;let i=m(n,e);return o.push([i,t.size,Math.trunc(t.mtimeMs)]),!0},follow:e=>{for(let t of e.missedCandidates)s.add(m(n,t));e.filePath&&i.push(e.filePath)}};for(;i.length>0;){let e=i.pop();if(e===void 0||a.has(e)||!c.stamp(e))continue;let t=r.readFileSync(e,`utf8`);for(let n of _(t))c.follow(w(e,n));f(t,c)}return{files:o,absentPaths:[...s]}}function f(e,t){for(let n of v(e)){let{name:e,subpath:r}=y(n),i=p(e,t);if(!i)continue;let a=S(i.manifest,r);a!==void 0&&t.follow(w(i.manifestPath,a))}}function p(e,t){let n=t.packages.get(e);if(n!==void 0)return n;let r=b(t.root,e,t.absentPaths);return t.packages.set(e,r),r&&t.stamp(r.manifestPath),r}function m(e,t){let n=i.resolve(t);return i.relative(i.resolve(e),n)||n}function h(e){try{return r.realpathSync.native(e)}catch{return i.resolve(e)}}function g(e){let t=e.map(([e,t,n])=>`${e}:${t}:${n}`).sort().join(`|`),r=n.createHash(`sha1`).update(t).digest(`hex`);return`graph:${e.length}:${r}`}function _(e){let t=new Set;a.lastIndex=0;let n=null;for(;(n=a.exec(e))!==null;)t.add(n[2]);return[...t]}function v(e){let t=new Set;o.lastIndex=0;let n=null;for(;(n=o.exec(e))!==null;)t.add(n[2]);return[...t]}function y(e){let t=e.split(`/`),n=t.slice(2).join(`/`);return{name:t.slice(0,2).join(`/`),subpath:n?`./${n}`:`.`}}function b(e,t,n){let a=i.join(e,`node_modules`,t,`package.json`);if(!E(a))return n.add(m(e,a)),null;let o=h(a);if(x(e,o))return null;try{return{manifestPath:o,manifest:JSON.parse(r.readFileSync(o,`utf8`))}}catch{return null}}function x(e,t){let n=i.relative(i.join(e,`node_modules`),t);return n!==``&&!n.startsWith(`..`)&&!i.isAbsolute(n)}function S(e,t){if(!e||typeof e!=`object`)return;let n=e.exports;if(!n||typeof n!=`object`)return;let r=n[t],i=typeof r==`string`?r:C(r);return typeof i==`string`&&i.startsWith(`.`)?i:void 0}function C(e){if(!(!e||typeof e!=`object`))return e.default}function w(e,t){let n=i.resolve(i.dirname(e),t),r=[];for(let e of T(n)){if(E(e))return{filePath:e,missedCandidates:r};r.push(e)}return{filePath:null,missedCandidates:r}}function*T(e){yield e;for(let t of s)yield`${e}${t}`;for(let t of s)yield i.join(e,`index${t}`)}function E(e){try{return r.statSync(e).isFile()}catch{return!1}}export{h as a,l as i,u as n,c as o,g as r,d as s,m as t};