stim 1.24.0 → 1.26.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 (162) hide show
  1. package/README.md +1 -1
  2. package/dist/{acquire-artifact-CEs02U2o.mjs → acquire-artifact-DVsvSwf7.mjs} +1 -1
  3. package/dist/{act-Cyvm8xYc.mjs → act-C-BqJEpu.mjs} +158 -36
  4. package/dist/{activity-Dq3ZcdD8.mjs → activity-Lnb_EoRY.mjs} +4 -5
  5. package/dist/{agent-device-usage-output-CccomeE0.mjs → agent-device-usage-output-DbXy5tg8.mjs} +4 -4
  6. package/dist/{android-CX5IcRuf.mjs → android-B5P81yI-.mjs} +1 -1
  7. package/dist/{android-DcztblCT.mjs → android-CSbLRD53.mjs} +5 -5
  8. package/dist/{android-BZppyPe_.mjs → android-CiNQw3kq.mjs} +81 -52
  9. package/dist/{android-882m4hxX.mjs → android-DTAcRwBC.mjs} +81 -34
  10. package/dist/{android-cas-BtCOrNqb.mjs → android-cas-BTVhZ0Qs.mjs} +4 -4
  11. package/dist/{android-project-DVWyCbWU.d.mts → android-project-DUGMbq28.d.mts} +61 -3
  12. package/dist/api.d.mts +8 -5
  13. package/dist/api.mjs +27 -27
  14. package/dist/apk-signed-tail-B46U9hXc.mjs +142 -0
  15. package/dist/{artifact-BR5VNArK.mjs → artifact-BxREhAaV.mjs} +25 -19
  16. package/dist/{artifact-Bdt_n9Jc.mjs → artifact-CsAP6AGK.mjs} +36 -21
  17. package/dist/{attempt-DW-mQqM7.mjs → attempt-ClyJlZPT.mjs} +4 -2
  18. package/dist/{browser-web-ycg9qWB8.mjs → browser-web-rYPyqhTf.mjs} +11 -12
  19. package/dist/{budget-dPGuhNai.mjs → budget-k2mZGvvk.mjs} +242 -38
  20. package/dist/{build-CaF574eS.mjs → build-DPhApsjV.mjs} +28 -24
  21. package/dist/{build-cache-HFUQ9eLz.mjs → build-cache-DrXNCy3T.mjs} +123 -23
  22. package/dist/{build-plan-JsDUq4w1.mjs → build-plan-DrMMdayj.mjs} +5 -5
  23. package/dist/{cache-manifest-BPXRONJz.mjs → cache-manifest-BEZ9Bpl1.mjs} +1 -1
  24. package/dist/cache-manifest.mjs +1 -1
  25. package/dist/{ccache-CCn1S6qG.mjs → ccache-Bx5TbxwG.mjs} +6 -6
  26. package/dist/{cli-xqAidP7O.mjs → cli-BBKFGOFl.mjs} +19 -19
  27. package/dist/cli.mjs +1 -1
  28. package/dist/{client-18-ZowoT.mjs → client-D9CaRks-.mjs} +55 -71
  29. package/dist/collector-run.mjs +4 -4
  30. package/dist/{command-output-DxC0k2rk.mjs → command-output-BF5AR2dL.mjs} +1 -1
  31. package/dist/{config-BZhXY15H.mjs → config-BktkY_zC.mjs} +321 -15
  32. package/dist/{launch-BVlyQw3T.mjs → dependencies-Dw6wfQdv.mjs} +259 -256
  33. package/dist/{dependency-state-C56ll9hY.mjs → dependency-state-DFB41vfr.mjs} +1 -1
  34. package/dist/{dev-client-w_fok0Ek.mjs → dev-client-DXR_tPVY.mjs} +2 -2
  35. package/dist/{device-BktRGdjS.mjs → device-BK-zwyd_.mjs} +64 -33
  36. package/dist/{device-4RUugw5X.mjs → device-BcYeHSFu.mjs} +14 -14
  37. package/dist/{device-capacity-Ic-kdmEV.mjs → device-capacity-DCSvUF0l.mjs} +10 -17
  38. package/dist/device-host-worker.mjs +11 -13
  39. package/dist/{device-ios-DzpSlZyd.mjs → device-ios-BLGfXQeK.mjs} +68 -25
  40. package/dist/{device-lease-run-DUtkbqBQ.mjs → device-lease-run-BmvIl7bI.mjs} +5 -5
  41. package/dist/{device-pool-CgBHk401.mjs → device-pool-Dluix4H3.mjs} +3 -3
  42. package/dist/{doctor-DZgpqR6J.mjs → doctor-Bhg1ii70.mjs} +14 -14
  43. package/dist/{doctor-BZ6oxNum.mjs → doctor-Cp-BhzTS.mjs} +1 -1
  44. package/dist/{doctor-C33AzVfR.mjs → doctor-OnwP94ne.mjs} +81 -26
  45. package/dist/{doctor-fingerprint-zlujA1Gs.mjs → doctor-fingerprint-D3a04Mhu.mjs} +8 -2
  46. package/dist/doctor-fingerprint.mjs +1 -1
  47. package/dist/{doctor-watchman-B453A231.mjs → doctor-watchman-BStK05nt.mjs} +4 -4
  48. package/dist/{eas-build-CxKUNHsb.mjs → eas-build-Dsj93iM9.mjs} +2 -2
  49. package/dist/{eas-fallback-LMxk9Kw0.mjs → eas-fallback-FwkeqqGi.mjs} +13 -12
  50. package/dist/{eas-session-ledger-Ck6YXPAO.mjs → eas-session-ledger-B5vygTiD.mjs} +5 -5
  51. package/dist/{error-diagnostics-BkKCZq4P.mjs → error-diagnostics-BOOm9Db7.mjs} +8 -8
  52. package/dist/{errors-ccaPc4ox.mjs → errors-DHm_U5gv.mjs} +2 -1
  53. package/dist/{gc-DDWEAj0w.mjs → gc-C_79zvz4.mjs} +2 -2
  54. package/dist/{gc-yVKpAOKM.mjs → gc-ldgr-hXU.mjs} +74 -43
  55. package/dist/{guide-Bggftwc5.mjs → guide-D7K0X6KG.mjs} +374 -78
  56. package/dist/{hosted-android-D4dweBof.mjs → hosted-android-Bk54ej6n.mjs} +3 -3
  57. package/dist/{hosted-client-BBTVe3X6.mjs → hosted-client-fHO8yqzc.mjs} +5 -5
  58. package/dist/{hosted-ios-Sn0djzg8.mjs → hosted-ios-D55QhYaD.mjs} +1 -1
  59. package/dist/{hosted-logs-CYIZ5ubJ.mjs → hosted-logs-BfbmDM4M.mjs} +17 -11
  60. package/dist/hosted-logs-sync-B0pvmOk-.mjs +195 -0
  61. package/dist/{hosted-macos-CXjsUNBR.mjs → hosted-macos-CPl0OZ9h.mjs} +5 -5
  62. package/dist/{hosted-native-Doxbfzem.mjs → hosted-native-CpDB3-PO.mjs} +6 -7
  63. package/dist/{idle-shutdown-BInjLKqm.mjs → idle-shutdown-FfxL1KdG.mjs} +22 -9
  64. package/dist/{ios-BItP6lkn.mjs → ios-B7-lToDu.mjs} +8 -8
  65. package/dist/{ios-CVUFFZ6C.mjs → ios-WxpDJ5T1.mjs} +129 -14
  66. package/dist/{ios-device-BI38NFFH.mjs → ios-device-CsyryvpT.mjs} +1 -1
  67. package/dist/{ios-B1FXRCMX.mjs → ios-ftxdQbJS.mjs} +84 -51
  68. package/dist/{ios-project-KYqeJURj.mjs → ios-project-Ty5pHl9O.mjs} +6 -6
  69. package/dist/{ios-state-DlElquYD.mjs → ios-state-Cw7-WQf2.mjs} +1 -1
  70. package/dist/{js-swap-BvrQvXHY.mjs → js-swap-BMhXYVDS.mjs} +4 -4
  71. package/dist/{launch-SfzGH_s9.mjs → launch-DOp8RjDz.mjs} +32 -27
  72. package/dist/{logs-DXE32kyb.mjs → logs-dQDki6Tt.mjs} +9 -173
  73. package/dist/{logs-ovlU7m7N.mjs → logs-s1dRIG1E.mjs} +85 -36
  74. package/dist/{macos-B3BveDrU.mjs → macos-B0VEV3Gf.mjs} +1 -1
  75. package/dist/{macos-CCfhb-jT.mjs → macos-DBBPNnIA.mjs} +18 -19
  76. package/dist/macos-run.mjs +1 -1
  77. package/dist/maintenance-run.mjs +28 -11
  78. package/dist/{metro-Bu8LBfzS.mjs → metro-CjC10t6E.mjs} +2 -2
  79. package/dist/{metro-gateway-DtsOy-0P.mjs → metro-gateway-B6_PgD0L.mjs} +2 -3
  80. package/dist/{named-ports-BWDuU5oQ.mjs → named-ports-BG0j1X4g.mjs} +2 -2
  81. package/dist/{native-android-96BBizbq.mjs → native-android-CL2NGiik.mjs} +17 -17
  82. package/dist/{native-gradle-artifact-inputs-BcLYBZil.mjs → native-gradle-artifact-inputs-btSUulme.mjs} +3 -3
  83. package/dist/{native-run-BmH7U8pr.mjs → native-run-BfIDFKLH.mjs} +2 -3
  84. package/dist/{native-runtime-DgtJkzIa.mjs → native-runtime-Dq3RBcON.mjs} +6 -7
  85. package/dist/{native-xcode-inputs-irplbQb0.mjs → native-xcode-inputs-BW7H8JGu.mjs} +2 -2
  86. package/dist/{native-xcode-ios-BY-6hh6M.mjs → native-xcode-ios-CBXJAxfC.mjs} +18 -18
  87. package/dist/offload-worker.d.mts +7 -2
  88. package/dist/offload-worker.mjs +34 -23
  89. package/dist/{ownership-DxlZGDcV.mjs → ownership-BjYvMNX_.mjs} +2 -2
  90. package/dist/{phone-reverses-BdsdesVF.mjs → phone-reverses-lmj6kcPm.mjs} +3 -3
  91. package/dist/{placement-log-DUvqqsB-.mjs → placement-log-DIFPQAXp.mjs} +1 -1
  92. package/dist/{plan-placement-4axc0Hs7.mjs → plan-placement-IiiSQhtz.mjs} +3 -3
  93. package/dist/{ports-D-E_OiAO.mjs → ports-C2_w1Z0Z.mjs} +3 -3
  94. package/dist/prebuild-gmouvmJZ.mjs +1247 -0
  95. package/dist/{project-Dz-hWkb-.mjs → project-BUu6Is4k.mjs} +15 -16
  96. package/dist/{react-native-android-DOinxgwB.mjs → react-native-android-Cgg99REN.mjs} +48 -33
  97. package/dist/{react-native-build-AuCu-aAP.mjs → react-native-build-oNwqF5Wb.mjs} +8 -8
  98. package/dist/{react-native-doctor-2ivJUmwZ.mjs → react-native-doctor-BhA3KUte.mjs} +49 -8
  99. package/dist/{react-native-ios-D5zTIuH8.mjs → react-native-ios-B-nf4rjN.mjs} +40 -25
  100. package/dist/{recordings-CdPwYwvs.mjs → recordings-BldzVKq0.mjs} +1 -1
  101. package/dist/{reload-Ck9RJeSq.mjs → reload-C9OduiNc.mjs} +1 -1
  102. package/dist/{reload-C1TTVesC.mjs → reload-CCR7KC_l.mjs} +14 -14
  103. package/dist/{remote-DEZ7AOVq.mjs → remote-C8S7FlPF.mjs} +16 -7
  104. package/dist/{result-DqBrb12U.mjs → result-7F5hEwQJ.mjs} +17 -17
  105. package/dist/{run-BIwoU44q.mjs → run-BqB0v3pt.mjs} +1 -1
  106. package/dist/{selection-BLtvaqxc.mjs → selection-BNPBZ6T5.mjs} +157 -44
  107. package/dist/{server-bare-Z1ToVLPn.mjs → server-bare-A75rDIdD.mjs} +55 -3
  108. package/dist/{server-command-C0pmjNdG.mjs → server-command-CssKFOD7.mjs} +4 -4
  109. package/dist/{server-expo-Tt_hLRpy.mjs → server-expo-eQfOdydb.mjs} +8 -6
  110. package/dist/server-expo-wvcj5tiZ.mjs +2 -0
  111. package/dist/{settings-RKwY33wv.mjs → settings-CosW5X-S.mjs} +59 -61
  112. package/dist/{settings-kkt0vP4w.mjs → settings-OaGQF-ri.mjs} +1 -1
  113. package/dist/{settings-write--gj6MACV.mjs → settings-write-QjYfSrjF.mjs} +5 -5
  114. package/dist/settings.schema.json +71 -6
  115. package/dist/{simslim-CdWKT3vA.mjs → simslim-Bax1qcxu.mjs} +22 -6
  116. package/dist/{slot-launch-A1BgotaM.mjs → slot-launch-CYCEhfBY.mjs} +6 -6
  117. package/dist/{stage-ERTMh88n.mjs → stage-jKQ7CP_B.mjs} +1 -1
  118. package/dist/{start-Bmg_qmHi.mjs → start-C_wefNKB.mjs} +1 -1
  119. package/dist/{start-BKGrEhzG.mjs → start-_BdJ32cZ.mjs} +9 -10
  120. package/dist/{state-B1ig0Kqy.mjs → state-C1i2nMOP.mjs} +2 -3
  121. package/dist/{state-BfAltYJP.mjs → state-C4OdpOTF.mjs} +1 -2
  122. package/dist/{stats-B-ckuiUg.mjs → stats-tEpEEH-u.mjs} +4 -4
  123. package/dist/{status-Pw-807f0.mjs → status-B9M7x4CZ.mjs} +1 -1
  124. package/dist/{status-Fect2w9R.mjs → status-CRXz-Gtj.mjs} +1 -1
  125. package/dist/{status-DfFp6a76.mjs → status-DQrqodLj.mjs} +22 -23
  126. package/dist/{status-watch-XC7F-AMf.mjs → status-watch-B5wDIH_o.mjs} +4 -4
  127. package/dist/status-worker.mjs +1 -1
  128. package/dist/{stim-desktop-DS0mzR8U.mjs → stim-desktop-6Dqp-gjX.mjs} +1 -1
  129. package/dist/{stop-BFu7X_Do.mjs → stop-CmdNhGlC.mjs} +2 -2
  130. package/dist/{stop-CL1kDHds.mjs → stop-DRqQVqDJ.mjs} +74 -53
  131. package/dist/{stop-DhclRwOO.mjs → stop-ySNQHXMG.mjs} +4 -5
  132. package/dist/supervisor-run.d.mts +1 -0
  133. package/dist/supervisor-run.mjs +15 -16
  134. package/dist/{support-B3tzVhKn.mjs → support-BGSCBoib.mjs} +4 -4
  135. package/dist/{support-B1W-hmC2.mjs → support-CVOCp0Ft.mjs} +15 -12
  136. package/dist/{swiftpm-artifact-inputs-BWYPj9Sn.mjs → swiftpm-artifact-inputs-CfUzt_0Z.mjs} +1 -1
  137. package/dist/{swiftpm-macos-BVCP5mO4.mjs → swiftpm-macos-x6HPpl_2.mjs} +10 -10
  138. package/dist/toolchain-DoavrvIA.mjs +2 -0
  139. package/dist/toolchain-J4J8MrAr.mjs +2107 -0
  140. package/dist/trigger-DzJu208Q.mjs +2 -0
  141. package/dist/{trigger-CBMe2YLH.mjs → trigger-KVaWWNyn.mjs} +1 -1
  142. package/dist/{warm-progress-ol0ZypEu.mjs → warm-progress-DvhTX_eu.mjs} +3 -4
  143. package/dist/web-BFLueSh-.mjs +2 -0
  144. package/dist/{web-BH7peScT.mjs → web-Bihbf7-u.mjs} +8 -9
  145. package/dist/web-run.mjs +4 -4
  146. package/dist/{workspace-state-CeBpIZgr.mjs → workspace-state-pUg3_RRA.mjs} +45 -7
  147. package/dist/{workspaces-CSV2Orf4.mjs → workspaces-g2lhdBXF.mjs} +17 -17
  148. package/dist/{worktree-Dw8kfacb.mjs → worktree-BKuklFh_.mjs} +34 -31
  149. package/dist/{worktree-DEDUzO_L.mjs → worktree-Bm4cb-nU.mjs} +1 -1
  150. package/package.json +8 -8
  151. package/shim/bundle-response.cjs +53 -1
  152. package/shim/bundle-response.d.cts +1 -1
  153. package/shim/expo-metro-config.cjs +23 -1
  154. package/dist/created-devices-D2Aca-xu.mjs +0 -52
  155. package/dist/paths-DQtTgsBf.mjs +0 -42
  156. package/dist/prebuild-DmVCf5xb.mjs +0 -501
  157. package/dist/server-expo-CEntXzRw.mjs +0 -2
  158. package/dist/toolchain-BjgKdoEf.mjs +0 -2
  159. package/dist/toolchain-D3bmRMia.mjs +0 -897
  160. package/dist/trigger-BLsHgAGR.mjs +0 -2
  161. package/dist/web-BdOFlTJr.mjs +0 -2
  162. package/dist/xcode-DHu41qQ4.mjs +0 -910
@@ -1,17 +1,17 @@
1
- import { Y as doctorIo, _ as loadConfig$1, p as getProject } from "./config-BZhXY15H.mjs";
2
- import { f as refuseNoProject, l as phaseLine } from "./command-output-DxC0k2rk.mjs";
3
- import { L as projectSettingsContextAsync, Mt as repoRoot } from "./settings-RKwY33wv.mjs";
4
- import { f as projectRegistry, t as NO_PROJECT_REFUSAL } from "./project-Dz-hWkb-.mjs";
5
- import { c as inspectStimVersions, s as compareStimVersions } from "./eas-session-ledger-Ck6YXPAO.mjs";
6
- import { a as inspectBudget, mr as memorySweepIsScoped, n as budgetLine, ur as inspectWatchmanMemory } from "./budget-dPGuhNai.mjs";
7
- import { B as readMemoryCulpritsAsync, f as listAllIosSimsAsync, h as listIosRuntimesAsync, l as iosRuntimeMatches, x as pickDefaultIosCreation, z as memoryCulpritFindings } from "./ios-CVUFFZ6C.mjs";
8
- import { c as detectXcodeMajorAsync } from "./xcode-DHu41qQ4.mjs";
9
- import { s as offloadCheck } from "./client-18-ZowoT.mjs";
10
- import { l as inspectBuildMachines, p as inspectDeviceHostMachines } from "./selection-BLtvaqxc.mjs";
11
- import { r as maintenanceStatus, t as maintenanceLine } from "./status-Fect2w9R.mjs";
12
- import { a as writeIgnoreDirs, c as recordDoctorRun, i as watchedCheckouts, n as inspectNestedWorktrees, r as nestedWorktreeFinding } from "./doctor-watchman-B453A231.mjs";
13
- import { c as checkWorktreeStorageLayout, l as readMachineSettings, o as runDoctor } from "./doctor-C33AzVfR.mjs";
14
- import { h as resolveDeviceType, v as resolveRuntime } from "./support-B1W-hmC2.mjs";
1
+ import { Z as doctorIo, _ as loadConfig$1, p as getProject } from "./config-BktkY_zC.mjs";
2
+ import { f as refuseNoProject, l as phaseLine } from "./command-output-BF5AR2dL.mjs";
3
+ import { Nt as repoRoot, R as projectSettingsContextAsync } from "./settings-CosW5X-S.mjs";
4
+ import { f as projectRegistry, t as NO_PROJECT_REFUSAL } from "./project-BUu6Is4k.mjs";
5
+ import { c as inspectStimVersions, s as compareStimVersions } from "./eas-session-ledger-B5vygTiD.mjs";
6
+ import { a as inspectBudget, hr as inspectWatchmanMemory, n as budgetLine, yr as memorySweepIsScoped } from "./budget-k2mZGvvk.mjs";
7
+ import { H as readMemoryCulpritsAsync, V as memoryCulpritFindings, f as listAllIosSimsAsync, h as listIosRuntimesAsync, l as iosRuntimeMatches, x as pickDefaultIosCreation } from "./ios-WxpDJ5T1.mjs";
8
+ import { I as detectXcodeMajorAsync } from "./toolchain-J4J8MrAr.mjs";
9
+ import { s as offloadCheck } from "./client-D9CaRks-.mjs";
10
+ import { d as inspectBuildMachines, g as inspectDeviceHostMachines } from "./selection-BNPBZ6T5.mjs";
11
+ import { r as maintenanceStatus, t as maintenanceLine } from "./status-CRXz-Gtj.mjs";
12
+ import { a as writeIgnoreDirs, c as recordDoctorRun, i as watchedCheckouts, n as inspectNestedWorktrees, r as nestedWorktreeFinding } from "./doctor-watchman-BStK05nt.mjs";
13
+ import { c as checkWorktreeStorageLayout, l as readMachineSettings, o as runDoctor } from "./doctor-OnwP94ne.mjs";
14
+ import { h as resolveDeviceType, v as resolveRuntime } from "./support-CVOCp0Ft.mjs";
15
15
  import { isJsonObject, maintenanceNdjsonFile, readHostedAppMetadata, readHostedSessions } from "@stim-cli/core/state";
16
16
  import { dirname, join, sep } from "path";
17
17
  import chalk from "chalk";
@@ -1,2 +1,2 @@
1
- import { a as readDoctorReport, i as parseDoctorPlatform, n as doctorCommand, o as shadowedStimFinding, r as doctorSuccessLines, s as toolchainReport, t as applySandboxFix } from "./doctor-DZgpqR6J.mjs";
1
+ import { a as readDoctorReport, i as parseDoctorPlatform, n as doctorCommand, o as shadowedStimFinding, r as doctorSuccessLines, s as toolchainReport, t as applySandboxFix } from "./doctor-Bhg1ii70.mjs";
2
2
  export { applySandboxFix, doctorCommand as default, doctorSuccessLines, parseDoctorPlatform, readDoctorReport, shadowedStimFinding, toolchainReport };
@@ -1,29 +1,28 @@
1
1
  import { C as reportSignal, T as trackReportResource, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { i as sharedBuildCache, u as workspaceDerivedData } from "./paths-DQtTgsBf.mjs";
3
- import { _ as loadConfig$1, nt as realIo, s as configCorruptRepair, u as getConcurrencyLimits } from "./config-BZhXY15H.mjs";
4
- import { d as quotedPath, u as plural } from "./command-output-DxC0k2rk.mjs";
2
+ import { T as workspaceDerivedData, r as readWorkspaceState$1, y as sharedBuildCache } from "./workspace-state-pUg3_RRA.mjs";
3
+ import { _ as loadConfig$1, it as realIo, s as configCorruptRepair, u as getConcurrencyLimits } from "./config-BktkY_zC.mjs";
4
+ import { d as quotedPath, u as plural } from "./command-output-BF5AR2dL.mjs";
5
5
  import { l as gitQuietAsync, o as git } from "./operation-exec-CUZifp6Z.mjs";
6
- import { r as readWorkspaceState$1 } from "./workspace-state-CeBpIZgr.mjs";
7
- import { D as mergeSettingsLayers, Et as listWorktreesAsync, Gt as temporaryRoot, Ht as makeTemporaryDirectory, I as projectSettingsContext, It as resolveSourceCheckoutAsync, K as resolveIosProjectDir, Mt as repoRoot, Nt as repoRootAsync, Ot as locallyKnownUpstreamAsync, Q as settingOrigin, T as iosSimSlimProfileSetting, U as remoteIosSetting, V as remoteAndroidSetting, Vt as filesystemDevice, W as resolveAndroidLayout, Y as resolveSettings, a as SETTING_SHAPE_REMEDY, at as webSettings, et as settingShapeErrors, ht as dirtyFingerprintFiles, i as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, it as unknownSettingKeys, m as defaultAndroidLayout, nt as settingsLayers, r as PATH_SETTINGS, tt as settingValueAt, vt as gitCommonDirAsync } from "./settings-RKwY33wv.mjs";
8
- import { C as resolvePackageJson, _ as appProjectProblem, b as isPackageResolvable, v as detectIsExpo } from "./project-Dz-hWkb-.mjs";
9
- import { ft as POOL_SETTING_REMEDY, k as hostSystemImageArch, o as androidHome, vt as parkedMaxSetting } from "./android-882m4hxX.mjs";
10
- import { Hn as checkEasAuth$1, Kn as ownerFromConfig, Wt as readInstalledEasCliVersionAsync, Yn as resolveEasCliBin, ir as easCliUpgradeRemedy, nr as MIN_EAS_CLI_SIMULATOR_VERSION, qn as providerFromConfig, rr as easCliSupport } from "./budget-dPGuhNai.mjs";
11
- import { R as listBuildSlots } from "./workspaces-CSV2Orf4.mjs";
12
- import { N as listBuildLocks } from "./activity-Dq3ZcdD8.mjs";
13
- import { d as fingerprintProject, o as diffFingerprintSources } from "./build-cache-HFUQ9eLz.mjs";
14
- import { I as readHostMemoryPressureAsync, M as hostMemoryPressureAdvice } from "./ios-CVUFFZ6C.mjs";
15
- import { p as resolveOptimizations, u as compilerCacheFallbackMessage } from "./errors-ccaPc4ox.mjs";
16
- import { i as projectCmakeLauncher } from "./ccache-CCn1S6qG.mjs";
17
- import { x as podInstallCommand } from "./xcode-DHu41qQ4.mjs";
18
- import { g as androidPathRoomRemedy, i as ccacheEnabled, l as androidSdkRefusal, m as androidPathRoomMessage, p as androidPathRoom, t as apkOutputsDir } from "./react-native-build-AuCu-aAP.mjs";
19
- import { a as countLiveOwnedDevicesAsync, i as countLiveOwnedDevices } from "./device-capacity-Ic-kdmEV.mjs";
20
- import { t as readDoctorFingerprint } from "./doctor-fingerprint-zlujA1Gs.mjs";
6
+ import { $ as settingOrigin, Dt as listWorktreesAsync, E as iosSimSlimProfileSetting, G as resolveAndroidLayout, H as remoteAndroidSetting, Ht as filesystemDevice, Kt as temporaryRoot, L as projectSettingsContext, Lt as resolveSourceCheckoutAsync, Nt as repoRoot, O as mergeSettingsLayers, Pt as repoRootAsync, T as iosSimSlimDefaultSetting, Ut as makeTemporaryDirectory, W as remoteIosSetting, X as resolveSettings, a as SETTING_SHAPE_REMEDY, at as unknownSettingKeys, gt as dirtyFingerprintFiles, i as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, kt as locallyKnownUpstreamAsync, m as defaultAndroidLayout, nt as settingValueAt, ot as webSettings, q as resolveIosProjectDir, r as PATH_SETTINGS, rt as settingsLayers, tt as settingShapeErrors, yt as gitCommonDirAsync } from "./settings-CosW5X-S.mjs";
7
+ import { C as resolvePackageJson, _ as appProjectProblem, b as isPackageResolvable, v as detectIsExpo } from "./project-BUu6Is4k.mjs";
8
+ import { ft as POOL_SETTING_REMEDY, k as hostSystemImageArch, o as androidHome, vt as parkedMaxSetting } from "./android-DTAcRwBC.mjs";
9
+ import { Jt as readInstalledEasCliVersionAsync, Qn as providerFromConfig, Zn as ownerFromConfig, cr as easCliSupport, er as resolveEasCliBin, lr as easCliUpgradeRemedy, qn as checkEasAuth$1, sr as MIN_EAS_CLI_SIMULATOR_VERSION } from "./budget-k2mZGvvk.mjs";
10
+ import { R as listBuildSlots } from "./workspaces-g2lhdBXF.mjs";
11
+ import { N as listBuildLocks } from "./activity-Lnb_EoRY.mjs";
12
+ import { o as diffFingerprintSources, p as fingerprintProject } from "./build-cache-DrXNCy3T.mjs";
13
+ import { P as hostMemoryPressureAdvice, R as readHostMemoryPressureAsync } from "./ios-WxpDJ5T1.mjs";
14
+ import { p as resolveOptimizations, u as compilerCacheFallbackMessage } from "./errors-DHm_U5gv.mjs";
15
+ import { i as projectCmakeLauncher } from "./ccache-Bx5TbxwG.mjs";
16
+ import { Y as podInstallCommand } from "./toolchain-J4J8MrAr.mjs";
17
+ import { g as androidPathRoomRemedy, i as ccacheEnabled, l as androidSdkRefusal, m as androidPathRoomMessage, p as androidPathRoom, t as apkOutputsDir } from "./react-native-build-oNwqF5Wb.mjs";
18
+ import { a as countLiveOwnedDevicesAsync, i as countLiveOwnedDevices } from "./device-capacity-DCSvUF0l.mjs";
19
+ import { t as readDoctorFingerprint } from "./doctor-fingerprint-D3a04Mhu.mjs";
21
20
  import { i as probeSigningIdentities } from "./ios-signing-4c_qXvQm.mjs";
22
21
  import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-BvV8ssI3.mjs";
23
- import { i as installedNpmTreeIsValidAsync, n as hasInstalledDependencies, t as dependencyState } from "./dependency-state-C56ll9hY.mjs";
24
- import { n as simslimIsOnPath } from "./simslim-CdWKT3vA.mjs";
25
- import { t as MIN_EAS_CLI_BUILD_DOWNLOAD_VERSION } from "./eas-build-CxKUNHsb.mjs";
26
- import { r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-BtCOrNqb.mjs";
22
+ import { i as installedNpmTreeIsValidAsync, n as hasInstalledDependencies, t as dependencyState } from "./dependency-state-DFB41vfr.mjs";
23
+ import { n as simslimIsOnPath } from "./simslim-Bax1qcxu.mjs";
24
+ import { t as MIN_EAS_CLI_BUILD_DOWNLOAD_VERSION } from "./eas-build-Dsj93iM9.mjs";
25
+ import { r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-BTVhZ0Qs.mjs";
27
26
  import { existsSync, lstatSync, readFileSync, readdirSync, realpathSync, rmSync } from "node:fs";
28
27
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
29
28
  import { LAST_BUILD_KEYS, isJsonObject, readBuildHistory, readJsonObject, readStats, settingDefinition } from "@stim-cli/core/state";
@@ -706,8 +705,12 @@ async function projectEasBuildDownloadFinding(projectRoot, remoteBackends, looku
706
705
  readEasCliVersion: () => version
707
706
  });
708
707
  }
709
- function checkSimSlim({ configured = false, profileError = null, onPath = false } = {}) {
708
+ function checkSimSlim({ configured = false, slimByDefault = false, profileError = null, onPath = false } = {}) {
710
709
  if (profileError) return finding("cost", "The SimSlim profile is invalid", profileError, "Set ios.simslimProfile to a readable JSON profile inside the repository.");
710
+ if (!configured && slimByDefault) {
711
+ if (onPath) return null;
712
+ return finding("cost", "ios.simslim is on, but SimSlim is not installed", "`stim ios` boots owned simulators without SimSlim until the `simslim` command is installed.", "brew install mobai-app/tap/simslim");
713
+ }
711
714
  if (!configured) return finding("note", "SimSlim is recommended for parallel iOS simulator work", "A reviewed profile can reduce background simulator services and memory use. It is optional: disabling services can affect tests that depend on them, and installing the binary alone does not apply a profile.", "Run `stim guide lifecycle simslim` to install SimSlim and configure ios.simslimProfile. Stim does not enable a profile through doctor --fix.");
712
715
  if (onPath) return null;
713
716
  return finding("cost", "A SimSlim profile is configured, but SimSlim is not installed", "`stim ios` needs the `simslim` command to apply the profile to its owned simulator.", "brew install mobai-app/tap/simslim");
@@ -780,10 +783,12 @@ async function runDoctor(projectRoot, options = {}, inspectors = []) {
780
783
  } catch (error) {
781
784
  simslimProfileError = String(error?.message || error);
782
785
  }
786
+ const simslimByDefault = localIos && iosSimSlimDefaultSetting(projectSettings);
783
787
  const simslimFinding = !localIos || !simslimProfile && !simslimProfileError && remoteIosSetting(projectSettings) ? null : checkSimSlim({
784
788
  configured: Boolean(simslimProfile),
789
+ slimByDefault: simslimByDefault,
785
790
  profileError: simslimProfileError,
786
- onPath: simslimProfile ? lookupSimSlim ? lookupSimSlim() : simslimIsOnPath() : false
791
+ onPath: simslimProfile || simslimByDefault ? lookupSimSlim ? lookupSimSlim() : simslimIsOnPath() : false
787
792
  });
788
793
  const memoryAdvice = localIos && !remoteIosSetting(projectSettings) ? hostMemoryPressureAdvice(await memoryPressure()) : null;
789
794
  const shared = [
@@ -868,8 +873,9 @@ async function reactNativeDoctorFindings({ root: projectRoot, settings: projectS
868
873
  readEasCliVersion: () => remoteVersion
869
874
  })).filter((remoteFinding) => remoteFinding !== null);
870
875
  const easBuildDownloadFinding = await projectEasBuildDownloadFinding(projectRoot, remoteBackends, lookupEasCli, options.operation);
876
+ const appProjectFinding = checkAppProject(projectRoot);
871
877
  return [
872
- checkAppProject(projectRoot),
878
+ appProjectFinding,
873
879
  checkIosHost(platform, host),
874
880
  checkXcodeEnvLineEndings(projectRoot, platform, host),
875
881
  ...checkStorageLayout(projectRoot, {
@@ -893,7 +899,8 @@ async function reactNativeDoctorFindings({ root: projectRoot, settings: projectS
893
899
  easFinding,
894
900
  easBuildDownloadFinding,
895
901
  await readOffloadCandidate(tailnetStatus, now(), host),
896
- ...remoteFindings
902
+ ...remoteFindings,
903
+ appProjectFinding ? null : checkReadinessMarkers(projectRoot)
897
904
  ].filter((value) => Boolean(value));
898
905
  }
899
906
  function checkAndroidPathRoom(projectRoot, platform, host, hostArch = process.arch) {
@@ -948,6 +955,54 @@ function checkAppProject(projectRoot) {
948
955
  if (problem.kind === "not-an-app") result.code = "not-an-app";
949
956
  return result;
950
957
  }
958
+ const READINESS_MARKER = "[stim:readiness]";
959
+ const READINESS_SCAN_LIMIT = 5e3;
960
+ const READINESS_SKIPPED_DIRS = /* @__PURE__ */ new Set([
961
+ "node_modules",
962
+ "ios",
963
+ "android",
964
+ "macos",
965
+ "windows",
966
+ "Pods",
967
+ "build",
968
+ "dist",
969
+ "web-build",
970
+ "coverage"
971
+ ]);
972
+ const JS_SOURCE = /\.[cm]?[jt]sx?$/;
973
+ function hasReadinessMarker(projectRoot) {
974
+ const dirs = [projectRoot];
975
+ let scanned = 0;
976
+ for (let dir = dirs.pop(); dir !== void 0; dir = dirs.pop()) {
977
+ let entries;
978
+ try {
979
+ entries = readdirSync$1(dir, { withFileTypes: true });
980
+ } catch {
981
+ continue;
982
+ }
983
+ for (const entry of entries) {
984
+ if (entry.name.startsWith(".")) continue;
985
+ const path = join$1(dir, entry.name);
986
+ if (entry.isDirectory()) {
987
+ if (!READINESS_SKIPPED_DIRS.has(entry.name)) dirs.push(path);
988
+ continue;
989
+ }
990
+ if (!entry.isFile() || !JS_SOURCE.test(entry.name)) continue;
991
+ if (++scanned > READINESS_SCAN_LIMIT) return null;
992
+ try {
993
+ if (readFileSync$1(path, "utf-8").includes(READINESS_MARKER)) return true;
994
+ } catch {}
995
+ }
996
+ }
997
+ return false;
998
+ }
999
+ function checkReadinessMarkers(projectRoot) {
1000
+ if (hasReadinessMarker(projectRoot) !== false) return null;
1001
+ return {
1002
+ code: "readiness-markers-missing",
1003
+ ...finding("note", "The app does not report readiness to Stim", `No \`${READINESS_MARKER}\` marker appears in this app's JavaScript or TypeScript sources outside node_modules. A debug \`stim ios\` or \`stim android\` launch then ends shortly after the app's JavaScript starts running, before the app is usable, and a later startup error shows only in \`stim logs --errors\`.`, "In debug builds, log `[stim:readiness] pending` from the first module the app's entry loads, before the root component, and `[stim:readiness] ready` once the app is usable. `stim guide lifecycle readiness` has the code.")
1004
+ };
1005
+ }
951
1006
  function agentDeviceIsOnPath() {
952
1007
  try {
953
1008
  return Boolean(getExecutor().findExecutable("agent-device"));
@@ -1,14 +1,20 @@
1
1
  import { t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
+ import { setPriority } from "node:os";
2
3
  import { fileURLToPath } from "node:url";
3
4
  //#region src/doctor-fingerprint.ts
4
- async function readDoctorFingerprint(operation, request) {
5
+ async function readDoctorFingerprint(operation, request, { lowPriority = false } = {}) {
5
6
  const output = await getExecutor().runFileAsync(process.execPath, [fileURLToPath(new URL("../dist/doctor-fingerprint.mjs", import.meta.url))], {
6
7
  cwd: operation.cwd,
7
8
  env: Object.fromEntries(Object.entries(operation.env).filter((entry) => entry[1] !== void 0)),
8
9
  input: JSON.stringify(request),
9
10
  timeoutMs: 6e4,
10
11
  killSignal: "SIGKILL",
11
- signal: operation.signal
12
+ signal: operation.signal,
13
+ ...lowPriority ? { onSpawn: (child) => {
14
+ try {
15
+ if (child.pid) setPriority(child.pid, 10);
16
+ } catch {}
17
+ } } : {}
12
18
  });
13
19
  return JSON.parse(output);
14
20
  }
@@ -1,4 +1,4 @@
1
- import { d as fingerprintProject } from "./build-cache-HFUQ9eLz.mjs";
1
+ import { p as fingerprintProject } from "./build-cache-DrXNCy3T.mjs";
2
2
  import * as fingerprint from "@expo/fingerprint";
3
3
  //#region bin/doctor-fingerprint.ts
4
4
  let input = "";
@@ -1,8 +1,8 @@
1
- import { E as upsertProject, O as withConfigLockAsync$1, d as getConfigDir, p as getProject } from "./config-BZhXY15H.mjs";
1
+ import { E as upsertProject, O as withConfigLockAsync$1, d as getConfigDir, p as getProject } from "./config-BktkY_zC.mjs";
2
2
  import { l as gitQuietAsync } from "./operation-exec-CUZifp6Z.mjs";
3
- import { Et as listWorktreesAsync, Nt as repoRootAsync } from "./settings-RKwY33wv.mjs";
4
- import { f as projectRegistry } from "./project-Dz-hWkb-.mjs";
5
- import { d as parseWatchRoots, m as runWatchman, s as compareStimVersions } from "./eas-session-ledger-Ck6YXPAO.mjs";
3
+ import { Dt as listWorktreesAsync, Pt as repoRootAsync } from "./settings-CosW5X-S.mjs";
4
+ import { f as projectRegistry } from "./project-BUu6Is4k.mjs";
5
+ import { d as parseWatchRoots, m as runWatchman, s as compareStimVersions } from "./eas-session-ledger-B5vygTiD.mjs";
6
6
  import { mkdirSync, readFileSync, realpathSync, renameSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
7
7
  import { dirname, isAbsolute, join, relative, sep } from "node:path";
8
8
  import { isJsonObject } from "@stim-cli/core/state";
@@ -1,7 +1,7 @@
1
1
  import { D as ownership_claim_exports, c as throwIfCancelled, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
2
  import { a as killOnAbort, r as childEnvironment } from "./operation-exec-CUZifp6Z.mjs";
3
- import { $n as remoteCliInvocation, Yn as resolveEasCliBin, ir as easCliUpgradeRemedy, rr as easCliSupport } from "./budget-dPGuhNai.mjs";
4
- import { M as acquireBuildLock, P as releaseBuildLock } from "./activity-Dq3ZcdD8.mjs";
3
+ import { cr as easCliSupport, er as resolveEasCliBin, ir as remoteCliInvocation, lr as easCliUpgradeRemedy } from "./budget-k2mZGvvk.mjs";
4
+ import { M as acquireBuildLock, P as releaseBuildLock } from "./activity-Lnb_EoRY.mjs";
5
5
  import { createHash } from "node:crypto";
6
6
  import { existsSync, realpathSync, statSync } from "node:fs";
7
7
  //#region src/engine/eas-build.ts
@@ -1,15 +1,15 @@
1
1
  import { c as throwIfCancelled, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { _ as loadConfig$1, p as getProject } from "./config-BZhXY15H.mjs";
2
+ import { _ as loadConfig$1, p as getProject } from "./config-BktkY_zC.mjs";
3
3
  import { r as childEnvironment } from "./operation-exec-CUZifp6Z.mjs";
4
- import { ct as detectProviders, lt as planMetroReach } from "./settings-RKwY33wv.mjs";
5
- import { M as readMetroTunnel, P as readRemoteSession } from "./project-Dz-hWkb-.mjs";
6
- import { Wn as isEasAuthFailureText, Wt as readInstalledEasCliVersionAsync, Yn as resolveEasCliBin, er as remoteCommand, nr as MIN_EAS_CLI_SIMULATOR_VERSION, rr as easCliSupport, s as peekBudget, tr as MIN_EAS_CLI_DEVICE_VERSION } from "./budget-dPGuhNai.mjs";
7
- import { I as readHostMemoryPressureAsync } from "./ios-CVUFFZ6C.mjs";
8
- import { f as hostingMachines, i as namedBuildMachine, s as resolveBuildMachine } from "./selection-BLtvaqxc.mjs";
9
- import { c as call, l as connectHost, p as requireHostedAppMode } from "./hosted-client-BBTVe3X6.mjs";
10
- import { c as writeHostedNativeAsync, r as readHostedNative } from "./ios-state-DlElquYD.mjs";
11
- import { i as prepareHostedNative } from "./hosted-native-Doxbfzem.mjs";
12
- import { c as peekDeviceSlots } from "./device-capacity-Ic-kdmEV.mjs";
4
+ import { lt as detectProviders, ut as planMetroReach } from "./settings-CosW5X-S.mjs";
5
+ import { M as readMetroTunnel, P as readRemoteSession } from "./project-BUu6Is4k.mjs";
6
+ import { Jt as readInstalledEasCliVersionAsync, Yn as isEasAuthFailureText, ar as remoteCommand, cr as easCliSupport, er as resolveEasCliBin, or as MIN_EAS_CLI_DEVICE_VERSION, s as peekBudget, sr as MIN_EAS_CLI_SIMULATOR_VERSION } from "./budget-k2mZGvvk.mjs";
7
+ import { R as readHostMemoryPressureAsync } from "./ios-WxpDJ5T1.mjs";
8
+ import { c as resolveBuildMachine, h as hostingMachines, i as namedBuildMachine } from "./selection-BNPBZ6T5.mjs";
9
+ import { c as call, l as connectHost, p as requireHostedAppMode } from "./hosted-client-fHO8yqzc.mjs";
10
+ import { c as writeHostedNativeAsync, r as readHostedNative } from "./ios-state-Cw7-WQf2.mjs";
11
+ import { i as prepareHostedNative } from "./hosted-native-CpDB3-PO.mjs";
12
+ import { c as peekDeviceSlots } from "./device-capacity-DCSvUF0l.mjs";
13
13
  import { ambientEnv } from "@stim-cli/core";
14
14
  import { automaticMachineEnabled, isJsonObject, machineCapacity, parseHostedChoice, parseHostedNativeOffer } from "@stim-cli/core/state";
15
15
  //#region src/device-host/placement.ts
@@ -219,10 +219,11 @@ function viaEas(code, reason, skipped) {
219
219
  skipped
220
220
  };
221
221
  }
222
- async function automaticDevicePlacement({ root, slot, platform, selectors, appMode, buildMachine, noWait, eas, signal }, { machines = () => hostingMachines(void 0, signal), read = readHostedNative, write = writeHostedNativeAsync, resume = prepareHostedNative, peek = () => peekDeviceSlots({
222
+ async function automaticDevicePlacement({ root, slot, platform, selectors, appMode, buildMachine, noWait, eas, signal, localSims }, { machines = () => hostingMachines(void 0, signal), read = readHostedNative, write = writeHostedNativeAsync, resume = prepareHostedNative, peek = () => peekDeviceSlots({
223
223
  platform,
224
224
  project: getProject(root),
225
- slot
225
+ slot,
226
+ ...localSims ? { sources: { sims: localSims } } : {}
226
227
  }), capacity = machineCapacity, memory = () => readHostMemoryPressureAsync(void 0, void 0, signal), probe = probeHost, budget = (projectRoot) => peekBudget(projectRoot, {}, ambientEnv(), signal) } = {}) {
227
228
  const recorded = read(root, platform, slot)[slot];
228
229
  if (recorded) {
@@ -1,9 +1,9 @@
1
1
  import { C as reportSignal, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { l as workspaceAgentDeviceDir, v as withDirLock$1, y as withDirLockAsync$1 } from "./paths-DQtTgsBf.mjs";
3
- import { G as projectDeviceSlots, V as deviceSlotKey } from "./config-BZhXY15H.mjs";
4
- import { a as formatElapsed, o as formatLongDuration, r as clockTime, u as plural } from "./command-output-DxC0k2rk.mjs";
5
- import { n as isInsideProject } from "./metro-Bu8LBfzS.mjs";
6
- import { r as cdpEndpoint } from "./state-B1ig0Kqy.mjs";
2
+ import { M as withDirLock$1, N as withDirLockAsync$1, w as workspaceAgentDeviceDir } from "./workspace-state-pUg3_RRA.mjs";
3
+ import { G as projectDeviceSlots, V as deviceSlotKey } from "./config-BktkY_zC.mjs";
4
+ import { a as formatElapsed, o as formatLongDuration, r as clockTime, u as plural } from "./command-output-BF5AR2dL.mjs";
5
+ import { n as isInsideProject } from "./metro-CjC10t6E.mjs";
6
+ import { r as cdpEndpoint } from "./state-C1i2nMOP.mjs";
7
7
  import { accessSync, constants, existsSync, mkdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
8
8
  import { delimiter, dirname, join, resolve } from "node:path";
9
9
  import { workspaceId } from "@stim-cli/core";
@@ -1,12 +1,12 @@
1
1
  import { t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { H as deviceSlotPlatforms, V as deviceSlotKey, p as getProject } from "./config-BZhXY15H.mjs";
3
- import { v as launchErrorPreview } from "./command-output-DxC0k2rk.mjs";
4
- import { r as readWorkspaceState$1 } from "./workspace-state-CeBpIZgr.mjs";
5
- import { I as readWorkspaceLaunches } from "./project-Dz-hWkb-.mjs";
6
- import { o as androidHome, u as androidToolCwd } from "./android-882m4hxX.mjs";
7
- import { d as resolveProjectMetro } from "./metro-Bu8LBfzS.mjs";
8
- import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-CX5IcRuf.mjs";
9
- import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-Dq3ZcdD8.mjs";
2
+ import { r as readWorkspaceState$1 } from "./workspace-state-pUg3_RRA.mjs";
3
+ import { H as deviceSlotPlatforms, V as deviceSlotKey, p as getProject } from "./config-BktkY_zC.mjs";
4
+ import { v as launchErrorPreview } from "./command-output-BF5AR2dL.mjs";
5
+ import { I as readWorkspaceLaunches } from "./project-BUu6Is4k.mjs";
6
+ import { o as androidHome, u as androidToolCwd } from "./android-DTAcRwBC.mjs";
7
+ import { d as resolveProjectMetro } from "./metro-CjC10t6E.mjs";
8
+ import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-B5P81yI-.mjs";
9
+ import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-Lnb_EoRY.mjs";
10
10
  import { r as deviceConsoleLevel } from "./ios-device-B6HK951C.mjs";
11
11
  import { createHash, randomUUID } from "node:crypto";
12
12
  import { existsSync, readFileSync, renameSync } from "node:fs";
@@ -179,11 +179,12 @@ function metroStoreConfirmedRoot(line) {
179
179
  const root = line.slice(51).trim();
180
180
  return root === "" ? null : root;
181
181
  }
182
- function expoMetroStoreEnv({ root, storeRoot, adapterPath, existingOverride }) {
182
+ function expoMetroStoreEnv({ root, port, storeRoot, adapterPath, existingOverride }) {
183
183
  return {
184
184
  EXPO_OVERRIDE_METRO_CONFIG: adapterPath,
185
185
  STIM_METRO_STORE: storeRoot,
186
186
  STIM_PROJECT_ROOT: root,
187
+ STIM_METRO_PORT: String(port),
187
188
  ...existingOverride ? { STIM_EXPO_METRO_CONFIG: existingOverride } : {}
188
189
  };
189
190
  }
@@ -1,3 +1,3 @@
1
- import { At as findStaleDeviceRecords, Ct as deleteParkedSims, Et as describeUnverifiableDevices, Tt as describeParkedSims, jt as findStaleProjectDevices, kt as findOrphanedDevices, ot as selectCaches } from "./budget-dPGuhNai.mjs";
2
- import { a as runGc, i as readGcReport, n as executeGc, o as withGcMaintenanceClaim, r as gcCommand, s as formatGcReport, t as collectGcReport } from "./gc-yVKpAOKM.mjs";
1
+ import { At as describeUnverifiableDevices, Dt as deleteParkedSims, Ft as findStaleProjectDevices, Nt as findOrphanedDevices, Pt as findStaleDeviceRecords, kt as describeParkedSims, ut as selectCaches } from "./budget-k2mZGvvk.mjs";
2
+ import { a as runGc, i as readGcReport, n as executeGc, o as withGcMaintenanceClaim, r as gcCommand, s as formatGcReport, t as collectGcReport } from "./gc-ldgr-hXU.mjs";
3
3
  export { collectGcReport, gcCommand as default, deleteParkedSims, describeParkedSims, describeUnverifiableDevices, executeGc, findOrphanedDevices, findStaleDeviceRecords, findStaleProjectDevices, formatGcReport, readGcReport, runGc, selectCaches, withGcMaintenanceClaim };
@@ -1,24 +1,22 @@
1
1
  import { D as ownership_claim_exports, S as process_identity_exports, c as throwIfCancelled, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, t as getExecutor, v as stopDeclaringSpawnsOn, x as withDrainingCancellation } from "./exec-VFRpu1iA.mjs";
2
- import { d as workspaceDir } from "./paths-DQtTgsBf.mjs";
3
- import { F as isOnMountedVolume, G as projectDeviceSlots, I as listMountedVolumes, L as measuredDirectorySizeAsync, N as directorySizeAsync, O as withConfigLockAsync$1, P as formatBytes, R as volumeRootFor, S as removeProject, _ as loadConfig$1, d as getConfigDir, j as acquireAvdClaim } from "./config-BZhXY15H.mjs";
4
- import { d as quotedPath$1, h as shortUdid, o as formatLongDuration, u as plural } from "./command-output-DxC0k2rk.mjs";
2
+ import { E as workspaceDir, u as workspaceLastUsed } from "./workspace-state-pUg3_RRA.mjs";
3
+ import { F as isOnMountedVolume, G as projectDeviceSlots, I as listMountedVolumes, L as measuredDirectorySizeAsync, N as directorySizeAsync, O as withConfigLockAsync$1, P as formatBytes, R as volumeRootFor, S as removeProject, _ as loadConfig$1, d as getConfigDir, j as acquireAvdClaim } from "./config-BktkY_zC.mjs";
4
+ import { d as quotedPath$1, h as shortUdid, o as formatLongDuration, u as plural } from "./command-output-BF5AR2dL.mjs";
5
5
  import { t as runOperationFile } from "./operation-exec-CUZifp6Z.mjs";
6
- import { u as workspaceLastUsed } from "./workspace-state-CeBpIZgr.mjs";
7
- import { Et as listWorktreesAsync, It as resolveSourceCheckoutAsync } from "./settings-RKwY33wv.mjs";
8
- import { i as findProjectRoot$1, v as detectIsExpo } from "./project-Dz-hWkb-.mjs";
9
- import { F as listAvdsAsync, L as listOrphanedAvdDirectories, V as ownedAvdDirectory, ft as POOL_SETTING_REMEDY, h as avdNameAbsent, vt as parkedMaxSetting } from "./android-882m4hxX.mjs";
10
- import { n as forgetCreatedDeviceAsync, r as readCreatedDevices$1 } from "./created-devices-D2Aca-xu.mjs";
11
- import { n as easMachineStateRoot$1, o as removeEasSessionClaimAsync, r as readEasSessionLedger$1 } from "./eas-session-ledger-Ck6YXPAO.mjs";
12
- import { $ as includesArchives, At as findStaleDeviceRecords, C as collectIdleDevices, Ct as deleteParkedSims, D as idleDeviceLines, Dt as deviceSweepIsScoped, Et as describeUnverifiableDevices, Ft as deleteEasSessions, It as describeError, Jt as withEasProjectLock, Lt as withRemoteSessionGcLocks, Mt as unverifiedDeviceCommand, Nt as withAndroidAvdSizes, O as parseIdleDuration, Ot as eraseParkedDevices, Pt as collectEasSessionSweep, Q as emptyCaches, Rn as runProcessOperation, Sr as discoverCaches, St as deleteParkedAvds, _r as scopedMemoryReport, _t as collectInventory, at as previewScopedEmptying, bt as collectParkedAvds, ct as trimCaches, dr as memoryCacheKind, dt as deleteGradleVersions, et as includesParkedDevices, fr as memoryLines, ft as gradleVersionLines, gr as reclaimMemory, gt as getMachineCacheReport, hr as memoryWorkPending, it as planCacheEmptying, jt as findStaleProjectDevices, k as shutDownIdleDevices, kt as findOrphanedDevices, lr as collectMemoryReport, lt as collectGradleVersions, mr as memorySweepIsScoped, mt as includesGradleVersions, nt as includesWorkspaceOutputs, or as parseArchiveSelector, ot as selectCaches, pr as memoryScope, pt as gradleVersionsPending, rt as isWorkspacesScope, st as selectsBeyondCaches, tt as includesRecordings, vt as DEVICE_LIST_TIMEOUT_MS, w as collectIdleDevicesAsync, wr as sizeCaches, wt as deleteProjectDevices, xt as collectParkedSims, yr as phase, yt as collectDeviceLeases } from "./budget-dPGuhNai.mjs";
6
+ import { Dt as listWorktreesAsync, Lt as resolveSourceCheckoutAsync } from "./settings-CosW5X-S.mjs";
7
+ import { i as findProjectRoot$1, v as detectIsExpo } from "./project-BUu6Is4k.mjs";
8
+ import { Ct as forgetCreatedDeviceAsync, F as listAvdsAsync, L as listOrphanedAvdDirectories, V as ownedAvdDirectory, ft as POOL_SETTING_REMEDY, h as avdNameAbsent, vt as parkedMaxSetting, wt as readCreatedDevices$1 } from "./android-DTAcRwBC.mjs";
9
+ import { n as easMachineStateRoot$1, o as removeEasSessionClaimAsync, r as readEasSessionLedger$1 } from "./eas-session-ledger-B5vygTiD.mjs";
10
+ import { At as describeUnverifiableDevices, Bt as describeError, C as gcOptionsOf, Ct as collectDeviceLeases, D as collectIdleDevices, Dr as discoverCaches, Dt as deleteParkedSims, Et as deleteParkedAvds, Ft as findStaleProjectDevices, It as unverifiedDeviceCommand, Lt as withAndroidAvdSizes, M as parseIdleDuration, Mt as eraseParkedDevices, N as shutDownIdleDevices, Nt as findOrphanedDevices, O as collectIdleDevicesAsync, Ot as deleteProjectDevices, Pt as findStaleDeviceRecords, Qt as withEasProjectLock, Rt as collectEasSessionSweep, Sr as scopedMemoryReport, St as DEVICE_LIST_TIMEOUT_MS, T as openGcLog, Tt as collectParkedSims, Un as runProcessOperation, Vt as withRemoteSessionGcLocks, _r as memoryLines, _t as gradleVersionsPending, at as includesRecordings, br as memoryWorkPending, bt as getMachineCacheReport, ct as planCacheEmptying, dr as parseArchiveSelector, dt as selectsBeyondCaches, ft as trimCaches, gr as memoryCacheKind, gt as gradleVersionLines, ht as deleteGradleVersions, it as includesParkedDevices, j as idleDeviceLines, jt as deviceSweepIsScoped, kr as sizeCaches, lt as previewScopedEmptying, mr as collectMemoryReport, nt as emptyCaches, ot as includesWorkspaceOutputs, pt as collectGradleVersions, rt as includesArchives, st as isWorkspacesScope, ut as selectCaches, vr as memoryScope, vt as includesGradleVersions, wr as phase, wt as collectParkedAvds, xr as reclaimMemory, xt as collectInventory, yr as memorySweepIsScoped, zt as deleteEasSessions } from "./budget-k2mZGvvk.mjs";
13
11
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
14
- import { B as GC_OUTPUT, R as listBuildSlots, V as createGcResults, a as collectWorkspaceOutputs, c as listWorkspaceDirs, h as workspaceInUseAsync, i as collectOrphanedWorkspaces, l as rootPresence, n as WORKSPACE_OUTPUT_DIRS, o as deleteOrphanedWorkspaces, p as withIdleWorkspace, r as clearWorkspaceOutputs, s as isInsideWorkspaces, t as REBUILD_COST, u as sizeText } from "./workspaces-CSV2Orf4.mjs";
15
- import { N as listBuildLocks, k as removeExpiredLease } from "./activity-Dq3ZcdD8.mjs";
16
- import { d as listAllIosSims, f as listAllIosSimsAsync } from "./ios-CVUFFZ6C.mjs";
17
- import { r as readCollectors } from "./ownership-DxlZGDcV.mjs";
18
- import { C as reclaimProject, S as describeDereferenced, T as sweepArchiveStaging, a as matchWorktreeEntry, b as TRASH_MANIFEST, v as TRASH_CLAIMS, w as deleteSelectedArchives, x as deleteTrashEntry } from "./worktree-Dw8kfacb.mjs";
19
- import { s as writeCacheFile } from "./warm-progress-ol0ZypEu.mjs";
20
- import { _ as collectWorktreeSweep, a as previewMaintenance, b as worktreeRemovalReason, c as deleteTempLeftovers, d as ARTIFACT_DIRS, f as appRoots, g as candidateRootsAsync, h as ownedDeviceUsage, l as tempLeftoverLines, o as triggeringRoot, p as finishedWorkspaces, s as collectTempLeftovers, t as deleteIdleWorkspaceDevices, u as tempLeftoverSection, v as removeWorktrees, y as worktreePullRequestNote } from "./act-Cyvm8xYc.mjs";
21
- import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-CccomeE0.mjs";
12
+ import { B as GC_OUTPUT, R as listBuildSlots, V as createGcResults, a as collectWorkspaceOutputs, c as listWorkspaceDirs, h as workspaceInUseAsync, i as collectOrphanedWorkspaces, l as rootPresence, n as WORKSPACE_OUTPUT_DIRS, o as deleteOrphanedWorkspaces, p as withIdleWorkspace, r as clearWorkspaceOutputs, s as isInsideWorkspaces, t as REBUILD_COST, u as sizeText } from "./workspaces-g2lhdBXF.mjs";
13
+ import { N as listBuildLocks, k as removeExpiredLease } from "./activity-Lnb_EoRY.mjs";
14
+ import { d as listAllIosSims, f as listAllIosSimsAsync } from "./ios-WxpDJ5T1.mjs";
15
+ import { r as readCollectors } from "./ownership-BjYvMNX_.mjs";
16
+ import { C as reclaimProject, S as describeDereferenced, T as sweepArchiveStaging, a as matchWorktreeEntry, b as TRASH_MANIFEST, v as TRASH_CLAIMS, w as deleteSelectedArchives, x as deleteTrashEntry } from "./worktree-BKuklFh_.mjs";
17
+ import { s as writeCacheFile } from "./warm-progress-DvhTX_eu.mjs";
18
+ import { S as readConcurrency, _ as collectWorktreeSweep, a as previewMaintenance, b as worktreeRemovalReason, c as deleteTempLeftovers, d as ARTIFACT_DIRS, f as appRoots, g as candidateRootsAsync, h as ownedDeviceUsage, l as tempLeftoverLines, o as triggeringRoot, p as finishedWorkspaces, s as collectTempLeftovers, t as deleteIdleWorkspaceDevices, u as tempLeftoverSection, v as removeWorktrees, x as eachLimited, y as worktreePullRequestNote } from "./act-C-BqJEpu.mjs";
19
+ import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-DbXy5tg8.mjs";
22
20
  import { claimRemoveCommand, isClaimRefusal, isClaimUnavailable, readClaimSet, releaseClaim, tryAcquireClaim } from "@stim-cli/core/ownership-claim";
23
21
  import { existsSync, lstatSync, readFileSync, readdirSync, statSync } from "node:fs";
24
22
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
@@ -148,12 +146,24 @@ async function forgetStaleEasLedgerEntries(entries, mountedVolumes, deps = {}, o
148
146
  await setImmediate();
149
147
  signal?.throwIfAborted();
150
148
  try {
151
- if (await remove(entry.id, root, (claim) => isStaleEasLedgerEntry(claim, mountedVolumes), signal)) output.log(chalk.green(`Forgot the EAS ledger entry ${entry.id} (invalid id, ${entry.workspaceRoot} is gone)`));
152
- else output.log(chalk.dim(`Kept the EAS ledger entry ${entry.id}: it changed since the report.`));
149
+ if (await remove(entry.id, root, (claim) => isStaleEasLedgerEntry(claim, mountedVolumes), signal)) {
150
+ output.log(chalk.green(`Forgot the EAS ledger entry ${entry.id} (invalid id, ${entry.workspaceRoot} is gone)`));
151
+ output.record("easLedgerEntry", "done", entry.id, { id: entry.id });
152
+ } else {
153
+ output.log(chalk.dim(`Kept the EAS ledger entry ${entry.id}: it changed since the report.`));
154
+ output.record("easLedgerEntry", "kept", entry.id, {
155
+ id: entry.id,
156
+ detail: "it changed since the report"
157
+ });
158
+ }
153
159
  } catch (error) {
154
160
  signal?.throwIfAborted();
155
161
  failures++;
156
162
  output.log(chalk.red(`Could not forget the EAS ledger entry ${entry.id}: ${describeError(error)}`));
163
+ output.record("easLedgerEntry", "failed", entry.id, {
164
+ id: entry.id,
165
+ detail: describeError(error)
166
+ });
157
167
  }
158
168
  }
159
169
  signal?.throwIfAborted();
@@ -1381,40 +1391,34 @@ async function duSize(dir, operation) {
1381
1391
  const kb = /^(\d+)\t/.exec(out)?.[1];
1382
1392
  return kb ? Number(kb) * 1024 : null;
1383
1393
  }
1384
- async function eachLimited(items, limit, run) {
1385
- const queue = items[Symbol.iterator]();
1386
- const worker = async () => {
1387
- for (const item of queue) await run(item);
1388
- };
1389
- await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
1390
- }
1391
1394
  /**
1392
1395
  * Sizes the regenerable directories maintenance clears and a project-local `.pnpm-store` in each worktree of the
1393
1396
  * sweep, from the disk-usage cache while an entry is under an hour old and no entry was added to or removed from the
1394
1397
  * directory since. Stale directories are measured with one `du` each, sequentially with an operation and at most
1395
1398
  * 4 at once otherwise, with 10 seconds each, so a
1396
- * slow tree delays only itself; a directory du could not measure in time is reported unmeasured (null). Also lists
1399
+ * slow tree delays only itself; a directory du could not measure in time is reported unmeasured (null). Without
1400
+ * `measure`, stale directories are reported unmeasured without a `du`. Also lists
1397
1401
  * the directories directly under a repository's `.worktrees/` that are no git worktree at all.
1398
1402
  */
1399
- async function measureWorktreeSweep(sweep, operation) {
1403
+ async function measureWorktreeSweep(sweep, operation, measure = true) {
1400
1404
  operation?.signal.throwIfAborted();
1401
1405
  const now = Date.now();
1406
+ const measured = sweep.worktrees.filter((candidate) => candidate.skipCode !== "not-a-worktree");
1402
1407
  const pending = [];
1403
- for (const candidate of sweep.worktrees) {
1408
+ await eachLimited([...measured.entries()], readConcurrency(operation), async ([index, candidate]) => {
1404
1409
  operation?.signal.throwIfAborted();
1405
- if (candidate.skipCode === "not-a-worktree") continue;
1406
1410
  const dirs = await buildStateDirs(candidate.path, candidate.keys, operation);
1407
- pending.push({
1411
+ pending[index] = {
1408
1412
  candidate,
1409
1413
  root: canonicalPath(candidate.path),
1410
1414
  dirs,
1411
1415
  sizes: new Map(dirs.map((dir) => [dir, cachedSize(dir, now)]))
1412
- });
1413
- }
1414
- const due = pending.flatMap(({ sizes }) => [...sizes].flatMap(([dir, bytes]) => bytes === null ? [{
1416
+ };
1417
+ });
1418
+ const due = measure ? pending.flatMap(({ sizes }) => [...sizes].flatMap(([dir, bytes]) => bytes === null ? [{
1415
1419
  dir,
1416
1420
  sizes
1417
- }] : []));
1421
+ }] : [])) : [];
1418
1422
  const worktrees = new Set(due.map(({ sizes }) => sizes)).size;
1419
1423
  if (due.length) phase("worktrees", `measuring the build state of ${plural(worktrees, "worktree")}`, operation);
1420
1424
  await eachLimited(due, operation ? 1 : BUILD_STATE_CONCURRENCY, async ({ dir, sizes }) => {
@@ -1463,9 +1467,13 @@ async function unlistedWorktreeDirs(operation) {
1463
1467
  signal: operation?.signal,
1464
1468
  declareFor: operation
1465
1469
  };
1466
- for (const root of await candidateRootsAsync(operation)) {
1470
+ const roots = await candidateRootsAsync(operation);
1471
+ const resolved = [];
1472
+ await eachLimited([...roots.entries()], readConcurrency(operation), async ([index, root]) => {
1467
1473
  operation?.signal.throwIfAborted();
1468
- const { entries, ...source } = await resolveSourceCheckoutAsync(root, options);
1474
+ resolved[index] = await resolveSourceCheckoutAsync(root, options);
1475
+ });
1476
+ for (const { entries, ...source } of resolved) {
1469
1477
  if ("refusal" in source || repositories.has(source.path)) continue;
1470
1478
  repositories.set(source.path, entries.map((entry) => canonicalPath(entry.path)));
1471
1479
  }
@@ -1583,14 +1591,23 @@ async function forgetStaleLedgerEntries(entries, output = GC_OUTPUT, signal) {
1583
1591
  if (entry.kind === "android") {
1584
1592
  if (!await forgetStaleAvdName(entry.id, signal)) {
1585
1593
  output.log(chalk.dim(`Kept the ledger entry for android ${entry.id}: the AVD or its setup reappeared`));
1594
+ output.record("ledgerEntry", "kept", `android ${entry.id}`, {
1595
+ id: entry.id,
1596
+ detail: "the AVD or its setup reappeared"
1597
+ });
1586
1598
  continue;
1587
1599
  }
1588
1600
  } else await forgetCreatedDeviceAsync(entry.kind, entry.id, signal);
1589
1601
  output.log(chalk.green(`Forgot the ledger entry for ${entry.kind} ${entry.id} (not on this machine)`));
1602
+ output.record("ledgerEntry", "done", `${entry.kind} ${entry.id}`, { id: entry.id });
1590
1603
  } catch (error) {
1591
1604
  signal?.throwIfAborted();
1592
1605
  failures++;
1593
1606
  output.log(chalk.red(`Could not forget the ledger entry for ${entry.kind} ${entry.id}: ${error?.message || error}`));
1607
+ output.record("ledgerEntry", "failed", `${entry.kind} ${entry.id}`, {
1608
+ id: entry.id,
1609
+ detail: error instanceof Error ? error.message : String(error)
1610
+ });
1594
1611
  }
1595
1612
  }
1596
1613
  signal?.throwIfAborted();
@@ -1759,15 +1776,18 @@ async function trimWorkspaceLogs(entries, output = GC_OUTPUT, operation) {
1759
1776
  signal?.throwIfAborted();
1760
1777
  failures++;
1761
1778
  output.log(chalk.red(`Could not trim the logs of ${root}: ${error?.message || String(error)}`));
1779
+ output.record("workspaceLogs", "failed", root, { detail: error instanceof Error ? error.message : String(error) });
1762
1780
  continue;
1763
1781
  }
1764
1782
  if (!run.ran || run.value.kept) {
1765
1783
  const kept = run.ran ? run.value.kept : `in use: ${run.reasons.join("; ")}`;
1766
1784
  output.log(chalk.yellow(`Kept the logs of ${root}: ${kept}`));
1785
+ output.record("workspaceLogs", "kept", root, { detail: kept });
1767
1786
  continue;
1768
1787
  }
1769
1788
  trimmed += run.value.bytes;
1770
1789
  output.log(chalk.green(`Trimmed the logs of ${root} (${formatBytes(run.value.bytes)})`));
1790
+ output.record("workspaceLogs", "done", root, { bytes: run.value.bytes });
1771
1791
  }
1772
1792
  signal?.throwIfAborted();
1773
1793
  if (trimmed) output.log(chalk.dim(`Trimmed ${formatBytes(trimmed)} of workspace logs.`));
@@ -2071,6 +2091,7 @@ function readGcReport(options = {}, deps = {}) {
2071
2091
  olderThan: options.olderThan,
2072
2092
  cache: options.cache,
2073
2093
  worktrees: options.worktrees,
2094
+ measureBuildState: options.measureBuildState,
2074
2095
  json: true
2075
2096
  }, deps, {
2076
2097
  output: GC_OUTPUT,
@@ -2128,7 +2149,7 @@ async function removedWholeWorkspaceDirs(operation) {
2128
2149
  });
2129
2150
  return [...orphaned.map((entry) => entry.dir), ...deadProjects.map(workspaceDir)];
2130
2151
  }
2131
- async function collectGcReport({ olderThan = null, cache = null, worktrees = false, refresh = true, now = Date.now(), lastTouched = workspaceLastUsed } = {}, deps = {}) {
2152
+ async function collectGcReport({ olderThan = null, cache = null, worktrees = false, refresh = true, measureBuildState = true, now = Date.now(), lastTouched = workspaceLastUsed } = {}, deps = {}) {
2132
2153
  const operation = deps.operation;
2133
2154
  const env = operation?.env ?? process.env;
2134
2155
  const scope = typeof cache === "string" && cache.trim() ? cache : null;
@@ -2421,7 +2442,7 @@ async function collectGcReport({ olderThan = null, cache = null, worktrees = fal
2421
2442
  now,
2422
2443
  refresh,
2423
2444
  operation
2424
- }), operation);
2445
+ }), operation, measureBuildState);
2425
2446
  return {
2426
2447
  skipped,
2427
2448
  deadProjects,
@@ -2568,7 +2589,13 @@ async function withGcMaintenanceClaim(opts, work) {
2568
2589
  }
2569
2590
  /** Executes one already-admitted sweep with separate progress, results and exit status. */
2570
2591
  async function executeGc(opts, deps, write, claim) {
2571
- const results = createGcResults();
2592
+ const log = opts.delete || opts.idle !== void 0 ? openGcLog({
2593
+ trigger: (deps.operation?.env ?? process.env).STIM_DESKTOP_APP ? "desktop" : "manual",
2594
+ env: deps.operation?.env,
2595
+ options: gcOptionsOf(opts),
2596
+ holdKept: true
2597
+ }) : null;
2598
+ const results = createGcResults(log?.record);
2572
2599
  let failed = false;
2573
2600
  const output = {
2574
2601
  log: (line) => write("stdout", line),
@@ -2738,7 +2765,10 @@ async function pruneDeadProjects(deadProjects, output, operation) {
2738
2765
  output.log(chalk.green(`Pruned ${path}`));
2739
2766
  output.record("project", "done", path);
2740
2767
  }
2741
- for (const dir of result.removedWorkspaceDirs) output.log(chalk.dim(` removed workspace output ${dir}`));
2768
+ for (const dir of result.removedWorkspaceDirs) {
2769
+ output.log(chalk.dim(` removed workspace output ${dir}`));
2770
+ output.record("workspaceDirectory", "done", dir);
2771
+ }
2742
2772
  for (const dir of result.failedWorkspaceDirs) {
2743
2773
  output.log(chalk.red(` could not remove workspace output ${dir}`));
2744
2774
  output.record("workspaceDirectory", "failed", dir, { detail: `could not remove it while pruning ${path}` });
@@ -2804,7 +2834,8 @@ async function runGcCore(opts, deps, execution, reportOnly = false) {
2804
2834
  olderThan,
2805
2835
  cache,
2806
2836
  worktrees: Boolean(opts.worktrees),
2807
- refresh
2837
+ refresh,
2838
+ measureBuildState: opts.measureBuildState
2808
2839
  }, deps);
2809
2840
  throwIfCancelled(signal, "GC");
2810
2841
  if (cache && report.caches.length === 0 && report.workspaceOutputs === null && !selectsBeyondCaches(cache)) {