stim 1.20.2 → 1.21.0

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 (217) hide show
  1. package/README.md +88 -8
  2. package/dist/acquire-artifact-CD4lbiWE.mjs +153 -0
  3. package/dist/act-DHAw2A2S.mjs +2667 -0
  4. package/dist/activity-BzVfHSrY.mjs +1376 -0
  5. package/dist/{agent-device-usage-output-Dzgv6lgR.mjs → agent-device-usage-output-zh1vhbLp.mjs} +21 -65
  6. package/dist/{android-HqP1_vB_.mjs → android-BEJ8Jpl7.mjs} +2 -2
  7. package/dist/{android-DCKZrNvV.mjs → android-BLgbNqox.mjs} +128 -78
  8. package/dist/{android-Dlzxshgp.mjs → android-CV_GCELZ.mjs} +5 -5
  9. package/dist/{android-Mz_Inn3w.mjs → android-DUYkNF4u.mjs} +184 -102
  10. package/dist/{android-cas-Bl-cLJBk.mjs → android-cas-Ct5b1xCK.mjs} +7 -6
  11. package/dist/android-cas-compiler.mjs +2 -2
  12. package/dist/android-project-BCAAmMwz.mjs +12 -0
  13. package/dist/api.d.mts +740 -8
  14. package/dist/api.mjs +585 -1
  15. package/dist/{artifact-HSwkIWEQ.mjs → artifact-B8T3S5gi.mjs} +223 -201
  16. package/dist/{artifact-D3czlUvT.mjs → artifact-DAuZ-FNU.mjs} +158 -148
  17. package/dist/{browser-web-CA-F1GQo.mjs → browser-web-QQzVjz3O.mjs} +26 -24
  18. package/dist/budget-Bs6SxxzO.mjs +9154 -0
  19. package/dist/{build-DYDbfkk5.mjs → build-CoPzQRNw.mjs} +144 -96
  20. package/dist/build-cache-DmyR9Zzc.mjs +602 -0
  21. package/dist/build-plan-CaFskB7_.mjs +188 -0
  22. package/dist/{cache-manifest-XH-fvDUj.mjs → cache-manifest-DkkqguoK.mjs} +2 -2
  23. package/dist/cache-manifest.mjs +1 -1
  24. package/dist/{ccache-zdKiYQ3E.mjs → ccache-BJRZ9pG3.mjs} +10 -9
  25. package/dist/{cdp-Dq_ypAlJ.mjs → cdp-CWmIUMbw.mjs} +18 -5
  26. package/dist/{chrome-BnzZMqsR.mjs → chrome-B6tfCta1.mjs} +7 -4
  27. package/dist/{cli-CLP3diBm.mjs → cli-0DYf8QhQ.mjs} +20 -20
  28. package/dist/cli.mjs +1 -1
  29. package/dist/client-B7QVOlCr.d.mts +253 -0
  30. package/dist/client-UXD70ZbM.mjs +1406 -0
  31. package/dist/collector-run.d.mts +4 -40
  32. package/dist/collector-run.mjs +9 -8
  33. package/dist/{command-output-BTy8hZ0F.mjs → command-output-B1UrjZHL.mjs} +1 -1
  34. package/dist/config-CYcBF478.mjs +949 -0
  35. package/dist/{created-devices-Dzd5C2LF.mjs → created-devices-CqeBlrEn.mjs} +3 -3
  36. package/dist/{dependency-state-DG0p31-y.mjs → dependency-state-BbKQW83h.mjs} +20 -5
  37. package/dist/{detached-entry-B9C_zeQC.mjs → detached-entry-DFRyG1_o.mjs} +1 -1
  38. package/dist/{dev-client-DAWVIGBu.mjs → dev-client-UOeESKm6.mjs} +2 -2
  39. package/dist/device-DCxH7_By.mjs +1068 -0
  40. package/dist/{device-BECOiufl.mjs → device-ExJq8Ei7.mjs} +35 -35
  41. package/dist/{device-capacity-CBUAcRyQ.mjs → device-capacity-CMlqEcvw.mjs} +43 -13
  42. package/dist/device-host-worker.mjs +65 -61
  43. package/dist/{device-ios-COSi6oS1.mjs → device-ios-DRUeKaFV.mjs} +48 -45
  44. package/dist/{device-lease-run-Cw2M4z51.mjs → device-lease-run-C8raGFoP.mjs} +14 -26
  45. package/dist/{device-pool-Bf-pOhSw.mjs → device-pool-DMRpVX9a.mjs} +5 -5
  46. package/dist/doctor-BLHCYxzi.mjs +2 -0
  47. package/dist/{doctor-kfMBnUw6.mjs → doctor-DTvaDOda.mjs} +281 -317
  48. package/dist/{doctor-CB8oZKCk.mjs → doctor-Dhqebm0q.mjs} +183 -91
  49. package/dist/doctor-fingerprint.mjs +19 -0
  50. package/dist/{doctor-watchman-BRyV2adA.mjs → doctor-watchman-Cv1F10Kj.mjs} +40 -21
  51. package/dist/{eas-build-JyfqyHfC.mjs → eas-build-BomfRnFT.mjs} +53 -20
  52. package/dist/{build-plan-B7SZsc2N.mjs → eas-fallback-DJwZpy0c.mjs} +26 -208
  53. package/dist/{watchman-CPQFZLXY.mjs → eas-session-ledger-op6A54yi.mjs} +229 -11
  54. package/dist/{error-diagnostics-BR677IDM.mjs → error-diagnostics-Bf0rZvG9.mjs} +172 -82
  55. package/dist/exec-H20xSg2T.d.mts +65 -0
  56. package/dist/exec-_UbtCQcG.mjs +750 -0
  57. package/dist/gc-C-WwL0yi.mjs +3 -0
  58. package/dist/{gc-qWOMdnER.mjs → gc-_-dCXdyL.mjs} +584 -796
  59. package/dist/git-C3iTsJaZ.mjs +73 -0
  60. package/dist/{guide-G9cAbVAc.mjs → guide-Yqwt2bd6.mjs} +941 -269
  61. package/dist/{hosted-android-C3MHGld1.mjs → hosted-android-Bw-honsd.mjs} +8 -6
  62. package/dist/{hosted-client-ZEKpS9vw.mjs → hosted-client-DB_gBPfY.mjs} +34 -19
  63. package/dist/{hosted-ios-l-o3iM9J.mjs → hosted-ios-CUvOf4Vr.mjs} +1 -1
  64. package/dist/{hosted-logs-EzQM7-3Z.mjs → hosted-logs-DL_P5AdN.mjs} +77 -43
  65. package/dist/{hosted-macos-BACVAVqE.mjs → hosted-macos-QI141yKk.mjs} +21 -17
  66. package/dist/{hosted-native-A4s1QPXe.mjs → hosted-native-Ksyjgzq-.mjs} +30 -21
  67. package/dist/idle-BVeRGroT.d.mts +24 -0
  68. package/dist/{idle-shutdown-DtxhPTKe.mjs → idle-shutdown-DaKmZi0z.mjs} +11 -10
  69. package/dist/{ios-BwVCF7oA.mjs → ios-CQ68hG9s.mjs} +8 -8
  70. package/dist/{ios-RkW4pnQf.mjs → ios-CpByZy12.mjs} +140 -80
  71. package/dist/{ios-device-B5veSDDQ.mjs → ios-device-CXGP1bsD.mjs} +1 -1
  72. package/dist/{ios-device-D7pi2Sca.mjs → ios-device-CwFMehUS.mjs} +51 -26
  73. package/dist/{ios-project-K9hY_Jab.mjs → ios-project-WuwwBdvW.mjs} +13 -13
  74. package/dist/{ios-nOLJGVdy.mjs → ios-qNJt4dFm.mjs} +1 -1
  75. package/dist/ios-signing-DTTIChGs.mjs +489 -0
  76. package/dist/{ios-state-CBLe1xYw.mjs → ios-state-DvFX-K_l.mjs} +1 -1
  77. package/dist/{ios-Ce7bc7br.mjs → ios-ubFsBzwq.mjs} +129 -86
  78. package/dist/{js-swap-Bb3nsS07.mjs → js-swap-Cc1dttps.mjs} +53 -26
  79. package/dist/{launch-F4sOqAhB.mjs → launch-CD1yVc7U.mjs} +91 -90
  80. package/dist/{launch-C3qJ6Agb.mjs → launch-Zq2mOSDy.mjs} +82 -541
  81. package/dist/logs-BS00Anxf.mjs +352 -0
  82. package/dist/logs-CMm05HxN.mjs +255 -0
  83. package/dist/{macos-D7uDvO-z.mjs → macos-B65--pPd.mjs} +1 -1
  84. package/dist/{macos-Ch5VJmcS.mjs → macos-C-0qJ6zq.mjs} +225 -212
  85. package/dist/macos-run.mjs +1 -1
  86. package/dist/maintenance-run.mjs +122 -247
  87. package/dist/{metro-DnCEjCxs.mjs → metro-DEXpIhHC.mjs} +67 -12
  88. package/dist/{metro-gateway-CX9Xlkq2.mjs → metro-gateway-BMJNlj3E.mjs} +20 -12
  89. package/dist/{named-ports-4WopRPg-.mjs → named-ports-BWTzt6mu.mjs} +8 -63
  90. package/dist/native-android-JACyjTZs.mjs +844 -0
  91. package/dist/{native-gradle-inputs-BsLRrl7u.mjs → native-gradle-inputs-Bep9JcSF.mjs} +128 -140
  92. package/dist/native-inputs-TRTTTRxt.mjs +91 -0
  93. package/dist/native-run-DY_RLx3C.mjs +277 -0
  94. package/dist/{native-runtime-k8dTIrbK.mjs → native-runtime-Dg1Q7tfF.mjs} +9 -8
  95. package/dist/{native-xcode-inputs-CykopJdM.mjs → native-xcode-inputs-CB2iQeWq.mjs} +27 -18
  96. package/dist/{native-xcode-ios-Bbf30Gm0.mjs → native-xcode-ios-CXX39F7o.mjs} +96 -47
  97. package/dist/{ndjson-GOnbyvso.mjs → ndjson-CgE_o3Dl.mjs} +3 -3
  98. package/dist/offload-worker.d.mts +1 -46
  99. package/dist/offload-worker.mjs +197 -66
  100. package/dist/{ownership-DCtw_2IA.mjs → ownership-DEmM5vhh.mjs} +3 -3
  101. package/dist/{page-DRHy329N.mjs → page-CPaHeYqj.mjs} +7 -4
  102. package/dist/paths-BsJMoPP2.mjs +12 -0
  103. package/dist/paths-DQtTgsBf.mjs +42 -0
  104. package/dist/{placement-log-MOfPVgaM.mjs → placement-log-BqGbTa61.mjs} +5 -5
  105. package/dist/{plan-placement-V0TdzYXp.mjs → plan-placement-Bwj-IjY1.mjs} +6 -6
  106. package/dist/{ports-DdSUicVo.mjs → ports-D-MmCTdv.mjs} +3 -3
  107. package/dist/prebuild-uD_ipCxF.mjs +449 -0
  108. package/dist/{project-_phNIJfs.mjs → project-BZNjmW_8.mjs} +65 -37
  109. package/dist/{pull-request-CQ8sPbZa.mjs → pull-request-Lfetn8Kr.mjs} +2 -2
  110. package/dist/pull-request-zjCSAryH.d.mts +120 -0
  111. package/dist/pull-requests.d.mts +1 -119
  112. package/dist/pull-requests.mjs +1 -1
  113. package/dist/{react-native-android-CM1XRDwv.mjs → react-native-android-DuzH0cn3.mjs} +74 -48
  114. package/dist/{gradle-DSrXb6lG.mjs → react-native-build-rhk4smwQ.mjs} +292 -15
  115. package/dist/react-native-doctor-CQpuIMso.mjs +234 -0
  116. package/dist/{react-native-ios-Dhq_eiYQ.mjs → react-native-ios-Bhq1rJeV.mjs} +46 -28
  117. package/dist/{recordings-D0d5aQt0.mjs → recordings-DYteQSu4.mjs} +12 -9
  118. package/dist/{reload-C8JhxjSh.mjs → reload-CmTRFJaX.mjs} +93 -47
  119. package/dist/reload-DzjSl5P_.mjs +2 -0
  120. package/dist/{remote-BiR6aYjy.mjs → remote-ByYkXdGD.mjs} +15 -10
  121. package/dist/result-DNiS-tTP.mjs +434 -0
  122. package/dist/{run-BtPgpKks.mjs → run-D23HmJMs.mjs} +4 -5
  123. package/dist/selection-CSl9i5qU.mjs +619 -0
  124. package/dist/{server-bare-R2m_gsH8.mjs → server-bare-CxTrvDg8.mjs} +3 -4
  125. package/dist/{server-command-CTtCkmcQ.mjs → server-command-CtzloH3v.mjs} +14 -7
  126. package/dist/server-expo-C-90EhcG.mjs +2 -0
  127. package/dist/{server-expo-DsguMGUF.mjs → server-expo-DT_F_uVI.mjs} +50 -9
  128. package/dist/{settings-B717odTD.mjs → settings-CsJDEXgK.mjs} +234 -24
  129. package/dist/{settings-vk3mJGSm.d.mts → settings-DkdmlelE.d.mts} +6 -4
  130. package/dist/settings-T1gtc3bf.mjs +114 -0
  131. package/dist/settings-write-HyVZ8eQ8.mjs +359 -0
  132. package/dist/settings.schema.json +163 -16
  133. package/dist/{simslim-CCr3rE-A.mjs → simslim-Cgk17SXV.mjs} +14 -12
  134. package/dist/{slot-launch-DPt0m9Nd.mjs → slot-launch-DF8VfT64.mjs} +15 -20
  135. package/dist/{spawn-entry-Dcb7sDUz.mjs → spawn-entry-jw19m8Nl.mjs} +0 -1
  136. package/dist/stage-BIS0ydsV.mjs +183 -0
  137. package/dist/{start-BWqzODpb.mjs → start-7lpH7hmN.mjs} +63 -44
  138. package/dist/{start-TXeMmmO2.mjs → start-RChynRDp.mjs} +1 -1
  139. package/dist/{state-D1Icyjlu.mjs → state-C4ZtUisW.mjs} +40 -13
  140. package/dist/{state-CG_OFoaA.mjs → state-XMziexv2.mjs} +3 -2
  141. package/dist/{stats-BoY5sEPU.mjs → stats-53T7OTb9.mjs} +7 -13
  142. package/dist/stats-report-BFfMpWWF.mjs +16 -0
  143. package/dist/{status-WgFbkRzj.mjs → status-BL7jVyAB.mjs} +535 -447
  144. package/dist/status-CSi6tlRq.mjs +2 -0
  145. package/dist/{status-BTA7kKiQ.mjs → status-DqEUSSxs.mjs} +6 -4
  146. package/dist/{status-watch-C23ILtf9.mjs → status-watch-GDCfqpTE.mjs} +187 -22
  147. package/dist/status-worker.d.mts +1 -0
  148. package/dist/status-worker.mjs +19 -0
  149. package/dist/stim-desktop-C12we7lz.mjs +112 -0
  150. package/dist/{stop-DR6VoDIk.mjs → stop-Bk_1qiV6.mjs} +2 -2
  151. package/dist/{stop-BNmBMi1F.mjs → stop-CPzlM1L-.mjs} +138 -98
  152. package/dist/{stop-DPEhunlw.mjs → stop-D7h6jAXQ.mjs} +11 -10
  153. package/dist/supervisor-run.d.mts +8 -17
  154. package/dist/supervisor-run.mjs +63 -27
  155. package/dist/{support-DMTqj3Hm.mjs → support-67vraa1Q.mjs} +18 -11
  156. package/dist/{support-CwjbFs9H.mjs → support-Dlu37g6H.mjs} +12 -12
  157. package/dist/{swiftpm-macos-DRNVJWlb.mjs → swiftpm-macos-p8WZbxKU.mjs} +35 -24
  158. package/dist/toolchain-DhKwp9iI.mjs +2 -0
  159. package/dist/toolchain-Hp9sCpK4.mjs +873 -0
  160. package/dist/{trigger-CigAYjeL.mjs → trigger-BAahxUPq.mjs} +20 -5
  161. package/dist/trigger-Bf3uDcpv.mjs +2 -0
  162. package/dist/{warm-progress-BuY-Fvfn.mjs → warm-progress-BHX5r0Ei.mjs} +250 -156
  163. package/dist/{web-BDBMxDpx.mjs → web-CJmIj6AI.mjs} +18 -13
  164. package/dist/web-DknQETPs.mjs +2 -0
  165. package/dist/web-run.mjs +11 -12
  166. package/dist/windows-report.d.mts +1 -0
  167. package/dist/windows-report.mjs +18 -0
  168. package/dist/windows-report.ps1 +43 -0
  169. package/dist/workspace-process-lock-1_1OoVW5.mjs +57 -0
  170. package/dist/{workspace-state-DJt_MMvf.mjs → workspace-state-Cjuigeeu.mjs} +62 -58
  171. package/dist/{workspaces-C36s2jb9.mjs → workspaces-BccMFmGQ.mjs} +1188 -1079
  172. package/dist/worktree-CK2MpJW5.mjs +2 -0
  173. package/dist/{worktree-CgvJYJ-Q.mjs → worktree-DQ6Zi2Mv.mjs} +304 -53
  174. package/dist/xcode-Zlx3qjEs.mjs +896 -0
  175. package/package.json +7 -5
  176. package/shim/android-optimizations.gradle +7 -5
  177. package/dist/activity-BSV745Kz.mjs +0 -629
  178. package/dist/api-qvOzWyfO.mjs +0 -154
  179. package/dist/api-run.mjs +0 -294
  180. package/dist/app-install-BIKtMfPq.mjs +0 -896
  181. package/dist/artifact-lifecycle-DzPpBYvK.mjs +0 -30
  182. package/dist/budget-f7516Zk0.mjs +0 -4106
  183. package/dist/build-facts-DcLv2HSd.d.mts +0 -111
  184. package/dist/cancellation-C_22VQTH.mjs +0 -24
  185. package/dist/client-qQAaXSUs.mjs +0 -1771
  186. package/dist/config-BYDxlMY3.mjs +0 -562
  187. package/dist/device-DuiPJQSn.mjs +0 -290
  188. package/dist/device-lease-BX1sJQ2E.mjs +0 -1224
  189. package/dist/device-remote-xRT0Vmo9.mjs +0 -1272
  190. package/dist/eas-session-ledger-Cm0Gwq2F.mjs +0 -207
  191. package/dist/exec-DqKo9GKJ.mjs +0 -268
  192. package/dist/git-DDfFzkMm.mjs +0 -45
  193. package/dist/launch-verify-B6Q8hZP-.mjs +0 -428
  194. package/dist/logs-BGrEUaEs.mjs +0 -383
  195. package/dist/miss-reason-mKzZ4VvN.mjs +0 -238
  196. package/dist/native-android-D5qc3-_v.mjs +0 -226
  197. package/dist/ndjson-Du3j0AQ9.d.mts +0 -17
  198. package/dist/plan-C4TjdPsR.mjs +0 -260
  199. package/dist/prebuild-DYbucPXy.mjs +0 -212
  200. package/dist/preview-78a9kR_-.mjs +0 -1011
  201. package/dist/react-native-build-CtCccJtb.mjs +0 -239
  202. package/dist/react-native-doctor-CfRnFfjs.mjs +0 -78
  203. package/dist/remote-cache-OyOyVIS3.mjs +0 -526
  204. package/dist/result-CaJg5Iat.mjs +0 -186
  205. package/dist/server-expo-Bigriskl.mjs +0 -2
  206. package/dist/settings-BORNaaCO.mjs +0 -402
  207. package/dist/spawn-claims-DVS5RkMS.mjs +0 -72
  208. package/dist/stage-KNTQopqv.mjs +0 -157
  209. package/dist/stim-desktop-BzBN2Em2.mjs +0 -63
  210. package/dist/tailnet-Dh-qiYzG.mjs +0 -265
  211. package/dist/toolchain-BFkAcstd.mjs +0 -2
  212. package/dist/toolchain-DxSsNssu.mjs +0 -1657
  213. package/dist/trigger-9_USgmxz.mjs +0 -2
  214. package/dist/web-Dq-i3wzJ.mjs +0 -2
  215. package/dist/worktree-DpLdCHga.mjs +0 -2
  216. package/dist/{api-run.d.mts → doctor-fingerprint.d.mts} +0 -0
  217. package/dist/{errors-DzkMYh8Q.mjs → errors-ccaPc4ox.mjs} +2 -2
@@ -1,9 +1,9 @@
1
- import { t as getExecutor } from "./exec-DqKo9GKJ.mjs";
2
- import { n as TOOL_ERROR_PREFIX } from "./ios-device-B5veSDDQ.mjs";
3
- import { i as INSTALL_ERROR, l as appProcessFromPid } from "./app-install-BIKtMfPq.mjs";
1
+ import { t as getExecutor } from "./exec-_UbtCQcG.mjs";
2
+ import { ln as INSTALL_ERROR, pn as appProcessFromPid } from "./budget-Bs6SxxzO.mjs";
3
+ import { n as TOOL_ERROR_PREFIX } from "./ios-device-CXGP1bsD.mjs";
4
4
  import { mkdtempSync, readFileSync, rmSync } from "node:fs";
5
- import { join } from "node:path";
6
5
  import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
7
  //#region src/engine/ios-device.ts
8
8
  const DEVICECTL_TIMEOUT_MS = 3e4;
9
9
  function text(value) {
@@ -44,8 +44,27 @@ function parseDevicectlDevices(payload) {
44
44
  }
45
45
  return out;
46
46
  }
47
- function listIosDevices({ exec = null } = {}) {
48
- return readIosDevices({ exec }) ?? [];
47
+ async function listIosDevices({ exec = null } = {}) {
48
+ const executor = exec || getExecutor();
49
+ const dir = mkdtempSync(join(tmpdir(), "stim-devicectl-"));
50
+ const out = join(dir, "devices.json");
51
+ try {
52
+ await executor.runFileAsync("xcrun", [
53
+ "devicectl",
54
+ "list",
55
+ "devices",
56
+ "-j",
57
+ out
58
+ ], { timeoutMs: DEVICECTL_TIMEOUT_MS });
59
+ return parseDevicectlDevices(readFileSync(out, "utf-8"));
60
+ } catch {
61
+ return [];
62
+ } finally {
63
+ rmSync(dir, {
64
+ recursive: true,
65
+ force: true
66
+ });
67
+ }
49
68
  }
50
69
  /** devicectl's device list, or null when devicectl failed or did not answer within `timeoutMs`. */
51
70
  function readIosDevices({ exec = null, timeoutMs = DEVICECTL_TIMEOUT_MS } = {}) {
@@ -91,18 +110,18 @@ function isWirelessIosDevice(device) {
91
110
  function isPhysical(device) {
92
111
  return isIosHardware(device) && isReachable(device) && (isWired(device) || isWirelessIosDevice(device));
93
112
  }
94
- function notUsableRefusal(device) {
113
+ function notUsableRefusal(device, wording) {
95
114
  if (!isIosHardware(device)) return {
96
- error: `${describe(device)} is a ${[device.reality, device.platform].filter(Boolean).join(" ")} device, and \`ios --device\` installs only on a physical iPhone or iPad.`,
97
- remedy: NOT_A_PHONE_REMEDY
115
+ error: `${describe(device)} is a ${[device.reality, device.platform].filter(Boolean).join(" ")} device, and ${wording.physicalOnly}.`,
116
+ remedy: wording.notAPhone
98
117
  };
99
118
  if (!isReachable(device)) return {
100
119
  error: `${describe(device)} is paired, but devicectl reports it unavailable: it cannot reach the phone right now.`,
101
120
  remedy: UNREACHABLE_REMEDY
102
121
  };
103
122
  return {
104
- error: `${describe(device)} is reached over ${device.transportType}, and Stim installs on a phone only over a cable or Wi-Fi.`,
105
- remedy: NOT_A_PHONE_REMEDY
123
+ error: `${describe(device)} is reached over ${device.transportType}, and ${wording.transportOnly}.`,
124
+ remedy: wording.notAPhone
106
125
  };
107
126
  }
108
127
  function describe(device) {
@@ -142,15 +161,21 @@ function iosPoolNoCandidatesRefusal(devices) {
142
161
  }
143
162
  return resolveIosPhysicalDevice(null, listed);
144
163
  }
145
- function pickOne(devices) {
164
+ function pickOne(devices, severalRemedy) {
146
165
  if (devices.length === 1) return unhealthy(devices[0]) ?? selected(devices[0]);
147
166
  if (devices.length > 1) return {
148
167
  error: `Several devices are connected: ${devices.map(describe).join(", ")}.`,
149
- remedy: "Name the one to build for with `stim ios --device <udid>`."
168
+ remedy: severalRemedy
150
169
  };
151
170
  return null;
152
171
  }
153
- function resolveIosPhysicalDevice(requested, devices) {
172
+ const IOS_RUN_WORDING = {
173
+ several: "Name the one to build for with `stim ios --device <udid>`.",
174
+ notAPhone: NOT_A_PHONE_REMEDY,
175
+ physicalOnly: "`ios --device` installs only on a physical iPhone or iPad",
176
+ transportOnly: "Stim installs on a phone only over a cable or Wi-Fi"
177
+ };
178
+ function resolveIosPhysicalDevice(requested, devices, wording = IOS_RUN_WORDING) {
154
179
  const listed = Array.isArray(devices) ? devices : [];
155
180
  const physical = listed.filter(isPhysical);
156
181
  if (requested) {
@@ -158,13 +183,13 @@ function resolveIosPhysicalDevice(requested, devices) {
158
183
  const match = physical.find(same);
159
184
  if (match) return unhealthy(match) ?? selected(match);
160
185
  const other = listed.find(same);
161
- if (other) return notUsableRefusal(other);
186
+ if (other) return notUsableRefusal(other, wording);
162
187
  return {
163
188
  error: physical.length ? `${requested} is not connected. devicectl reports these devices: ${physical.map(describe).join(", ")}.` : `${requested} is not connected, and devicectl reports no device over a cable or Wi-Fi at all.`,
164
189
  remedy: "Check the cable and `xcrun devicectl list devices`, then retry with a UDID it lists."
165
190
  };
166
191
  }
167
- const chosen = pickOne(physical);
192
+ const chosen = pickOne(physical, wording.several);
168
193
  if (chosen) return chosen;
169
194
  return {
170
195
  error: "No physical iOS device is connected.",
@@ -237,7 +262,7 @@ function wirelessInstallFailure(error, { udid, appPath, wireless }) {
237
262
  * second install, each with the same bound; `beforeStep` runs before each of those two
238
263
  * so the caller can extend its device lease.
239
264
  */
240
- function installIosDeviceApp({ udid, appPath, bundleId = null, wireless = false }, { exec = null, beforeStep = () => {} } = {}) {
265
+ async function installIosDeviceApp({ udid, appPath, bundleId = null, wireless = false }, { exec = null, beforeStep = () => {} } = {}) {
241
266
  const e = exec || getExecutor();
242
267
  const timeoutMs = iosDeviceBounds(wireless).installMs;
243
268
  const target = {
@@ -245,8 +270,8 @@ function installIosDeviceApp({ udid, appPath, bundleId = null, wireless = false
245
270
  appPath,
246
271
  wireless
247
272
  };
248
- const install = () => {
249
- e.runFile("xcrun", [
273
+ const install = async () => {
274
+ await e.runFileAsync("xcrun", [
250
275
  "devicectl",
251
276
  "device",
252
277
  "install",
@@ -257,7 +282,7 @@ function installIosDeviceApp({ udid, appPath, bundleId = null, wireless = false
257
282
  ], { timeoutMs });
258
283
  };
259
284
  try {
260
- install();
285
+ await install();
261
286
  return {
262
287
  ok: true,
263
288
  appPath
@@ -278,7 +303,7 @@ function installIosDeviceApp({ udid, appPath, bundleId = null, wireless = false
278
303
  };
279
304
  try {
280
305
  beforeStep();
281
- e.runFile("xcrun", [
306
+ await e.runFileAsync("xcrun", [
282
307
  "devicectl",
283
308
  "device",
284
309
  "uninstall",
@@ -301,7 +326,7 @@ function installIosDeviceApp({ udid, appPath, bundleId = null, wireless = false
301
326
  }
302
327
  try {
303
328
  beforeStep();
304
- install();
329
+ await install();
305
330
  } catch (retryErr) {
306
331
  return wirelessInstallFailure(retryErr, target) ?? {
307
332
  failed: true,
@@ -348,12 +373,12 @@ function deviceProcessPid(processes, appName) {
348
373
  for (const entry of processes) if (entry.executable.includes(marker)) return entry.pid;
349
374
  return null;
350
375
  }
351
- function iosDeviceProcess({ udid, appName }, { exec = null } = {}) {
376
+ async function iosDeviceProcess({ udid, appName }, { exec = null } = {}) {
352
377
  const executor = exec || getExecutor();
353
378
  const dir = mkdtempSync(join(tmpdir(), "stim-devicectl-"));
354
379
  const out = join(dir, "processes.json");
355
380
  try {
356
- executor.runFile("xcrun", [
381
+ await executor.runFileAsync("xcrun", [
357
382
  "devicectl",
358
383
  "device",
359
384
  "info",
@@ -427,7 +452,7 @@ async function awaitIosDeviceLaunch({ udid, bundleId, appName, collectorPid = nu
427
452
  for (;;) {
428
453
  const records = collectorRecordsFor(readRecords(), collectorPid);
429
454
  const ended = records.find((entry) => typeof entry.event === "string" && COLLECTOR_ENDED_EVENTS.has(entry.event));
430
- const running = probeProcess();
455
+ const running = await probeProcess();
431
456
  if (running.state === "running") return { pid: running.pid };
432
457
  if (ended) {
433
458
  const evidence = launchEvidence(records);
@@ -482,7 +507,7 @@ async function verifyIosDeviceReleaseLaunch({ udid, appName, waitMs = 3e3, probe
482
507
  }));
483
508
  const startedAt = now();
484
509
  await sleep(Math.max(0, waitMs));
485
- const running = probeProcess();
510
+ const running = await probeProcess();
486
511
  const waitedMs = now() - startedAt;
487
512
  if (running.state === "unknown") return {
488
513
  verified: false,
@@ -1,11 +1,9 @@
1
- import { y as workspaceAgentDeviceDir } from "./workspace-state-DJt_MMvf.mjs";
2
- import { i as formatDuration, l as phaseLine } from "./command-output-BTy8hZ0F.mjs";
3
- import { i as workspaceLinkLine } from "./stim-desktop-BzBN2Em2.mjs";
4
- import { Dt as recordFinishedBuild } from "./budget-f7516Zk0.mjs";
5
- import { a as easAuthNote, n as UPLOAD_TIMEOUT_MS, r as cacheLevel, s as isEasAuthFailureText } from "./remote-cache-OyOyVIS3.mjs";
6
- import "./launch-verify-B6Q8hZP-.mjs";
7
- import { S as compilationCacheActivityLine, _ as COMPILATION_CACHE_NOT_RUN } from "./toolchain-DxSsNssu.mjs";
8
- import { i as deviceLabel } from "./support-CwjbFs9H.mjs";
1
+ import { l as workspaceAgentDeviceDir } from "./paths-DQtTgsBf.mjs";
2
+ import { i as formatDuration, l as phaseLine } from "./command-output-B1UrjZHL.mjs";
3
+ import { B as recordFinishedBuild, Hn as isEasAuthFailureText, Rn as UPLOAD_TIMEOUT_MS, Vn as easAuthNote, zn as cacheLevel } from "./budget-Bs6SxxzO.mjs";
4
+ import { a as workspaceLinkLine } from "./stim-desktop-C12we7lz.mjs";
5
+ import { o as compilationCacheActivityLine, t as COMPILATION_CACHE_NOT_RUN } from "./xcode-Zlx3qjEs.mjs";
6
+ import { i as deviceLabel } from "./support-Dlu37g6H.mjs";
9
7
  import { buildDiagnostics } from "@stim-cli/core/state";
10
8
  import chalk from "chalk";
11
9
  //#region src/commands/ios/result.ts
@@ -93,7 +91,9 @@ async function finishIosUpload(uploadPending, remote, phase, note) {
93
91
  }
94
92
  return false;
95
93
  }
96
- function reportIosResult({ devicePlacement, host, slot, root, json, release, runtimeKind = release ? "embedded-js" : "metro", configuration, buildScheme = null, metroCheck, metroPort, logsDir, device, udid, appPath, bundleId, installSkipped, elapsed, startedAt, storeHash, storeKey, cacheHit, missReason, compilationCache, useBuildCache, waitedForBuild, launchState, launchWarning, providerName, buildMachine = "auto", builtOn, offloadedTo = null, offloadFallback = null, closeWriter, webPreviewUrl, lease, recordRun, reclaimed = [], devServer = null, links }) {
94
+ function reportIosResult({ output, devicePlacement, host, slot, root, json, release, runtimeKind = release ? "embedded-js" : "metro", configuration, buildScheme = null, metroCheck, metroPort, logsDir, device, udid, appPath, bundleId, installSkipped, elapsed, startedAt, storeHash, storeKey, cacheHit, missReason, compilationCache, useBuildCache, waitedForBuild, launchState, launchWarning, providerName, buildMachine = "auto", builtOn, offloadedTo = null, offloadFallback = null, closeWriter, webPreviewUrl, lease, recordRun, reclaimed = [], devServer = null, links }) {
95
+ const emit = (line) => output("stdout", `${line}\n`);
96
+ const note = (line) => output("stderr", `${line}\n`);
97
97
  const durationMs = elapsed();
98
98
  recordRun({
99
99
  failed: false,
@@ -153,7 +153,7 @@ function reportIosResult({ devicePlacement, host, slot, root, json, release, run
153
153
  });
154
154
  if (devicePlacement) facts.devicePlacement = devicePlacement;
155
155
  if (host) facts.host = host;
156
- if (json) console.log(JSON.stringify({
156
+ if (json) emit(JSON.stringify({
157
157
  ...facts,
158
158
  ...links ? { links } : {},
159
159
  ...reclaimed.length ? { reclaimed } : {}
@@ -164,7 +164,7 @@ function reportIosResult({ devicePlacement, host, slot, root, json, release, run
164
164
  const deviceName = device?.deviceName ?? device?.name ?? udid;
165
165
  const cacheResult = useBuildCache ? cacheDescription(cacheHit, providerName, offloadedTo) : `bypassed; ${cacheDescription(false, null, offloadedTo)}`;
166
166
  const metroResult = runtimeKind === "process" ? "native process (no Metro)" : runtimeKind === "embedded-js" ? `embedded (${configuration})` : !metroCheck ? `check skipped on port ${metroPort}` : launchState === "unverified" ? `state unverified on port ${metroPort}` : `running on port ${metroPort}${devServer ? ` (started: ${devServer.reason})` : ""}`;
167
- console.log([
167
+ emit([
168
168
  outcome,
169
169
  phaseLine("device", host ? `${deviceName} (iOS ${device.runtime?.replace(/^iOS /, "")}) on ${host.machine}` : `${deviceName} (${udid})`),
170
170
  phaseLine("app", bundleId),
@@ -174,8 +174,8 @@ function reportIosResult({ devicePlacement, host, slot, root, json, release, run
174
174
  phaseLine("logs", logsDir),
175
175
  phaseLine("agent-device", `AGENT_DEVICE_STATE_DIR=${workspaceAgentDeviceDir(root)}`)
176
176
  ].join("\n"));
177
- if (facts.webPreviewUrl) console.error(chalk.dim(`Watch this device: ${facts.webPreviewUrl}`));
178
- if (links) console.error(chalk.dim(workspaceLinkLine(links)));
177
+ if (facts.webPreviewUrl) note(chalk.dim(`Watch this device: ${facts.webPreviewUrl}`));
178
+ if (links) note(chalk.dim(workspaceLinkLine(links)));
179
179
  }
180
180
  return facts;
181
181
  }
@@ -1,4 +1,4 @@
1
- import { t as getExecutor } from "./exec-DqKo9GKJ.mjs";
1
+ import { t as getExecutor } from "./exec-_UbtCQcG.mjs";
2
2
  //#region src/collector/ios.ts
3
3
  const MESSAGE_TYPE_LEVEL = {
4
4
  Debug: "debug",