stim 1.30.0 → 1.32.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 (144) hide show
  1. package/dist/{acquire-artifact-CrZ4rEbI.mjs → acquire-artifact-CI9fIokp.mjs} +1 -1
  2. package/dist/{act-BaKjDWGw.mjs → act-BfChMxcU.mjs} +71 -22
  3. package/dist/{activity-BTaUf0tc.mjs → activity-yjH7Q3zn.mjs} +4 -4
  4. package/dist/{agent-device-usage-output-DYBpO17K.mjs → agent-device-usage-output-DO412bsG.mjs} +4 -4
  5. package/dist/{android-BWqdDK6R.mjs → android-BNm5A40S.mjs} +41 -39
  6. package/dist/{android-BEQUDpOg.mjs → android-BeeC15Ve.mjs} +1 -1
  7. package/dist/{android-BCYLwmH6.mjs → android-D56S_GX3.mjs} +5 -5
  8. package/dist/{android-DdKG6lyD.mjs → android-DsEj2CCs.mjs} +27 -6
  9. package/dist/{android-cas-BH6K12__.mjs → android-cas-CbumHXIq.mjs} +4 -4
  10. package/dist/api.mjs +26 -26
  11. package/dist/{apk-signed-tail-B8kw4a8K.mjs → apk-signed-tail-B9Usseps.mjs} +2 -2
  12. package/dist/{artifact-M6W2l-xh.mjs → artifact-C8Nvp07y.mjs} +12 -12
  13. package/dist/{artifact-DTHXcmQ3.mjs → artifact-k1x9Jrn0.mjs} +12 -12
  14. package/dist/{auto-placement-CZaWDmcY.mjs → auto-placement--nfdQ9rp.mjs} +10 -10
  15. package/dist/{browser-web-JQ7lFej3.mjs → browser-web-6RDAeH0z.mjs} +11 -11
  16. package/dist/{build-C2ZWoCmg.mjs → build-VXX_dtl5.mjs} +22 -22
  17. package/dist/{build-cache-DlC3owap.mjs → build-cache-BsKim4V7.mjs} +4 -4
  18. package/dist/{build-plan-J3iRR3gI.mjs → build-plan-BK34X2iY.mjs} +6 -6
  19. package/dist/{cache-manifest-evF_zJ9U.mjs → cache-manifest-CfiEny4T.mjs} +1 -1
  20. package/dist/cache-manifest.mjs +1 -1
  21. package/dist/{ccache-B8gY50-h.mjs → ccache-BrwGIxmV.mjs} +15 -15
  22. package/dist/{cli-xRPXJPtA.mjs → cli-Jc7obreB.mjs} +18 -18
  23. package/dist/cli.mjs +1 -1
  24. package/dist/{client-DrHykA24.mjs → client-lDmA-5jx.mjs} +4 -4
  25. package/dist/collector-run.mjs +4 -4
  26. package/dist/{command-output-BBW8eWPL.mjs → command-output-CfPW1bKP.mjs} +1 -1
  27. package/dist/{config-AbUjIBOQ.mjs → config-D5qNWJEP.mjs} +2 -2
  28. package/dist/{dependencies-vUh9mp5z.mjs → dependencies-DkZ8681S.mjs} +37 -37
  29. package/dist/{dependency-state-CPKAKCZ8.mjs → dependency-state-DZVln1P9.mjs} +1 -1
  30. package/dist/{dev-client-CASgAOu7.mjs → dev-client-eDZy6RoX.mjs} +2 -2
  31. package/dist/{device-CsIdRXfm.mjs → device-CTozKhU0.mjs} +11 -11
  32. package/dist/{device-ChnO7bR9.mjs → device-CeIikWac.mjs} +12 -12
  33. package/dist/{device-android-CcdQqQWg.mjs → device-android-zgD9We85.mjs} +20 -14
  34. package/dist/{device-capacity-C5C_jOQd.mjs → device-capacity-Bki6B-7h.mjs} +173 -74
  35. package/dist/device-host-worker.mjs +19 -15
  36. package/dist/{device-ios-DbmtPIiw.mjs → device-ios-TE5ejeXx.mjs} +8 -8
  37. package/dist/{device-lease-run-Do6zYA7y.mjs → device-lease-run-DeNGjJZM.mjs} +4 -4
  38. package/dist/{device-pool-CpoYiCGO.mjs → device-pool-mjyUYaau.mjs} +3 -3
  39. package/dist/{device-provision-B5Ms94qY.mjs → device-provision-j_B7G0e6.mjs} +8 -8
  40. package/dist/{doctor-CJSB5q-s.mjs → doctor-BlrcoQ7B.mjs} +36 -25
  41. package/dist/{doctor-CpfbYh3Q.mjs → doctor-CNZuvTSe.mjs} +1 -1
  42. package/dist/doctor-fingerprint.mjs +1 -1
  43. package/dist/{doctor-CLE4AZEI.mjs → doctor-sSLtn-j1.mjs} +15 -15
  44. package/dist/{doctor-watchman-D1IyMle9.mjs → doctor-watchman-CCuboyj1.mjs} +4 -4
  45. package/dist/{eas-build-DIDOHw2P.mjs → eas-build-CaG-Sfs9.mjs} +2 -2
  46. package/dist/{eas-fallback-DVS9oBSc.mjs → eas-fallback-BpX1lpco.mjs} +4 -4
  47. package/dist/{eas-session-ledger-CW3l-inB.mjs → eas-session-ledger-B-nTfdfk.mjs} +19 -6
  48. package/dist/{error-diagnostics-XJ9eWdtq.mjs → error-diagnostics-q56Im4D8.mjs} +8 -8
  49. package/dist/{gc-BVIcxCxE.mjs → gc-By2Kc-Ek.mjs} +2 -2
  50. package/dist/{gc-Co7PE36D.mjs → gc-Dv6nb9nf.mjs} +17 -17
  51. package/dist/{guide-DkepBgHT.mjs → guide-CwpsGWTJ.mjs} +141 -39
  52. package/dist/{hosted-android-Du7NxufJ.mjs → hosted-android-c5nPJA6S.mjs} +3 -3
  53. package/dist/{hosted-client-Cect92SZ.mjs → hosted-client-Hs-fD4L3.mjs} +36 -12
  54. package/dist/{hosted-logs-Opcjv1Lr.mjs → hosted-logs-BteXG8rm.mjs} +16 -10
  55. package/dist/{hosted-logs-sync-wsI7N1Hv.mjs → hosted-logs-sync-B8bjLEMs.mjs} +5 -5
  56. package/dist/{hosted-macos-BP9Kucat.mjs → hosted-macos-B4byscei.mjs} +5 -5
  57. package/dist/{hosted-native-DmdLSmvu.mjs → hosted-native-Bh9IJ_t5.mjs} +7 -7
  58. package/dist/{idle-shutdown-BcMN_cLm.mjs → idle-shutdown-BaeCo4ps.mjs} +6 -6
  59. package/dist/{ios-CXnoVO_z.mjs → ios-CdAV4-1E.mjs} +4 -4
  60. package/dist/{ios-BFkBHuRT.mjs → ios-D1XKSITX.mjs} +8 -8
  61. package/dist/{ios-CG0IsLtt.mjs → ios-D3oK9-O4.mjs} +32 -31
  62. package/dist/{ios-device-ClSfuu-_.mjs → ios-device-D7Gi3e1I.mjs} +1 -1
  63. package/dist/{ios-project-BM9TbTE7.mjs → ios-project-DDQlX_jX.mjs} +7 -7
  64. package/dist/{ios-state-Ce_dystM.mjs → ios-state-BEIJRJ7P.mjs} +1 -1
  65. package/dist/{js-swap-9Rx-5Nqz.mjs → js-swap-C8N5DXHl.mjs} +4 -4
  66. package/dist/{launch-DvJV1Mx4.mjs → launch-DxpvL6il.mjs} +19 -19
  67. package/dist/{lightened-23pqe7LS.mjs → lightened-Df6II_XI.mjs} +4 -4
  68. package/dist/{logs-DJgZlf2K.mjs → logs-CuWJWF88.mjs} +7 -7
  69. package/dist/{logs-Pkeh3wZk.mjs → logs-zv3ge7c6.mjs} +5 -5
  70. package/dist/{macos-DPvPQadc.mjs → macos-C6U-4Iip.mjs} +19 -19
  71. package/dist/{macos-Du07NsOB.mjs → macos-CbRZheLw.mjs} +1 -1
  72. package/dist/macos-run.mjs +1 -1
  73. package/dist/maintenance-run.mjs +5 -5
  74. package/dist/{metro-BMQHczcf.mjs → metro-mKHEMO-a.mjs} +2 -2
  75. package/dist/{metro-request-BtF7ox53.mjs → metro-request-DODHNXCN.mjs} +8 -2
  76. package/dist/{named-ports-DcktE2Pw.mjs → named-ports-B0hCk2v-.mjs} +2 -2
  77. package/dist/{native-android-CBOM1_gB.mjs → native-android-9dVFqvTT.mjs} +16 -16
  78. package/dist/{native-gradle-artifact-inputs-D_iAfPuS.mjs → native-gradle-artifact-inputs-BlY97pt8.mjs} +3 -3
  79. package/dist/{native-runtime-D4cTwU0Z.mjs → native-runtime-DQfxW5Au.mjs} +6 -6
  80. package/dist/{native-xcode-inputs-BF-ogSnG.mjs → native-xcode-inputs-tDuUvSU8.mjs} +2 -2
  81. package/dist/{native-xcode-ios-DwJBfMP6.mjs → native-xcode-ios-CG-PD-7g.mjs} +15 -15
  82. package/dist/offload-worker.mjs +19 -19
  83. package/dist/{ownership-Dtz9G5Gl.mjs → ownership-CCfiBfOP.mjs} +2 -2
  84. package/dist/{phone-reverses-CvhhkGMH.mjs → phone-reverses-CnNwdz9A.mjs} +4 -4
  85. package/dist/{placement-log-CRR_TE1r.mjs → placement-log-CRL0IY-k.mjs} +1 -1
  86. package/dist/{plan-placement-CdLc-pTb.mjs → plan-placement-2imvnlWP.mjs} +6 -6
  87. package/dist/{ports-g4N_cfyg.mjs → ports-CKktj5lV.mjs} +3 -3
  88. package/dist/{prebuild-DBJMhwSS.mjs → prebuild-CyNrUWgV.mjs} +9 -9
  89. package/dist/{project-DPQjnpcI.mjs → project-Crtcbfl0.mjs} +15 -15
  90. package/dist/{react-native-android-idMWOwkX.mjs → react-native-android-Cabe2YER.mjs} +22 -22
  91. package/dist/{react-native-build-BSoh4HkH.mjs → react-native-build-DhWBUV_H.mjs} +7 -7
  92. package/dist/{react-native-doctor-CYibY8-4.mjs → react-native-doctor-D-twmBon.mjs} +5 -5
  93. package/dist/{react-native-ios-13KIIOOy.mjs → react-native-ios-u_ley41B.mjs} +14 -14
  94. package/dist/{recordings-CHMaF73C.mjs → recordings-BWnIlhZH.mjs} +1 -1
  95. package/dist/{reload-BUQI3dSu.mjs → reload-D2TpUlns.mjs} +14 -14
  96. package/dist/{reload-B9DZOjcV.mjs → reload-f9hvEHE9.mjs} +1 -1
  97. package/dist/{remote-C-RGHhAP.mjs → remote-BsBAjlD2.mjs} +8 -8
  98. package/dist/{result-W4HCum4A.mjs → result-EOsWV6sp.mjs} +16 -16
  99. package/dist/{run-BQAmrohh.mjs → run-2CHAJ9Oj.mjs} +1 -1
  100. package/dist/{selection-PCMT97XD.mjs → selection-C4ZQz_ER.mjs} +3 -3
  101. package/dist/{server-bare-CEQdB_F4.mjs → server-bare-CFyVFZXJ.mjs} +1 -1
  102. package/dist/{server-command-oqi3TDy7.mjs → server-command-BMyKtnjH.mjs} +4 -4
  103. package/dist/{server-expo-C1K07shx.mjs → server-expo-BLxcN2x2.mjs} +2 -2
  104. package/dist/server-expo-DwR3eD-a.mjs +2 -0
  105. package/dist/{settings-D776ygML.mjs → settings-C6UTYW2K.mjs} +1 -1
  106. package/dist/{settings-CKlMOmhj.mjs → settings-jeS0WmUF.mjs} +2 -2
  107. package/dist/{settings-payload-CE-NZ6Lq.mjs → settings-payload-CrX933Xi.mjs} +4 -4
  108. package/dist/{settings-write-D7Xwa_-M.mjs → settings-write-DMcT23Kl.mjs} +5 -5
  109. package/dist/settings.schema.json +47 -5
  110. package/dist/{simslim-CbpHERcv.mjs → simslim-93xmPh-d.mjs} +1 -1
  111. package/dist/{slot-launch-CeIK1iUI.mjs → slot-launch-CSpQcFZw.mjs} +6 -6
  112. package/dist/{stage-Blqe6bWb.mjs → stage-Cf9uSM1a.mjs} +1 -1
  113. package/dist/{start-B7J5a9nS.mjs → start-CLN_r9EG.mjs} +10 -10
  114. package/dist/{start-CvP2pJjc.mjs → start-CquYgzVf.mjs} +1 -1
  115. package/dist/{state-D5ZxwCGJ.mjs → state-CM_HvvkS.mjs} +2 -2
  116. package/dist/{state-C2AUjjhg.mjs → state-CiflgxTP.mjs} +1 -1
  117. package/dist/{stats-Uo7l8OAk.mjs → stats-BVEZuSlg.mjs} +4 -4
  118. package/dist/{status-CqJI1TgG.mjs → status-Bhdy07v0.mjs} +1 -1
  119. package/dist/{status-_rWXFSO7.mjs → status-D0ruTmPl.mjs} +26 -25
  120. package/dist/{status-CK7ZoEhV.mjs → status-GQ-JqvRi.mjs} +1 -1
  121. package/dist/{status-watch-CnSyXUmj.mjs → status-watch-DSu_hhg6.mjs} +4 -4
  122. package/dist/status-worker.mjs +1 -1
  123. package/dist/{stim-desktop-CYXLFpFS.mjs → stim-desktop-1XxET4S8.mjs} +1 -1
  124. package/dist/{stop-CMVfaA-6.mjs → stop-B616ZyTv.mjs} +4 -4
  125. package/dist/{stop-Bogo9oO2.mjs → stop-RZqER_Ww.mjs} +2 -2
  126. package/dist/{stop-CnF9ixYe.mjs → stop-W4DK8qZq.mjs} +15 -15
  127. package/dist/supervisor-run.mjs +134 -42
  128. package/dist/{support-DUevTPur.mjs → support-NxnD8QXd.mjs} +9 -9
  129. package/dist/{support-BGqpYMV8.mjs → support-S_5nkkzs.mjs} +4 -4
  130. package/dist/{swiftpm-artifact-inputs-BcJk6-3u.mjs → swiftpm-artifact-inputs-yp8D5LE4.mjs} +1 -1
  131. package/dist/{swiftpm-macos-DBrmoocG.mjs → swiftpm-macos-Gtq9bNQb.mjs} +8 -8
  132. package/dist/{toolchain-Cw9VVHOY.mjs → toolchain-B2bN8jEo.mjs} +1 -1
  133. package/dist/{toolchain-DLdoyxIt.mjs → toolchain-Bnm8vUCV.mjs} +4 -4
  134. package/dist/{warm-progress-DQ2wQZKp.mjs → warm-progress-_aTMvkIH.mjs} +3 -3
  135. package/dist/{web-g9U7L1sR.mjs → web-BdWG8b5_.mjs} +8 -8
  136. package/dist/web-DwuluWJt.mjs +2 -0
  137. package/dist/web-run.mjs +4 -4
  138. package/dist/{workspace-state-DGwkPXwq.mjs → workspace-state-3bF4TB8P.mjs} +2 -2
  139. package/dist/{workspaces-7_RWoi6c.mjs → workspaces-C59v9bpD.mjs} +19 -15
  140. package/dist/{worktree-qKJ3x07S.mjs → worktree-CinoSsGy.mjs} +24 -24
  141. package/dist/{worktree-DEet9H3p.mjs → worktree-K9F50fD_.mjs} +1 -1
  142. package/package.json +7 -7
  143. package/dist/server-expo-BUFAq2In.mjs +0 -2
  144. package/dist/web-CI_qCRPw.mjs +0 -2
@@ -1,5 +1,5 @@
1
1
  import { l as WorkspaceProcessCleanupError } from "./exec-aULwtNly.mjs";
2
- import { I as waitForSharedBuild } from "./activity-BTaUf0tc.mjs";
2
+ import { I as waitForSharedBuild } from "./activity-yjH7Q3zn.mjs";
3
3
  import { rmSync } from "node:fs";
4
4
  //#region src/engine/artifact-lifecycle.ts
5
5
  async function runArtifactLifecycle(phases) {
@@ -1,33 +1,34 @@
1
1
  import { S as process_identity_exports, d as workspaceProcessLockError, l as WorkspaceProcessCleanupError, n as isTimeoutError, t as getExecutor, u as withWorkspaceProcessLock } from "./exec-aULwtNly.mjs";
2
- import { E as workspaceDir, j as workspaceStateFile$1, k as workspaceLogsDir$1, r as readWorkspaceState$1, u as workspaceLastUsed, w as workspaceAgentDeviceDir } from "./workspace-state-DGwkPXwq.mjs";
3
- import { F as isOnMountedVolume, G as projectDeviceSlots, I as listMountedVolumes, L as measuredDirectorySizeAsync, N as directorySizeAsync, P as formatBytes, _ as loadConfig$1, p as getProject } from "./config-AbUjIBOQ.mjs";
4
- import { o as formatLongDuration, u as plural } from "./command-output-BBW8eWPL.mjs";
2
+ import { E as workspaceDir, j as workspaceStateFile$1, k as workspaceLogsDir$1, r as readWorkspaceState$1, u as workspaceLastUsed, w as workspaceAgentDeviceDir } from "./workspace-state-3bF4TB8P.mjs";
3
+ import { F as formatBytes, I as isOnMountedVolume, K as projectDeviceSlots, L as listMountedVolumes, P as directorySizeAsync, R as measuredDirectorySizeAsync, m as getProject, v as loadConfig$1 } from "./config-D5qNWJEP.mjs";
4
+ import { o as formatLongDuration, u as plural } from "./command-output-CfPW1bKP.mjs";
5
5
  import { c as gitQuiet, l as gitQuietAsync, n as runOperationFileQuiet, r as childEnvironment } from "./operation-exec-Dp4FuIGR.mjs";
6
- import { At as listWorktrees, Et as hasUncommittedWorkAsync, Ft as matchWorktreeEntry, Kt as sourceCheckoutOf, O as maintenanceKeepSetting, Pt as lockReason, Ut as resolveFullRefAsync, Wt as resolveSourceCheckoutAsync, X as resolveProjectSettings, Xt as worktreeLockAsync, Z as resolveProjectSettingsAsync, bt as dirtyPathsAsync, h as deviceIdleShutdownMinutesSetting, it as settingValueAt, jt as listWorktreesAsync, mt as LOCKED_REASON, qt as unpushedCommitsAsync, sn as removeTemporaryEntryAsync, wt as hasPopulatedSubmodulesAsync } from "./settings-D776ygML.mjs";
7
- import { P as readRemoteSession, i as findProjectRoot$1 } from "./project-DPQjnpcI.mjs";
8
- import { F as listAvds, G as ownedAvdSerialResolverAsync, I as listAvdsAsync, M as listAdbDevicesAsync, O as getAvdNameForSerial, V as ownedAvdDirectory, j as listAdbDevices, k as getAvdNameForSerialAsync, yt as readParked } from "./android-DdKG6lyD.mjs";
9
- import { c as pidExists } from "./metro-BMQHczcf.mjs";
10
- import { A as diskPressureLevel, G as planCacheEmptying, N as lowestFree, P as protectWindowMs, X as collectGradleVersions, Z as deleteGradleVersion, Zn as collectMemoryReport, _ as resolveBudget, at as DEVICE_LIST_TIMEOUT_MS, ct as collectParkedSims, d as enforceBudget, dr as pruneCache, dt as deleteProjectDevices, j as levelFloors, lt as deleteParkedAvds, mt as deviceSweepIsScoped, nr as memorySweepIsScoped, nt as waitForGradleExit, or as stopIdleGradleDaemons, p as machineNumber, sr as phase, st as collectParkedAvds, u as cacheLabel, ur as discoverCaches, ut as deleteParkedSims, v as trimmableCaches, vt as findStaleProjectDevices, y as stopOwnedMetro, z as emptyCaches } from "./ccache-B8gY50-h.mjs";
11
- import { o as readWebRecord, u as webFacts } from "./state-D5ZxwCGJ.mjs";
12
- import { a as unregister, n as readManifest } from "./cache-manifest-evF_zJ9U.mjs";
13
- import { B as workspaceBuildInProgress, Et as GC_OUTPUT, F as collectOwnedDeviceActivityAsync, Ot as takeGcResults, P as collectOwnedDeviceActivity, a as collectOrphanedWorkspaces, b as workspaceInUseAsync, c as isInsideWorkspaces, d as recentNativeUseReason, g as ARTIFACT_DIRS, h as workspaceDirRemoved, i as clearWorkspaceOutputs, jt as readConcurrency, kt as eachLimited, l as keptByLock, m as workspaceBuildReasons, o as collectWorkspaceOutputs, s as deleteOrphanedWorkspaces, t as LIGHTEN_AFTER_MS, u as listWorkspaceDirs, v as withIdleWorkspace, x as resolveSupervisorTarget, y as workspaceInUse } from "./workspaces-7_RWoi6c.mjs";
6
+ import { At as listWorktrees, Et as hasUncommittedWorkAsync, Ft as matchWorktreeEntry, Kt as sourceCheckoutOf, O as maintenanceKeepSetting, Pt as lockReason, Ut as resolveFullRefAsync, Wt as resolveSourceCheckoutAsync, X as resolveProjectSettings, Xt as worktreeLockAsync, Z as resolveProjectSettingsAsync, bt as dirtyPathsAsync, h as deviceIdleShutdownMinutesSetting, it as settingValueAt, jt as listWorktreesAsync, mt as LOCKED_REASON, qt as unpushedCommitsAsync, sn as removeTemporaryEntryAsync, wt as hasPopulatedSubmodulesAsync } from "./settings-C6UTYW2K.mjs";
7
+ import { P as readRemoteSession, i as findProjectRoot$1 } from "./project-Crtcbfl0.mjs";
8
+ import { A as getAvdNameForSerialAsync, L as listAvds, N as listAdbDevices, P as listAdbDevicesAsync, R as listAvdsAsync, U as ownedAvdDirectory, k as getAvdNameForSerial, q as ownedAvdSerialResolverAsync, xt as readParked } from "./android-DsEj2CCs.mjs";
9
+ import { c as pidExists } from "./metro-mKHEMO-a.mjs";
10
+ import { A as diskPressureLevel, G as planCacheEmptying, N as lowestFree, P as protectWindowMs, X as collectGradleVersions, Z as deleteGradleVersion, Zn as collectMemoryReport, _ as resolveBudget, at as DEVICE_LIST_TIMEOUT_MS, ct as collectParkedSims, d as enforceBudget, dr as pruneCache, dt as deleteProjectDevices, j as levelFloors, lt as deleteParkedAvds, mt as deviceSweepIsScoped, nr as memorySweepIsScoped, nt as waitForGradleExit, or as stopIdleGradleDaemons, p as machineNumber, sr as phase, st as collectParkedAvds, u as cacheLabel, ur as discoverCaches, ut as deleteParkedSims, v as trimmableCaches, vt as findStaleProjectDevices, y as stopOwnedMetro, z as emptyCaches } from "./ccache-BrwGIxmV.mjs";
11
+ import { o as readWebRecord, u as webFacts } from "./state-CM_HvvkS.mjs";
12
+ import { a as unregister, n as readManifest } from "./cache-manifest-CfiEny4T.mjs";
13
+ import { B as workspaceBuildInProgress, Et as GC_OUTPUT, F as collectOwnedDeviceActivityAsync, Ot as takeGcResults, P as collectOwnedDeviceActivity, a as collectOrphanedWorkspaces, b as workspaceInUseAsync, c as isInsideWorkspaces, d as recentNativeUseReason, g as ARTIFACT_DIRS, h as workspaceDirRemoved, i as clearWorkspaceOutputs, jt as readConcurrency, kt as eachLimited, l as keptByLock, m as workspaceBuildReasons, o as collectWorkspaceOutputs, s as deleteOrphanedWorkspaces, t as LIGHTEN_AFTER_MS, u as listWorkspaceDirs, v as withIdleWorkspace, x as resolveSupervisorTarget, y as workspaceInUse } from "./workspaces-C59v9bpD.mjs";
14
14
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
15
- import { N as listBuildLocks, _ as workspaceDeviceLastUseAt, b as leaseIsExpired, g as workspaceActivity, x as listLeaseFiles } from "./activity-BTaUf0tc.mjs";
16
- import { d as listAllIosSims, f as listAllIosSimsAsync } from "./ios-CXnoVO_z.mjs";
15
+ import { N as listBuildLocks, _ as workspaceDeviceLastUseAt, b as leaseIsExpired, g as workspaceActivity, x as listLeaseFiles } from "./activity-yjH7Q3zn.mjs";
16
+ import { d as listAllIosSims, f as listAllIosSimsAsync } from "./ios-CdAV4-1E.mjs";
17
17
  import { s as metroStoreRoot } from "./errors-DHm_U5gv.mjs";
18
18
  import { t as resolveMaintenanceSettings } from "./settings-D9LtQaUw.mjs";
19
- import { o as runStop } from "./stop-CnF9ixYe.mjs";
20
- import { D as stimCliUseOf, E as stimCliEntries, M as worktreeArchiveLimits, T as serviceRunningFrom, _ as cacheBlocked, a as nestedWorktrees, b as measurePressure, i as excludeWatchmanCookies, o as porcelainPath, p as removeWorktreeTarget, r as excludePodChurn, s as reclaimKeys, v as measureDisk, w as uncommittedActivityOf, x as measurePressureAsync, y as measureDiskAsync } from "./worktree-qKJ3x07S.mjs";
19
+ import { p as probeHostedSession } from "./hosted-client-Hs-fD4L3.mjs";
20
+ import { o as runStop } from "./stop-W4DK8qZq.mjs";
21
+ import { D as stimCliUseOf, E as stimCliEntries, M as worktreeArchiveLimits, T as serviceRunningFrom, _ as cacheBlocked, a as nestedWorktrees, b as measurePressure, i as excludeWatchmanCookies, o as porcelainPath, p as removeWorktreeTarget, r as excludePodChurn, s as reclaimKeys, v as measureDisk, w as uncommittedActivityOf, x as measurePressureAsync, y as measureDiskAsync } from "./worktree-CinoSsGy.mjs";
21
22
  import { n as describePullRequest, r as endedPullRequest, s as pullRequestLookups } from "./pull-request-BzLmzAIQ.mjs";
22
- import { a as lastFetchedAtAsync, c as mergeStateAsync, f as recordPullRequestLookup, i as fetchDefaultBranchAsync, o as localDefaultBranchAsync, r as FETCH_FRESH_MS } from "./warm-progress-DQ2wQZKp.mjs";
23
- import { a as restoreProblem, r as recordLightened, t as finishLightened } from "./lightened-23pqe7LS.mjs";
24
- import { i as writeIdleShutdownEvent, n as dueIdleDevices, r as shutDownIdleDevices } from "./idle-shutdown-BcMN_cLm.mjs";
23
+ import { a as lastFetchedAtAsync, c as mergeStateAsync, f as recordPullRequestLookup, i as fetchDefaultBranchAsync, o as localDefaultBranchAsync, r as FETCH_FRESH_MS } from "./warm-progress-_aTMvkIH.mjs";
24
+ import { a as restoreProblem, r as recordLightened, t as finishLightened } from "./lightened-Df6II_XI.mjs";
25
+ import { i as writeIdleShutdownEvent, n as dueIdleDevices, r as shutDownIdleDevices } from "./idle-shutdown-BaeCo4ps.mjs";
25
26
  import { readClaimSet } from "@stim-cli/core/ownership-claim";
26
27
  import { existsSync, lstatSync, readFileSync, readdirSync, readlinkSync, realpathSync, rmSync, statSync } from "node:fs";
27
28
  import { tmpdir } from "node:os";
28
29
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
29
30
  import { buildCacheRoot, configDir, metroCacheRoot, rotatedLogPath } from "@stim-cli/core";
30
- import { LAST_BUILD_KEYS, MAINTENANCE_LOG_NAME, coerceSettingText, deviceViewersDir, lastNativeUseFrom, loadConfig, parseNdjsonText, readBuildHistory, readJsonObject, readMaintenanceState, readPullRequestCache, settingDefinition, settingValueError, sharedCompilationCache } from "@stim-cli/core/state";
31
+ import { LAST_BUILD_KEYS, MAINTENANCE_LOG_NAME, coerceSettingText, deviceViewersDir, hostedNativeRecords, lastNativeUseFrom, loadConfig, parseHostedNativePlacement, parseNdjsonText, readBuildHistory, readJsonObject, readMacosRecord, readMaintenanceState, readPullRequestCache, settingDefinition, settingValueError, sharedCompilationCache, unreadableHostedNative } from "@stim-cli/core/state";
31
32
  import { isAbsolute as isAbsolute$1, join as join$1 } from "path";
32
33
  import chalk from "chalk";
33
34
  import { existsSync as existsSync$1, readdirSync as readdirSync$1, statSync as statSync$1 } from "fs";
@@ -1554,6 +1555,47 @@ async function idleStopHours(root, env, operation) {
1554
1555
  const error = settingValueError(setting, value);
1555
1556
  return error || typeof value !== "number" ? { invalid: `${fromEnv ? setting.env : SETTING} is invalid: expected ${error ?? "a number"}` } : { hours: value };
1556
1557
  }
1558
+ function hostedFacts(root) {
1559
+ const placements = [];
1560
+ const unreadable = [];
1561
+ for (const platform of ["ios", "android"]) for (const [slot, record] of Object.entries(hostedNativeRecords(readWorkspaceState$1(root), platform))) {
1562
+ const placement = parseHostedNativePlacement(record, platform);
1563
+ if (placement) {
1564
+ const label = platform === "ios" ? "iOS simulator" : "Android emulator";
1565
+ placements.push({
1566
+ label,
1567
+ machine: placement.machine,
1568
+ session: placement.session,
1569
+ platform
1570
+ });
1571
+ } else unreadable.push(unreadableHostedNative(slot, platform));
1572
+ }
1573
+ const host = readMacosRecord(root)?.host;
1574
+ if (host) placements.push({
1575
+ label: "macOS app",
1576
+ machine: host.machine,
1577
+ session: host.session
1578
+ });
1579
+ return {
1580
+ placements,
1581
+ unreadable
1582
+ };
1583
+ }
1584
+ async function hostedKeepReasons(facts) {
1585
+ const keep = [...facts.unreadable];
1586
+ if (keep.length) return keep;
1587
+ for (const { label, machine, session, platform } of facts.placements) {
1588
+ const probe = await probeHostedSession({
1589
+ machine,
1590
+ session,
1591
+ platform
1592
+ }, { ttlMs: 0 });
1593
+ if (probe.state === "ready" || probe.state === "stopped") continue;
1594
+ const why = probe.state === "unreachable" ? `${machine} did not answer: ${probe.reason.replace(/\.+$/, "")}` : `${machine} cannot confirm it${probe.notice ? `: ${probe.notice.replace(/\.+$/, "")}` : ""}`;
1595
+ keep.push(`its hosted ${label} session ${session} is not confirmed: ${why}`);
1596
+ }
1597
+ return keep;
1598
+ }
1557
1599
  function deviceKeepReason(device, platform) {
1558
1600
  const { activity } = device;
1559
1601
  const what = `its ${device.kind === "ios" ? "simulator" : "emulator"} ${device.name}`;
@@ -1628,7 +1670,9 @@ function unreadableViewers() {
1628
1670
  async function keepReasons(root, devices, { now, platform, locked, operation }) {
1629
1671
  const checks = {
1630
1672
  devServer: false,
1631
- nativeRun: !locked
1673
+ nativeRun: !locked,
1674
+ hosted: false,
1675
+ hostedMacos: false
1632
1676
  };
1633
1677
  const keep = operation ? await workspaceInUseAsync(root, checks, operation.signal, operation) : workspaceInUse(root, checks);
1634
1678
  if (workspaceBuildInProgress(root)) keep.push("a build is in progress");
@@ -1703,6 +1747,7 @@ async function idleStopEvidence(root, devices, { now, idleMs, platform = process
1703
1747
  basis: "Metro request",
1704
1748
  at: metro
1705
1749
  });
1750
+ if (!activity.some(({ at }) => now - at < idleMs)) keep.push(...await hostedKeepReasons(hostedFacts(root)));
1706
1751
  return {
1707
1752
  activity,
1708
1753
  keep
@@ -1756,7 +1801,9 @@ async function candidate(path, env, devices, operation) {
1756
1801
  const slots = projectDeviceSlots(project);
1757
1802
  const ownsIos = slots.some(({ platforms }) => platforms.ios?.owned === true);
1758
1803
  const owns = ownsIos || slots.some(({ platforms }) => platforms.android?.owned === true);
1759
- if (!owns && (supervisor.status === "none" || supervisor.status === "stale")) return null;
1804
+ const hosted = hostedFacts(path);
1805
+ const isHosted = hosted.placements.length > 0 || hosted.unreadable.length > 0;
1806
+ if (!owns && !isHosted && (supervisor.status === "none" || supervisor.status === "stale")) return null;
1760
1807
  const setting = await idleStopHours(path, env, operation);
1761
1808
  if ("invalid" in setting) return { skip: setting.invalid };
1762
1809
  if (setting.hours === 0) return null;
@@ -1771,7 +1818,7 @@ async function candidate(path, env, devices, operation) {
1771
1818
  if (supervisor.status === "ours" && readWorkspaceState$1(path)?.supervisor?.mode === "command-child") return { skip: "its dev server runs metro.command, whose bundle and HMR requests Stim cannot see" };
1772
1819
  if (supervisor.status === "ours" && readWorkspaceState$1(path)?.supervisor?.hmrUpdates !== true) return { skip: "its dev server does not report HMR updates to Stim: an Expo SDK before 54, or a server an older Stim started, which stim stop and stim start restart" };
1773
1820
  const avdNames = slots.flatMap(({ platforms }) => platforms.android?.owned && platforms.android.avdName ? [platforms.android.avdName] : []);
1774
- if (supervisor.status !== "ours" && booted.length === 0) return null;
1821
+ if (supervisor.status !== "ours" && booted.length === 0 && !isHosted) return null;
1775
1822
  const orphan = supervisor.status === "stale" ? survivingServer(readWorkspaceState$1(path)?.supervisor) : null;
1776
1823
  if (orphan) return { skip: orphan };
1777
1824
  const seen = new Set(booted.flatMap((device) => device.kind === "android" ? [device.id] : []));
@@ -1910,6 +1957,8 @@ async function stopIdleWorkspace(action, { protectedRoot, devices, operation, en
1910
1957
  }, {
1911
1958
  purpose: "automatic maintenance",
1912
1959
  devServer: false,
1960
+ hosted: false,
1961
+ hostedMacos: false,
1913
1962
  operation
1914
1963
  });
1915
1964
  return run.ran ? run.value : kept$1(`in use: ${run.reasons.join("; ")}`);
@@ -1,9 +1,9 @@
1
1
  import { D as ownership_claim_exports, S as process_identity_exports, m as declareSpawnsOn, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-aULwtNly.mjs";
2
- import { M as withDirLock$1, N as withDirLockAsync$1, c as withWorkspaceStateLock, d as writeWorkspaceState, k as workspaceLogsDir$1, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1 } from "./workspace-state-DGwkPXwq.mjs";
3
- import { U as parseDeviceSlotKey, V as deviceSlotKey, d as getConfigDir, q as validateDeviceSlot } from "./config-AbUjIBOQ.mjs";
4
- import { a as formatElapsed, i as formatDuration, m as shortHash } from "./command-output-BBW8eWPL.mjs";
2
+ import { M as withDirLock$1, N as withDirLockAsync$1, c as withWorkspaceStateLock, d as writeWorkspaceState, k as workspaceLogsDir$1, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1 } from "./workspace-state-3bF4TB8P.mjs";
3
+ import { H as deviceSlotKey, J as validateDeviceSlot, W as parseDeviceSlotKey, d as getConfigDir } from "./config-D5qNWJEP.mjs";
4
+ import { a as formatElapsed, i as formatDuration, m as shortHash } from "./command-output-CfPW1bKP.mjs";
5
5
  import { n as runOperationFileQuiet } from "./operation-exec-Dp4FuIGR.mjs";
6
- import { C as resolveBuild } from "./build-cache-DlC3owap.mjs";
6
+ import { C as resolveBuild } from "./build-cache-BsKim4V7.mjs";
7
7
  import { randomBytes } from "node:crypto";
8
8
  import { closeSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
9
9
  import { homedir } from "node:os";
@@ -1,8 +1,8 @@
1
1
  import { S as process_identity_exports } from "./exec-aULwtNly.mjs";
2
- import { P as formatBytes } from "./config-AbUjIBOQ.mjs";
3
- import { o as formatLongDuration } from "./command-output-BBW8eWPL.mjs";
4
- import { bt as measureDu, u as listWorkspaceDirs, xt as writeUsageCache, yt as canonical } from "./workspaces-7_RWoi6c.mjs";
5
- import { c as parseAgentDeviceRecord, o as envDir, u as processMatches } from "./activity-BTaUf0tc.mjs";
2
+ import { F as formatBytes } from "./config-D5qNWJEP.mjs";
3
+ import { o as formatLongDuration } from "./command-output-CfPW1bKP.mjs";
4
+ import { bt as measureDu, u as listWorkspaceDirs, xt as writeUsageCache, yt as canonical } from "./workspaces-C59v9bpD.mjs";
5
+ import { c as parseAgentDeviceRecord, o as envDir, u as processMatches } from "./activity-yjH7Q3zn.mjs";
6
6
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
7
7
  import { homedir } from "node:os";
8
8
  import { isAbsolute, join, relative, sep } from "node:path";
@@ -1,43 +1,43 @@
1
1
  import { D as ownership_claim_exports, t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { a as recordWorkspaceUseAsync, f as writeWorkspaceStateAsync, g as emulatorLogFile, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-DGwkPXwq.mjs";
3
- import { B as deviceSlotFileKey, E as upsertProject, H as deviceSlotPlatforms, O as withConfigLockAsync$1, W as parseDeviceSlotOption, p as getProject, q as validateDeviceSlot, u as getConcurrencyLimits } from "./config-AbUjIBOQ.mjs";
4
- import { _ as stepTimer, f as refuseNoProject, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-BBW8eWPL.mjs";
5
- import { B as publicUrlSetting, F as metroWarmupUrlSetting, J as resolveCacheProviderConfig, N as metroPortSetting, Q as resolveSettings, W as remoteEasFallbackSetting, Z as resolveProjectSettingsAsync, a as SETTING_SHAPE_REMEDY, dt as detectProviders, g as deviceReclaimIdleMinutesSetting, ot as tunnelModeSetting, z as projectSettingsContextAsync } from "./settings-D776ygML.mjs";
6
- import { f as projectRegistry, i as findProjectRoot$1, l as projectShortcut, t as NO_PROJECT_REFUSAL, z as writeWorkspaceLaunchAsync } from "./project-DPQjnpcI.mjs";
7
- import { Dt as configuredAndroidEmulatorApp, L as listInstalledSystemImages, M as listAdbDevicesAsync, T as emulatorProbeSession, Y as physicalDeviceModel, Z as probeEmulatorSerial, a as androidDeviceAbi, ct as waitForBoot, nt as resolveOwnedAvdSerialAsync, rt as resolvePhysicalDevice } from "./android-DdKG6lyD.mjs";
8
- import { c as pidExists, d as resolveProjectMetro } from "./metro-BMQHczcf.mjs";
2
+ import { a as recordWorkspaceUseAsync, f as writeWorkspaceStateAsync, g as emulatorLogFile, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-3bF4TB8P.mjs";
3
+ import { D as upsertProject, G as parseDeviceSlotOption, J as validateDeviceSlot, U as deviceSlotPlatforms, V as deviceSlotFileKey, k as withConfigLockAsync$1, m as getProject, u as getConcurrencyLimits } from "./config-D5qNWJEP.mjs";
4
+ import { _ as stepTimer, f as refuseNoProject, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-CfPW1bKP.mjs";
5
+ import { B as publicUrlSetting, F as metroWarmupUrlSetting, J as resolveCacheProviderConfig, N as metroPortSetting, Q as resolveSettings, W as remoteEasFallbackSetting, Z as resolveProjectSettingsAsync, a as SETTING_SHAPE_REMEDY, dt as detectProviders, g as deviceReclaimIdleMinutesSetting, ot as tunnelModeSetting, z as projectSettingsContextAsync } from "./settings-C6UTYW2K.mjs";
6
+ import { f as projectRegistry, i as findProjectRoot$1, l as projectShortcut, t as NO_PROJECT_REFUSAL, z as writeWorkspaceLaunchAsync } from "./project-Crtcbfl0.mjs";
7
+ import { $ as probeEmulatorSerial, E as emulatorProbeSession, M as isEmulatorToolAbsent, P as listAdbDevicesAsync, Z as physicalDeviceModel, a as androidDeviceAbi, at as resolvePhysicalDevice, it as resolveOwnedAvdSerialAsync, kt as configuredAndroidEmulatorApp, ut as waitForBoot, v as avdStorageExists, z as listInstalledSystemImages } from "./android-DsEj2CCs.mjs";
8
+ import { c as pidExists, d as resolveProjectMetro } from "./metro-mKHEMO-a.mjs";
9
9
  import { i as createNdjsonWriter } from "./ndjson-CrjIsGzw.mjs";
10
- import { An as checkEasAuth, At as ensureRemoteBootOwned, En as runProcessOperation, Et as binOnPath, Jt as verifyLaunch, Ln as resolveEasCliBin, Mt as remoteAndroidDeps, Pt as resolveRemoteContext, Qt as DEFAULT_METRO_PORT, Rn as resolveRemote, Zt as ADB_INSTALL_TIMEOUT_MS, c as budgetGate, kt as ensureMetroReachable, ln as installAndroidApp, mn as launchAndroidReleaseApp, pn as launchAndroidApp, qn as ownedSessionName, qt as verifyAndroidReleaseLaunch, t as CCACHE_NOT_RUN, wn as exitAfterFlush, zn as uploadRemote } from "./ccache-B8gY50-h.mjs";
11
- import { $ as tapBuildLog, H as NO_BUILD_PROGRESS, Q as startBuildProgress, St as acquireBuildSlot, Tt as releaseBuildSlot, Z as runFailureRecord, ct as recordRunStats, et as thrownRunFailureRecord, it as readRunEstimates, lt as statsProjectKey$1, ot as recordCapacityRefusal, rt as createRunRecorder } from "./workspaces-7_RWoi6c.mjs";
12
- import { $ as cancelledFailure, ct as withNativeBuildRun, ot as runCancellation, st as runCancellationSignal } from "./toolchain-DLdoyxIt.mjs";
13
- import { F as waitForBuild, M as acquireBuildLock, P as releaseBuildLock } from "./activity-BTaUf0tc.mjs";
14
- import { T as storedAppId } from "./build-cache-DlC3owap.mjs";
15
- import { S as setRemoteLogSink } from "./client-DrHykA24.mjs";
16
- import { d as resolveBuildPlacement, s as parseBuildMachineOption } from "./selection-PCMT97XD.mjs";
17
- import { r as hostedMetroSettings } from "./metro-request-BtF7ox53.mjs";
18
- import { a as writeHostedAndroidAsync, i as writeDevicePlacementAsync, t as readHostedAndroid } from "./ios-state-Ce_dystM.mjs";
19
- import { n as prepareHostedAndroid, t as placeHostedAndroid } from "./hosted-android-Du7NxufJ.mjs";
20
- import { n as verifyCollectorOwnership } from "./ownership-Dtz9G5Gl.mjs";
21
- import { i as restoreLightenedDependencies, n as printLightenedFailure } from "./lightened-23pqe7LS.mjs";
22
- import { c as startDevServer } from "./start-B7J5a9nS.mjs";
23
- import { a as acquireRunLease, d as runLease, f as waitFlagConflict, o as leaseExpiryText, u as releaseLeaseOnAbort } from "./device-lease-run-Do6zYA7y.mjs";
24
- import { n as DeviceAdmissionRefusal, r as checkDeviceCapacity } from "./device-capacity-C5C_jOQd.mjs";
25
- import { a as resolveEasDevelopmentBuild, r as isEasBuildFailure } from "./eas-build-DIDOHw2P.mjs";
26
- import { t as followHostedLaunchLogs } from "./hosted-logs-sync-wsI7N1Hv.mjs";
27
- import { f as settleFingerprintCheck } from "./prebuild-DBJMhwSS.mjs";
28
- import { i as launchOutcomeRecord, n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-D4cTwU0Z.mjs";
29
- import { n as devicePlacementRecord } from "./placement-log-CRR_TE1r.mjs";
30
- import { S as pooledAndroidDevice, a as PLATFORM, b as noDeviceDiagnostic, g as dumpApkManifest, h as displayPath, o as androidBuildOptions, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme } from "./support-BGqpYMV8.mjs";
31
- import { t as acquireAndroidArtifact } from "./artifact-M6W2l-xh.mjs";
32
- import { a as persistLastBuild, c as androidDeviceSelectorRefusal, i as logPostBuildFailure, n as finishAndroidUpload, o as persistThrownBuild, s as reportAndroidResult, u as resolveAndroidRunPlan } from "./result-W4HCum4A.mjs";
33
- import { n as devicePlacementLine, t as automaticDevicePlacement } from "./auto-placement-CZaWDmcY.mjs";
34
- import { i as verifyAndroidMetroRun, r as finishAndroidRun } from "./launch-DvJV1Mx4.mjs";
35
- import { t as checkEasFallback } from "./eas-fallback-DVS9oBSc.mjs";
36
- import { i as warmMetro, n as ensureBooted, r as ensureOwnedDevice, t as didSetUpDevice } from "./device-CsIdRXfm.mjs";
37
- import { a as AvdBootError, o as AvdRecoveryError } from "./device-android-CcdQqQWg.mjs";
38
- import { t as selectFromPool } from "./device-pool-CpoYiCGO.mjs";
10
+ import { An as checkEasAuth, At as ensureRemoteBootOwned, En as runProcessOperation, Et as binOnPath, Jt as verifyLaunch, Ln as resolveEasCliBin, Mt as remoteAndroidDeps, Pt as resolveRemoteContext, Qt as DEFAULT_METRO_PORT, Rn as resolveRemote, Zt as ADB_INSTALL_TIMEOUT_MS, c as budgetGate, kt as ensureMetroReachable, ln as installAndroidApp, mn as launchAndroidReleaseApp, pn as launchAndroidApp, qn as ownedSessionName, qt as verifyAndroidReleaseLaunch, t as CCACHE_NOT_RUN, wn as exitAfterFlush, zn as uploadRemote } from "./ccache-BrwGIxmV.mjs";
11
+ import { $ as tapBuildLog, H as NO_BUILD_PROGRESS, Q as startBuildProgress, St as acquireBuildSlot, Tt as releaseBuildSlot, Z as runFailureRecord, ct as recordRunStats, et as thrownRunFailureRecord, it as readRunEstimates, lt as statsProjectKey$1, ot as recordCapacityRefusal, rt as createRunRecorder } from "./workspaces-C59v9bpD.mjs";
12
+ import { $ as cancelledFailure, ct as withNativeBuildRun, ot as runCancellation, st as runCancellationSignal } from "./toolchain-Bnm8vUCV.mjs";
13
+ import { F as waitForBuild, M as acquireBuildLock, P as releaseBuildLock } from "./activity-yjH7Q3zn.mjs";
14
+ import { T as storedAppId } from "./build-cache-BsKim4V7.mjs";
15
+ import { S as setRemoteLogSink } from "./client-lDmA-5jx.mjs";
16
+ import { d as resolveBuildPlacement, s as parseBuildMachineOption } from "./selection-C4ZQz_ER.mjs";
17
+ import { i as hostedMetroSettings } from "./metro-request-DODHNXCN.mjs";
18
+ import { a as writeHostedAndroidAsync, i as writeDevicePlacementAsync, t as readHostedAndroid } from "./ios-state-BEIJRJ7P.mjs";
19
+ import { n as prepareHostedAndroid, t as placeHostedAndroid } from "./hosted-android-c5nPJA6S.mjs";
20
+ import { n as verifyCollectorOwnership } from "./ownership-CCfiBfOP.mjs";
21
+ import { i as restoreLightenedDependencies, n as printLightenedFailure } from "./lightened-Df6II_XI.mjs";
22
+ import { c as startDevServer } from "./start-CLN_r9EG.mjs";
23
+ import { a as acquireRunLease, d as runLease, f as waitFlagConflict, o as leaseExpiryText, u as releaseLeaseOnAbort } from "./device-lease-run-DeNGjJZM.mjs";
24
+ import { n as DeviceAdmissionRefusal, r as checkDeviceCapacity } from "./device-capacity-Bki6B-7h.mjs";
25
+ import { a as resolveEasDevelopmentBuild, r as isEasBuildFailure } from "./eas-build-CaG-Sfs9.mjs";
26
+ import { t as followHostedLaunchLogs } from "./hosted-logs-sync-B8bjLEMs.mjs";
27
+ import { f as settleFingerprintCheck } from "./prebuild-CyNrUWgV.mjs";
28
+ import { i as launchOutcomeRecord, n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-DQfxW5Au.mjs";
29
+ import { n as devicePlacementRecord } from "./placement-log-CRL0IY-k.mjs";
30
+ import { S as pooledAndroidDevice, a as PLATFORM, b as noDeviceDiagnostic, g as dumpApkManifest, h as displayPath, o as androidBuildOptions, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme } from "./support-S_5nkkzs.mjs";
31
+ import { t as acquireAndroidArtifact } from "./artifact-C8Nvp07y.mjs";
32
+ import { a as persistLastBuild, c as androidDeviceSelectorRefusal, i as logPostBuildFailure, n as finishAndroidUpload, o as persistThrownBuild, s as reportAndroidResult, u as resolveAndroidRunPlan } from "./result-EOsWV6sp.mjs";
33
+ import { n as devicePlacementLine, t as automaticDevicePlacement } from "./auto-placement--nfdQ9rp.mjs";
34
+ import { i as verifyAndroidMetroRun, r as finishAndroidRun } from "./launch-DxpvL6il.mjs";
35
+ import { t as checkEasFallback } from "./eas-fallback-BpX1lpco.mjs";
36
+ import { i as warmMetro, n as ensureBooted, r as ensureOwnedDevice, t as didSetUpDevice } from "./device-CTozKhU0.mjs";
37
+ import { a as AvdBootError, o as AvdRecoveryError } from "./device-android-zgD9We85.mjs";
38
+ import { t as selectFromPool } from "./device-pool-mjyUYaau.mjs";
39
39
  import { t as unsupportedPlan } from "./project-plan-BPwbLwQu.mjs";
40
- import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-J3iRR3gI.mjs";
40
+ import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-BK34X2iY.mjs";
41
41
  import { join } from "node:path";
42
42
  import { workspaceId } from "@stim-cli/core";
43
43
  import { hostedAndroidStatus, parseMachine } from "@stim-cli/core/state";
@@ -72,7 +72,9 @@ async function connectAndroidHosting({ root, slot, machine, release, appMode = r
72
72
  try {
73
73
  const resolved = await resolveSerial(local.avdName, { timeoutMs: 5e3 });
74
74
  running = Boolean(resolved.serial) || !resolved.notRunning && !resolved.missing;
75
- } catch {}
75
+ } catch (error) {
76
+ running = !isEmulatorToolAbsent(error) || avdStorageExists(local.avdName);
77
+ }
76
78
  if (running) return { failure: {
77
79
  code: "STIM_BAD_ARG",
78
80
  message: `This workspace's Android emulator for slot ${slot} runs on this machine; run stim stop first.`
@@ -1055,7 +1057,7 @@ async function runAndroid(options = {}) {
1055
1057
  if (capacity) {
1056
1058
  if (capacity.code === "STIM_AT_CAPACITY") recordRefusal({
1057
1059
  platform: PLATFORM,
1058
- max: limits.maxDevices,
1060
+ max: capacity.max,
1059
1061
  workspace: workspaceId(root)
1060
1062
  }, now());
1061
1063
  return fail(capacity.code, capacity.message, capacity.remedy);
@@ -1,5 +1,5 @@
1
1
  import { t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { u as androidToolCwd } from "./android-DdKG6lyD.mjs";
2
+ import { u as androidToolCwd } from "./android-DsEj2CCs.mjs";
3
3
  //#region src/collector/android.ts
4
4
  const LEVEL_BY_LETTER = {
5
5
  V: "debug",
@@ -1,6 +1,6 @@
1
- import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BBW8eWPL.mjs";
2
- import { E as resolveVariant, T as resolveSystemImage, _ as findAapt, b as noDeviceDiagnostic, d as androidVariantSetting, f as apkDevClientFacts, g as dumpApkManifest, h as displayPath, i as NO_FINGERPRINT, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme, u as androidSystemImageSetting, x as parseXmltree, y as isReleaseVariant } from "./support-BGqpYMV8.mjs";
3
- import { r as lastBuildRecord, t as androidFacts } from "./result-W4HCum4A.mjs";
4
- import { i as runAndroidOperation, n as registerAndroid, r as runAndroid, t as androidCommand } from "./android-BWqdDK6R.mjs";
5
- import { a as collectorLogFile, o as killPreviousCollector, s as startCollector } from "./launch-DvJV1Mx4.mjs";
1
+ import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-CfPW1bKP.mjs";
2
+ import { E as resolveVariant, T as resolveSystemImage, _ as findAapt, b as noDeviceDiagnostic, d as androidVariantSetting, f as apkDevClientFacts, g as dumpApkManifest, h as displayPath, i as NO_FINGERPRINT, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme, u as androidSystemImageSetting, x as parseXmltree, y as isReleaseVariant } from "./support-S_5nkkzs.mjs";
3
+ import { r as lastBuildRecord, t as androidFacts } from "./result-EOsWV6sp.mjs";
4
+ import { i as runAndroidOperation, n as registerAndroid, r as runAndroid, t as androidCommand } from "./android-BNm5A40S.mjs";
5
+ import { a as collectorLogFile, o as killPreviousCollector, s as startCollector } from "./launch-DxpvL6il.mjs";
6
6
  export { NO_DEVICE, NO_FINGERPRINT, androidDevClientScheme, androidFacts, androidSystemImageSetting, androidVariantSetting, apkDevClientFacts, apkPackage, collectorLogFile, androidCommand as default, displayPath, dumpApkManifest, findAapt, formatDuration, isReleaseVariant, killPreviousCollector, lastBuildRecord, noDeviceDiagnostic, parseXmltree, phaseLine, registerAndroid, resolveSystemImage, resolveVariant, runAndroid, runAndroidOperation, shortHash, startCollector };
@@ -1,10 +1,10 @@
1
1
  import { D as ownership_claim_exports, S as process_identity_exports, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, o as cancellableSleep, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-aULwtNly.mjs";
2
- import { M as withDirLock$1, N as withDirLockAsync$1 } from "./workspace-state-DGwkPXwq.mjs";
3
- import { C as saveConfig, D as withConfigLock$1, G as projectDeviceSlots, H as deviceSlotPlatforms, K as removeSlotDevice, O as withConfigLockAsync$1, _ as loadConfig$1, c as ensureConfig, d as getConfigDir, f as getConfigPath$1, z as assignSlotDevice } from "./config-AbUjIBOQ.mjs";
2
+ import { M as withDirLock$1, N as withDirLockAsync$1 } from "./workspace-state-3bF4TB8P.mjs";
3
+ import { B as assignSlotDevice, K as projectDeviceSlots, O as withConfigLock$1, U as deviceSlotPlatforms, c as ensureConfig, d as getConfigDir, f as getConfigPath$1, k as withConfigLockAsync$1, q as removeSlotDevice, v as loadConfig$1, w as saveConfig } from "./config-D5qNWJEP.mjs";
4
4
  import { n as runOperationFileQuiet, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
5
- import { c as androidDataPartitionSizeBytes } from "./settings-D776ygML.mjs";
6
- import { i as stimDesktopInstalledAsync, n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-CYXLFpFS.mjs";
7
- import { c as pidExists, p as signalProcessTreeAsync } from "./metro-BMQHczcf.mjs";
5
+ import { c as androidDataPartitionSizeBytes } from "./settings-C6UTYW2K.mjs";
6
+ import { i as stimDesktopInstalledAsync, n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-1XxET4S8.mjs";
7
+ import { c as pidExists, p as signalProcessTreeAsync } from "./metro-mKHEMO-a.mjs";
8
8
  import { renameSync, rmSync, writeFileSync } from "node:fs";
9
9
  import { isDeepStrictEqual } from "node:util";
10
10
  import { join } from "node:path";
@@ -833,6 +833,9 @@ function avdStorageRoots(env = ambientEnv()) {
833
833
  join$1(home, ".android", "avd")
834
834
  ].filter((value) => Boolean(value)))];
835
835
  }
836
+ function avdStorageExists(avdName) {
837
+ return avdStorageRoots().some((root) => avdPathExists(join$1(root, `${avdName}.ini`)) || avdPathExists(join$1(root, `${avdName}.avd`)));
838
+ }
836
839
  function avdPathExists(path) {
837
840
  try {
838
841
  lstatSync$1(path);
@@ -1659,6 +1662,24 @@ async function getAvdNameForSerialAsync(serial, { timeoutMs = EMU_AVD_NAME_TIMEO
1659
1662
  if (!out) return null;
1660
1663
  return out.split("\n")[0]?.trim() || null;
1661
1664
  }
1665
+ const ANDROID_LOCATION_VARIABLES = [
1666
+ "ANDROID_HOME",
1667
+ "ANDROID_SDK_ROOT",
1668
+ "ANDROID_AVD_HOME",
1669
+ "ANDROID_EMULATOR_HOME",
1670
+ "ANDROID_USER_HOME",
1671
+ "ANDROID_SDK_HOME"
1672
+ ];
1673
+ /**
1674
+ * True when `error` is the emulator binary failing to spawn on a machine with no Android SDK or AVD
1675
+ * location configured. Nothing Stim started can be running through a tool that does not exist. An
1676
+ * explicitly configured location may name an unmounted volume, so it keeps the failure, and so does a
1677
+ * missing adb. An emulator started from another environment still has AVD data on disk, which callers check
1678
+ * before they act on this.
1679
+ */
1680
+ function isEmulatorToolAbsent(error, env = ambientEnv()) {
1681
+ return error instanceof Error && "code" in error && error.code === "ENOENT" && "path" in error && typeof error.path === "string" && /^emulator(?:\.exe)?$/.test(error.path) && !ANDROID_LOCATION_VARIABLES.some((name) => env[name]);
1682
+ }
1662
1683
  /**
1663
1684
  * `resolveOwnedAvdSerial` without blocking the event loop, with the same reads and the same timeout budget.
1664
1685
  * `preferredSerial` is the serial this workspace recorded for the AVD: it is read first, and the other
@@ -1786,4 +1807,4 @@ function ownedAvdSerialResolver({ timeoutMs } = {}) {
1786
1807
  };
1787
1808
  }
1788
1809
  //#endregion
1789
- export { removeMetroReverses as $, hostSystemImageArch as A, ownedAvdDeviceProfile as B, emulatorDiskSpaceRemedy as C, forgetCreatedDeviceAsync as Ct, findBuildTool as D, configuredAndroidEmulatorApp as Dt, extractEmulatorFailure as E, recordCreatedDeviceAsync as Et, listAvds as F, ownedAvdSerialResolverAsync as G, ownedAvdMatchesConfiguration as H, listAvdsAsync as I, parseAvdSystemImage as J, ownedAvdSystemImage as K, listInstalledSystemImages as L, listAdbDevicesAsync as M, listAvdDeviceProfiles as N, getAvdNameForSerial as O, listAvdDeviceProfilesAsync as P, profileNeedsFoldFeature as Q, listOrphanedAvdDirectories as R, deleteAvd as S, forgetCreatedDevice as St, emulatorProbeSession as T, recordCreatedDevice as Tt, ownedAvdName as U, ownedAvdDirectory as V, ownedAvdSerialResolver as W, pickDefaultSystemImage as X, physicalDeviceModel as Y, probeEmulatorSerial as Z, avdPoolConfiguration as _, parkSim as _t, androidDeviceAbi as a, systemImageSupportsFold as at, configureNewOwnedAvd as b, removeParkedAfter as bt, androidPoolNoCandidatesRefusal as c, waitForBoot as ct, androidToolPath as d, isStimOwnedSim as dt, removeOwnedEmulatorMetroReverses as et, assertOwnedAvdStopped as f, POOL_SETTING_REMEDY as ft, avdPathExists as g, isLegacyDeletionClaim as gt, avdNameAbsent as h, eraseParkedAfter as ht, androidDataFreeBytes as i, shutdownAndroidEmulator as it, listAdbDevices as j, getAvdNameForSerialAsync as k, androidSystemImageAbi as l, wipeAvdUserData as lt, avdIniPaths as m, dropParked as mt, OWNED_AVD_CONFIG_DEFAULTS as n, resolveOwnedAvdSerialAsync as nt, androidHome as o, trimAndroidCaches as ot, assertOwnedAvdStoppedAsync as p, adoptParked as pt, parseAvdDeviceProfile as q, androidBuildToolName as r, resolvePhysicalDevice as rt, androidPoolCandidates as s, waitForAndroidEmulatorShutdown as st, DEFAULT_AVD_DEVICE_PROFILE as t, resetAdoptedAvd as tt, androidToolCwd as u, isStimOwnedAvd as ut, avdStorageRoots as v, parkedMaxSetting as vt, emulatorFailureRemedy as w, readCreatedDevices$1 as wt, createOwnedAvd as x, selectParked as xt, bootAndroidEmulator as y, readParked as yt, nextConsolePort as z };
1810
+ export { probeEmulatorSerial as $, getAvdNameForSerialAsync as A, listOrphanedAvdDirectories as B, deleteAvd as C, selectParked as Ct, extractEmulatorFailure as D, recordCreatedDevice as Dt, emulatorProbeSession as E, readCreatedDevices$1 as Et, listAvdDeviceProfiles as F, ownedAvdName as G, ownedAvdDeviceProfile as H, listAvdDeviceProfilesAsync as I, ownedAvdSystemImage as J, ownedAvdSerialResolver as K, listAvds as L, isEmulatorToolAbsent as M, listAdbDevices as N, findBuildTool as O, recordCreatedDeviceAsync as Ot, listAdbDevicesAsync as P, pickDefaultSystemImage as Q, listAvdsAsync as R, createOwnedAvd as S, removeParkedAfter as St, emulatorFailureRemedy as T, forgetCreatedDeviceAsync as Tt, ownedAvdDirectory as U, nextConsolePort as V, ownedAvdMatchesConfiguration as W, parseAvdSystemImage as X, parseAvdDeviceProfile as Y, physicalDeviceModel as Z, avdPoolConfiguration as _, eraseParkedAfter as _t, androidDeviceAbi as a, resolvePhysicalDevice as at, bootAndroidEmulator as b, parkedMaxSetting as bt, androidPoolNoCandidatesRefusal as c, trimAndroidCaches as ct, androidToolPath as d, wipeAvdUserData as dt, profileNeedsFoldFeature as et, assertOwnedAvdStopped as f, isStimOwnedAvd as ft, avdPathExists as g, dropParked as gt, avdNameAbsent as h, adoptParked as ht, androidDataFreeBytes as i, resolveOwnedAvdSerialAsync as it, hostSystemImageArch as j, getAvdNameForSerial as k, configuredAndroidEmulatorApp as kt, androidSystemImageAbi as l, waitForAndroidEmulatorShutdown as lt, avdIniPaths as m, POOL_SETTING_REMEDY as mt, OWNED_AVD_CONFIG_DEFAULTS as n, removeOwnedEmulatorMetroReverses as nt, androidHome as o, shutdownAndroidEmulator as ot, assertOwnedAvdStoppedAsync as p, isStimOwnedSim as pt, ownedAvdSerialResolverAsync as q, androidBuildToolName as r, resetAdoptedAvd as rt, androidPoolCandidates as s, systemImageSupportsFold as st, DEFAULT_AVD_DEVICE_PROFILE as t, removeMetroReverses as tt, androidToolCwd as u, waitForBoot as ut, avdStorageExists as v, isLegacyDeletionClaim as vt, emulatorDiskSpaceRemedy as w, forgetCreatedDevice as wt, configureNewOwnedAvd as x, readParked as xt, avdStorageRoots as y, parkSim as yt, listInstalledSystemImages as z };
@@ -1,7 +1,7 @@
1
- import { M as withDirLock$1, _ as ensureWorkspaceStorage } from "./workspace-state-DGwkPXwq.mjs";
2
- import { d as getConfigDir } from "./config-AbUjIBOQ.mjs";
3
- import { m as defaultAndroidLayout } from "./settings-D776ygML.mjs";
4
- import { r as register } from "./cache-manifest-evF_zJ9U.mjs";
1
+ import { M as withDirLock$1, _ as ensureWorkspaceStorage } from "./workspace-state-3bF4TB8P.mjs";
2
+ import { d as getConfigDir } from "./config-D5qNWJEP.mjs";
3
+ import { m as defaultAndroidLayout } from "./settings-C6UTYW2K.mjs";
4
+ import { r as register } from "./cache-manifest-CfiEny4T.mjs";
5
5
  import { createHash, randomUUID } from "node:crypto";
6
6
  import { accessSync, constants, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync } from "node:fs";
7
7
  import { join } from "node:path";
package/dist/api.mjs CHANGED
@@ -1,32 +1,32 @@
1
1
  import { D as ownership_claim_exports, T as trackReportResource, b as operationState, c as throwIfCancelled, l as WorkspaceProcessCleanupError, s as cancelledError, w as runReport } from "./exec-aULwtNly.mjs";
2
- import { E as workspaceDir, a as recordWorkspaceUseAsync, k as workspaceLogsDir$1, v as ensureWorkspaceStorageAsync } from "./workspace-state-DGwkPXwq.mjs";
3
- import { E as upsertProject, O as withConfigLockAsync$1, p as getProject, q as validateDeviceSlot, y as refuseRelativeStimPaths } from "./config-AbUjIBOQ.mjs";
4
- import { l as phaseLine } from "./command-output-BBW8eWPL.mjs";
5
- import { Vt as repoRootAsync, Z as resolveProjectSettingsAsync, _ as inertSettingWarning, a as SETTING_SHAPE_REMEDY, p as cacheProviderSettingError, rt as settingShapeErrors, st as unknownSettingKeys } from "./settings-D776ygML.mjs";
6
- import { c as projectProblem, f as projectRegistry, i as findProjectRoot$1, r as findCommandWorkspaceAsync, t as NO_PROJECT_REFUSAL } from "./project-DPQjnpcI.mjs";
7
- import { n as macosDir } from "./state-C2AUjjhg.mjs";
8
- import { c as ensureHomeIdentity, s as workspaceShareURL } from "./stim-desktop-CYXLFpFS.mjs";
2
+ import { E as workspaceDir, a as recordWorkspaceUseAsync, k as workspaceLogsDir$1, v as ensureWorkspaceStorageAsync } from "./workspace-state-3bF4TB8P.mjs";
3
+ import { D as upsertProject, J as validateDeviceSlot, b as refuseRelativeStimPaths, k as withConfigLockAsync$1, m as getProject } from "./config-D5qNWJEP.mjs";
4
+ import { l as phaseLine } from "./command-output-CfPW1bKP.mjs";
5
+ import { Vt as repoRootAsync, Z as resolveProjectSettingsAsync, _ as inertSettingWarning, a as SETTING_SHAPE_REMEDY, p as cacheProviderSettingError, rt as settingShapeErrors, st as unknownSettingKeys } from "./settings-C6UTYW2K.mjs";
6
+ import { c as projectProblem, f as projectRegistry, i as findProjectRoot$1, r as findCommandWorkspaceAsync, t as NO_PROJECT_REFUSAL } from "./project-Crtcbfl0.mjs";
7
+ import { n as macosDir } from "./state-CiflgxTP.mjs";
8
+ import { c as ensureHomeIdentity, s as workspaceShareURL } from "./stim-desktop-1XxET4S8.mjs";
9
9
  import { i as createNdjsonWriter } from "./ndjson-CrjIsGzw.mjs";
10
- import { $ as tapBuildLog, Q as startBuildProgress, X as recordFinishedBuild, tt as errorRemedy } from "./workspaces-7_RWoi6c.mjs";
11
- import { ct as withNativeBuildRun, st as runCancellationSignal } from "./toolchain-DLdoyxIt.mjs";
12
- import { d as resolveBuildPlacement } from "./selection-PCMT97XD.mjs";
13
- import { c as stopWorkspaceNow } from "./stop-CnF9ixYe.mjs";
14
- import { r as runReload } from "./reload-BUQI3dSu.mjs";
15
- import { m as warmWorktreeTarget, p as removeWorktreeTarget } from "./worktree-qKJ3x07S.mjs";
16
- import { i as restoreLightenedDependencies } from "./lightened-23pqe7LS.mjs";
17
- import { c as startDevServer } from "./start-B7J5a9nS.mjs";
18
- import { s as recordDoctorCheck } from "./doctor-watchman-D1IyMle9.mjs";
19
- import { c as readSettingsPayload, s as readSettingsContext, t as SettingsRefusal } from "./settings-payload-CE-NZ6Lq.mjs";
20
- import { a as readDoctorReport } from "./doctor-CLE4AZEI.mjs";
21
- import { i as readGcReport, n as executeGc, o as withGcMaintenanceClaim } from "./gc-Co7PE36D.mjs";
22
- import { r as readWorkspaceLogs, t as followWorkspaceLogs } from "./logs-Pkeh3wZk.mjs";
10
+ import { $ as tapBuildLog, Q as startBuildProgress, X as recordFinishedBuild, tt as errorRemedy } from "./workspaces-C59v9bpD.mjs";
11
+ import { ct as withNativeBuildRun, st as runCancellationSignal } from "./toolchain-Bnm8vUCV.mjs";
12
+ import { d as resolveBuildPlacement } from "./selection-C4ZQz_ER.mjs";
13
+ import { c as stopWorkspaceNow } from "./stop-W4DK8qZq.mjs";
14
+ import { r as runReload } from "./reload-D2TpUlns.mjs";
15
+ import { m as warmWorktreeTarget, p as removeWorktreeTarget } from "./worktree-CinoSsGy.mjs";
16
+ import { i as restoreLightenedDependencies } from "./lightened-Df6II_XI.mjs";
17
+ import { c as startDevServer } from "./start-CLN_r9EG.mjs";
18
+ import { s as recordDoctorCheck } from "./doctor-watchman-CCuboyj1.mjs";
19
+ import { c as readSettingsPayload, s as readSettingsContext, t as SettingsRefusal } from "./settings-payload-CrX933Xi.mjs";
20
+ import { a as readDoctorReport } from "./doctor-sSLtn-j1.mjs";
21
+ import { i as readGcReport, n as executeGc, o as withGcMaintenanceClaim } from "./gc-Dv6nb9nf.mjs";
22
+ import { r as readWorkspaceLogs, t as followWorkspaceLogs } from "./logs-zv3ge7c6.mjs";
23
23
  import { t as readProjectStats } from "./stats-report-B86Cv7Uc.mjs";
24
- import { n as buildAndroidOperation, t as buildIosOperation } from "./build-C2ZWoCmg.mjs";
25
- import { a as readAndroidBuildPlan, i as runAndroidOperation } from "./android-BWqdDK6R.mjs";
26
- import { i as readIosBuildPlan, r as runIosOperation } from "./ios-CG0IsLtt.mjs";
27
- import { a as buildMacosBundle, i as planMacos, n as runMacos } from "./macos-DPvPQadc.mjs";
28
- import { t as runWeb } from "./web-g9U7L1sR.mjs";
29
- import { t as mutateSetting } from "./settings-write-D7Xwa_-M.mjs";
24
+ import { n as buildAndroidOperation, t as buildIosOperation } from "./build-VXX_dtl5.mjs";
25
+ import { a as readAndroidBuildPlan, i as runAndroidOperation } from "./android-BNm5A40S.mjs";
26
+ import { i as readIosBuildPlan, r as runIosOperation } from "./ios-D3oK9-O4.mjs";
27
+ import { a as buildMacosBundle, i as planMacos, n as runMacos } from "./macos-C6U-4Iip.mjs";
28
+ import { t as runWeb } from "./web-BdWG8b5_.mjs";
29
+ import { t as mutateSetting } from "./settings-write-DMcT23Kl.mjs";
30
30
  import { randomBytes } from "node:crypto";
31
31
  import { mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync } from "node:fs";
32
32
  import { stripVTControlCharacters } from "node:util";
@@ -1,5 +1,5 @@
1
- import { y as sharedBuildCache } from "./workspace-state-DGwkPXwq.mjs";
2
- import { D as findBuildTool } from "./android-DdKG6lyD.mjs";
1
+ import { y as sharedBuildCache } from "./workspace-state-3bF4TB8P.mjs";
2
+ import { O as findBuildTool } from "./android-DsEj2CCs.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import { closeSync, fstatSync, openSync, readFileSync, readSync, realpathSync, renameSync, rmSync } from "node:fs";
5
5
  import { basename, dirname, join } from "node:path";
@@ -1,16 +1,16 @@
1
1
  import { D as ownership_claim_exports, c as throwIfCancelled, x as withDrainingCancellation } from "./exec-aULwtNly.mjs";
2
- import { E as workspaceDir } from "./workspace-state-DGwkPXwq.mjs";
3
- import { _ as stepTimer, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BBW8eWPL.mjs";
4
- import { Dn as RESOLVE_TIMEOUT_MS, Mn as isEasAuthFailureText, jn as easAuthNote, n as CCACHE_UNAVAILABLE, r as ccacheActivityLine, t as CCACHE_NOT_RUN } from "./ccache-B8gY50-h.mjs";
5
- import { $ as cancelledFailure, st as runCancellationSignal } from "./toolchain-DLdoyxIt.mjs";
6
- import { b as providerDownloadPath, y as prepareProviderDownloadDir } from "./build-cache-DlC3owap.mjs";
7
- import { c as offloadPlacement, i as closeOffload, l as placementLoad, n as buildPlacementCandidates, o as offloadBuild, r as chooseBuildMachine, u as remotePhaseText } from "./client-DrHykA24.mjs";
8
- import { a as missingPackageManagerRemedy, i as fingerprintMismatchRemedy, l as requireLocalBuild, n as automaticBuild, o as namedBuildMachine, t as OffloadRefusal } from "./selection-PCMT97XD.mjs";
9
- import { f as formatDiagnostic } from "./react-native-build-BSoh4HkH.mjs";
10
- import { u as skippedMissReason } from "./prebuild-DBJMhwSS.mjs";
11
- import { t as buildPlacementRecord } from "./placement-log-CRR_TE1r.mjs";
12
- import { n as settleArtifactUploads, t as acquireArtifact } from "./acquire-artifact-CrZ4rEbI.mjs";
13
- import { a as PLATFORM, h as displayPath } from "./support-BGqpYMV8.mjs";
2
+ import { E as workspaceDir } from "./workspace-state-3bF4TB8P.mjs";
3
+ import { _ as stepTimer, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-CfPW1bKP.mjs";
4
+ import { Dn as RESOLVE_TIMEOUT_MS, Mn as isEasAuthFailureText, jn as easAuthNote, n as CCACHE_UNAVAILABLE, r as ccacheActivityLine, t as CCACHE_NOT_RUN } from "./ccache-BrwGIxmV.mjs";
5
+ import { $ as cancelledFailure, st as runCancellationSignal } from "./toolchain-Bnm8vUCV.mjs";
6
+ import { b as providerDownloadPath, y as prepareProviderDownloadDir } from "./build-cache-BsKim4V7.mjs";
7
+ import { c as offloadPlacement, i as closeOffload, l as placementLoad, n as buildPlacementCandidates, o as offloadBuild, r as chooseBuildMachine, u as remotePhaseText } from "./client-lDmA-5jx.mjs";
8
+ import { a as missingPackageManagerRemedy, i as fingerprintMismatchRemedy, l as requireLocalBuild, n as automaticBuild, o as namedBuildMachine, t as OffloadRefusal } from "./selection-C4ZQz_ER.mjs";
9
+ import { f as formatDiagnostic } from "./react-native-build-DhWBUV_H.mjs";
10
+ import { u as skippedMissReason } from "./prebuild-CyNrUWgV.mjs";
11
+ import { t as buildPlacementRecord } from "./placement-log-CRL0IY-k.mjs";
12
+ import { n as settleArtifactUploads, t as acquireArtifact } from "./acquire-artifact-CI9fIokp.mjs";
13
+ import { a as PLATFORM, h as displayPath } from "./support-S_5nkkzs.mjs";
14
14
  import { t as AndroidRecipeRefusal } from "./android-project-BCAAmMwz.mjs";
15
15
  import { rmSync } from "node:fs";
16
16
  import { join } from "node:path";
@@ -1,16 +1,16 @@
1
1
  import { D as ownership_claim_exports, c as throwIfCancelled, x as withDrainingCancellation } from "./exec-aULwtNly.mjs";
2
- import { E as workspaceDir } from "./workspace-state-DGwkPXwq.mjs";
3
- import { _ as stepTimer, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BBW8eWPL.mjs";
4
- import { Dn as RESOLVE_TIMEOUT_MS, Mn as isEasAuthFailureText, jn as easAuthNote } from "./ccache-B8gY50-h.mjs";
5
- import { $ as cancelledFailure, A as COMPILATION_CACHE_NOT_RUN, F as compilationCacheActivityLine, st as runCancellationSignal } from "./toolchain-DLdoyxIt.mjs";
6
- import { T as storedAppId, b as providerDownloadPath, x as providerUploadOutcome, y as prepareProviderDownloadDir } from "./build-cache-DlC3owap.mjs";
7
- import { C as COMPILATION_CACHE_CORRUPT, c as offloadPlacement, i as closeOffload, l as placementLoad, n as buildPlacementCandidates, o as offloadBuild, r as chooseBuildMachine, s as offloadCheck, u as remotePhaseText, w as clearCorruptCompilationCache } from "./client-DrHykA24.mjs";
8
- import { a as missingPackageManagerRemedy, c as podsFailedRemedy, h as predictedRefusal, i as fingerprintMismatchRemedy, l as requireLocalBuild, n as automaticBuild, o as namedBuildMachine, t as OffloadRefusal } from "./selection-PCMT97XD.mjs";
9
- import { S as xcodeFailureReport, p as printDiagnostics } from "./support-DUevTPur.mjs";
10
- import { f as settleFingerprintCheck, u as skippedMissReason } from "./prebuild-DBJMhwSS.mjs";
11
- import { t as buildPlacementRecord } from "./placement-log-CRR_TE1r.mjs";
12
- import { n as settleArtifactUploads, t as acquireArtifact } from "./acquire-artifact-CrZ4rEbI.mjs";
13
- import { r as finishIosUpload, t as IosRecipeRefusal } from "./ios-project-BM9TbTE7.mjs";
2
+ import { E as workspaceDir } from "./workspace-state-3bF4TB8P.mjs";
3
+ import { _ as stepTimer, i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-CfPW1bKP.mjs";
4
+ import { Dn as RESOLVE_TIMEOUT_MS, Mn as isEasAuthFailureText, jn as easAuthNote } from "./ccache-BrwGIxmV.mjs";
5
+ import { $ as cancelledFailure, A as COMPILATION_CACHE_NOT_RUN, F as compilationCacheActivityLine, st as runCancellationSignal } from "./toolchain-Bnm8vUCV.mjs";
6
+ import { T as storedAppId, b as providerDownloadPath, x as providerUploadOutcome, y as prepareProviderDownloadDir } from "./build-cache-BsKim4V7.mjs";
7
+ import { C as COMPILATION_CACHE_CORRUPT, c as offloadPlacement, i as closeOffload, l as placementLoad, n as buildPlacementCandidates, o as offloadBuild, r as chooseBuildMachine, s as offloadCheck, u as remotePhaseText, w as clearCorruptCompilationCache } from "./client-lDmA-5jx.mjs";
8
+ import { a as missingPackageManagerRemedy, c as podsFailedRemedy, h as predictedRefusal, i as fingerprintMismatchRemedy, l as requireLocalBuild, n as automaticBuild, o as namedBuildMachine, t as OffloadRefusal } from "./selection-C4ZQz_ER.mjs";
9
+ import { S as xcodeFailureReport, p as printDiagnostics } from "./support-NxnD8QXd.mjs";
10
+ import { f as settleFingerprintCheck, u as skippedMissReason } from "./prebuild-CyNrUWgV.mjs";
11
+ import { t as buildPlacementRecord } from "./placement-log-CRL0IY-k.mjs";
12
+ import { n as settleArtifactUploads, t as acquireArtifact } from "./acquire-artifact-CI9fIokp.mjs";
13
+ import { r as finishIosUpload, t as IosRecipeRefusal } from "./ios-project-DDQlX_jX.mjs";
14
14
  import { rmSync } from "node:fs";
15
15
  import { join } from "node:path";
16
16
  import { machineCapacity } from "@stim-cli/core/state";
@@ -1,11 +1,11 @@
1
- import { _ as loadConfig$1, p as getProject } from "./config-AbUjIBOQ.mjs";
2
- import { m as peekBudget } from "./ccache-B8gY50-h.mjs";
3
- import { z as readHostMemoryPressureAsync } from "./ios-CXnoVO_z.mjs";
4
- import { _ as hostingMachines, o as namedBuildMachine, u as resolveBuildMachine } from "./selection-PCMT97XD.mjs";
5
- import { c as call, l as connectHost, m as requireHostedAppMode } from "./hosted-client-Cect92SZ.mjs";
6
- import { c as writeHostedNativeAsync, r as readHostedNative } from "./ios-state-Ce_dystM.mjs";
7
- import { i as prepareHostedNative } from "./hosted-native-DmdLSmvu.mjs";
8
- import { t as DEFAULT_DEVICE_SLOT_WAIT_MS, u as peekDeviceSlots } from "./device-capacity-C5C_jOQd.mjs";
1
+ import { m as getProject, v as loadConfig$1 } from "./config-D5qNWJEP.mjs";
2
+ import { m as peekBudget } from "./ccache-BrwGIxmV.mjs";
3
+ import { z as readHostMemoryPressureAsync } from "./ios-CdAV4-1E.mjs";
4
+ import { _ as hostingMachines, o as namedBuildMachine, u as resolveBuildMachine } from "./selection-C4ZQz_ER.mjs";
5
+ import { c as call, l as connectHost, m as requireHostedAppMode } from "./hosted-client-Hs-fD4L3.mjs";
6
+ import { c as writeHostedNativeAsync, r as readHostedNative } from "./ios-state-BEIJRJ7P.mjs";
7
+ import { i as prepareHostedNative } from "./hosted-native-Bh9IJ_t5.mjs";
8
+ import { d as peekDeviceSlots, t as DEFAULT_DEVICE_SLOT_WAIT_MS } from "./device-capacity-Bki6B-7h.mjs";
9
9
  import { ambientEnv } from "@stim-cli/core";
10
10
  import { automaticMachineEnabled, isJsonObject, machineCapacity, mayRunHere, parseHostedChoice, parseHostedNativeOffer, prefersRemote } from "@stim-cli/core/state";
11
11
  import { setTimeout } from "node:timers/promises";
@@ -43,12 +43,12 @@ function decideDevicePlacement(inputs) {
43
43
  }
44
44
  const { platform, placement = "auto", here, offers, buildMachine, noWait, eas } = inputs;
45
45
  const remoteFirst = prefersRemote(placement);
46
- const { count, max, queued } = here.devices;
46
+ const { count, max, queued, limit } = here.devices;
47
47
  const room = max === 0 || count !== null && count < max;
48
48
  const localEnabled = here.localEnabled !== false && mayRunHere(placement);
49
49
  const cannotTake = !localEnabled || !room || queued > 0;
50
50
  const atCapacity = count !== null && (!room || queued > 0);
51
- const usage = max > 0 ? `${count} of ${max} devices in use` : `${count} devices in use, no device cap`;
51
+ const usage = max > 0 ? `${count} of ${max} devices in use${limit ? ` (${limit})` : ""}` : `${count} devices in use, no device cap`;
52
52
  const localReason = !mayRunHere(placement) ? "remote-only never runs here" : !localEnabled ? "local is disabled in remote.devicePoolDisabled" : count === null ? "cannot tell how many devices run here; local boot admission decides" : cannotTake ? `${usage}${queued ? `, ${queued} runs queued ahead` : ""}` : here.budgetRefusal ?? (here.memoryPressure !== "normal" ? `host memory pressure ${here.memoryPressure ?? "unknown"} here` : `load ${here.loadPerCore.toFixed(1)}/core here, ${usage}`);
53
53
  let hostsFull = false;
54
54
  const nowhere = (code, reason, skipped = [], waiting = "") => {