agent-device 0.21.24 → 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 (379) hide show
  1. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk +0 -0
  2. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.25.apk.sha256 +1 -0
  3. package/android/ime-helper/dist/{agent-device-android-ime-helper-0.21.24.manifest.json → agent-device-android-ime-helper-0.21.25.manifest.json} +4 -4
  4. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk +0 -0
  5. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.apk.sha256 +1 -0
  6. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.25.manifest.json +16 -0
  7. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunner/AgentDeviceRunnerApp.m +159 -4
  8. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerHttpRequestFraming.swift +139 -0
  9. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerPeer.swift +41 -0
  10. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerListenerToken.swift +25 -0
  11. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Environment.swift +18 -11
  12. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Navigation.swift +25 -1
  13. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+SynthesizedTextEntry.swift +0 -3
  14. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntry.swift +1 -3
  15. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextEntryConfirmation.swift +59 -26
  16. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TextTyping.swift +47 -103
  17. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+Transport.swift +142 -54
  18. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests+TypeExecution.swift +4 -1
  19. package/dist/apple/runner/AgentDeviceRunner/AgentDeviceRunnerUITests/RunnerTests.swift +21 -19
  20. package/dist/src/absence-observation-errors.js +1 -0
  21. package/dist/src/adapter.js +1 -1
  22. package/dist/src/adb-executor.js +2 -2
  23. package/dist/src/adb-failure.js +2 -2
  24. package/dist/src/agent-browser-lifecycle.js +1 -1
  25. package/dist/src/agent-browser-process-record.js +1 -1
  26. package/dist/src/agent-browser-provider.js +1 -1
  27. package/dist/src/agent-browser-tool.js +1 -1
  28. package/dist/src/agent-device-client.js +2 -2
  29. package/dist/src/android-adb.js +1 -1
  30. package/dist/src/android-input-ownership.js +1 -1
  31. package/dist/src/android-system-surface-disclosure.js +1 -0
  32. package/dist/src/android-text-entry.js +1 -0
  33. package/dist/src/android.js +1 -1
  34. package/dist/src/app-backend.js +1 -1
  35. package/dist/src/app-helpers.js +1 -1
  36. package/dist/src/app-launch.js +1 -1
  37. package/dist/src/app-lifecycle.js +4 -3
  38. package/dist/src/app-lifecycle2.js +2 -2
  39. package/dist/src/app-log-files.js +1 -1
  40. package/dist/src/app-log-reconnect.js +1 -1
  41. package/dist/src/app-log-runtime2.js +3 -3
  42. package/dist/src/app-resolution-facade.js +1 -1
  43. package/dist/src/app-resolution.js +2 -2
  44. package/dist/src/apple-runner-platform.js +1 -1
  45. package/dist/src/artifact-download.js +1 -1
  46. package/dist/src/auth.js +1 -1
  47. package/dist/src/aws-device-farm-connection.js +1 -1
  48. package/dist/src/back-mode.js +1 -1
  49. package/dist/src/boot-diagnostics.js +1 -1
  50. package/dist/src/browserstack-connection.js +1 -1
  51. package/dist/src/capture-disclosure.js +1 -0
  52. package/dist/src/cli-config.js +1 -1
  53. package/dist/src/cli-help.js +17 -14
  54. package/dist/src/cli-output.js +1 -1
  55. package/dist/src/cli-runner.js +3 -1
  56. package/dist/src/cli.js +3 -3
  57. package/dist/src/client-companion-tunnel.js +1 -1
  58. package/dist/src/client-metro.js +1 -1
  59. package/dist/src/client-types.d.ts +8 -2
  60. package/dist/src/code-signature-cache.js +1 -1
  61. package/dist/src/code-signature.js +1 -1
  62. package/dist/src/command-metadata.js +73 -1
  63. package/dist/src/command-policy.js +1 -0
  64. package/dist/src/command-schema.js +3 -3
  65. package/dist/src/command-surface.js +1 -1
  66. package/dist/src/command-tools.js +2 -2
  67. package/dist/src/connection-runtime.js +1 -1
  68. package/dist/src/connection-verification.js +1 -1
  69. package/dist/src/connection.js +3 -3
  70. package/dist/src/contracts.js +1 -1
  71. package/dist/src/daemon-client-lease-beat.js +1 -1
  72. package/dist/src/daemon-client-lifecycle.js +1 -1
  73. package/dist/src/daemon-client-liveness-probe.js +1 -1
  74. package/dist/src/daemon-policy-file.js +1 -1
  75. package/dist/src/daemon-registration-owner.js +1 -1
  76. package/dist/src/daemon-registration.js +1 -1
  77. package/dist/src/daemon-resolution.js +3 -1
  78. package/dist/src/debug-symbols-facade.js +1 -1
  79. package/dist/src/device-claim-inspection.js +1 -1
  80. package/dist/src/device-input-state.d.ts +5 -3
  81. package/dist/src/device-inventory-context.js +1 -1
  82. package/dist/src/device-readiness-runtime.js +1 -1
  83. package/dist/src/device-release.js +1 -1
  84. package/dist/src/device-shell.js +1 -1
  85. package/dist/src/device.js +3 -1
  86. package/dist/src/devicectl.js +1 -1
  87. package/dist/src/diagnostics.js +1 -1
  88. package/dist/src/doctor-facade.js +1 -1
  89. package/dist/src/durable-capture-resource.js +1 -1
  90. package/dist/src/durable-resource.js +1 -1
  91. package/dist/src/engine-eval-script.js +1 -1
  92. package/dist/src/error.js +1 -1
  93. package/dist/src/exec.js +1 -1
  94. package/dist/src/expo-dev-client-launch.js +1 -0
  95. package/dist/src/file.js +3 -1
  96. package/dist/src/find.js +1 -1
  97. package/dist/src/finders.js +1 -1
  98. package/dist/src/generic-settle.js +1 -1
  99. package/dist/src/generic.js +1 -1
  100. package/dist/src/gesture-plan.js +1 -1
  101. package/dist/src/gesture-runtime.js +1 -1
  102. package/dist/src/harmonyos.js +1 -1
  103. package/dist/src/hdc.js +1 -1
  104. package/dist/src/helper.js +2 -2
  105. package/dist/src/human-control.js +1 -1
  106. package/dist/src/ime-rebind.js +1 -1
  107. package/dist/src/ime-state.js +1 -1
  108. package/dist/src/index.d.ts +1 -1
  109. package/dist/src/index.js +1 -1
  110. package/dist/src/input-actions.js +1 -1
  111. package/dist/src/input-actions2.js +2 -2
  112. package/dist/src/install-source-network-transport.js +1 -1
  113. package/dist/src/install-source2.js +1 -1
  114. package/dist/src/interaction-error.js +1 -0
  115. package/dist/src/interaction-positionals.js +1 -1
  116. package/dist/src/interaction.js +1 -1
  117. package/dist/src/interaction2.js +1 -1
  118. package/dist/src/interactor-operation-catalog.js +1 -1
  119. package/dist/src/interactor.js +5 -5
  120. package/dist/src/interactor2.js +1 -1
  121. package/dist/src/internal/bin.js +1 -1
  122. package/dist/src/internal/daemon.js +5 -1
  123. package/dist/src/internal/png-worker.js +1 -1
  124. package/dist/src/inventory.js +2 -2
  125. package/dist/src/inventory6.js +1 -1
  126. package/dist/src/io.d.ts +2 -2
  127. package/dist/src/ios-client.js +1 -1
  128. package/dist/src/ios-settings.js +1 -1
  129. package/dist/src/ios-snapshot-acquisition.js +1 -1
  130. package/dist/src/ios-snapshot-adapter.js +1 -1
  131. package/dist/src/ios-snapshot-engine.js +1 -1
  132. package/dist/src/ios-snapshot-runtime.js +1 -1
  133. package/dist/src/keyed-lock.js +1 -1
  134. package/dist/src/launch-confirmation.js +1 -1
  135. package/dist/src/lease.js +1 -1
  136. package/dist/src/limrun-runtime-dependencies.js +1 -1
  137. package/dist/src/limrun.d.ts +2 -10
  138. package/dist/src/limrun.js +1 -1
  139. package/dist/src/linux.js +1 -1
  140. package/dist/src/load.js +1 -1
  141. package/dist/src/local-interactor-operation-set.js +1 -1
  142. package/dist/src/log-stream.js +9 -9
  143. package/dist/src/mechanics.js +16 -16
  144. package/dist/src/metro.js +1 -1
  145. package/dist/src/metro2.js +1 -1
  146. package/dist/src/mobile-snapshot-semantics.js +1 -1
  147. package/dist/src/observability.js +1 -1
  148. package/dist/src/open-target-resolution.js +1 -1
  149. package/dist/src/output-path.js +1 -1
  150. package/dist/src/overlay.js +1 -3
  151. package/dist/src/perf-facade.js +1 -1
  152. package/dist/src/perf-runtime-operation-builder.js +1 -1
  153. package/dist/src/perf-runtime.js +1 -1
  154. package/dist/src/physical-device-control.js +1 -1
  155. package/dist/src/platform-request-scope.js +1 -1
  156. package/dist/src/platform-runtime-android-adb-host.js +1 -1
  157. package/dist/src/platform-runtime-app-log-android-transport.js +1 -1
  158. package/dist/src/platform-runtime-apple-resources.js +1 -0
  159. package/dist/src/platform-runtime-claim-recovery.js +1 -0
  160. package/dist/src/platform-runtime-daemon-services.js +1 -0
  161. package/dist/src/platform-runtime-host.js +1 -1
  162. package/dist/src/platform-runtime-network-web-transport.js +1 -1
  163. package/dist/src/platform-runtime-open-target.js +1 -1
  164. package/dist/src/platform-runtime-operation-host.js +4 -4
  165. package/dist/src/platform-runtime-runtime-hints.js +2 -2
  166. package/dist/src/platform-runtime-screen-recording-android-host.js +1 -1
  167. package/dist/src/platform-runtime-screen-recording-apple-runner-transport.js +1 -1
  168. package/dist/src/platform-runtime-screen-recording-apple-simulator-host.js +1 -1
  169. package/dist/src/platform-runtime-screen-recording-harmony-host.js +1 -1
  170. package/dist/src/platform-runtime-screen-recording-web-host.js +1 -1
  171. package/dist/src/platform-runtime-unavailable.js +1 -1
  172. package/dist/src/platform-runtime.js +1 -1
  173. package/dist/src/platform-runtime2.js +1 -1
  174. package/dist/src/plugin.js +1 -1
  175. package/dist/src/png-crop-bytes.js +1 -1
  176. package/dist/src/png-resize.js +1 -0
  177. package/dist/src/png-worker-client.js +1 -1
  178. package/dist/src/png-worker-contract.js +1 -1
  179. package/dist/src/process-entry.js +1 -1
  180. package/dist/src/process.js +1 -1
  181. package/dist/src/provider-credential-fingerprint.js +1 -1
  182. package/dist/src/provider-device-admission.js +1 -1
  183. package/dist/src/provider-policy.js +1 -1
  184. package/dist/src/provider-webdriver.js +1 -1
  185. package/dist/src/proxy.js +2 -2
  186. package/dist/src/quality-warnings.js +1 -1
  187. package/dist/src/react-native-overlay2.js +3 -0
  188. package/dist/src/react-native.js +1 -1
  189. package/dist/src/record-runtime.js +1 -1
  190. package/dist/src/record-trace.js +1 -1
  191. package/dist/src/recording.js +2 -2
  192. package/dist/src/register-builtins.js +1 -1
  193. package/dist/src/remote-config-core.js +1 -1
  194. package/dist/src/replay-backend-registry.js +1 -0
  195. package/dist/src/replay-divergence.js +1 -1
  196. package/dist/src/replay-maestro-backend.js +117 -0
  197. package/dist/src/replay-script-selection.js +1 -0
  198. package/dist/src/replay.js +1 -3
  199. package/dist/src/replay2.js +1 -0
  200. package/dist/src/reporting.js +3 -3
  201. package/dist/src/request-cancel.js +1 -1
  202. package/dist/src/request-providers.js +1 -1
  203. package/dist/src/request-runtime-binding.js +1 -1
  204. package/dist/src/result-serialization.js +1 -1
  205. package/dist/src/retry.js +1 -1
  206. package/dist/src/runner-cache-retention.js +1 -1
  207. package/dist/src/runner-cache-trim.js +1 -1
  208. package/dist/src/runner-client.js +1 -1
  209. package/dist/src/runner-dev-tools-security.js +1 -1
  210. package/dist/src/runner-device-readiness.js +1 -1
  211. package/dist/src/runner-device-set.js +1 -1
  212. package/dist/src/runner-error-classification.js +3 -3
  213. package/dist/src/runner-exchange.js +1 -1
  214. package/dist/src/runner-lease.js +1 -1
  215. package/dist/src/runner-operations-facade.js +1 -1
  216. package/dist/src/runner-retention.js +1 -0
  217. package/dist/src/runner-start-budget.js +1 -1
  218. package/dist/src/runner-startup-transport.js +1 -0
  219. package/dist/src/runner-toolchain-probe.js +1 -1
  220. package/dist/src/runner.js +2 -1
  221. package/dist/src/runtime-command-surface.js +1 -0
  222. package/dist/src/runtime-deployment.js +1 -1
  223. package/dist/src/runtime-factory.js +1 -0
  224. package/dist/src/runtime-session.js +1 -0
  225. package/dist/src/runtime-transport-hints.js +1 -1
  226. package/dist/src/runtime.js +2 -1
  227. package/dist/src/runtime10.js +2 -1
  228. package/dist/src/runtime2.js +5 -2
  229. package/dist/src/runtime3.js +1 -5
  230. package/dist/src/runtime4.js +5 -1
  231. package/dist/src/runtime5.js +1 -5
  232. package/dist/src/runtime6.js +1 -1
  233. package/dist/src/runtime7.js +1 -1
  234. package/dist/src/runtime8.js +1 -1
  235. package/dist/src/runtime9.js +1 -1
  236. package/dist/src/screenshot-image.js +1 -1
  237. package/dist/src/screenshot-runtime.js +1 -0
  238. package/dist/src/screenshot3.js +5 -5
  239. package/dist/src/sdk-batch-runner.js +2 -2
  240. package/dist/src/sdk-batch.js +1 -1
  241. package/dist/src/sdk-contracts.js +2 -2
  242. package/dist/src/sdk-finders.js +1 -1
  243. package/dist/src/sdk-io.d.ts +4 -2
  244. package/dist/src/sdk-selectors.d.ts +4 -5
  245. package/dist/src/sdk-selectors.js +1 -1
  246. package/dist/src/selection.js +0 -0
  247. package/dist/src/selector-pipeline-policy.js +1 -1
  248. package/dist/src/selector-runtime.js +1 -1
  249. package/dist/src/selectors.js +1 -1
  250. package/dist/src/server.js +2 -2
  251. package/dist/src/session-allocation.js +1 -1
  252. package/dist/src/session-replay-runtime-failure-response.js +1 -0
  253. package/dist/src/session-runtime-admission.js +1 -0
  254. package/dist/src/session.js +1 -1
  255. package/dist/src/session2.js +5 -5
  256. package/dist/src/settings.js +1 -1
  257. package/dist/src/settings2.js +1 -1
  258. package/dist/src/simctl-settings.js +1 -1
  259. package/dist/src/simulator.js +1 -1
  260. package/dist/src/snapshot-chrome.js +1 -0
  261. package/dist/src/snapshot-desktop-projection.js +1 -1
  262. package/dist/src/snapshot-evidence.js +1 -0
  263. package/dist/src/snapshot-node-lookup.js +1 -0
  264. package/dist/src/snapshot-occlusion.js +1 -0
  265. package/dist/src/snapshot-quality-verdict.js +1 -0
  266. package/dist/src/snapshot-runtime-binding.js +1 -1
  267. package/dist/src/snapshot-runtime.js +1 -1
  268. package/dist/src/snapshot-state.js +1 -1
  269. package/dist/src/snapshot.js +1 -1
  270. package/dist/src/snapshot2.js +1 -1
  271. package/dist/src/snapshot3.js +1 -1
  272. package/dist/src/src.js +5 -1
  273. package/dist/src/src2.js +1 -1
  274. package/dist/src/src3.js +2 -1
  275. package/dist/src/store.js +1 -1
  276. package/dist/src/surface-snapshot2.js +1 -1
  277. package/dist/src/target-evidence-tree.js +1 -0
  278. package/dist/src/target-evidence.js +1 -1
  279. package/dist/src/text-entry-focus.js +1 -1
  280. package/dist/src/tool-provider2.js +1 -1
  281. package/dist/src/touch-runtime.js +1 -1
  282. package/dist/src/touch-runtime2.js +1 -1
  283. package/dist/src/tree.js +1 -1
  284. package/dist/src/tv-remote.js +1 -1
  285. package/dist/src/type-text-runtime.js +1 -1
  286. package/dist/src/undici.js +8 -8
  287. package/dist/src/update-check.js +1 -1
  288. package/dist/src/vars.js +2 -0
  289. package/dist/src/version.js +1 -1
  290. package/dist/src/video.js +2 -2
  291. package/dist/src/wait.js +1 -0
  292. package/dist/src/web.js +1 -1
  293. package/dist/src/web2.js +1 -1
  294. package/package.json +9 -11
  295. package/server.json +2 -2
  296. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk +0 -0
  297. package/android/ime-helper/dist/agent-device-android-ime-helper-0.21.24.apk.sha256 +0 -1
  298. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk +0 -0
  299. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.apk.sha256 +0 -1
  300. package/android/snapshot-helper/dist/agent-device-android-snapshot-helper-0.21.24.manifest.json +0 -16
  301. package/dist/src/adb-transport.js +0 -1
  302. package/dist/src/alert-runtime.js +0 -1
  303. package/dist/src/app-deployment-resolution.js +0 -2
  304. package/dist/src/app-inventory-contract.js +0 -1
  305. package/dist/src/app-log-session-resource.js +0 -1
  306. package/dist/src/application-lifecycle-runtime.js +0 -1
  307. package/dist/src/auth-session.js +0 -1
  308. package/dist/src/browserstack-device-features.js +0 -1
  309. package/dist/src/browserstack.js +0 -1
  310. package/dist/src/cache.js +0 -1
  311. package/dist/src/capture.js +0 -1
  312. package/dist/src/catalog.js +0 -1
  313. package/dist/src/click-button.js +0 -1
  314. package/dist/src/client-metro-companion.js +0 -1
  315. package/dist/src/client-options.js +0 -3
  316. package/dist/src/daemon-client-transport.js +0 -1
  317. package/dist/src/daemon-http.js +0 -1
  318. package/dist/src/device-rotation.js +0 -1
  319. package/dist/src/device-session.js +0 -3
  320. package/dist/src/device2.js +0 -1
  321. package/dist/src/device3.js +0 -3
  322. package/dist/src/dispatch-resolve.js +0 -4
  323. package/dist/src/format.js +0 -2
  324. package/dist/src/gesture-plan-types.js +0 -1
  325. package/dist/src/host.js +0 -1
  326. package/dist/src/ime-settings-record.js +0 -1
  327. package/dist/src/interaction-ref-policy.js +0 -1
  328. package/dist/src/interactor-operation-binding.js +0 -1
  329. package/dist/src/keyboard-actions.js +0 -1
  330. package/dist/src/lease-context.js +0 -1
  331. package/dist/src/lease-registry-scope.js +0 -1
  332. package/dist/src/lease-scope.js +0 -1
  333. package/dist/src/managed-device-scope.js +0 -1
  334. package/dist/src/manifest.js +0 -1
  335. package/dist/src/observe-until.js +0 -1
  336. package/dist/src/output-common.js +0 -5
  337. package/dist/src/owner-identity.js +0 -3
  338. package/dist/src/path-resolution.js +0 -1
  339. package/dist/src/perf-runtime-plan.js +0 -1
  340. package/dist/src/platform-runtime-app-log-process.js +0 -1
  341. package/dist/src/platform-runtime-managed-owner.js +0 -1
  342. package/dist/src/platform-runtime-screen-recording-process-host.js +0 -1
  343. package/dist/src/png.js +0 -1
  344. package/dist/src/provider-session-ownership.js +0 -2
  345. package/dist/src/providers.js +0 -1
  346. package/dist/src/registry.js +0 -68
  347. package/dist/src/remote-connection-state.js +0 -1
  348. package/dist/src/request-admission.js +0 -1
  349. package/dist/src/request-cancellation.js +0 -1
  350. package/dist/src/request-progress-protocol.js +0 -1
  351. package/dist/src/runner-cache-metadata.js +0 -2
  352. package/dist/src/runner-disposal.js +0 -1
  353. package/dist/src/runner-session-types.js +0 -1
  354. package/dist/src/runtime-admission.js +0 -1
  355. package/dist/src/runtime11.js +0 -2
  356. package/dist/src/screen-recording-resource-recovery.js +0 -1
  357. package/dist/src/screenshot-result.js +0 -1
  358. package/dist/src/script.js +0 -1
  359. package/dist/src/scroll-command.js +0 -1
  360. package/dist/src/scroll-gesture.js +0 -1
  361. package/dist/src/scroll-indicator.js +0 -1
  362. package/dist/src/session-artifact-paths.js +0 -1
  363. package/dist/src/session-paths.js +0 -1
  364. package/dist/src/session-repair-tombstone.js +0 -1
  365. package/dist/src/session-snapshot.js +0 -1
  366. package/dist/src/snapshot-private-evidence.js +0 -1
  367. package/dist/src/snapshot4.js +0 -1
  368. package/dist/src/src4.js +0 -1
  369. package/dist/src/src5.js +0 -1
  370. package/dist/src/src6.js +0 -1
  371. package/dist/src/src7.js +0 -2
  372. package/dist/src/src8.js +0 -115
  373. package/dist/src/string-enum.js +0 -1
  374. package/dist/src/success-text.js +0 -1
  375. package/dist/src/transport.js +0 -3
  376. package/dist/src/ttl-memo.js +0 -1
  377. package/dist/src/verified-file.js +0 -1
  378. package/dist/src/window-state.js +0 -1
  379. /package/dist/src/{doctor-output.js → doctor-lines.js} +0 -0
package/dist/src/cli.js CHANGED
@@ -1,4 +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{R as l}from"./registry.js";import{a as u,i as d,l as f,n as p,o as m,r as h}from"./diagnostics.js";import"./diagnostics2.js";import{n as g,r as ee}from"./agent-device-client.js";import{s as te,t as ne,u as re}from"./sdk-batch.js";import{i as ie,r as _,t as v}from"./catalog.js";import{n as y,r as b}from"./back-mode.js";import{n as ae}from"./command-metadata.js";import{t as oe}from"./session-artifact-paths.js";import{a as se}from"./version.js";import{t as x}from"./daemon-resolution.js";import{r as S,t as ce}from"./command-schema.js";import{i as C,r as w,t as le}from"./cli-config.js";import{t as ue}from"./update-check.js";import{n as de,r as fe,t as pe}from"./cli-command-aliases.js";import{exitAfterFlush as T}from"./process-exit.js";import{_ as me,m as he,v as ge}from"./remote-connection-state.js";import{i as _e}from"./auth-session.js";import E from"node:fs";import{pathToFileURL as ve}from"node:url";const D=`open <app> --relaunch`,ye={start:{command:`open`,example:D},restart:{command:`open`,example:D},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 be(e){if(e.length<=2)return[];let t=ie(),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:Se(e,t)})).filter(t=>t.distance<=xe(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 xe(e){return e.length<4?1:e.length<=6?2:3}function Se(e,t){return e===t?0:e.startsWith(t)||t.startsWith(e)?Math.abs(e.length-t.length):A(e,t)}function A(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 j(e){let t=e.toLowerCase(),n=ye[t]?.example;if(n)return n;let r=be(t);if(r.length!==0)return r.length===1?r[0]:`one of: ${r.join(`, `)}`}const Ce=new Set([`--bundle-id`,`--bundleid`,`--bundle`,`--package`,`--package-name`,`--packagename`,`--app-id`,`--appid`,`--pkg`]),we=new Set([`--session-locked`,`--session-lock-conflicts`]),Te={"--output":`--out`,"--path":`--out`};function Ee(e,t){let n=e.toLowerCase(),r=Te[n];if(r&&De(r,t))return r;let i=Oe(n,t);if(i.length!==0)return i.length===1?i[0]:`one of: ${i.join(`, `)}`}function De(e,t){let n=b().find(t=>t.names.includes(e));return n?C(n.key,t):!1}function Oe(e,t){let n=M(e);if(n.length<=2)return[];let r=ke(t),i=r.filter(e=>M(e).startsWith(n));return i.length>0?i.sort(O).slice(0,3):k(n,r.map(e=>M(e))).map(e=>`--${e}`)}function ke(e){let t=new Set;for(let n of b()){if(!C(n.key,e))continue;let r=n.names[0];r&&t.add(r)}return[...t]}function M(e){return e.replace(/^--?/,``)}function Ae(e,t){let n=e.toLowerCase();if(Ce.has(n))return`Unknown flag: ${e}. The app or bundle id is a positional argument, e.g. ${D}.`;if(we.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=Ee(e,t);return r?`Unknown flag: ${e}. Did you mean ${r}?`:`Unknown flag: ${e}`}function N(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=R(l));continue}if(Pe(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=R(l));continue}let[f,p]=u?P(l):[l,void 0];if(Me(r,f))continue;let m=Fe(f,r);if(Ne(r,m)){a.push(l);continue}if(!m){if(Be(r,a,l)){r?a.push(l):r=l;continue}throw new n(`INVALID_ARGS`,Ae(f,r))}let h=Re(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 je(i,t),{command:r,positionals:a,flags:t,warnings:o,providedFlags:s}}function je(e,t){if(e)for(let n of pe(e)?.impliedFlags??[])t[n]=!0}function Me(e,t){return t===`-c`&&(e===`snapshot`||e===`diff`)}function Ne(e,t){return e===`react-devtools`?!t||!C(t.key,e):!1}function Pe(e){return e===`cdp`}function Fe(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=>C(e.key,t));if(e)return e}return y(e)}function Ie(e,t){let r=t?.strictFlags??!0,i=[...e.warnings],a=w({json:!1,help:!1,version:!1},t?.defaultFlags??{});if(w(a,e.flags),e.command&&!_(e.command)&&!a.help){let t=j(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=Ke(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=We(e);if(s.length>0){let t=Ge(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]);Ue(e,a),Le(e),re(e.command,a);let c=He({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 Le(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 P(e){let t=e.indexOf(`=`);return t===-1?[e,void 0]:[e.slice(0,t),e.slice(t+1)]}function Re(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||I(i)?{value:!0,consumeNext:!1}:ze(i)?{value:i,consumeNext:!0}:{value:!0,consumeNext:!1}}let a=r??i;if(a===void 0||r===void 0&&I(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 ${F(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 ${F(t)}: ${a}`);return{value:e.type===`int`?Math.floor(o):o,consumeNext:r===void 0}}function F(e){return e.replace(/^-+/,``)}function I(e){if(!e.startsWith(`-`)||e===`-`)return!1;let[t]=e.startsWith(`--`)?P(e):[e,void 0];return y(t)!==void 0}function ze(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 Be(e,t,n){if(!Ve(n)||!e)return!1;let r=S(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 Ve(e){return/^-\d+(\.\d+)?$/.test(e)}function He(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 Ue(e,t){let n=S(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 We(e){let t=S(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 Ge(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 Ke(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 L(){let{buildUsageText:e}=await import(`./cli-help.js`).then(e=>e.n);return e()}async function qe(e){let{buildCommandUsageText:t}=await import(`./cli-help.js`).then(e=>e.n);return t(R(e))}function R(e){let t=fe(e);if(t)throw new n(`INVALID_ARGS`,t);return de(e)}function Je(){return{renderedToStderr:!1}}function Ye(e){return t=>{t.type===`command`&&(e.renderedToStderr=!0,process.stderr.write(`${t.message}\n`))}}function Xe(e){return ae(e)}const Ze={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 z(e){let t={...e.flags},n=Ze[e.command];return n&&await(await n())({...e,flags:t})?!0:Xe(e.command)?await Qe({...e,command:e.command,flags:t}):!1}async function Qe(e){let{runGenericClientBackedCommand:t}=await import(`./generic.js`);return await t(e)}const B=`${s} Run agent-device help batch for the commands batch accepts and for runnable step examples.`,$e=`${ne} Run agent-device help batch for the commands batch accepts and for runnable step examples.`;function et(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)=>tt(e,t+1))}function tt(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})}l(r,[`command`,`input`,`runtime`],`Batch step ${t}`,B);let s=c(r.runtime,t);return{command:te(r.command,t,$e),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??rt(t.AGENT_DEVICE_PLATFORM),r=at(e.configuredSession??t.AGENT_DEVICE_SESSION);return{defaultPlatform:n,lockPolicy:nt(e.policyOverrides,t,r)}}function nt(e,t,n){let r=e?.sessionLock??it(t.AGENT_DEVICE_SESSION_LOCK);if(r)return r;if(n)return`reject`}function rt(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 it(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 at(e){return typeof e==`string`&&e.trim().length>0}function ot(e,t){let n=N(e),r=t?.env??process.env,i=t?.cwd??process.cwd(),a=st(n.command)?me({remoteConfig:n.flags.remoteConfig,cwd:i,env:r}):{},o=w(le({command:n.command,cwd:i,cliFlags:n.flags,env:r}),a);return{...Ie(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)),lt={sendToDaemon:ee},ut=new Set([`launchUrl`,`kind`,`metroBearerToken`,`metroKind`,`metroListenHost`,`metroNoInstallDeps`,`metroNoReuseExisting`,`metroPreparePort`,`metroProbeTimeoutMs`,`metroProjectRoot`,`metroProxyBaseUrl`,`metroPublicBaseUrl`,`metroRuntimeFile`,`metroStartupTimeoutMs`,`metroStatusHost`]),dt=new Set([`connect`,`connection`,`close`,`daemon`,`plugins`,`device`,`disconnect`,`metro`,`proxy`,`session`,`takeover`]);async function G(e,t=lt){let n=p(),r=se(),i=xt(e),a=e.includes(`--json`),o=Nt(e)??process.env.AGENT_DEVICE_SESSION??`default`;await f({session:o,requestId:n,command:e[0],debug:i},async()=>{let{parsed:o,command:s,positionals:c}=await ft(e,{version:r,jsonRequested:a,debugEnabled:i}),l=Z(s,o.providedFlags),u=await pt(o,{command:s,positionals:c,requestId:n,debugOutputEnabled:l});K(u.effectiveFlags);let d=null;try{if(s===`react-devtools`){await T(await mt(u,t));return}if(s===`web`){let{runWebCommand:e}=await import(`./web.js`);await T(await e(c,{flags:u.effectiveFlags,stateDir:u.daemonPaths.baseDir}));return}if(ue({command:s,currentVersion:r,stateDir:u.daemonPaths.baseDir,flags:u.effectiveFlags}),await ht(u,t),K(u.effectiveFlags),s===`cdp`){await T(await ge(c,{flags:u.effectiveFlags,runtime:u.resolvedRuntime,cwd:process.cwd(),env:process.env}));return}d=gt(u);let e=await _t(u),n=Je();await vt(u,g(q(u),{transport:Mt({command:s,flags:u.effectiveFlags,replayTestReporterRuntime:e,commandProgress:n,transport:t.sendToDaemon})}),e,n)}catch(e){await yt(e,u,d)}finally{d&&d()}})}function K(e){e.daemonAuthToken&&m(e.daemonAuthToken)}async function ft(e,r){let i;try{i=ot(e,{cwd:process.cwd(),env:process.env})}catch(e){h({level:`error`,phase:`cli_parse_failed`,data:{error:e instanceof Error?e.message:String(e)}});let n=t(e,{diagnosticId:u().diagnosticId,logPath:d({force:!0})?.path});return r.jsonRequested?await W({success:!1,error:n}):await U(n,{showDetails:r.debugEnabled}),T(1)}for(let e of i.warnings)process.stderr.write(`Warning: ${e}\n`);if(i.flags.version)return process.stdout.write(`${r.version}\n`),T(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.`)),T(1);let e=a?i.positionals[0]:i.command;if(!e)return process.stdout.write(`${await L()}\n`),T(0);let t=await qe(e);return t?(process.stdout.write(t),T(0)):(await U(new n(`INVALID_ARGS`,St(e))),process.stdout.write(`${await L()}\n`),T(1))}return i.command?{parsed:i,command:i.command,positionals:i.positionals}:(process.stdout.write(`${await L()}\n`),T(1))}async function pt(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=x(t.stateDir),o=t.session??`default`,s=Tt({command:r.command,explicitFlagKeys:i,stateDir:a.baseDir,session:o,remoteConfig:t.remoteConfig,hasResolvedSession:t.session!==void 0}),c=s?At(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:u().diagnosticId,logPath:d({force:!0})?.path});return n.flags.json?await W({success:!1,error:o}):await U(o,{showDetails:r.debugOutputEnabled}),T(1)}}async function mt(e,t){let{runReactDevtoolsCommand:n}=await import(`./react-devtools.js`),{daemonAuthToken:i,...a}=e.effectiveFlags;return await n(e.positionals,{flags:{...a,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 ct({route:`react-devtools`,command:v.runtime,request:{positionals:[`port-reverse`],flags:{...a,leaseProvider:e.connectionDefaults?.connection?.leaseProvider,devicePort:8097,hostPort:8097,portReverseName:`react-devtools`},session:e.effectiveFlags.session??e.sessionName},transport:t.sendToDaemon,transportOptions:{authToken:i}});n.ok||r(n.error)}})}async function ht(e,t){if(e.command===`batch`){if(e.positionals.length>0)throw new n(`INVALID_ARGS`,`batch does not accept positional arguments.`);e.parsedBatchSteps=Ct(e.flags)}if(Dt(e.command)&&(e.effectiveFlags=(await _e({command:e.command,flags:e.effectiveFlags,stateDir:e.daemonPaths.baseDir,env:process.env})).flags),e.effectiveFlags.remoteConfig&&Et(e.command)){let n=g(q(e),{transport:Q(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:jt(e.explicitFlagKeys)});e.effectiveFlags=i.flags,e.resolvedRuntime=i.runtime,e.connectionMetadata=i.connection}Ot({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 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,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 gt(e){let t=e.effectiveFlags.daemonBaseUrl;return e.debugOutputEnabled&&!e.effectiveFlags.json&&!t?Pt(e.daemonPaths.logPath):null}async function _t(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 vt(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 z({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 z({command:a,positionals:o,flags:s,client:t,debug:e.debugOutputEnabled,replayTestReporterRuntime:r,commandProgress:i}))return;throw new n(`INVALID_ARGS`,X(a))}async function yt(n,r,i){let a=e(n),o=t(a,{diagnosticId:u().diagnosticId,logPath:d({force:!0})?.path});if(r.command===`close`&&wt(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&&bt(r,o)),i&&i(),await T(1)}const J=64e3;function bt(e,t){if(!e.effectiveFlags.daemonBaseUrl){Y(`daemon log`,e.daemonPaths.logPath);return}let n=t.diagnosticsRecord;n&&Y(`remote diagnostics`,oe(e.daemonPaths.baseDir,n))}function Y(e,t){try{if(E.existsSync(t)){let n=E.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(`
3
3
  `),r=n.slice(Math.max(0,n.length-200)).join(`
4
- `);r.length>J&&(r=r.slice(r.length-J)),r.trim().length>0&&process.stderr.write(`\n[${e}]\n${r}\n`)}}catch{}}function xt(e){try{let t=N(e);return Z(t.command??``,t.providedFlags)}catch{return e.includes(`--debug`)||e.includes(`-v`)||e.includes(`--verbose`)}}function St(e){let t=j(e);return t?`Unknown command: ${e}. Did you mean ${t}?`:`Unknown command: ${e}`}function X(e){return _(e)?(h({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 Ct(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 et(t)}function wt(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 Tt(e){return e.command===`connect`||e.command===`connection`||e.command===`daemon`||e.command===`plugins`||e.command===`proxy`?null:he({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 Et(e){return!dt.has(e)}function Dt(e){return e!==`auth`&&e!==`connection`&&e!==`daemon`&&e!==`plugins`&&e!==`device`&&e!==`proxy`}function Ot(e){return e.command!==`open`||e.runtime||e.flags.bundleUrl||e.flags.metroHost||e.flags.metroPort||e.flags.remoteConfig||e.hadConnectionDefaults?!1:kt(e.explicitFlagKeys)}function kt(e){return e.has(`daemonBaseUrl`)||e.has(`daemonTransport`)||e.has(`tenant`)||e.has(`sessionIsolation`)||e.has(`runId`)||e.has(`leaseId`)||e.has(`leaseBackend`)}function At(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 jt(e){for(let t of ut)if(e.has(t))return!0;return!1}function Mt(e){let{command:t,flags:n,replayTestReporterRuntime:r,transport:i}=e;if(n.json)return Q(i);let a=t===`test`&&r?r.onProgress:Ye(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 Nt(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}ve(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 T(1)});function Pt(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{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};
@@ -1 +1 @@
1
- import{O as e,S as t,m as n,w as r}from"./owner-identity.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(e,i){if(!n(e.pid))return!1;if(e.startTime){let t=r(e.pid);if(!t||t!==e.startTime)return!1}let a=t(e.pid);return!a||!P(a,i.definition)||!e.bridgeScope?!1:e.serverBaseUrl===g(i.serverBaseUrl)&&e.localBaseUrl===g(i.localBaseUrl)&&e.launchUrl===w(i.launchUrl)&&e.registerPath===w(i.registerPath)&&e.unregisterPath===w(i.unregisterPath)&&e.devicePort===i.devicePort&&e.session===w(i.session)&&E(e.bridgeScope,i.bridgeScope)&&e.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(r,i){if(!n(r.pid))return;let a=t(r.pid);if(!(!a||!P(a,i))){try{process.kill(r.pid,`SIGTERM`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}if(!await e(r.pid,1e3)){try{process.kill(r.pid,`SIGKILL`)}catch(e){let t=e.code;if(t===`ESRCH`||t===`EPERM`)return;throw e}await e(r.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(e,n){let a=H(e.definition),o=a.endsWith(`.ts`)?[`--experimental-strip-types`]:[];y.mkdirSync(b.dirname(n),{recursive:!0});let s=y.openSync(n,`a`),c=0;try{c=i(process.execPath,[...o,a,e.definition.runArg],{env:V(e,e.env??process.env),stdio:[`ignore`,s,s]})}finally{y.closeSync(s)}if(!Number.isInteger(c)||c<=0)throw Error(`Failed to start ${e.definition.displayName} process.`);return{pid:c,startTime:r(c)??void 0,command:t(c)??void 0,serverBaseUrl:g(e.serverBaseUrl),localBaseUrl:g(e.localBaseUrl),launchUrl:w(e.launchUrl),registerPath:w(e.registerPath),unregisterPath:w(e.unregisterPath),devicePort:e.devicePort,session:w(e.session),bridgeScope:e.bridgeScope,tokenHash:C(e.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
+ 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{i as o}from"./retry.js";import"./file.js";import"./command.js";import"./process.js";import"./retry2.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};
@@ -584,6 +584,8 @@ type FillOptions = DeviceCommandBaseOptions & SelectorSnapshotCommandOptions & I
584
584
  delayMs?: number;
585
585
  /** Publish this fill value as `${VAR}` when script recording is armed. */
586
586
  recordAs?: string;
587
+ /** The text came from the CLI's stdin; keep it out of diagnostics and recorded actions. */
588
+ textStdin?: boolean;
587
589
  verify?: boolean;
588
590
  };
589
591
  type PinchOptions = DeviceCommandBaseOptions & {
@@ -956,8 +958,12 @@ type SettingsUpdateOptions = (DeviceCommandBaseOptions & {
956
958
  permission: PermissionTarget;
957
959
  mode?: PermissionMode;
958
960
  /**
959
- * The app the permission changes, by bundle id or package name. Without it the app bound to
960
- * 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
961
967
  * Android's `pm` need only the id. macOS permissions are host-level TCC grants, so naming an
962
968
  * app there is refused rather than dropped.
963
969
  */
@@ -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};