stim 1.19.0 → 1.20.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 (172) hide show
  1. package/README.md +20 -3
  2. package/dist/{activity-BSw0x84R.mjs → activity-BrGh9EAI.mjs} +3 -3
  3. package/dist/{agent-device-usage-output-Bjxu_VmX.mjs → agent-device-usage-output-DVyv_hWj.mjs} +7 -7
  4. package/dist/android-0vv-OruW.mjs +6 -0
  5. package/dist/android-Brx6EKvJ.mjs +1258 -0
  6. package/dist/{android-BdQC6zs1.mjs → android-BsYNR81W.mjs} +103 -45
  7. package/dist/{android-DE5g_5gv.mjs → android-CK3fpEyZ.mjs} +2 -2
  8. package/dist/{android-cas-C87geAg-.mjs → android-cas-DCAuXryb.mjs} +9 -5
  9. package/dist/android-cas-compiler.mjs +1 -1
  10. package/dist/api-run.mjs +159 -8
  11. package/dist/{api-DIf_s86s.mjs → api-zuX3ynYN.mjs} +5 -1
  12. package/dist/api.d.mts +98 -4
  13. package/dist/api.mjs +1 -1
  14. package/dist/{app-install-CFI4ptUL.mjs → app-install-0LgaQRT7.mjs} +9 -8
  15. package/dist/artifact-CnC0mfov.mjs +807 -0
  16. package/dist/artifact-DClXJNWx.mjs +772 -0
  17. package/dist/artifact-lifecycle-DzPpBYvK.mjs +30 -0
  18. package/dist/{browser-web-CDhqQxhv.mjs → browser-web-CzBmhmgs.mjs} +19 -19
  19. package/dist/{budget-Dz-kyXLv.mjs → budget-BONq9vXY.mjs} +3101 -3062
  20. package/dist/build-BixRI6sB.mjs +462 -0
  21. package/dist/{build-facts-B87vo-Im.d.mts → build-facts-DcLv2HSd.d.mts} +1 -32
  22. package/dist/build-plan-CP0tckNU.mjs +553 -0
  23. package/dist/{cache-manifest-DiwKSyv9.mjs → cache-manifest-qA3dT2x2.mjs} +1 -1
  24. package/dist/cache-manifest.mjs +1 -1
  25. package/dist/{manifest-CX0d1IkZ.mjs → ccache-CjHQ5F8g.mjs} +13 -19
  26. package/dist/{chrome-BTUOo8p2.mjs → chrome-Dp2lMLBe.mjs} +1 -1
  27. package/dist/{cli-C9Zvgbdc.mjs → cli-B2R8wH1F.mjs} +20 -20
  28. package/dist/cli.mjs +1 -1
  29. package/dist/{client-CuUo8Nvg.mjs → client-BLy1Pw2V.mjs} +89 -307
  30. package/dist/collector-run.d.mts +4 -0
  31. package/dist/collector-run.mjs +7 -7
  32. package/dist/{command-output-Bt8ygHE7.mjs → command-output-BjPN99ZB.mjs} +2 -2
  33. package/dist/{config-DC5jEtd1.mjs → config-D0LhTY3S.mjs} +8 -12
  34. package/dist/{created-devices-D0s26Hx5.mjs → created-devices-HU_DAb_Q.mjs} +7 -6
  35. package/dist/{dependency-state-DKaS1OM9.mjs → dependency-state-B2m8eqsS.mjs} +2 -2
  36. package/dist/{detached-entry-pB_IPfV4.mjs → detached-entry-BXq4fIl-.mjs} +1 -1
  37. package/dist/{dev-client-CDY_zAmD.mjs → dev-client-ClATaJoH.mjs} +2 -2
  38. package/dist/{device-BHw0WlHl.mjs → device-B7lsC0K1.mjs} +8 -8
  39. package/dist/device-DVCwAFlX.mjs +727 -0
  40. package/dist/{device-capacity-BoN1jQkO.mjs → device-capacity-Ca_ke1LE.mjs} +13 -14
  41. package/dist/device-host-worker.mjs +38 -18
  42. package/dist/device-ios-CRUqPxKw.mjs +413 -0
  43. package/dist/{device-lease-Cu7PtQpZ.mjs → device-lease-DHOBXGgS.mjs} +135 -22
  44. package/dist/{device-lease-run-D38SnZtt.mjs → device-lease-run-CvDeHTkG.mjs} +4 -4
  45. package/dist/{device-pool-CP4rAsHx.mjs → device-pool-L2-5GxMy.mjs} +3 -3
  46. package/dist/{device-remote-B5GiUifk.mjs → device-remote-Bmg42063.mjs} +17 -68
  47. package/dist/doctor-C2MSuMMg.mjs +515 -0
  48. package/dist/{doctor-PRJH94v6.mjs → doctor-DPAqhVCK.mjs} +333 -744
  49. package/dist/{doctor-watchman-wZhyTdp4.mjs → doctor-watchman-CB4NnVZm.mjs} +13 -12
  50. package/dist/{simslim-D9LkJxIO.mjs → eas-build-Dw_ec2Km.mjs} +6 -152
  51. package/dist/{stim-installations-DbmUjsLv.mjs → eas-session-ledger-DZlC-Fq3.mjs} +57 -4
  52. package/dist/{error-diagnostics--v5HGOU0.mjs → error-diagnostics-Du7I_GuY.mjs} +17 -12
  53. package/dist/errors-DzkMYh8Q.mjs +205 -0
  54. package/dist/{exec-i8GDPwq9.mjs → exec-B81Qodjn.mjs} +40 -10
  55. package/dist/{gc-CyHMcKcn.mjs → gc-PWp34zGb.mjs} +21 -20
  56. package/dist/{device-ios-B2ruohE-.mjs → gradle-C2OEKCCI.mjs} +21 -650
  57. package/dist/{guide-dRaQJJk9.mjs → guide-Dai9lphv.mjs} +504 -117
  58. package/dist/{hosted-android-Bs7fytj7.mjs → hosted-android-DQ-Agsd8.mjs} +5 -5
  59. package/dist/{hosted-client-C5G4h_OJ.mjs → hosted-client-Io01s5By.mjs} +9 -3
  60. package/dist/{hosted-ios-Bik035eL.mjs → hosted-ios-DIxFnYp-.mjs} +3 -3
  61. package/dist/{hosted-logs-CI9Az9a4.mjs → hosted-logs-DP-ABU_M.mjs} +8 -8
  62. package/dist/{hosted-macos-DABm3ScO.mjs → hosted-macos-Aziw9T_9.mjs} +7 -6
  63. package/dist/{hosted-native-DbV2aUVw.mjs → hosted-native-BdAQi21M.mjs} +17 -14
  64. package/dist/{idle-shutdown-DYiMBn34.mjs → idle-shutdown-DdMqoSUB.mjs} +7 -7
  65. package/dist/{ios-DYUr9LGc.mjs → ios-BZ9dg2Fr.mjs} +8 -7
  66. package/dist/{ios-BWbHFZVz.mjs → ios-CXLIUxXJ.mjs} +180 -24
  67. package/dist/ios-CZuv6gRv.mjs +1112 -0
  68. package/dist/{ios-DCrkgXEM.mjs → ios-VGvNdsv2.mjs} +1 -1
  69. package/dist/{ios-device-CrW8aMb5.mjs → ios-device-B1B14xND.mjs} +1 -1
  70. package/dist/{ios-device-CJ_ZOGky.mjs → ios-device-BreZOpM0.mjs} +3 -3
  71. package/dist/ios-project-B9drt_aY.mjs +197 -0
  72. package/dist/{ios-state-By0XuLTQ.mjs → ios-state-CjrL2qv-.mjs} +1 -1
  73. package/dist/js-swap-C8icNYIY.mjs +432 -0
  74. package/dist/launch-DxH0THLP.mjs +745 -0
  75. package/dist/{react-native-ios-CSpIxexZ.mjs → launch-YrbqaIFj.mjs} +59 -612
  76. package/dist/{launch-verify-DCveSE6d.mjs → launch-verify-BzRdbuO1.mjs} +26 -7
  77. package/dist/{logs-Bao1HOMy.mjs → logs-DHaRNfg7.mjs} +11 -11
  78. package/dist/macos-C0iljhsN.mjs +2 -0
  79. package/dist/{macos-ciyBdTY5.mjs → macos-V_3Ui7g4.mjs} +42 -50
  80. package/dist/macos-run.mjs +1 -1
  81. package/dist/maintenance-run.mjs +13 -10
  82. package/dist/{metro-DI2AjPF_.mjs → metro-D_j9sN-B.mjs} +18 -5
  83. package/dist/{metro-gateway-BxpJLIwh.mjs → metro-gateway-BBJldOdi.mjs} +2 -2
  84. package/dist/miss-reason-BPAzZS0r.mjs +238 -0
  85. package/dist/{named-ports-B4iWH4E-.mjs → named-ports-C2lvoPsb.mjs} +3 -3
  86. package/dist/native-android-lHzaew7r.mjs +226 -0
  87. package/dist/native-gradle-inputs-BQnIdAlL.mjs +356 -0
  88. package/dist/{native-runtime-BGxsbfny.mjs → native-runtime-BRmWL7ru.mjs} +9 -8
  89. package/dist/native-xcode-inputs-eutS19jU.mjs +307 -0
  90. package/dist/native-xcode-ios-DP3cHLwu.mjs +434 -0
  91. package/dist/{ndjson-LGZAMsqa.mjs → ndjson-GOnbyvso.mjs} +6 -6
  92. package/dist/offload-worker.d.mts +41 -7
  93. package/dist/offload-worker.mjs +409 -74
  94. package/dist/{ownership-EB0ySdGK.mjs → ownership-DXzMMSx6.mjs} +2 -2
  95. package/dist/{placement-log-Dxe34rJm.mjs → placement-log-reFbjqEr.mjs} +1 -1
  96. package/dist/plan-BDk2AeY_.mjs +260 -0
  97. package/dist/plan-placement-D_YYlE6N.mjs +73 -0
  98. package/dist/{ports-ByPc0_97.mjs → ports-jzvAJXXL.mjs} +3 -3
  99. package/dist/{prebuild-BKJ3wJI1.mjs → prebuild-Bw44QxVh.mjs} +4 -4
  100. package/dist/{preview-BbSottmO.mjs → preview-BaBJ72Al.mjs} +50 -32
  101. package/dist/project-B8_duAzW.mjs +1067 -0
  102. package/dist/project-plan-BPwbLwQu.mjs +10 -0
  103. package/dist/{pull-request-IHNdMnG8.mjs → pull-request-vOhLNmIb.mjs} +1 -1
  104. package/dist/pull-requests.mjs +1 -1
  105. package/dist/react-native-android-chm1DMlA.mjs +921 -0
  106. package/dist/react-native-build-oAw6gQeW.mjs +239 -0
  107. package/dist/react-native-doctor-DYXoh-6I.mjs +78 -0
  108. package/dist/react-native-ios-SCTK_CT5.mjs +595 -0
  109. package/dist/{recordings-Bv8McZN4.mjs → recordings-Bk-VivUV.mjs} +1 -1
  110. package/dist/{reload-rAPdqeRR.mjs → reload-D34GkY78.mjs} +17 -13
  111. package/dist/remote-BU9UyhCJ.mjs +192 -0
  112. package/dist/{remote-cache-N3hAEaAL.mjs → remote-cache-Bsts6f6Y.mjs} +5 -5
  113. package/dist/result-BDoRk1k3.mjs +186 -0
  114. package/dist/{run-lAkle1-c.mjs → run-qvff78hv.mjs} +3 -3
  115. package/dist/{server-bare-CkIjnegq.mjs → server-bare-dWjAarki.mjs} +5 -5
  116. package/dist/server-command-7XIKlWtO.mjs +69 -0
  117. package/dist/{server-expo-n3tUi3Em.mjs → server-expo-CsYu2aKL.mjs} +107 -82
  118. package/dist/server-expo-DV43vep4.mjs +2 -0
  119. package/dist/{settings-CxgngUZk.mjs → settings-Bbztm4oV.mjs} +179 -129
  120. package/dist/{settings-2am7TSxp.mjs → settings-CT3E71-i.mjs} +6 -6
  121. package/dist/{state-lKh8shBp.d.mts → settings-vk3mJGSm.d.mts} +4 -2
  122. package/dist/settings.schema.json +84 -0
  123. package/dist/simslim-ChMfe8rg.mjs +149 -0
  124. package/dist/{slot-launch-HV_KtPIw.mjs → slot-launch-B9hn96wd.mjs} +6 -6
  125. package/dist/{stage-BgaZJVZY.mjs → stage-BNKKdDNc.mjs} +6 -3
  126. package/dist/start-CbQCSnXQ.mjs +2 -0
  127. package/dist/{start-DtxthMfI.mjs → start-CdvcTaXr.mjs} +97 -68
  128. package/dist/{state-Tp4uImDS.mjs → state-Boo0IMJq.mjs} +1 -1
  129. package/dist/{state-D2KtnALG.mjs → state-DI84A-uu.mjs} +29 -10
  130. package/dist/{stats-8EJ5ivFT.mjs → stats-BIIDrjA8.mjs} +5 -5
  131. package/dist/{status-BEeL6IKz.mjs → status-BDGHwkCs.mjs} +3 -1
  132. package/dist/{status-BOyp0CUl.mjs → status-DARMkc9q.mjs} +81 -293
  133. package/dist/status-watch-DvmI3SmN.mjs +296 -0
  134. package/dist/{stim-desktop-C65jk_q2.mjs → stim-desktop-8GQX2OV8.mjs} +1 -1
  135. package/dist/{stop-DRipAg-e.mjs → stop-CCZS-C9m.mjs} +2 -2
  136. package/dist/{stop-D0UIpZuh.mjs → stop-WQPQHLuy.mjs} +5 -5
  137. package/dist/{stop-zDlknFoz.mjs → stop-iNemHsJC.mjs} +21 -20
  138. package/dist/supervisor-run.d.mts +7 -2
  139. package/dist/supervisor-run.mjs +32 -20
  140. package/dist/{support-DsNaFg6D.mjs → support-CnE_SIjt.mjs} +17 -7
  141. package/dist/{support-CNqYkV0y.mjs → support-DCco5fut.mjs} +61 -8
  142. package/dist/{swiftpm-macos-aJzPAj1t.mjs → swiftpm-macos-afeNUExW.mjs} +5 -5
  143. package/dist/tailnet-CoJUb2tB.mjs +265 -0
  144. package/dist/toolchain-BIupIro1.mjs +2 -0
  145. package/dist/{toolchain-C3xSoyUl.mjs → toolchain-DqyDXs30.mjs} +206 -53
  146. package/dist/{trigger-CAhmG-4s.mjs → trigger-C0MWBi8O.mjs} +2 -2
  147. package/dist/trigger-SHLOWJ4O.mjs +2 -0
  148. package/dist/{warm-progress-pFLB2e6P.mjs → warm-progress-C3ASD6z5.mjs} +6 -6
  149. package/dist/{watchman-BL1IdOtq.mjs → watchman-CQl51YZu.mjs} +6 -6
  150. package/dist/{web-DbbrPUn0.mjs → web-B3eldHFH.mjs} +9 -13
  151. package/dist/web-BLXpOe6b.mjs +2 -0
  152. package/dist/web-run.mjs +10 -10
  153. package/dist/{workspace-state-CR9X86xJ.mjs → workspace-state-CSIFuuDa.mjs} +33 -33
  154. package/dist/{workspaces-Djb2gfi9.mjs → workspaces-D2xSHBDY.mjs} +1260 -1258
  155. package/dist/{worktree-BL4M1rhB.mjs → worktree-BxDqaTev.mjs} +84 -48
  156. package/dist/worktree-q7_OZNY0.mjs +2 -0
  157. package/package.json +8 -6
  158. package/shim/native-android.gradle +101 -0
  159. package/dist/android-BXc6BmEi.mjs +0 -3732
  160. package/dist/android-BvV1gGdN.mjs +0 -4
  161. package/dist/ios-ITYno9rO.mjs +0 -2241
  162. package/dist/macos-nIOATJmR.mjs +0 -2
  163. package/dist/metro-store-BAHFcJm6.mjs +0 -106
  164. package/dist/miss-reason-CjQCOKqq.mjs +0 -1743
  165. package/dist/plan-placement-BVY59qa8.mjs +0 -290
  166. package/dist/project-B5eQ1USs.mjs +0 -612
  167. package/dist/react-native-ios-BMh2i25I.mjs +0 -2
  168. package/dist/server-expo-DGsdUGX2.mjs +0 -2
  169. package/dist/start-D8NbxNBb.mjs +0 -2
  170. package/dist/trigger-CoalsMTV.mjs +0 -2
  171. package/dist/web-DFpFeZu5.mjs +0 -2
  172. package/dist/worktree-DV-A0LNL.mjs +0 -2
@@ -1,40 +1,41 @@
1
1
  import { t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
- import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
3
- import { a as formatElapsed, i as formatDuration, r as clockTime, u as plural } from "./command-output-Bt8ygHE7.mjs";
4
- import { B as parseDeviceSlotKey, F as volumeRootFor, H as projectDeviceSlots, R as deviceSlotKey, _ as loadConfig$1, d as getConfigDir, j as formatBytes } from "./config-DC5jEtd1.mjs";
5
- import { b as workspaceLogErrorIndex, r as readWorkspaceState$1, x as workspaceLogsDir$1 } from "./workspace-state-CR9X86xJ.mjs";
6
- import { A as readWorkspaceLaunches, E as readMetroTunnel, O as readRemoteSession, _ as readAppJson, c as projectShortcut, i as findServerWorkspace, l as detectPlatforms, m as detectTutorial, p as detectIsExpo } from "./project-B5eQ1USs.mjs";
7
- import { I as resolveSettings, ct as linkedWorktreesOnDisk, mt as repoRoot, nt as gitCommonDir, rt as gitCommonDirOnDisk } from "./settings-CxgngUZk.mjs";
8
- import { a as listeningPidsByPort, c as processCwd, i as listeningPids, l as processCwds, p as isMetroRunning, s as pidExists, u as resolveProjectMetro } from "./metro-DI2AjPF_.mjs";
9
- import { a as readWebPage, o as readWebRecord, u as webFacts } from "./state-D2KtnALG.mjs";
10
- import { C as statusActivity, E as withWebFacts, S as remoteDeviceState, T as unprovisionedWorktrees, _ as gitSummaryText, b as poolLine, c as activityLabel, d as capacity, f as deviceLeaseLines, h as environmentState, l as addReverseMissingIssue, m as diskLine, p as deviceLeaseStates, u as applyMachineMemory, v as metroReverseTargets, w as tightVolumes, x as remoteDeviceLine, y as parseDfFree } from "./watchman-BL1IdOtq.mjs";
11
- import { A as buildReport, B as readStats$1, D as ACTIVE_BUILD_KEY, Mt as readFootprints, N as parseActiveBuild, W as statsProjectKey$1, _ as metroLastStop, j as buildStatusLine, jt as attributeMachineUsage, k as activeBuildState, o as machineNumber, p as describeMetroLastStop } from "./budget-Dz-kyXLv.mjs";
12
- import { m as resolveSupervisorTarget } from "./workspaces-Djb2gfi9.mjs";
13
- import { d as readWebActivity, f as tailLines, i as createDeviceProcessTables, r as createActivityReader } from "./activity-BSw0x84R.mjs";
14
- import { i as listLeaseFiles, r as leaseIsExpired, s as parseWorkspaceLeases } from "./device-lease-Cu7PtQpZ.mjs";
15
- import { F as ownedAvdDeviceProfile, O as listAdbDevices, d as androidToolPath, ft as parkedMaxSetting, ot as POOL_SETTING_REMEDY, pt as readParked, z as ownedAvdSerialResolver } from "./android-BdQC6zs1.mjs";
16
- import { f as listAllIosSimsAsync, y as parseSimctlList } from "./ios-BWbHFZVz.mjs";
17
- import { a as parseNdjsonLine } from "./ndjson-LGZAMsqa.mjs";
18
- import { l as probeHostedSession } from "./hosted-client-C5G4h_OJ.mjs";
19
- import { m as hasMetroReverse } from "./app-install-CFI4ptUL.mjs";
20
- import { m as readEasSessionLedger$1, p as easMachineStateRoot$1 } from "./device-remote-B5GiUifk.mjs";
21
- import { d as readIosDevices, s as isReachable } from "./ios-device-CJ_ZOGky.mjs";
22
- import "./hosted-macos-DABm3ScO.mjs";
23
- import { i as readSupervisorState } from "./stop-zDlknFoz.mjs";
24
- import { i as createStatusMeasurer, n as workspacePhase, r as applyStatusMeasures, s as mergeState } from "./warm-progress-pFLB2e6P.mjs";
25
- import { r as workspaceRecordingEnabled } from "./recordings-Bv8McZN4.mjs";
26
- import { n as maintenanceLines, r as maintenanceStatus } from "./status-BEeL6IKz.mjs";
2
+ import { t as getExecutor } from "./exec-B81Qodjn.mjs";
3
+ import { B as parseDeviceSlotKey, F as volumeRootFor, H as projectDeviceSlots, R as deviceSlotKey, _ as loadConfig$1, d as getConfigDir, j as formatBytes } from "./config-D0LhTY3S.mjs";
4
+ import { Et as repoRoot, bt as linkedWorktreesOnDisk, ht as gitCommonDirOnDisk, mt as gitCommonDir, q as resolveSettings } from "./settings-Bbztm4oV.mjs";
5
+ import { i as listLeaseFiles, r as leaseIsExpired, s as parseWorkspaceLeases } from "./device-lease-DHOBXGgS.mjs";
6
+ import { C as workspaceLogErrorIndex, r as readWorkspaceState$1, w as workspaceLogsDir$1 } from "./workspace-state-CSIFuuDa.mjs";
7
+ import { a as formatElapsed, i as formatDuration, r as clockTime, u as plural } from "./command-output-BjPN99ZB.mjs";
8
+ import { F as readWorkspaceLaunches, N as readRemoteSession, _ as detectIsExpo, c as projectShortcut, i as findServerWorkspace, j as readMetroTunnel, l as detectPlatforms, v as detectTutorial, x as readAppJson } from "./project-B8_duAzW.mjs";
9
+ import { F as ownedAvdDeviceProfile, O as listAdbDevices, at as POOL_SETTING_REMEDY, dt as parkedMaxSetting, ft as readParked, z as ownedAvdSerialResolver } from "./android-BsYNR81W.mjs";
10
+ import { a as listeningPidsByPort, c as processCwd, i as listeningPids, l as processCwds, p as isMetroRunning, s as pidExists, u as resolveProjectMetro } from "./metro-D_j9sN-B.mjs";
11
+ import { P as resolveSupervisorTarget } from "./workspaces-D2xSHBDY.mjs";
12
+ import { Ct as bundlingActivity, It as statsProjectKey$1, Mt as readStats$1, St as buildStatusLine, Tt as parseActiveBuild, bt as activeBuildState, it as readFootprints, mt as metroLastStop, o as machineNumber, rt as attributeMachineUsage, ut as describeMetroLastStop, vt as ACTIVE_BUILD_KEY, xt as buildReport } from "./budget-BONq9vXY.mjs";
13
+ import { a as parseNdjsonLine } from "./ndjson-GOnbyvso.mjs";
14
+ import { a as readWebPage, o as readWebRecord, u as webFacts } from "./state-DI84A-uu.mjs";
15
+ import { C as statusActivity, E as withWebFacts, S as remoteDeviceState, T as unprovisionedWorktrees, _ as gitSummaryText, b as poolLine, c as activityLabel, d as capacity, f as deviceLeaseLines, h as environmentState, l as addReverseMissingIssue, m as diskLine, p as deviceLeaseStates, u as applyMachineMemory, v as metroReverseTargets, w as tightVolumes, x as remoteDeviceLine, y as parseDfFree } from "./watchman-CQl51YZu.mjs";
16
+ import { d as readWebActivity, f as tailLines, i as createDeviceProcessTables, r as createActivityReader } from "./activity-BrGh9EAI.mjs";
17
+ import { b as parseSimctlList, f as listAllIosSimsAsync } from "./ios-CXLIUxXJ.mjs";
18
+ import { m as hasMetroReverse } from "./app-install-0LgaQRT7.mjs";
19
+ import { u as probeHostedSession } from "./hosted-client-Io01s5By.mjs";
20
+ import { r as readEasSessionLedger$1 } from "./eas-session-ledger-DZlC-Fq3.mjs";
21
+ import { d as readIosDevices, s as isReachable } from "./ios-device-BreZOpM0.mjs";
22
+ import "./hosted-macos-Aziw9T_9.mjs";
23
+ import { i as readSupervisorState } from "./stop-iNemHsJC.mjs";
24
+ import { i as createStatusMeasurer, n as workspacePhase, r as applyStatusMeasures, s as mergeState } from "./warm-progress-C3ASD6z5.mjs";
25
+ import { r as workspaceRecordingEnabled } from "./recordings-Bk-VivUV.mjs";
26
+ import { n as maintenanceLines, r as maintenanceStatus } from "./status-BDGHwkCs.mjs";
27
+ import { a as watchStatusSources, i as watchPayload, n as WATCH_LIGHT_INTERVAL_MS, r as createRefreshScheduler, t as WATCH_FALLBACK_MS } from "./status-watch-DvmI3SmN.mjs";
27
28
  import { t as watchStdoutReader } from "./stdout-reader-C8yjre1x.mjs";
28
- import { t as triggerMaintenance } from "./trigger-CAhmG-4s.mjs";
29
- import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, watch, writeFileSync } from "node:fs";
29
+ import { t as triggerMaintenance } from "./trigger-C0MWBi8O.mjs";
30
+ import { mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
30
31
  import { join, posix, resolve } from "node:path";
31
32
  import { basename as basename$1, dirname as dirname$1, join as join$1 } from "path";
32
33
  import { DEVICE_RECLAIM_REASON, ERROR_SOURCES, archiveRoot, archivedUsage, bundleMarkerPlatform, countErrorEntries, gitMergeCacheDir, hostedAndroidPlacements, hostedAndroidRecords, hostedAndroidStatus, hostedIosPlacements, hostedIosRecords, hostedIosStatus, linkReplacedArchives, logFiles, macosAppState, parseHostedAndroidPlacement, parseHostedIosPlacement, queryLogs, readArchives, readBuildDetail, readBuildHistory, readDeviceIdleShutdowns, readDevicePlacement, readIdleStop, readLastBuilds, readMacosRecord, recordMatches, sortByTs, unreadableHostedAndroid, unreadableHostedIos, withDerivedFacts, withGitChip, withStateReadCache } from "@stim-cli/core/state";
33
- import chalk from "chalk";
34
34
  import { closeSync as closeSync$1, existsSync as existsSync$1, fstatSync as fstatSync$1, openSync as openSync$1, readFileSync as readFileSync$1, readSync as readSync$1, renameSync as renameSync$1, rmSync as rmSync$1, statSync as statSync$1, writeFileSync as writeFileSync$1 } from "fs";
35
35
  import { rotatedLogPath } from "@stim-cli/core";
36
- import { createHash, randomUUID } from "node:crypto";
37
36
  import { homedir, totalmem } from "os";
37
+ import { createHash, randomUUID } from "node:crypto";
38
+ import chalk from "chalk";
38
39
  //#region src/device-host/hosted-native-status.ts
39
40
  function hostedNativeProbe(placement, probe, slot, platform) {
40
41
  const label = platform === "ios" ? "iOS" : "Android";
@@ -116,252 +117,6 @@ async function readHostedMacosStatus(record, options) {
116
117
  return applyHostedMacosProbe(record, await probeHostedSession(record.host, options));
117
118
  }
118
119
  //#endregion
119
- //#region src/status-watch.ts
120
- const WATCH_FALLBACK_MS = 3e4;
121
- const WATCH_LIGHT_INTERVAL_MS = 15e3;
122
- const WATCH_SIMCTL_INTERVAL_MS = 5e3;
123
- const ADB_RESTART_MIN_MS = 1e3;
124
- const ADB_RESTART_MAX_MS = 6e4;
125
- const SIMCTL_TIMEOUT_MS = 1e4;
126
- /**
127
- * Coalesces change signals into refreshes: a burst of full triggers runs `run('full')` once after `debounceMs` of
128
- * quiet, at most one run is in flight, and a trigger that arrives during a run causes exactly one more run after it.
129
- * A `light` trigger runs `run('light')` no sooner than `debounceMs` from the trigger and `lightIntervalMs` from the
130
- * start of the previous run, unless a queued full run covers it; later light triggers do not postpone it.
131
- */
132
- function createRefreshScheduler({ debounceMs, lightIntervalMs = 0, run }) {
133
- let timer = null;
134
- let queued = "full";
135
- let running = false;
136
- let pending = null;
137
- let stopped = false;
138
- let lastRunAt = -Infinity;
139
- const fire = async () => {
140
- timer = null;
141
- running = true;
142
- lastRunAt = Date.now();
143
- try {
144
- await run(queued);
145
- } finally {
146
- running = false;
147
- if (pending) {
148
- const next = pending;
149
- pending = null;
150
- trigger(next);
151
- }
152
- }
153
- };
154
- function trigger(kind = "full", delayMs = debounceMs) {
155
- if (stopped) return;
156
- if (running) {
157
- pending = pending === "full" ? "full" : kind;
158
- return;
159
- }
160
- if (kind === "light") {
161
- if (timer) return;
162
- queued = "light";
163
- timer = setTimeout(() => void fire(), Math.max(delayMs, lastRunAt + lightIntervalMs - Date.now()));
164
- return;
165
- }
166
- if (timer) clearTimeout(timer);
167
- queued = "full";
168
- timer = setTimeout(() => void fire(), delayMs);
169
- }
170
- return {
171
- trigger,
172
- stop() {
173
- stopped = true;
174
- if (timer) clearTimeout(timer);
175
- timer = null;
176
- }
177
- };
178
- }
179
- /**
180
- * Which refresh a change to `name` in a watched `$STIM_HOME` directory needs: `light` for a log append or a running
181
- * build's detail, which can change only the log-derived fields, `full` for anything else that can change the payload,
182
- * null for none. A null name means the platform did not report one.
183
- */
184
- function statusChange(dir, name) {
185
- if (dir === "archive" && (name?.startsWith(".incoming-") || name?.startsWith(".removing-") || name?.startsWith(".lock"))) return null;
186
- if (name?.includes(".lock")) return null;
187
- if (dir === "logs") return "light";
188
- if (name === null) return "full";
189
- switch (dir) {
190
- case "home":
191
- if (name === "maintenance") return "light";
192
- return name.startsWith("config.json") || name === "archive" || name === "workspaces" || name === "device-locks" ? "full" : null;
193
- case "workspace":
194
- if (name.startsWith("build-detail.json")) return "light";
195
- return name.startsWith("state.json") || name.startsWith("ended-agents.json") || name === "logs" ? "full" : null;
196
- case "maintenance": return name === "state.json" ? "light" : null;
197
- case "eas": return name.startsWith("sessions.json") ? "full" : null;
198
- default: return "full";
199
- }
200
- }
201
- /** A stable summary of every simulator's state, or null when the listing is unreadable. */
202
- function simulatorSignature(simctlJson) {
203
- try {
204
- return parseSimctlList(simctlJson, { includeUnavailable: true }).map((sim) => `${sim.udid}:${sim.state}`).toSorted().join(",");
205
- } catch {
206
- return null;
207
- }
208
- }
209
- /**
210
- * Calls `onChange` when anything `stim status` reports may have changed:
211
- * `$STIM_HOME` files, adb device arrivals and departures, and simulator
212
- * state. simctl has no push API reachable from Node, so it is polled.
213
- */
214
- function watchStatusSources({ home, onChange, platform = process.platform, simctlIntervalMs = WATCH_SIMCTL_INTERVAL_MS }) {
215
- let stopped = false;
216
- const watchers = /* @__PURE__ */ new Map();
217
- const desiredDirs = () => {
218
- const dirs = /* @__PURE__ */ new Map([
219
- [home, "home"],
220
- [join(home, "archive"), "archive"],
221
- [join(home, "workspaces"), "workspaces"],
222
- [join(home, "maintenance"), "maintenance"],
223
- [join(home, "device-locks"), "leases"],
224
- [easMachineStateRoot$1(), "eas"]
225
- ]);
226
- let names = [];
227
- try {
228
- names = readdirSync(join(home, "workspaces"));
229
- } catch {}
230
- for (const name of names) {
231
- const dir = join(home, "workspaces", name);
232
- dirs.set(dir, "workspace");
233
- dirs.set(join(dir, "logs"), "logs");
234
- }
235
- return dirs;
236
- };
237
- const reconcile = () => {
238
- if (stopped) return;
239
- const desired = desiredDirs();
240
- for (const [dir, watcher] of watchers) if (!desired.has(dir)) {
241
- watcher.close();
242
- watchers.delete(dir);
243
- }
244
- for (const [dir, kind] of desired) {
245
- if (watchers.has(dir)) continue;
246
- try {
247
- const watcher = watch(dir, (_event, name) => {
248
- const change = statusChange(kind, name === null ? null : String(name));
249
- if (!change) return;
250
- if (kind === "home" || kind === "workspaces" || kind === "workspace") {
251
- listingStaleBefore = Date.now();
252
- reconcile();
253
- }
254
- onChange(change);
255
- });
256
- watcher.on("error", () => {
257
- watcher.close();
258
- watchers.delete(dir);
259
- });
260
- watchers.set(dir, watcher);
261
- } catch {}
262
- }
263
- };
264
- const adb = trackAdbDevices(() => onChange("full"));
265
- let simctl = null;
266
- let listing = null;
267
- let listingStaleBefore = 0;
268
- let simTimer = null;
269
- if (platform === "darwin") {
270
- let last = null;
271
- const check = () => {
272
- if (simctl || stopped) return;
273
- const startedAt = Date.now();
274
- let out = "";
275
- const child = getExecutor().spawn("xcrun", [
276
- "simctl",
277
- "list",
278
- "devices",
279
- "--json"
280
- ], {
281
- stdio: [
282
- "ignore",
283
- "pipe",
284
- "ignore"
285
- ],
286
- timeout: SIMCTL_TIMEOUT_MS,
287
- killSignal: "SIGKILL"
288
- });
289
- simctl = child;
290
- child.stdout?.on("data", (chunk) => out += chunk.toString());
291
- child.on("error", () => {
292
- simctl = null;
293
- });
294
- child.on("close", () => {
295
- simctl = null;
296
- const signature = simulatorSignature(out);
297
- if (signature === null || stopped) return;
298
- listing = {
299
- at: startedAt,
300
- json: out
301
- };
302
- if (last !== null && signature !== last) onChange("full");
303
- last = signature;
304
- });
305
- };
306
- check();
307
- simTimer = setInterval(check, simctlIntervalMs);
308
- }
309
- reconcile();
310
- return {
311
- reconcile,
312
- simulatorListing: () => listing && listing.at > listingStaleBefore && Date.now() - listing.at <= 2 * simctlIntervalMs ? listing.json : null,
313
- stop() {
314
- stopped = true;
315
- for (const watcher of watchers.values()) watcher.close();
316
- watchers.clear();
317
- if (simTimer) clearInterval(simTimer);
318
- simctl?.kill("SIGKILL");
319
- adb.stop();
320
- }
321
- };
322
- }
323
- /**
324
- * Runs `adb track-devices` and calls `onChange` on every device list it
325
- * reports. adb exits when its server restarts, so the tracker restarts with a
326
- * doubling delay that resets once a run lasts a minute.
327
- */
328
- function trackAdbDevices(onChange) {
329
- const exec = getExecutor();
330
- const resolved = androidToolPath("adb");
331
- const adb = resolved === "adb" ? exec.findExecutable("adb") : resolved;
332
- if (!adb) return { stop() {} };
333
- let child = null;
334
- let restart = null;
335
- let delay = ADB_RESTART_MIN_MS;
336
- let stopped = false;
337
- const start = () => {
338
- restart = null;
339
- if (stopped) return;
340
- const startedAt = Date.now();
341
- const current = exec.spawn(adb, ["track-devices"], { stdio: [
342
- "ignore",
343
- "pipe",
344
- "ignore"
345
- ] });
346
- child = current;
347
- current.stdout?.on("data", () => onChange());
348
- current.on("error", () => {});
349
- current.on("close", () => {
350
- if (child === current) child = null;
351
- if (stopped) return;
352
- if (Date.now() - startedAt >= ADB_RESTART_MAX_MS) delay = ADB_RESTART_MIN_MS;
353
- restart = setTimeout(start, delay);
354
- delay = Math.min(delay * 2, ADB_RESTART_MAX_MS);
355
- });
356
- };
357
- start();
358
- return { stop() {
359
- stopped = true;
360
- if (restart) clearTimeout(restart);
361
- child?.kill("SIGTERM");
362
- } };
363
- }
364
- //#endregion
365
120
  //#region src/diagnostics/error-index.ts
366
121
  const INDEX_VERSION = 7;
367
122
  const HEAD_BYTES = 1024;
@@ -554,6 +309,7 @@ function writeIndex(file, index) {
554
309
  //#endregion
555
310
  //#region src/workspace/git-summary.ts
556
311
  const GIT_TIMEOUT_MS = 3e3;
312
+ const GIT_CONCURRENCY = 6;
557
313
  const MERGE_BUDGET_MS = 250;
558
314
  const MERGE_TIMEOUT_BACKOFF_MS = 3e5;
559
315
  const ORIGIN_PREFIX = "refs/remotes/origin/";
@@ -594,7 +350,11 @@ function inPrivacyProtectedFolder(path, home) {
594
350
  "Library/CloudStorage"
595
351
  ].map((dir) => posix.join(home, dir)), "/Volumes"].some((dir) => path === dir || path.startsWith(`${dir}/`));
596
352
  }
353
+ const gitQueue = [];
354
+ let gitRunning = 0;
597
355
  async function git(path, args) {
356
+ if (gitRunning < GIT_CONCURRENCY) gitRunning++;
357
+ else await new Promise((proceed) => gitQueue.push(proceed));
598
358
  try {
599
359
  return await getExecutor().runFileAsync("git", [
600
360
  "--no-optional-locks",
@@ -604,6 +364,10 @@ async function git(path, args) {
604
364
  ], { timeoutMs: GIT_TIMEOUT_MS });
605
365
  } catch {
606
366
  return null;
367
+ } finally {
368
+ const next = gitQueue.shift();
369
+ if (next) next();
370
+ else gitRunning--;
607
371
  }
608
372
  }
609
373
  async function defaultBranchOf(repository) {
@@ -750,7 +514,7 @@ function gitFilesStamp(worktree, refs) {
750
514
  };
751
515
  }
752
516
  /**
753
- * Reads every worktree's git summary in parallel, each git call bounded by a timeout. A worktree `skip` rejects, or
517
+ * Reads every worktree's git summary, at most six git calls at a time, each bounded by a timeout once it starts. A worktree `skip` rejects, or
754
518
  * one git cannot answer in time, maps to null. After every read, merge verdicts missing from the cache are judged one
755
519
  * at a time; no new judgement starts 250 ms after the first, and a verdict for the same HEAD judged at an older
756
520
  * default-branch commit stands in, because a merged branch stays merged. A judgement that timed out is not retried
@@ -789,7 +553,8 @@ async function readWorktreeGit(worktrees, { skip, maxAgeMs = 0 }) {
789
553
  status: out === null ? null : parseGitStatus(out),
790
554
  target,
791
555
  files,
792
- refs
556
+ refs,
557
+ at: Date.now()
793
558
  };
794
559
  }));
795
560
  const budget = {};
@@ -801,7 +566,7 @@ async function readWorktreeGit(worktrees, { skip, maxAgeMs = 0 }) {
801
566
  }
802
567
  if (!read.status) {
803
568
  if (read.files?.missing) recent.set(read.path, {
804
- at: now,
569
+ at: read.at,
805
570
  files: read.files.stamp,
806
571
  refs: read.refs,
807
572
  git: null
@@ -821,7 +586,7 @@ async function readWorktreeGit(worktrees, { skip, maxAgeMs = 0 }) {
821
586
  };
822
587
  const settled = !merge?.deferred && refs.upstream === read.refs.upstream && refs.target === read.refs.target;
823
588
  recent.set(read.path, {
824
- at: now,
589
+ at: read.at,
825
590
  files: settled ? read.files?.stamp ?? null : null,
826
591
  refs,
827
592
  git: summary
@@ -1098,6 +863,14 @@ function androidStatusLines(record, slotLabel) {
1098
863
  if (record?.host?.agent.driver === "agent-device") out.push(chalk.dim(` agent: ${record.host.agent.command}`));
1099
864
  return out;
1100
865
  }
866
+ function doctorRunTimes(proj) {
867
+ const runs = {};
868
+ for (const platform of ["ios", "android"]) {
869
+ const at = proj.doctorRuns?.[platform]?.at;
870
+ if (typeof at === "string") runs[platform] = { at };
871
+ }
872
+ return Object.keys(runs).length ? runs : void 0;
873
+ }
1101
874
  function formatGb(mb) {
1102
875
  return `${(mb / 1024).toFixed(1)} GB`;
1103
876
  }
@@ -1131,7 +904,8 @@ async function readStatusFacts(gitMaxAgeMs, simctlListing, cachedArchives) {
1131
904
  };
1132
905
  }));
1133
906
  processes.catch(() => {});
1134
- const gitRead = readGitInto(worktrees, orphanWorktrees, gitMaxAgeMs);
907
+ const watching = gitMaxAgeMs > 0;
908
+ const gitRead = watching ? readGitInto(worktrees, orphanWorktrees, gitMaxAgeMs) : null;
1135
909
  const androidRuntimeOf = androidRuntimeReader();
1136
910
  const devices = projects.map(([, proj]) => ({
1137
911
  androidRuntimes: Object.fromEntries(projectDeviceSlots(proj).slice(1).map(({ slot, platforms }) => [slot, platforms.android?.owned && platforms.android.avdName ? androidRuntimeOf(platforms.android.avdName) : null])),
@@ -1245,15 +1019,23 @@ async function readStatusFacts(gitMaxAgeMs, simctlListing, cachedArchives) {
1245
1019
  state.live ||= macos.state === "running" || macos.state === "orphaned" || macos.build.state === "running";
1246
1020
  }
1247
1021
  Object.assign(state, builds, workspacePhase(state.live, saved, { now: leaseNow }), {
1248
- platforms: detectPlatforms(path, resolveSettings({
1249
- projectPath: path,
1250
- gitCommonDir: gitCommonDirOnDisk(path),
1251
- repoRoot: state.worktree?.path ?? path
1252
- })),
1022
+ platforms: (() => {
1023
+ const context = {
1024
+ projectPath: path,
1025
+ gitCommonDir: gitCommonDirOnDisk(path),
1026
+ repoRoot: state.worktree?.path ?? path
1027
+ };
1028
+ return detectPlatforms(path, {
1029
+ context,
1030
+ settings: resolveSettings(context)
1031
+ });
1032
+ })(),
1253
1033
  recording: { enabled: workspaceRecordingEnabled(path, proj, cfg, process.env) }
1254
1034
  });
1255
1035
  const tutorial = detectTutorial(readAppJson(path));
1256
1036
  if (tutorial) state.tutorial = tutorial;
1037
+ const doctorRuns = doctorRunTimes(proj);
1038
+ if (doctorRuns) state.doctorRuns = doctorRuns;
1257
1039
  }
1258
1040
  const physicalDevices = physicalDeviceStates(leaseFiles, parseWorkspaceLeases(saved?.deviceLeases), {
1259
1041
  root: path,
@@ -1264,6 +1046,7 @@ async function readStatusFacts(gitMaxAgeMs, simctlListing, cachedArchives) {
1264
1046
  if (state && physicalDevices.length) state.physicalDevices = physicalDevices;
1265
1047
  labelOnlyRoots.push(Boolean(proj.worktreeRoot && !proj.bundleId && !state?.metro && !state?.ios && !state?.android && !state?.web && !state?.macos));
1266
1048
  }
1049
+ if (!watching) await readGitInto(worktrees, orphanWorktrees, gitMaxAgeMs, new Set(states.flatMap((state) => state.live && state.worktree ? [state.worktree.path] : [])));
1267
1050
  applyStatusMeasures(states, worktrees);
1268
1051
  readLogDerivedFacts(states);
1269
1052
  const tables = createDeviceProcessTables();
@@ -1349,6 +1132,8 @@ function readLogDerivedFacts(states) {
1349
1132
  const detail = record.phase === "compile" ? readBuildDetail(state.path, record.claim.claimId) : null;
1350
1133
  if (detail) state.build.detail = detail;
1351
1134
  else delete state.build.detail;
1135
+ const activity = bundlingActivity(state.build.activity, state.build.platform, state.metro?.bundle);
1136
+ if (activity) state.build.activity = activity;
1352
1137
  }
1353
1138
  }
1354
1139
  }
@@ -1405,7 +1190,7 @@ async function refreshLightFacts(snapshot, machine) {
1405
1190
  busy: true
1406
1191
  });
1407
1192
  }
1408
- function renderStatus({ archived, archivedUsage: usage, projects, states, labelOnlyRoots, leases, leaseNow, orphanWorktrees, simsAvailable, simctlError, cwdRoot, machine }, json) {
1193
+ function renderStatus({ archived, archivedUsage: usage, projects, states, labelOnlyRoots, leases, leaseNow, orphanWorktrees, simsAvailable, simctlError, cwdRoot, machine }, json, settle = (payload) => payload) {
1409
1194
  const out = [];
1410
1195
  const totalMemoryMb = Math.round(totalmem() / 1048576);
1411
1196
  const cap = capacity(states, totalMemoryMb);
@@ -1422,7 +1207,7 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
1422
1207
  });
1423
1208
  const maintenance = maintenanceStatus();
1424
1209
  if (json) {
1425
- out.push(JSON.stringify({
1210
+ const payload = {
1426
1211
  environments: states.map((state, i) => withDerivedFacts(labelOnlyRoots[i] ? {
1427
1212
  ...state,
1428
1213
  labelOnly: true
@@ -1435,7 +1220,8 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
1435
1220
  simctlAvailable: simsAvailable,
1436
1221
  machine,
1437
1222
  maintenance
1438
- }));
1223
+ };
1224
+ out.push(JSON.stringify(settle(payload)));
1439
1225
  return out;
1440
1226
  }
1441
1227
  out.push(...maintenanceLines(maintenance).map((line) => chalk.dim(line)));
@@ -1539,6 +1325,7 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
1539
1325
  }
1540
1326
  async function watchStatus(json) {
1541
1327
  let last = null;
1328
+ let lastPayload = null;
1542
1329
  let archiveStamp = null;
1543
1330
  let archives;
1544
1331
  let snapshot = null;
@@ -1550,6 +1337,7 @@ async function watchStatus(json) {
1550
1337
  run: async (kind) => {
1551
1338
  triggerMaintenance("status-watch");
1552
1339
  let text;
1340
+ let payload = null;
1553
1341
  try {
1554
1342
  if (kind === "light" && snapshot) await refreshLightFacts(snapshot, json);
1555
1343
  else {
@@ -1564,7 +1352,7 @@ async function watchStatus(json) {
1564
1352
  snapshot = await readStatus(WATCH_GIT_MAX_AGE_MS, sources?.simulatorListing(), archives);
1565
1353
  }
1566
1354
  measurer.schedule(snapshot.states, snapshot.worktrees);
1567
- text = renderStatus(snapshot, json).join("\n");
1355
+ text = renderStatus(snapshot, json, (full) => payload = watchPayload(lastPayload, full)).join("\n");
1568
1356
  } catch (error) {
1569
1357
  console.error(chalk.red(String(error?.message || error)));
1570
1358
  return;
@@ -1573,6 +1361,7 @@ async function watchStatus(json) {
1573
1361
  }
1574
1362
  if (text === last) return;
1575
1363
  last = text;
1364
+ lastPayload = payload;
1576
1365
  process.stdout.write(`${!json && process.stdout.isTTY ? "\x1B[2J\x1B[H" : ""}${text}\n`);
1577
1366
  }
1578
1367
  });
@@ -1596,11 +1385,11 @@ async function watchStatus(json) {
1596
1385
  scheduler.trigger("full", 0);
1597
1386
  await new Promise(() => {});
1598
1387
  }
1599
- async function readGitInto(worktrees, orphans, maxAgeMs) {
1388
+ async function readGitInto(worktrees, orphans, maxAgeMs, only) {
1600
1389
  const home = homedir();
1601
1390
  const byPath = await readWorktreeGit(worktrees, {
1602
1391
  maxAgeMs,
1603
- skip: (w) => process.platform === "darwin" && orphans.includes(w) && inPrivacyProtectedFolder(w.path, home)
1392
+ skip: (w) => only !== void 0 && !only.has(w.path) || process.platform === "darwin" && orphans.includes(w) && inPrivacyProtectedFolder(w.path, home)
1604
1393
  });
1605
1394
  for (const worktree of worktrees) worktree.git = byPath.get(worktree.path) ?? null;
1606
1395
  }
@@ -1787,8 +1576,7 @@ function readVolumes(projectPath) {
1787
1576
  ])];
1788
1577
  const volumes = [];
1789
1578
  for (const volume of roots) {
1790
- const quoted = `'${volume.replace(/'/g, "'\\''")}'`;
1791
- const disk = parseDfFree(getExecutor().runQuiet(`df -k ${quoted}`, { timeoutMs: 5e3 }));
1579
+ const disk = parseDfFree(getExecutor().runFileQuiet("df", ["-k", volume], { timeoutMs: 5e3 }));
1792
1580
  if (disk) volumes.push({
1793
1581
  volume,
1794
1582
  disk