stim 1.23.1 → 1.24.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 (169) hide show
  1. package/README.md +3 -2
  2. package/dist/{acquire-artifact-BzYRDgaP.mjs → acquire-artifact-CEs02U2o.mjs} +2 -2
  3. package/dist/{act-vxiMwdf5.mjs → act-Cyvm8xYc.mjs} +40 -25
  4. package/dist/{activity-BpWUPgUm.mjs → activity-Dq3ZcdD8.mjs} +6 -6
  5. package/dist/{agent-device-usage-output-CUlLsbRt.mjs → agent-device-usage-output-CccomeE0.mjs} +5 -5
  6. package/dist/{android-C7sVmyI9.mjs → android-882m4hxX.mjs} +140 -46
  7. package/dist/{android-DtfRGLcc.mjs → android-BZppyPe_.mjs} +66 -46
  8. package/dist/{android-DR5lZ2Az.mjs → android-CX5IcRuf.mjs} +13 -3
  9. package/dist/{android-CLi6DSiS.mjs → android-DcztblCT.mjs} +5 -5
  10. package/dist/{android-cas-ngferVq2.mjs → android-cas-BtCOrNqb.mjs} +3 -3
  11. package/dist/android-cas-compiler.mjs +1 -1
  12. package/dist/api.d.mts +21 -4
  13. package/dist/api.mjs +32 -31
  14. package/dist/{artifact-Xvgibgzq.mjs → artifact-BR5VNArK.mjs} +17 -16
  15. package/dist/{artifact-DBI3DALs.mjs → artifact-Bdt_n9Jc.mjs} +17 -16
  16. package/dist/{artifact-platform-CXcmX_j3.mjs → artifact-platform-CMRc0M_r.mjs} +3 -3
  17. package/dist/{browser-web-BJN9ZHxB.mjs → browser-web-ycg9qWB8.mjs} +16 -17
  18. package/dist/{budget-3ivAK99e.mjs → budget-dPGuhNai.mjs} +101 -40
  19. package/dist/{build-Dv9s8Fz-.mjs → build-CaF574eS.mjs} +31 -28
  20. package/dist/{build-cache-Dv7RN200.mjs → build-cache-HFUQ9eLz.mjs} +152 -19
  21. package/dist/{build-plan-BmbdHQbr.mjs → build-plan-JsDUq4w1.mjs} +8 -7
  22. package/dist/{cache-manifest-DSeQjt-Q.mjs → cache-manifest-BPXRONJz.mjs} +1 -1
  23. package/dist/cache-manifest.mjs +1 -1
  24. package/dist/{ccache-CH2EWGPB.mjs → ccache-CCn1S6qG.mjs} +6 -6
  25. package/dist/{cdp-3fwICjzi.mjs → cdp-BG3FJCCx.mjs} +1 -1
  26. package/dist/{chrome-Bbw689-6.mjs → chrome-BvV8ssI3.mjs} +1 -1
  27. package/dist/{cli-BkK6Wr5i.mjs → cli-xqAidP7O.mjs} +20 -20
  28. package/dist/cli.mjs +1 -1
  29. package/dist/{client-B4MMzfo_.mjs → client-18-ZowoT.mjs} +254 -28
  30. package/dist/collector-run.mjs +6 -6
  31. package/dist/{command-output-YKGWivpG.mjs → command-output-DxC0k2rk.mjs} +3 -2
  32. package/dist/{config-DlrsduwG.mjs → config-BZhXY15H.mjs} +3 -3
  33. package/dist/{created-devices-x9rN6bhs.mjs → created-devices-D2Aca-xu.mjs} +6 -2
  34. package/dist/{dependency-state-1I9KZT1Y.mjs → dependency-state-C56ll9hY.mjs} +2 -2
  35. package/dist/{detached-entry-BwNEtIrP.mjs → detached-entry-KmieOKgN.mjs} +1 -1
  36. package/dist/{dev-client-BFxiDpkf.mjs → dev-client-w_fok0Ek.mjs} +3 -3
  37. package/dist/{device-B7ljwccX.mjs → device-4RUugw5X.mjs} +16 -16
  38. package/dist/{device-CiNYxqp6.mjs → device-BktRGdjS.mjs} +40 -44
  39. package/dist/{device-capacity-DH0QsZYZ.mjs → device-capacity-Ic-kdmEV.mjs} +20 -16
  40. package/dist/device-host-worker.mjs +17 -17
  41. package/dist/{device-ios-CbVDtDIy.mjs → device-ios-DzpSlZyd.mjs} +23 -52
  42. package/dist/{device-lease-run-DXPSwdbb.mjs → device-lease-run-DUtkbqBQ.mjs} +5 -5
  43. package/dist/{device-pool-B4iOXIrD.mjs → device-pool-CgBHk401.mjs} +3 -3
  44. package/dist/{doctor-DRu-8ld6.mjs → doctor-BZ6oxNum.mjs} +1 -1
  45. package/dist/{doctor-HUC1igzw.mjs → doctor-C33AzVfR.mjs} +28 -28
  46. package/dist/{doctor-C6t4Maue.mjs → doctor-DZgpqR6J.mjs} +14 -14
  47. package/dist/{doctor-fingerprint-DZLoYFVb.mjs → doctor-fingerprint-zlujA1Gs.mjs} +1 -1
  48. package/dist/doctor-fingerprint.mjs +1 -1
  49. package/dist/{doctor-watchman-iGBpC6KM.mjs → doctor-watchman-B453A231.mjs} +5 -5
  50. package/dist/{eas-build-DMWSSvxq.mjs → eas-build-CxKUNHsb.mjs} +4 -4
  51. package/dist/{eas-fallback-vKlrqxgE.mjs → eas-fallback-LMxk9Kw0.mjs} +14 -14
  52. package/dist/{eas-session-ledger-BQF9Yyy9.mjs → eas-session-ledger-Ck6YXPAO.mjs} +12 -8
  53. package/dist/{error-diagnostics-DYsjJIHz.mjs → error-diagnostics-BkKCZq4P.mjs} +17 -42
  54. package/dist/{exec-DEoAhcze.mjs → exec-VFRpu1iA.mjs} +116 -28
  55. package/dist/{gc-dDE4QPVu.mjs → gc-DDWEAj0w.mjs} +2 -2
  56. package/dist/{gc-BW8E1uSC.mjs → gc-yVKpAOKM.mjs} +205 -28
  57. package/dist/{guide-DYYEO3Wz.mjs → guide-Bggftwc5.mjs} +222 -59
  58. package/dist/{hosted-android-xcfgCgSF.mjs → hosted-android-D4dweBof.mjs} +4 -4
  59. package/dist/{hosted-client-Bt-tndxV.mjs → hosted-client-BBTVe3X6.mjs} +4 -4
  60. package/dist/{hosted-ios-y19jCYFF.mjs → hosted-ios-Sn0djzg8.mjs} +1 -1
  61. package/dist/{hosted-logs-DzJKzKlj.mjs → hosted-logs-CYIZ5ubJ.mjs} +11 -6
  62. package/dist/{hosted-macos-BJusKvqL.mjs → hosted-macos-CXjsUNBR.mjs} +7 -7
  63. package/dist/{hosted-native-BmQC6U_x.mjs → hosted-native-Doxbfzem.mjs} +58 -11
  64. package/dist/{idle-shutdown-CJmUOV5x.mjs → idle-shutdown-BInjLKqm.mjs} +10 -10
  65. package/dist/{ios-CWjqfSm_.mjs → ios-B1FXRCMX.mjs} +71 -44
  66. package/dist/{ios-DTOYZGMJ.mjs → ios-BItP6lkn.mjs} +8 -8
  67. package/dist/{ios-hcBpnEGk.mjs → ios-CVUFFZ6C.mjs} +70 -13
  68. package/dist/{ios-xtlRHaeB.mjs → ios-ENC4sRPA.mjs} +1 -1
  69. package/dist/{ios-device-BXZ0c7Kb.mjs → ios-device-B6HK951C.mjs} +1 -1
  70. package/dist/{ios-device-DFGuwF4U.mjs → ios-device-BI38NFFH.mjs} +3 -3
  71. package/dist/{ios-project-CSZYI1iu.mjs → ios-project-KYqeJURj.mjs} +5 -5
  72. package/dist/{ios-signing-BtAffm0A.mjs → ios-signing-4c_qXvQm.mjs} +2 -2
  73. package/dist/{ios-state-Dtw5K2aI.mjs → ios-state-DlElquYD.mjs} +15 -7
  74. package/dist/{js-swap-BSBHldmm.mjs → js-swap-BvrQvXHY.mjs} +7 -6
  75. package/dist/{launch-CP2wDCVd.mjs → launch-BVlyQw3T.mjs} +51 -49
  76. package/dist/{launch-D-zq8SHG.mjs → launch-SfzGH_s9.mjs} +48 -29
  77. package/dist/{logs-pNvA2hHK.mjs → logs-DXE32kyb.mjs} +16 -9
  78. package/dist/{logs-By5aw3g9.mjs → logs-ovlU7m7N.mjs} +8 -6
  79. package/dist/{macos-CPMahOC2.mjs → macos-B3BveDrU.mjs} +1 -1
  80. package/dist/{macos-C67FZ2ft.mjs → macos-CCfhb-jT.mjs} +49 -42
  81. package/dist/macos-run.mjs +1 -1
  82. package/dist/maintenance-run.mjs +7 -7
  83. package/dist/{metro-DiXtA3Ty.mjs → metro-Bu8LBfzS.mjs} +4 -4
  84. package/dist/{metro-gateway-CKZqKqx7.mjs → metro-gateway-DtsOy-0P.mjs} +3 -4
  85. package/dist/{named-ports-DkEzOfzO.mjs → named-ports-BWDuU5oQ.mjs} +3 -3
  86. package/dist/{native-android-_MWSs3PP.mjs → native-android-96BBizbq.mjs} +17 -17
  87. package/dist/{native-gradle-artifact-inputs-DHFnmrVf.mjs → native-gradle-artifact-inputs-BcLYBZil.mjs} +5 -5
  88. package/dist/{native-run-Dv88i0aU.mjs → native-run-BmH7U8pr.mjs} +6 -6
  89. package/dist/{native-runtime-DBRfY_PN.mjs → native-runtime-DgtJkzIa.mjs} +10 -9
  90. package/dist/{native-source-Y0yLhFyQ.mjs → native-source-D-4Dh4JU.mjs} +7 -4
  91. package/dist/{native-xcode-inputs-CqViUh3r.mjs → native-xcode-inputs-irplbQb0.mjs} +2 -2
  92. package/dist/{native-xcode-ios-vFgqL_yS.mjs → native-xcode-ios-BY-6hh6M.mjs} +18 -18
  93. package/dist/offload-worker.d.mts +7 -2
  94. package/dist/offload-worker.mjs +75 -41
  95. package/dist/{operation-exec-BW0em61G.mjs → operation-exec-CUZifp6Z.mjs} +2 -25
  96. package/dist/{ownership-C5fo5Edb.mjs → ownership-DxlZGDcV.mjs} +3 -3
  97. package/dist/{page-DBL2PiUU.mjs → page-CzEA_-5_.mjs} +2 -3
  98. package/dist/phone-reverses-BdsdesVF.mjs +57 -0
  99. package/dist/{placement-log-BnGgJRRZ.mjs → placement-log-DUvqqsB-.mjs} +1 -1
  100. package/dist/{plan-placement-cr0fEU7b.mjs → plan-placement-4axc0Hs7.mjs} +3 -3
  101. package/dist/{ports-DpXjKkSV.mjs → ports-D-E_OiAO.mjs} +3 -3
  102. package/dist/{prebuild-BligW0QS.mjs → prebuild-DmVCf5xb.mjs} +14 -9
  103. package/dist/{project-DhCtQWWU.mjs → project-Dz-hWkb-.mjs} +21 -17
  104. package/dist/{pull-request-W1IuLXDt.mjs → pull-request-CbNlkFok.mjs} +2 -2
  105. package/dist/pull-requests.mjs +1 -1
  106. package/dist/{react-native-android-ZlhQfhvq.mjs → react-native-android-DOinxgwB.mjs} +75 -32
  107. package/dist/{react-native-build-CelbTO_y.mjs → react-native-build-AuCu-aAP.mjs} +22 -19
  108. package/dist/{react-native-doctor-LTIaP7lv.mjs → react-native-doctor-2ivJUmwZ.mjs} +10 -9
  109. package/dist/{react-native-ios-C5W0SA6f.mjs → react-native-ios-D5zTIuH8.mjs} +38 -22
  110. package/dist/{recordings-CQmfzAh7.mjs → recordings-CdPwYwvs.mjs} +1 -1
  111. package/dist/{registration-BcRgF6Ox.mjs → registration-CN6nlhcD.mjs} +1 -1
  112. package/dist/{reload-COJWTbae.mjs → reload-C1TTVesC.mjs} +144 -42
  113. package/dist/{reload-QcwnYLYV.mjs → reload-Ck9RJeSq.mjs} +1 -1
  114. package/dist/{remote-DR8qUERM.mjs → remote-DEZ7AOVq.mjs} +7 -7
  115. package/dist/{result-utnBea7x.mjs → result-DqBrb12U.mjs} +40 -17
  116. package/dist/{run-DidHghD1.mjs → run-BIwoU44q.mjs} +2 -2
  117. package/dist/{selection-DSMbWEX2.mjs → selection-BLtvaqxc.mjs} +11 -5
  118. package/dist/{server-bare-CafzuyFB.mjs → server-bare-Z1ToVLPn.mjs} +2 -2
  119. package/dist/{server-command-B9o92sLM.mjs → server-command-C0pmjNdG.mjs} +5 -5
  120. package/dist/server-expo-CEntXzRw.mjs +2 -0
  121. package/dist/{server-expo-BXrWxNYh.mjs → server-expo-Tt_hLRpy.mjs} +8 -5
  122. package/dist/{settings-C7O8A6ZI.mjs → settings-RKwY33wv.mjs} +114 -19
  123. package/dist/{settings-PfJx8uK1.mjs → settings-kkt0vP4w.mjs} +1 -1
  124. package/dist/{settings-write-Chuy7Cte.mjs → settings-write--gj6MACV.mjs} +7 -7
  125. package/dist/settings.schema.json +13 -0
  126. package/dist/{simslim-BNckWpXi.mjs → simslim-CdWKT3vA.mjs} +2 -2
  127. package/dist/{slot-launch-B7AuoWJv.mjs → slot-launch-A1BgotaM.mjs} +6 -6
  128. package/dist/{stage-C4u17aES.mjs → stage-ERTMh88n.mjs} +2 -3
  129. package/dist/{start-CU8mCPC7.mjs → start-BKGrEhzG.mjs} +75 -35
  130. package/dist/{start-BL_BsiWt.mjs → start-Bmg_qmHi.mjs} +1 -1
  131. package/dist/{state--smjFSTL.mjs → state-B1ig0Kqy.mjs} +4 -4
  132. package/dist/{state-08I3hw3_.mjs → state-BfAltYJP.mjs} +2 -2
  133. package/dist/{stats-CO6sK0Nh.mjs → stats-B-ckuiUg.mjs} +5 -5
  134. package/dist/{stats-report-BzaPrRm6.mjs → stats-report-n2U5plhk.mjs} +1 -1
  135. package/dist/{status-_WPHzVft.mjs → status-DfFp6a76.mjs} +24 -24
  136. package/dist/{status-BRROykC8.mjs → status-Fect2w9R.mjs} +1 -1
  137. package/dist/{status-CrJutl6-.mjs → status-Pw-807f0.mjs} +1 -1
  138. package/dist/{status-watch-BHFasOZN.mjs → status-watch-XC7F-AMf.mjs} +5 -5
  139. package/dist/status-worker.mjs +1 -1
  140. package/dist/stim-clonefile.c +18 -0
  141. package/dist/{stim-desktop-D5OGpYZM.mjs → stim-desktop-DS0mzR8U.mjs} +2 -2
  142. package/dist/{stop-iuFHjUST.mjs → stop-BFu7X_Do.mjs} +2 -2
  143. package/dist/{stop-BJ06ipTZ.mjs → stop-CL1kDHds.mjs} +55 -21
  144. package/dist/{stop-CR5689oB.mjs → stop-DhclRwOO.mjs} +5 -5
  145. package/dist/supervisor-run.mjs +16 -16
  146. package/dist/{support-TWuQlHQo.mjs → support-B1W-hmC2.mjs} +8 -8
  147. package/dist/{support-CbXPbUMJ.mjs → support-B3tzVhKn.mjs} +6 -6
  148. package/dist/{swiftpm-artifact-inputs-DFcGsXDP.mjs → swiftpm-artifact-inputs-BWYPj9Sn.mjs} +4 -4
  149. package/dist/{swiftpm-macos-DbwGCpZg.mjs → swiftpm-macos-BVCP5mO4.mjs} +14 -13
  150. package/dist/{toolchain-XkA2PfJZ.mjs → toolchain-BjgKdoEf.mjs} +1 -1
  151. package/dist/{toolchain-B9hCFCQw.mjs → toolchain-D3bmRMia.mjs} +57 -36
  152. package/dist/trigger-BLsHgAGR.mjs +2 -0
  153. package/dist/{trigger-Cbyc41d_.mjs → trigger-CBMe2YLH.mjs} +2 -2
  154. package/dist/{warm-progress-CA3TgT3-.mjs → warm-progress-ol0ZypEu.mjs} +6 -6
  155. package/dist/{web-DRF_oFXk.mjs → web-BH7peScT.mjs} +12 -10
  156. package/dist/web-BdOFlTJr.mjs +2 -0
  157. package/dist/web-run.mjs +8 -9
  158. package/dist/windows-report.mjs +12 -1
  159. package/dist/windows-report.ps1 +1 -1
  160. package/dist/{workspace-state-U08dEzhG.mjs → workspace-state-CeBpIZgr.mjs} +11 -4
  161. package/dist/{workspaces-e41xsjKr.mjs → workspaces-CSV2Orf4.mjs} +36 -32
  162. package/dist/{worktree-BEwxVwKF.mjs → worktree-DEDUzO_L.mjs} +1 -1
  163. package/dist/{worktree-B4Nj3EGS.mjs → worktree-Dw8kfacb.mjs} +324 -99
  164. package/dist/{xcode-Rq744mBF.mjs → xcode-DHu41qQ4.mjs} +41 -27
  165. package/package.json +7 -7
  166. package/dist/native-gradle-inputs-Dnh84Zbd.mjs +0 -211
  167. package/dist/server-expo-Ddr8cG_c.mjs +0 -2
  168. package/dist/trigger-yb_nFzPF.mjs +0 -2
  169. package/dist/web-kDE9Myoy.mjs +0 -2
@@ -1,8 +1,8 @@
1
- import { d as spawnDeclared, t as getExecutor } from "./exec-DEoAhcze.mjs";
1
+ import { _ as spawnDeclared, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
2
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
3
- import { a as killOnAbort } from "./operation-exec-BW0em61G.mjs";
4
- import { o as androidHome } from "./android-C7sVmyI9.mjs";
5
- import { b as bundlerPin, h as startBuildHeartbeat, r as HEARTBEAT_INTERVAL_MS } from "./xcode-Rq744mBF.mjs";
3
+ import { a as killOnAbort } from "./operation-exec-CUZifp6Z.mjs";
4
+ import { o as androidHome } from "./android-882m4hxX.mjs";
5
+ import { b as bundlerPin, h as startBuildHeartbeat, r as HEARTBEAT_INTERVAL_MS } from "./xcode-DHu41qQ4.mjs";
6
6
  import { createRequire } from "node:module";
7
7
  import { existsSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync } from "node:fs";
8
8
  import { homedir, tmpdir } from "node:os";
@@ -211,18 +211,23 @@ function podEnvForRuby(version, { env = ambientEnv(), home = (process.platform =
211
211
  { bin: join(home, ".rbenv", "versions", version, "bin") },
212
212
  {
213
213
  bin: join(home, ".rvm", "rubies", `ruby-${version}`, "bin"),
214
- gems: join(home, ".rvm", "gems", `ruby-${version}`)
214
+ rvm: `ruby-${version}`
215
215
  },
216
216
  { bin: join(home, ".asdf", "installs", "ruby", version, "bin") },
217
217
  { bin: join(home, ".local", "share", "mise", "installs", "ruby", version, "bin") }
218
218
  ] : [];
219
219
  for (const c of candidates) {
220
220
  if (!exists(c.bin)) continue;
221
- out.PATH = `${c.bin}${delimiter}${out.PATH ?? ""}`;
222
- if (c.gems && exists(c.gems)) {
223
- out.GEM_HOME = c.gems;
224
- out.GEM_PATH = c.gems;
221
+ if (c.rvm) {
222
+ const rvm = rvmRuby(join(home, ".rvm"), c.rvm, exists);
223
+ out.PATH = prependPath(rvm.bins, out.PATH);
224
+ if (exists(rvm.gems.home)) {
225
+ out.GEM_HOME = rvm.gems.home;
226
+ out.GEM_PATH = rvm.gems.path;
227
+ }
228
+ return out;
225
229
  }
230
+ out.PATH = `${c.bin}${delimiter}${out.PATH ?? ""}`;
226
231
  return out;
227
232
  }
228
233
  if (env.GEM_HOME) return out;
@@ -243,6 +248,22 @@ function podEnvForRuby(version, { env = ambientEnv(), home = (process.platform =
243
248
  if (login.GEM_PATH) out.GEM_PATH = login.GEM_PATH;
244
249
  return out;
245
250
  }
251
+ /** What `rvm use <name>` sets: the gemset and its `@global` gemset on `GEM_PATH` and their `bin` directories on `PATH`. */
252
+ function rvmRuby(rvm, name, exists) {
253
+ const gems = join(rvm, "gems", name);
254
+ const global = `${gems}@global`;
255
+ return {
256
+ bins: [
257
+ join(gems, "bin"),
258
+ join(global, "bin"),
259
+ join(rvm, "rubies", name, "bin")
260
+ ].filter(exists),
261
+ gems: {
262
+ home: gems,
263
+ path: [gems, global].join(delimiter)
264
+ }
265
+ };
266
+ }
246
267
  /**
247
268
  * The Ruby a new login shell makes the default, read from the version manager's files: rvm's `default` alias in
248
269
  * `~/.rvm/config/alias`, or rbenv's global `~/.rbenv/version`.
@@ -250,21 +271,7 @@ function podEnvForRuby(version, { env = ambientEnv(), home = (process.platform =
250
271
  function defaultRuby(home, exists, read) {
251
272
  const rvm = join(home, ".rvm");
252
273
  const alias = /^default=(\S+)$/m.exec(read(join(rvm, "config", "alias")) ?? "")?.[1];
253
- if (alias && exists(join(rvm, "rubies", alias, "bin"))) {
254
- const gems = join(rvm, "gems", alias);
255
- const global = `${gems}@global`;
256
- return {
257
- bins: [
258
- join(gems, "bin"),
259
- join(global, "bin"),
260
- join(rvm, "rubies", alias, "bin")
261
- ].filter(exists),
262
- gems: {
263
- home: gems,
264
- path: [gems, global].join(delimiter)
265
- }
266
- };
267
- }
274
+ if (alias && exists(join(rvm, "rubies", alias, "bin"))) return rvmRuby(rvm, alias, exists);
268
275
  const rbenv = read(join(home, ".rbenv", "version"))?.trim();
269
276
  if (rbenv && exists(join(home, ".rbenv", "versions", rbenv, "bin"))) return { bins: [join(home, ".rbenv", "versions", rbenv, "bin")] };
270
277
  return null;
@@ -413,7 +420,7 @@ async function ensureBundledGems(root, pin, ctx) {
413
420
  failed: true,
414
421
  code: DEPS_ERROR,
415
422
  reason: `\`bundle install\` failed (${how}).`,
416
- remedy: frozenRemedy(root, pin, transcript) || gemInstallRemedy(root, pin),
423
+ remedy: frozenRemedy(pin, transcript) || gemInstallRemedy(root, pin),
417
424
  diagnosticSource: extracted ? extracted.source : "tail",
418
425
  diagnosticLines: extracted ? extracted.lines : [],
419
426
  lastLines: install.transcript.slice(-20),
@@ -441,13 +448,13 @@ function bundlerSpawnFailure(command, run, pin) {
441
448
  function missingBundlerNote(pin) {
442
449
  return `${pin.lockfile} pins this project's CocoaPods, but \`bundle\` is not on PATH, so pods run as plain \`pod install\` with whatever CocoaPods PATH resolves to (\`gem install bundler\` to use the pin).`;
443
450
  }
444
- function frozenRemedy(root, pin, transcript) {
451
+ function frozenRemedy(pin, transcript) {
445
452
  if (!BUNDLER_FROZEN.test(transcript)) return void 0;
446
- return `Stim runs bundler with BUNDLE_FROZEN so it can never write into your checkout, and ${pin.gemfile} no longer matches ${pin.lockfile}. Run \`cd ${root} && bundle install\` yourself, keep the updated Gemfile.lock, then run again.`;
453
+ return `Stim runs bundler with BUNDLE_FROZEN so it can never write into your checkout, and ${pin.gemfile} no longer matches ${pin.lockfile}. Run \`cd ${dirname(pin.gemfile)} && bundle install\` yourself, keep the updated Gemfile.lock, then run again.`;
447
454
  }
448
455
  function gemInstallRemedy(root, pin) {
449
456
  const version = readRubyVersion(root);
450
- return `${version ? `This repo pins ruby ${version} (.ruby-version), so put that ruby on PATH (rbenv/rvm/asdf/mise) first. ` : ""}Bundler could not install the gems ${pin.lockfile} pins, so \`bundle exec pod install\` cannot run. Run \`cd ${root} && bundle install\` and fix what it reports, then run again.`;
457
+ return `${version ? `This repo pins ruby ${version} (.ruby-version), so put that ruby on PATH (rbenv/rvm/asdf/mise) first. ` : ""}Bundler could not install the gems ${pin.lockfile} pins, so \`bundle exec pod install\` cannot run. Run \`cd ${dirname(pin.gemfile)} && bundle install\` and fix what it reports, then run again.`;
451
458
  }
452
459
  async function runPodInstall(root, logWriter, { spawnFn = null, now = Date.now, heartbeatMs = HEARTBEAT_INTERVAL_MS, estimateMs = null, onHeartbeat = (line) => console.error(line), directory = join(root, "ios") } = {}) {
453
460
  const iosDir = directory;
@@ -466,7 +473,7 @@ async function runPodInstall(root, logWriter, { spawnFn = null, now = Date.now,
466
473
  onHeartbeat
467
474
  };
468
475
  const notes = [];
469
- const pin = bundlerPin(root);
476
+ const pin = bundlerPin(root, iosDir);
470
477
  let bundler = false;
471
478
  if (pin) {
472
479
  const gems = await ensureBundledGems(root, pin, ctx);
@@ -531,9 +538,9 @@ async function runPodInstall(root, logWriter, { spawnFn = null, now = Date.now,
531
538
  }
532
539
  function podFailureRemedy(root, pin, transcript) {
533
540
  if (pin) {
534
- const frozen = frozenRemedy(root, pin, transcript);
541
+ const frozen = frozenRemedy(pin, transcript);
535
542
  if (frozen) return frozen;
536
- if (BUNDLER_NO_COCOAPODS.test(transcript)) return `${pin.lockfile} resolves cocoapods, but bundler found no \`pod\` executable in the bundle it loaded: the installed gems belong to a different Gemfile than ${pin.gemfile}, or that Gemfile's bundle was never installed. Run \`cd ${root} && bundle install && bundle exec pod --version\` and make that work, then run again.`;
543
+ if (BUNDLER_NO_COCOAPODS.test(transcript)) return `${pin.lockfile} resolves cocoapods, but bundler found no \`pod\` executable in the bundle it loaded: the installed gems belong to a different Gemfile than ${pin.gemfile}, or that Gemfile's bundle was never installed. Run \`cd ${dirname(pin.gemfile)} && bundle install && bundle exec pod --version\` and make that work, then run again.`;
537
544
  }
538
545
  const pinned = /Could not find proper version of cocoapods/.test(transcript) ? readRubyVersion(root) : null;
539
546
  if (!pinned) return void 0;
@@ -577,8 +584,8 @@ async function quietAsync(file, args) {
577
584
  return null;
578
585
  }
579
586
  }
580
- async function iosToolchainAsync(root, native) {
581
- const rubyVersion = native ? null : readRubyVersion(root);
587
+ /** This Mac's iOS toolchain, with the CocoaPods that `pod install` in `podDirectory` runs; null skips CocoaPods. */
588
+ async function iosToolchainAsync(root, podDirectory) {
582
589
  const [xcode, simulatorSdk, cocoapods] = await Promise.all([
583
590
  quietAsync("xcodebuild", ["-version"]),
584
591
  quietAsync("xcrun", [
@@ -586,7 +593,7 @@ async function iosToolchainAsync(root, native) {
586
593
  "iphonesimulator",
587
594
  "--show-sdk-version"
588
595
  ]),
589
- native ? null : cocoapodsVersionAsync(rubyVersion)
596
+ podDirectory === null ? null : projectCocoapodsVersion(root, podDirectory)
590
597
  ]);
591
598
  return assembleIosToolchain(xcode, simulatorSdk, cocoapods);
592
599
  }
@@ -618,11 +625,14 @@ function cocoapodsVersion(rubyVersion) {
618
625
  env: podProbeEnv(podEnvForRuby(rubyVersion))
619
626
  }));
620
627
  }
621
- async function cocoapodsVersionAsync(rubyVersion) {
628
+ async function projectCocoapodsVersion(root, podDirectory) {
629
+ const pin = bundlerPin(root, podDirectory);
630
+ if (pin) return pin.cocoapods;
622
631
  try {
623
632
  return podVersionLine(await getExecutor().runFileAsync("pod", ["--version"], {
624
633
  timeoutMs: 2e4,
625
- env: podProbeEnv(await podEnvForRubyAsync(rubyVersion))
634
+ cwd: podDirectory,
635
+ env: podProbeEnv(await podEnvForRubyAsync(readRubyVersion(root)))
626
636
  }));
627
637
  } catch {
628
638
  return null;
@@ -832,6 +842,17 @@ function toolchainMismatches(target, worker) {
832
842
  reason: `${worker.os} there, and ${name} builds need a Mac`
833
843
  }];
834
844
  }
845
+ if (target.platform === "macos" && target.runsOnWorker) {
846
+ if (!worker.xcode) out.push({
847
+ code: "xcode",
848
+ reason: "no Xcode there"
849
+ });
850
+ if (!worker.macosSdk) out.push({
851
+ code: "macos-sdk",
852
+ reason: "no macOS SDK there"
853
+ });
854
+ return out;
855
+ }
835
856
  if (worker.arch !== local.arch) out.push({
836
857
  code: "arch",
837
858
  reason: `CPU ${worker.arch} there, ${local.arch} here`
@@ -0,0 +1,2 @@
1
+ import { t as triggerMaintenance } from "./trigger-CBMe2YLH.mjs";
2
+ export { triggerMaintenance };
@@ -1,7 +1,7 @@
1
- import { t as getExecutor } from "./exec-DEoAhcze.mjs";
1
+ import { t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
2
  import { t as resolveMaintenanceSettings } from "./settings-Djl-mpjX.mjs";
3
3
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
4
- import { n as windowsLauncherArgs } from "./detached-entry-BwNEtIrP.mjs";
4
+ import { n as windowsLauncherArgs } from "./detached-entry-KmieOKgN.mjs";
5
5
  import { n as stampAttempt, r as due, t as capChildLog } from "./attempt-DW-mQqM7.mjs";
6
6
  import { readClaimSet } from "@stim-cli/core/ownership-claim";
7
7
  import { closeSync, openSync } from "node:fs";
@@ -1,10 +1,10 @@
1
- import { b as debugLog, n as isTimeoutError, r as WorkspaceProcessCleanupError, t as getExecutor, x as ownership_claim_exports } from "./exec-DEoAhcze.mjs";
1
+ import { D as ownership_claim_exports, E as debugLog, l as WorkspaceProcessCleanupError, n as isTimeoutError, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
2
  import { d as workspaceDir, n as ensureWorkspaceStorage, v as withDirLock } from "./paths-DQtTgsBf.mjs";
3
- import { l as gitQuietAsync, o as git$1, s as gitAsync } from "./operation-exec-BW0em61G.mjs";
4
- import { f as agentKey, m as discoverAgentSessions, o as updateWorkspaceState, p as attributeAgentSessions } from "./workspace-state-U08dEzhG.mjs";
5
- import { wt as linkedWorktreesOnDisk, yt as gitCommonDirOnDisk } from "./settings-C7O8A6ZI.mjs";
6
- import { V as ownedAvdDirectory } from "./android-C7sVmyI9.mjs";
7
- import { s as pullRequestLookups } from "./pull-request-W1IuLXDt.mjs";
3
+ import { l as gitQuietAsync, o as git$1, s as gitAsync } from "./operation-exec-CUZifp6Z.mjs";
4
+ import { h as discoverAgentSessions, m as attributeAgentSessions, o as updateWorkspaceState, p as agentKey } from "./workspace-state-CeBpIZgr.mjs";
5
+ import { wt as linkedWorktreesOnDisk, yt as gitCommonDirOnDisk } from "./settings-RKwY33wv.mjs";
6
+ import { V as ownedAvdDirectory } from "./android-882m4hxX.mjs";
7
+ import { s as pullRequestLookups } from "./pull-request-CbNlkFok.mjs";
8
8
  import { clearClaimChild, markClaimChildPending, releaseClaim, setClaimChild, tryAcquireClaim } from "@stim-cli/core/ownership-claim";
9
9
  import { randomUUID } from "node:crypto";
10
10
  import { existsSync, mkdirSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
@@ -1,20 +1,22 @@
1
1
  import { m as workspaceLogsDir } from "./paths-DQtTgsBf.mjs";
2
- import { E as upsertProject, p as getProject } from "./config-DlrsduwG.mjs";
3
- import { f as refuseNoProject, l as phaseLine } from "./command-output-YKGWivpG.mjs";
4
- import { i as recordWorkspaceUse } from "./workspace-state-U08dEzhG.mjs";
5
- import { J as resolveProjectSettingsAsync, a as SETTING_SHAPE_REMEDY, et as settingShapeErrors } from "./settings-C7O8A6ZI.mjs";
6
- import { f as projectRegistry, n as findCommandWorkspace } from "./project-DhCtQWWU.mjs";
7
- import { o as readWebRecord, r as cdpEndpoint } from "./state--smjFSTL.mjs";
8
- import { a as workspaceLinkLine, o as workspaceLinks } from "./stim-desktop-D5OGpYZM.mjs";
9
- import { t as liveWebRecord } from "./page-DBL2PiUU.mjs";
10
- import { n as ensureWorkspaceStorageSafely } from "./native-runtime-DBRfY_PN.mjs";
2
+ import { E as upsertProject, O as withConfigLockAsync, p as getProject } from "./config-BZhXY15H.mjs";
3
+ import { f as refuseNoProject, l as phaseLine } from "./command-output-DxC0k2rk.mjs";
4
+ import { i as recordWorkspaceUse } from "./workspace-state-CeBpIZgr.mjs";
5
+ import { J as resolveProjectSettingsAsync, a as SETTING_SHAPE_REMEDY, et as settingShapeErrors } from "./settings-RKwY33wv.mjs";
6
+ import { f as projectRegistry, n as findCommandWorkspace } from "./project-Dz-hWkb-.mjs";
7
+ import { a as workspaceLinkLine, o as workspaceLinks } from "./stim-desktop-DS0mzR8U.mjs";
8
+ import { o as readWebRecord, r as cdpEndpoint } from "./state-B1ig0Kqy.mjs";
9
+ import { t as liveWebRecord } from "./page-CzEA_-5_.mjs";
10
+ import { n as ensureWorkspaceStorageSafely } from "./native-runtime-DgtJkzIa.mjs";
11
11
  import chalk from "chalk";
12
12
  //#region src/commands/web.ts
13
13
  const printNote = (line) => console.error(line);
14
14
  async function runWeb({ root, headed, note, context }) {
15
15
  const startedAt = Date.now();
16
16
  await ensureWorkspaceStorageSafely(root, { note });
17
- if (!getProject(root)) upsertProject(root, {});
17
+ await withConfigLockAsync(() => {
18
+ if (!getProject(root)) upsertProject(root, {});
19
+ });
18
20
  const { settings } = await resolveProjectSettingsAsync(root, context ? {
19
21
  env: context.env,
20
22
  signal: context.signal
@@ -0,0 +1,2 @@
1
+ import { n as webCommand, t as runWeb } from "./web-BH7peScT.mjs";
2
+ export { webCommand as default, runWeb };
package/dist/web-run.mjs CHANGED
@@ -1,13 +1,12 @@
1
- import { g as process_identity_exports, t as getExecutor, x as ownership_claim_exports } from "./exec-DEoAhcze.mjs";
2
- import { u as cancellableSleep } from "./operation-exec-BW0em61G.mjs";
1
+ import { D as ownership_claim_exports, S as process_identity_exports, o as cancellableSleep, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
+ import { i as recordCreatedDevice } from "./created-devices-D2Aca-xu.mjs";
3
+ import { f as signalProcessTree } from "./metro-Bu8LBfzS.mjs";
3
4
  import { r as createNdjsonWriter } from "./ndjson-CgE_o3Dl.mjs";
4
- import { f as signalProcessTree } from "./metro-DiXtA3Ty.mjs";
5
- import { c as webClaimRoot, f as webLogFile, g as chromeProcessState, h as writeWebRecord, i as clearWebRecord, l as webDir, n as browserLogFile, p as webProfileDir, s as updateWebRecord, v as liveProfileHolder, y as removeSingletonFiles } from "./state--smjFSTL.mjs";
6
- import { l as probeWebDrivers } from "./activity-BpWUPgUm.mjs";
7
- import { i as recordCreatedDevice } from "./created-devices-x9rN6bhs.mjs";
8
- import { t as connectOwnedBrowser } from "./cdp-3fwICjzi.mjs";
9
- import { t as relaunchWithLogFile } from "./detached-entry-BwNEtIrP.mjs";
10
- import { i as chromeArgs, n as DESKTOP_PAGE, r as PHONE_SCREEN } from "./chrome-Bbw689-6.mjs";
5
+ import { c as webClaimRoot, f as webLogFile, g as chromeProcessState, h as writeWebRecord, i as clearWebRecord, l as webDir, n as browserLogFile, p as webProfileDir, s as updateWebRecord, v as liveProfileHolder, y as removeSingletonFiles } from "./state-B1ig0Kqy.mjs";
6
+ import { l as probeWebDrivers } from "./activity-Dq3ZcdD8.mjs";
7
+ import { t as connectOwnedBrowser } from "./cdp-BG3FJCCx.mjs";
8
+ import { t as relaunchWithLogFile } from "./detached-entry-KmieOKgN.mjs";
9
+ import { i as chromeArgs, n as DESKTOP_PAGE, r as PHONE_SCREEN } from "./chrome-BvV8ssI3.mjs";
11
10
  import { existsSync, mkdirSync, openSync, realpathSync } from "node:fs";
12
11
  import { isAbsolute, resolve } from "node:path";
13
12
  import { LOG_ROTATE_BYTES } from "@stim-cli/core";
@@ -1,17 +1,28 @@
1
- import { t as getExecutor } from "./exec-DEoAhcze.mjs";
1
+ import { t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
+ import { writeFileSync } from "node:fs";
2
3
  //#region bin/windows-report.ts
3
4
  const request = JSON.parse(process.env.STIM_REPORT_CHILD ?? "");
4
5
  const env = { ...process.env };
5
6
  delete env.STIM_REPORT_CHILD;
7
+ const mark = (path) => {
8
+ if (!path) return;
9
+ try {
10
+ writeFileSync(path, "");
11
+ } catch {}
12
+ };
6
13
  const child = getExecutor().spawn(request.file, request.args, {
7
14
  stdio: "inherit",
8
15
  env
9
16
  });
17
+ child.once("spawn", () => {
18
+ mark(request.started);
19
+ });
10
20
  child.once("error", (error) => {
11
21
  console.error(error.message);
12
22
  process.exitCode = 1;
13
23
  });
14
24
  child.once("close", (status) => {
25
+ mark(request.closed);
15
26
  process.exitCode = status ?? 1;
16
27
  });
17
28
  //#endregion
@@ -40,4 +40,4 @@ $start.Arguments = '"' + $request.entry + '"'
40
40
  $start.UseShellExecute = $false
41
41
  $child = [System.Diagnostics.Process]::Start($start)
42
42
  $child.WaitForExit()
43
- [System.Environment]::Exit($child.ExitCode)
43
+ exit $child.ExitCode
@@ -1,7 +1,7 @@
1
- import { g as process_identity_exports, t as getExecutor } from "./exec-DEoAhcze.mjs";
1
+ import { S as process_identity_exports, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
2
  import { _ as workspaceStateLock, g as workspaceStateFile$1, n as ensureWorkspaceStorage, r as ensureWorkspaceStorageAsync, v as withDirLock, y as withDirLockAsync } from "./paths-DQtTgsBf.mjs";
3
- import { A as writeConfigSettingAsync, k as writeConfigSetting, m as getProjectSettings } from "./config-DlrsduwG.mjs";
4
- import { ot as workspaceHiddenSetting } from "./settings-C7O8A6ZI.mjs";
3
+ import { A as writeConfigSettingAsync, k as writeConfigSetting, m as getProjectSettings } from "./config-BZhXY15H.mjs";
4
+ import { ot as workspaceHiddenSetting } from "./settings-RKwY33wv.mjs";
5
5
  import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
6
6
  import { homedir } from "node:os";
7
7
  import { dirname, isAbsolute, join, relative } from "node:path";
@@ -275,6 +275,13 @@ function writeWorkspaceState(root, patch) {
275
275
  ...patch
276
276
  }));
277
277
  }
278
+ /** Merges a patch into workspace state after asynchronously acquiring its lock. */
279
+ function writeWorkspaceStateAsync(root, patch, signal) {
280
+ return updateWorkspaceStateAsync(root, (state) => ({
281
+ ...state,
282
+ ...patch
283
+ }), signal);
284
+ }
278
285
  function updateWorkspaceState(root, update) {
279
286
  return withWorkspaceStateLock(root, () => replaceWorkspaceState(root, update(readWorkspaceState(root) ?? {})));
280
287
  }
@@ -382,4 +389,4 @@ function workspaceUsePatch(now, env, commandCwd) {
382
389
  };
383
390
  }
384
391
  //#endregion
385
- export { recordWorkspaceUseAsync as a, withWorkspaceStateLock as c, writeWorkspaceState as d, agentKey as f, recordWorkspaceUse as i, withWorkspaceStateLockAsync as l, discoverAgentSessions as m, clearWorkspaceStateKeys as n, updateWorkspaceState as o, attributeAgentSessions as p, readWorkspaceState$1 as r, updateWorkspaceStateAsync as s, clearWorkspaceStateKey as t, workspaceLastUsed as u };
392
+ export { recordWorkspaceUseAsync as a, withWorkspaceStateLock as c, writeWorkspaceState as d, writeWorkspaceStateAsync as f, discoverAgentSessions as h, recordWorkspaceUse as i, withWorkspaceStateLockAsync as l, attributeAgentSessions as m, clearWorkspaceStateKeys as n, updateWorkspaceState as o, agentKey as p, readWorkspaceState$1 as r, updateWorkspaceStateAsync as s, clearWorkspaceStateKey as t, workspaceLastUsed as u };
@@ -1,20 +1,20 @@
1
- import { a as workspaceProcessLockError, c as declareSpawnsOn, f as stopDeclaringSpawnsOn, g as process_identity_exports, i as withWorkspaceProcessLock, o as workspaceProcessLockPath, r as WorkspaceProcessCleanupError, t as getExecutor, x as ownership_claim_exports } from "./exec-DEoAhcze.mjs";
1
+ import { D as ownership_claim_exports, S as process_identity_exports, c as throwIfCancelled, d as workspaceProcessLockError, f as workspaceProcessLockPath, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, o as cancellableSleep, t as getExecutor, u as withWorkspaceProcessLock, v as stopDeclaringSpawnsOn } from "./exec-VFRpu1iA.mjs";
2
2
  import { d as workspaceDir, h as workspaceName$1, l as workspaceAgentDeviceDir } from "./paths-DQtTgsBf.mjs";
3
- import { F as isOnMountedVolume, G as projectDeviceSlots, H as deviceSlotPlatforms, I as listMountedVolumes, L as measuredDirectorySizeAsync, O as withConfigLockAsync$1, P as formatBytes, _ as loadConfig$1, d as getConfigDir, g as isPathPrefix, j as acquireAvdClaim, p as getProject } from "./config-DlrsduwG.mjs";
3
+ import { F as isOnMountedVolume, G as projectDeviceSlots, H as deviceSlotPlatforms, I as listMountedVolumes, L as measuredDirectorySizeAsync, O as withConfigLockAsync$1, P as formatBytes, _ as loadConfig$1, d as getConfigDir, g as isPathPrefix, j as acquireAvdClaim, p as getProject } from "./config-BZhXY15H.mjs";
4
4
  import { t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
5
- import { a as formatElapsed, l as phaseLine } from "./command-output-YKGWivpG.mjs";
6
- import { f as throwIfCancelled, t as runOperationFile, u as cancellableSleep } from "./operation-exec-BW0em61G.mjs";
7
- import { l as withWorkspaceStateLockAsync, r as readWorkspaceState$1, u as workspaceLastUsed } from "./workspace-state-U08dEzhG.mjs";
8
- import { Nt as repoRootAsync, ut as resolveTailscaleBinary } from "./settings-C7O8A6ZI.mjs";
9
- import { a as macosRuntimeClaim, n as macosDir } from "./state-08I3hw3_.mjs";
10
- import { c as pidExists, f as signalProcessTree, p as signalProcessTreeAsync } from "./metro-DiXtA3Ty.mjs";
11
- import { _ as chromeProcessStateAsync, c as webClaimRoot, i as clearWebRecord, o as readWebRecord, p as webProfileDir, t as CDP_PORT_LABEL, u as webFacts, v as liveProfileHolder, y as removeSingletonFiles } from "./state--smjFSTL.mjs";
5
+ import { a as formatElapsed, l as phaseLine } from "./command-output-DxC0k2rk.mjs";
6
+ import { t as runOperationFile } from "./operation-exec-CUZifp6Z.mjs";
7
+ import { l as withWorkspaceStateLockAsync, r as readWorkspaceState$1, u as workspaceLastUsed } from "./workspace-state-CeBpIZgr.mjs";
8
+ import { Nt as repoRootAsync, ut as resolveTailscaleBinary } from "./settings-RKwY33wv.mjs";
9
+ import { a as macosRuntimeClaim, n as macosDir } from "./state-BfAltYJP.mjs";
10
+ import { H as ownedAvdMatchesConfiguration, K as ownedAvdSystemImage, L as listOrphanedAvdDirectories, S as deleteAvd, V as ownedAvdDirectory, _t as parkSim, bt as removeParkedAfter, g as avdPathExists, ht as eraseParkedAfter, it as shutdownAndroidEmulator, j as listAdbDevicesAsync, lt as wipeAvdUserData, nt as resolveOwnedAvdSerialAsync, p as assertOwnedAvdStoppedAsync, st as waitForAndroidEmulatorShutdown, ut as isStimOwnedAvd, v as avdStorageRoots, yt as readParked } from "./android-882m4hxX.mjs";
11
+ import { i as recordCreatedDevice, n as forgetCreatedDeviceAsync, r as readCreatedDevices$1, t as forgetCreatedDevice } from "./created-devices-D2Aca-xu.mjs";
12
+ import { c as pidExists, f as signalProcessTree, p as signalProcessTreeAsync } from "./metro-Bu8LBfzS.mjs";
13
+ import { _ as chromeProcessStateAsync, c as webClaimRoot, i as clearWebRecord, o as readWebRecord, p as webProfileDir, t as CDP_PORT_LABEL, u as webFacts, v as liveProfileHolder, y as removeSingletonFiles } from "./state-B1ig0Kqy.mjs";
12
14
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
13
- import { N as listBuildLocks, d as readAgentDeviceRecords, t as agentDeviceDaemon } from "./activity-BpWUPgUm.mjs";
14
- import { i as recordCreatedDevice, r as readCreatedDevices$1, t as forgetCreatedDevice } from "./created-devices-x9rN6bhs.mjs";
15
- import { H as ownedAvdMatchesConfiguration, K as ownedAvdSystemImage, L as listOrphanedAvdDirectories, S as deleteAvd, V as ownedAvdDirectory, at as waitForAndroidEmulatorShutdown, et as resolveOwnedAvdSerialAsync, g as avdPathExists, gt as parkSim, j as listAdbDevicesAsync, lt as isStimOwnedAvd, mt as eraseParkedAfter, nt as shutdownAndroidEmulator, p as assertOwnedAvdStoppedAsync, st as wipeAvdUserData, v as avdStorageRoots, vt as readParked, yt as removeParkedAfter } from "./android-C7sVmyI9.mjs";
16
- import { E as resolveOwnedIosSim, O as shutdownIosSim, S as renameIosSim, c as eraseIosSim, f as listAllIosSimsAsync, o as deleteIosSim, p as listIosDeviceTypesAsync, s as deleteParkedIosSim, v as parkedSimName, y as parseRuntimeVersion } from "./ios-hcBpnEGk.mjs";
17
- import { r as releaseBrowserPort } from "./named-ports-DkEzOfzO.mjs";
15
+ import { N as listBuildLocks, d as readAgentDeviceRecords, t as agentDeviceDaemon } from "./activity-Dq3ZcdD8.mjs";
16
+ import { E as resolveOwnedIosSim, O as shutdownIosSim, S as renameIosSim, c as eraseIosSim, f as listAllIosSimsAsync, o as deleteIosSim, p as listIosDeviceTypesAsync, s as deleteParkedIosSim, v as parkedSimName, y as parseRuntimeVersion } from "./ios-CVUFFZ6C.mjs";
17
+ import { r as releaseBrowserPort } from "./named-ports-BWDuU5oQ.mjs";
18
18
  import { createHash, randomUUID } from "node:crypto";
19
19
  import { closeSync, existsSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, rmdirSync, statSync, unlinkSync, watch, writeFileSync } from "node:fs";
20
20
  import { isDeepStrictEqual } from "node:util";
@@ -22,7 +22,7 @@ import { homedir } from "node:os";
22
22
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
23
23
  import { ambientContext, ambientEnv, ambientWrite } from "@stim-cli/core";
24
24
  import { buildSlotsDir, hostedNativeRecords, isJsonObject, macosAppState, parseHostedNativePlacement, readJsonFile, readMacosRecord, requireAutomaticMachine, tryAcquireBuildSlotClaim, unreadableHostedNative } from "@stim-cli/core/state";
25
- import { basename as basename$1, isAbsolute as isAbsolute$1, join as join$1, relative as relative$1 } from "path";
25
+ import { basename as basename$1, dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, relative as relative$1 } from "path";
26
26
  import chalk from "chalk";
27
27
  import { existsSync as existsSync$1, lstatSync as lstatSync$1, readdirSync as readdirSync$1, statSync as statSync$1 } from "fs";
28
28
  import { lstat, readFile, readdir, rm, stat, unlink } from "node:fs/promises";
@@ -641,13 +641,13 @@ async function parkOwnedIosSim(settled, udid, park, operation) {
641
641
  };
642
642
  return {
643
643
  record,
644
- evicted: parkSim({
644
+ evicted: await withConfigLockAsync$1(() => parkSim({
645
645
  platform: "ios",
646
646
  projectPath: park.projectPath,
647
647
  slot: park.slot,
648
648
  record,
649
649
  max: park.max
650
- })
650
+ }))
651
651
  };
652
652
  }
653
653
  async function teardownOwnedIosSim(udid, { del = false, label, park, workspace, shutdownClock = {}, operation } = {}) {
@@ -775,7 +775,7 @@ async function removeOrphanedAvdDirectory(candidate, owner, operation) {
775
775
  } catch (error) {
776
776
  throw new Error(`Could not remove AVD data at ${detached}; retry gc --delete: ${error.message}`, { cause: error });
777
777
  }
778
- forgetCreatedDevice("android", basename(detached, ".avd"));
778
+ await forgetCreatedDeviceAsync("android", basename(detached, ".avd"));
779
779
  }
780
780
  async function teardownUnregisteredAvd(avdName, del, owner, surveyed, operation) {
781
781
  operation?.signal.throwIfAborted();
@@ -812,7 +812,7 @@ async function teardownOwnedAvd(avdName, options = {}) {
812
812
  if (operation) declareSpawnsOn(operation, claim);
813
813
  const result = await teardownClaimedAvd(avdName, claim, options);
814
814
  operation?.signal.throwIfAborted();
815
- if (result.status === "torn-down" || result.status === "missing") options.onRemoved?.();
815
+ if (result.status === "torn-down" || result.status === "missing") await options.onRemoved?.();
816
816
  return result;
817
817
  } catch (error) {
818
818
  if (claim && (error instanceof WorkspaceProcessCleanupError || error instanceof Error && "reportCleanup" in error)) {
@@ -948,21 +948,22 @@ async function teardownClaimedAvd(avdName, claim, { operation, del = false, wipe
948
948
  if (park && park.max > 0) try {
949
949
  const systemImage = ownedAvdSystemImage(avdName);
950
950
  if (!systemImage || !park.configuration || !ownedAvdMatchesConfiguration(avdName, park.configuration)) throw new Error("the AVD has no verified creation configuration");
951
- const evicted = parkSim({
951
+ const record = {
952
+ udid: avdName,
953
+ name: avdName,
954
+ systemImage,
955
+ configuration: park.configuration,
956
+ parkedAt: (/* @__PURE__ */ new Date()).toISOString(),
957
+ ...park.appId ? { packageName: park.appId } : {},
958
+ ...park.cacheKey ? { cacheKey: park.cacheKey } : {}
959
+ };
960
+ const evicted = await withConfigLockAsync$1(() => parkSim({
952
961
  platform: "android",
953
962
  projectPath: park.projectPath,
954
963
  slot: park.slot,
955
964
  max: park.max,
956
- record: {
957
- udid: avdName,
958
- name: avdName,
959
- systemImage,
960
- configuration: park.configuration,
961
- parkedAt: (/* @__PURE__ */ new Date()).toISOString(),
962
- ...park.appId ? { packageName: park.appId } : {},
963
- ...park.cacheKey ? { cacheKey: park.cacheKey } : {}
964
- }
965
- });
965
+ record
966
+ }));
966
967
  const removed = [];
967
968
  const failures = [];
968
969
  for (const entry of evicted) {
@@ -1132,7 +1133,7 @@ async function teardownBrowserHeld(root, { deleteProfile = false, operation } =
1132
1133
  force: true
1133
1134
  });
1134
1135
  signal?.throwIfAborted();
1135
- forgetCreatedDevice("web", profile);
1136
+ await forgetCreatedDeviceAsync("web", profile);
1136
1137
  }
1137
1138
  return record ? {
1138
1139
  status: "torn-down",
@@ -2125,6 +2126,9 @@ function rootPresence(path) {
2125
2126
  return code === "ENOENT" || code === "ENOTDIR" ? false : null;
2126
2127
  }
2127
2128
  }
2129
+ function workspaceDirRemoved(dir) {
2130
+ return existsSync$1(workspacesRoot()) && canonicalPath(dirname$1(dir)) === canonicalPath(workspacesRoot()) && rootPresence(dir) === false;
2131
+ }
2128
2132
  async function collectOrphanedWorkspaces(registryKeys, mountedVolumes, { measure = true, operation } = {}) {
2129
2133
  const classified = {
2130
2134
  orphaned: [],
@@ -2377,4 +2381,4 @@ function sizeText(bytes) {
2377
2381
  return bytes === null ? "size unknown" : formatBytes(bytes);
2378
2382
  }
2379
2383
  //#endregion
2380
- export { teardownParkedAvd as A, createGcResults as B, runningBundleInstancesAsync as C, teardownOwnedAvd as D, teardownBrowserHeld as E, writeUsageCache as F, acquireBuildSlot as I, listBuildSlots as L, probePublicHttp as M, canonical$1 as N, teardownOwnedBrowser as O, measureDu as P, releaseBuildSlot as R, withManagedTunnelRemovalLock as S, eraseParkedIosSim as T, takeGcResults as V, stopTunnel as _, collectWorkspaceOutputs as a, withManagedRemoteWorktreeRemovalLock as b, listWorkspaceDirs as c, emptyWorkspaceDir as d, withIdleWorkspace as f, startTunnelSequence as g, resolveSupervisorTarget as h, collectOrphanedWorkspaces as i, teardownParkedIosSim as j, teardownOwnedIosSim as k, rootPresence as l, workspaceInUseAsync as m, WORKSPACE_OUTPUT_DIRS as n, deleteOrphanedWorkspaces as o, workspaceInUse as p, clearWorkspaceOutputs as r, isInsideWorkspaces as s, REBUILD_COST as t, sizeText as u, terminateChild as v, eraseParkedAvd as w, withManagedTunnelLock as x, withManagedRemoteWorktreeLock as y, GC_OUTPUT as z };
2384
+ export { teardownOwnedIosSim as A, GC_OUTPUT as B, withManagedTunnelRemovalLock as C, teardownBrowserHeld as D, eraseParkedIosSim as E, measureDu as F, takeGcResults as H, writeUsageCache as I, acquireBuildSlot as L, teardownParkedIosSim as M, probePublicHttp as N, teardownOwnedAvd as O, canonical$1 as P, listBuildSlots as R, withManagedTunnelLock as S, eraseParkedAvd as T, createGcResults as V, startTunnelSequence as _, collectWorkspaceOutputs as a, withManagedRemoteWorktreeLock as b, listWorkspaceDirs as c, workspaceDirRemoved as d, emptyWorkspaceDir as f, resolveSupervisorTarget as g, workspaceInUseAsync as h, collectOrphanedWorkspaces as i, teardownParkedAvd as j, teardownOwnedBrowser as k, rootPresence as l, workspaceInUse as m, WORKSPACE_OUTPUT_DIRS as n, deleteOrphanedWorkspaces as o, withIdleWorkspace as p, clearWorkspaceOutputs as r, isInsideWorkspaces as s, REBUILD_COST as t, sizeText as u, stopTunnel as v, runningBundleInstancesAsync as w, withManagedRemoteWorktreeRemovalLock as x, terminateChild as y, releaseBuildSlot as z };
@@ -1,2 +1,2 @@
1
- import { _ as worktreeCommand, a as matchWorktreeEntry, c as reclaimKeys, d as removalBlockers, f as removalPath, g as warmedWorkspace, h as warmWorktreeTarget, i as excludeWatchmanCookies, l as registerRemove, m as removeWorktreeTarget, n as dependencyInstallCommand, o as nestedWorktrees, p as removalRemedy, r as excludePodChurn, s as porcelainPath, t as customIosDirs, u as registerWarm } from "./worktree-B4Nj3EGS.mjs";
1
+ import { _ as worktreeCommand, a as matchWorktreeEntry, c as reclaimKeys, d as removalBlockers, f as removalPath, g as warmedWorkspace, h as warmWorktreeTarget, i as excludeWatchmanCookies, l as registerRemove, m as removeWorktreeTarget, n as dependencyInstallCommand, o as nestedWorktrees, p as removalRemedy, r as excludePodChurn, s as porcelainPath, t as customIosDirs, u as registerWarm } from "./worktree-Dw8kfacb.mjs";
2
2
  export { customIosDirs, worktreeCommand as default, dependencyInstallCommand, excludePodChurn, excludeWatchmanCookies, matchWorktreeEntry, nestedWorktrees, porcelainPath, reclaimKeys, registerRemove, registerWarm, removalBlockers, removalPath, removalRemedy, removeWorktreeTarget, warmWorktreeTarget, warmedWorkspace };