stim 1.17.2 → 1.19.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 +50 -1
  2. package/dist/{activity-IRvJY_ru.mjs → activity-BSw0x84R.mjs} +4 -4
  3. package/dist/{agent-device-usage-output-BK41vnzN.mjs → agent-device-usage-output-Bjxu_VmX.mjs} +8 -8
  4. package/dist/{android-B9yaNKwa.mjs → android-BXc6BmEi.mjs} +658 -404
  5. package/dist/{android-B_YNZy61.mjs → android-BdQC6zs1.mjs} +9 -9
  6. package/dist/android-BvV1gGdN.mjs +4 -0
  7. package/dist/{android-DE4v59Mb.mjs → android-DE5g_5gv.mjs} +2 -2
  8. package/dist/{android-cas-ZFpjJBL_.mjs → android-cas-C87geAg-.mjs} +5 -5
  9. package/dist/android-cas-compiler.mjs +2 -2
  10. package/dist/api-DIf_s86s.mjs +150 -0
  11. package/dist/api-run.d.mts +1 -0
  12. package/dist/api-run.mjs +145 -0
  13. package/dist/api.d.mts +218 -0
  14. package/dist/api.mjs +2 -0
  15. package/dist/{app-install-VPkI5WEg.mjs → app-install-CFI4ptUL.mjs} +33 -13
  16. package/dist/{attempt-Bk2ouQVL.mjs → attempt-DW-mQqM7.mjs} +14 -4
  17. package/dist/{web-Dl0KSRHf.mjs → browser-web-CDhqQxhv.mjs} +138 -176
  18. package/dist/{budget-DfcgFdQB.mjs → budget-Dz-kyXLv.mjs} +1391 -58
  19. package/dist/build-facts-B87vo-Im.d.mts +142 -0
  20. package/dist/{cache-manifest-DnUHBJaU.mjs → cache-manifest-DiwKSyv9.mjs} +3 -3
  21. package/dist/cache-manifest.mjs +1 -1
  22. package/dist/{chrome-BrcVWQyD.mjs → chrome-BTUOo8p2.mjs} +1 -1
  23. package/dist/cli-C9Zvgbdc.mjs +68 -0
  24. package/dist/cli.mjs +1 -1
  25. package/dist/{client-SvBdgObD.mjs → client-CuUo8Nvg.mjs} +381 -49
  26. package/dist/collector-run.d.mts +6 -0
  27. package/dist/collector-run.mjs +9 -9
  28. package/dist/{command-output-CDAIFD-8.mjs → command-output-Bt8ygHE7.mjs} +2 -2
  29. package/dist/{config-D0DbpZtM.mjs → config-DC5jEtd1.mjs} +9 -5
  30. package/dist/{created-devices-CpvzBL25.mjs → created-devices-D0s26Hx5.mjs} +2 -2
  31. package/dist/{dependency-state-CLcBHH2M.mjs → dependency-state-DKaS1OM9.mjs} +2 -2
  32. package/dist/{detached-entry-CiTEgMR1.mjs → detached-entry-pB_IPfV4.mjs} +1 -1
  33. package/dist/{dev-client-B-XC4uRH.mjs → dev-client-CDY_zAmD.mjs} +2 -2
  34. package/dist/{device-C8IOoJPv.mjs → device-BHw0WlHl.mjs} +8 -8
  35. package/dist/{device-capacity-ZC4XSZ4R.mjs → device-capacity-BoN1jQkO.mjs} +25 -14
  36. package/dist/device-host-worker.mjs +19 -19
  37. package/dist/{gradle-dJpre3Yn.mjs → device-ios-B2ruohE-.mjs} +661 -107
  38. package/dist/{device-lease-DpoS36_u.mjs → device-lease-Cu7PtQpZ.mjs} +9 -9
  39. package/dist/{device-lease-run-B8YltIH_.mjs → device-lease-run-D38SnZtt.mjs} +4 -4
  40. package/dist/{device-pool-3o7s5lo4.mjs → device-pool-CP4rAsHx.mjs} +3 -3
  41. package/dist/{device-remote-hFSkpfQu.mjs → device-remote-B5GiUifk.mjs} +15 -16
  42. package/dist/{doctor-CFv1fCrF.mjs → doctor-PRJH94v6.mjs} +61 -34
  43. package/dist/doctor-watchman-wZhyTdp4.mjs +259 -0
  44. package/dist/{error-diagnostics-C-NMnhrk.mjs → error-diagnostics--v5HGOU0.mjs} +11 -11
  45. package/dist/{exec-CaErVv7t.mjs → exec-i8GDPwq9.mjs} +93 -6
  46. package/dist/{gc-DEmkg3Xh.mjs → gc-CyHMcKcn.mjs} +25 -471
  47. package/dist/{guide-CSmhMTf8.mjs → guide-dRaQJJk9.mjs} +681 -507
  48. package/dist/{hosted-android-E1Heoqnv.mjs → hosted-android-Bs7fytj7.mjs} +3 -3
  49. package/dist/{hosted-client-Bp4knSwu.mjs → hosted-client-C5G4h_OJ.mjs} +2 -2
  50. package/dist/{hosted-ios-BnbeYOUD.mjs → hosted-ios-Bik035eL.mjs} +1 -1
  51. package/dist/{hosted-logs-OcgIBvCT.mjs → hosted-logs-CI9Az9a4.mjs} +9 -9
  52. package/dist/{hosted-macos-DcxKjtfH.mjs → hosted-macos-DABm3ScO.mjs} +5 -5
  53. package/dist/{hosted-native-1Ebbig4w.mjs → hosted-native-DbV2aUVw.mjs} +13 -9
  54. package/dist/{idle-shutdown-IGyNV8Cr.mjs → idle-shutdown-DYiMBn34.mjs} +7 -8
  55. package/dist/{ios-DSfnPfse.mjs → ios-BWbHFZVz.mjs} +19 -7
  56. package/dist/{ios-Cr1h5gnO.mjs → ios-DCrkgXEM.mjs} +1 -1
  57. package/dist/ios-DYUr9LGc.mjs +8 -0
  58. package/dist/ios-ITYno9rO.mjs +2241 -0
  59. package/dist/{ios-device-pAN4t54-.mjs → ios-device-CJ_ZOGky.mjs} +3 -3
  60. package/dist/{ios-device-Ee7sDXfp.mjs → ios-device-CrW8aMb5.mjs} +1 -1
  61. package/dist/{ios-state-8L3lgum6.mjs → ios-state-By0XuLTQ.mjs} +1 -1
  62. package/dist/{launch-verify-lTnWZikR.mjs → launch-verify-DCveSE6d.mjs} +5 -5
  63. package/dist/{logs-BAaS7gS2.mjs → logs-Bao1HOMy.mjs} +13 -13
  64. package/dist/{macos-BIRQS90f.mjs → macos-ciyBdTY5.mjs} +194 -132
  65. package/dist/macos-nIOATJmR.mjs +2 -0
  66. package/dist/macos-run.mjs +1 -1
  67. package/dist/maintenance-run.mjs +349 -47
  68. package/dist/manifest-CX0d1IkZ.mjs +148 -0
  69. package/dist/{metro-g8NqiJp-.mjs → metro-DI2AjPF_.mjs} +196 -43
  70. package/dist/{metro-gateway-C-ijGI2F.mjs → metro-gateway-BxpJLIwh.mjs} +4 -4
  71. package/dist/{metro-store-CDDZHtPl.mjs → metro-store-BAHFcJm6.mjs} +16 -2
  72. package/dist/{build-plan-BDsSi09V.mjs → miss-reason-CjQCOKqq.mjs} +207 -249
  73. package/dist/{named-ports-C8m8EQs2.mjs → named-ports-B4iWH4E-.mjs} +70 -8
  74. package/dist/{native-runtime-BEK171xQ.mjs → native-runtime-BGxsbfny.mjs} +6 -6
  75. package/dist/{ndjson-PclOIwVY.mjs → ndjson-LGZAMsqa.mjs} +8 -4
  76. package/dist/offload-worker.d.mts +3 -45
  77. package/dist/offload-worker.mjs +11 -11
  78. package/dist/{ownership-DyRQru0q.mjs → ownership-EB0ySdGK.mjs} +3 -3
  79. package/dist/{page-QF_Ke10s.mjs → page-Bv9s2KwY.mjs} +1 -1
  80. package/dist/placement-log-Dxe34rJm.mjs +88 -0
  81. package/dist/plan-placement-BVY59qa8.mjs +290 -0
  82. package/dist/{ports-4nYqxPWC.mjs → ports-ByPc0_97.mjs} +3 -3
  83. package/dist/{prebuild-D7RUMkwN.mjs → prebuild-BKJ3wJI1.mjs} +5 -5
  84. package/dist/preview-BbSottmO.mjs +986 -0
  85. package/dist/{rolldown-runtime-BsOwBuO_.mjs → process-identity-Biv3arCO.mjs} +11 -1
  86. package/dist/project-B5eQ1USs.mjs +612 -0
  87. package/dist/{pull-request-pxnDCQzn.mjs → pull-request-IHNdMnG8.mjs} +1 -1
  88. package/dist/pull-requests.mjs +1 -1
  89. package/dist/react-native-ios-BMh2i25I.mjs +2 -0
  90. package/dist/react-native-ios-CSpIxexZ.mjs +2083 -0
  91. package/dist/{recordings-BNgsD1Tr.mjs → recordings-Bv8McZN4.mjs} +1 -1
  92. package/dist/{reload-DcRxj3qG.mjs → reload-rAPdqeRR.mjs} +14 -15
  93. package/dist/{remote-cache-Ci4DQYYj.mjs → remote-cache-N3hAEaAL.mjs} +5 -5
  94. package/dist/{run-CkE9y0nc.mjs → run-lAkle1-c.mjs} +5 -5
  95. package/dist/{server-bare-BkrSxSsZ.mjs → server-bare-CkIjnegq.mjs} +5 -6
  96. package/dist/server-expo-DGsdUGX2.mjs +2 -0
  97. package/dist/{server-expo-CHTyXD0G.mjs → server-expo-n3tUi3Em.mjs} +5 -6
  98. package/dist/{settings-SR9OmW9h.mjs → settings-2am7TSxp.mjs} +5 -5
  99. package/dist/{settings-Cfd-0r2d.mjs → settings-CxgngUZk.mjs} +116 -103
  100. package/dist/{settings-BBpMcDbD.mjs → settings-Djl-mpjX.mjs} +1 -1
  101. package/dist/settings.schema.json +198 -9
  102. package/dist/{simslim-BWNrc3M3.mjs → simslim-D9LkJxIO.mjs} +7 -7
  103. package/dist/{slot-launch-DmjBmpQV.mjs → slot-launch-HV_KtPIw.mjs} +6 -6
  104. package/dist/{spawn-claims-D0XfSe8u.mjs → spawn-claims-Kqiifsk2.mjs} +1 -1
  105. package/dist/{spawn-entry-jw19m8Nl.mjs → spawn-entry-Dcb7sDUz.mjs} +1 -0
  106. package/dist/{stage-CzaiwFsI.mjs → stage-BgaZJVZY.mjs} +14 -3
  107. package/dist/{start-AlfCPRVU.mjs → start-D8NbxNBb.mjs} +1 -1
  108. package/dist/{start-DUz3mYdb.mjs → start-DtxthMfI.mjs} +34 -27
  109. package/dist/{state-PeQiJuIu.mjs → state-D2KtnALG.mjs} +4 -4
  110. package/dist/{state-DyaNTgfR.mjs → state-Tp4uImDS.mjs} +5 -3
  111. package/dist/{state-B4PQFXMW.d.mts → state-lKh8shBp.d.mts} +2 -3
  112. package/dist/{stats-Bq4fJOdB.mjs → stats-8EJ5ivFT.mjs} +6 -6
  113. package/dist/{status-DlKvVJBE.mjs → status-BEeL6IKz.mjs} +6 -4
  114. package/dist/{status-BA2pehwf.mjs → status-BOyp0CUl.mjs} +31 -34
  115. package/dist/{stim-desktop-Cnz8CPnl.mjs → stim-desktop-C65jk_q2.mjs} +1 -1
  116. package/dist/{stim-installations-QMEI32v1.mjs → stim-installations-DbmUjsLv.mjs} +1 -1
  117. package/dist/stop-D0UIpZuh.mjs +72 -0
  118. package/dist/{stop-zF1y04f2.mjs → stop-DRipAg-e.mjs} +2 -2
  119. package/dist/{stop-DQIasgKp.mjs → stop-zDlknFoz.mjs} +79 -33
  120. package/dist/supervisor-run.d.mts +24 -22
  121. package/dist/supervisor-run.mjs +21 -22
  122. package/dist/{support-CsJNVfOc.mjs → support-CNqYkV0y.mjs} +7 -7
  123. package/dist/{support-WvD__tSV.mjs → support-DsNaFg6D.mjs} +5 -5
  124. package/dist/swiftpm-macos-aJzPAj1t.mjs +119 -0
  125. package/dist/{toolchain-DNyR3NPq.mjs → toolchain-C3xSoyUl.mjs} +475 -269
  126. package/dist/{trigger-Bemu8ytw.mjs → trigger-CAhmG-4s.mjs} +6 -6
  127. package/dist/trigger-CoalsMTV.mjs +2 -0
  128. package/dist/{warm-progress-DF4JRvYI.mjs → warm-progress-pFLB2e6P.mjs} +135 -38
  129. package/dist/{status-CzS4bPO9.mjs → watchman-BL1IdOtq.mjs} +75 -7
  130. package/dist/web-DFpFeZu5.mjs +2 -0
  131. package/dist/web-DbbrPUn0.mjs +127 -0
  132. package/dist/web-run.mjs +10 -10
  133. package/dist/{workspace-state-DqcCbpE7.mjs → workspace-state-CR9X86xJ.mjs} +3 -3
  134. package/dist/{ownership-BMLqyBgJ.mjs → workspaces-Djb2gfi9.mjs} +661 -23
  135. package/dist/{worktree-Be_7NLKy.mjs → worktree-BL4M1rhB.mjs} +252 -50
  136. package/dist/{worktree-j3IcFAI5.mjs → worktree-DV-A0LNL.mjs} +1 -1
  137. package/package.json +10 -5
  138. package/shim/bundle-response.cjs +2 -1
  139. package/shim/bundle-response.d.cts +1 -1
  140. package/shim/expo-metro-config.cjs +1 -1
  141. package/dist/build-progress-D0WkjCPd.mjs +0 -1036
  142. package/dist/build-slots-41v_d2x9.mjs +0 -142
  143. package/dist/cli-CYXb29oE.mjs +0 -51
  144. package/dist/deps-iKw0eD4P.mjs +0 -438
  145. package/dist/device-ios-C2Um-XUR.mjs +0 -412
  146. package/dist/errors-B6W7FkxQ.mjs +0 -15
  147. package/dist/guide-status-Du-ZQ3FD.mjs +0 -125
  148. package/dist/idle-BXG__1BA.mjs +0 -176
  149. package/dist/in-use-CvGOUn-x.mjs +0 -130
  150. package/dist/ios-BJ4XUSe1.mjs +0 -3867
  151. package/dist/native-run-D1Q56rAD.mjs +0 -158
  152. package/dist/preview-B-g9d7kV.mjs +0 -318
  153. package/dist/process-identity-BmRm1qV0.mjs +0 -12
  154. package/dist/project-D47Rh0ly.mjs +0 -276
  155. package/dist/server-expo-CeakhI8P.mjs +0 -2
  156. package/dist/state-BKa8wNN5.mjs +0 -148
  157. package/dist/stop-BIiM49EY.mjs +0 -48
  158. package/dist/stop-cause-rhmGfwvt.mjs +0 -97
  159. package/dist/trigger-CXts6qt1.mjs +0 -2
  160. package/dist/watchman-APYjXSQa.mjs +0 -48
  161. package/dist/workspace-process-lock-2mNzOlaB.mjs +0 -58
  162. package/dist/workspaces-Bcib97-6.mjs +0 -306
@@ -275,7 +275,7 @@
275
275
  }
276
276
  },
277
277
  "remote": {
278
- "description": "Default iOS remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy",
278
+ "description": "Default iOS remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy; local runs here, overriding a lower layer",
279
279
  "type": "string",
280
280
  "pattern": "^[A-Za-z0-9][A-Za-z0-9.-]*(?::(?!0+$)(?:[0-5]?[0-9]{1,4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$",
281
281
  "x-stim": {
@@ -464,7 +464,7 @@
464
464
  }
465
465
  },
466
466
  "remote": {
467
- "description": "Default Android remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy",
467
+ "description": "Default Android remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy; local runs here, overriding a lower layer",
468
468
  "type": "string",
469
469
  "pattern": "^[A-Za-z0-9][A-Za-z0-9.-]*(?::(?!0+$)(?:[0-5]?[0-9]{1,4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$",
470
470
  "x-stim": {
@@ -854,6 +854,47 @@
854
854
  },
855
855
  "additionalProperties": false
856
856
  },
857
+ "maintenance": {
858
+ "type": "object",
859
+ "properties": {
860
+ "keep": {
861
+ "description": "Pin this workspace: automatic maintenance never clears its build outputs or removes its worktree",
862
+ "type": "boolean",
863
+ "default": false,
864
+ "x-stim": {
865
+ "key": "maintenance.keep",
866
+ "kind": "boolean",
867
+ "scopes": [
868
+ "workspace",
869
+ "repo",
870
+ "committed"
871
+ ]
872
+ }
873
+ }
874
+ },
875
+ "additionalProperties": false
876
+ },
877
+ "remote": {
878
+ "type": "object",
879
+ "properties": {
880
+ "easFallback": {
881
+ "description": "When ios.remote or android.remote is auto, this Mac is at its concurrency.maxDevices cap and no Mac in remote.machines takes the run, run the simulator or emulator on a billed EAS Simulator instead of waiting or refusing, when eas-cli can",
882
+ "type": "boolean",
883
+ "default": false,
884
+ "x-stim": {
885
+ "key": "remote.easFallback",
886
+ "kind": "boolean",
887
+ "scopes": [
888
+ "machine",
889
+ "workspace",
890
+ "repo",
891
+ "committed"
892
+ ]
893
+ }
894
+ }
895
+ },
896
+ "additionalProperties": false
897
+ },
857
898
  "$schema": {
858
899
  "type": "string"
859
900
  }
@@ -1119,7 +1160,7 @@
1119
1160
  }
1120
1161
  },
1121
1162
  "remote": {
1122
- "description": "Default iOS remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy",
1163
+ "description": "Default iOS remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy; local runs here, overriding a lower layer",
1123
1164
  "type": "string",
1124
1165
  "pattern": "^[A-Za-z0-9][A-Za-z0-9.-]*(?::(?!0+$)(?:[0-5]?[0-9]{1,4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$",
1125
1166
  "x-stim": {
@@ -1169,7 +1210,7 @@
1169
1210
  }
1170
1211
  },
1171
1212
  "remote": {
1172
- "description": "Default Android remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy",
1213
+ "description": "Default Android remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy; local runs here, overriding a lower layer",
1173
1214
  "type": "string",
1174
1215
  "pattern": "^[A-Za-z0-9][A-Za-z0-9.-]*(?::(?!0+$)(?:[0-5]?[0-9]{1,4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$",
1175
1216
  "x-stim": {
@@ -1528,13 +1569,14 @@
1528
1569
  "type": "object",
1529
1570
  "properties": {
1530
1571
  "mode": {
1531
- "description": "Automatic resource maintenance. report measures, plans and logs what it would do and never deletes or stops anything; off disables it. Off under STIM_HOME or CI unless STIM_MAINTENANCE is set",
1572
+ "description": "Automatic resource maintenance. on removes what gc would remove under the caps and floors below and logs every action; report measures, plans and logs what it would do and never deletes anything; off disables it. Off under STIM_HOME or CI unless STIM_MAINTENANCE is set",
1532
1573
  "type": "string",
1533
1574
  "enum": [
1534
1575
  "off",
1535
- "report"
1576
+ "report",
1577
+ "on"
1536
1578
  ],
1537
- "default": "report",
1579
+ "default": "on",
1538
1580
  "x-stim": {
1539
1581
  "key": "maintenance.mode",
1540
1582
  "kind": "choice",
@@ -1687,6 +1729,75 @@
1687
1729
  "env": "STIM_MAINTENANCE_CAP_TARGET_PERCENT"
1688
1730
  }
1689
1731
  },
1732
+ "worktreeCheckMinutes": {
1733
+ "description": "Finished-worktree check interval in minutes",
1734
+ "type": "integer",
1735
+ "minimum": 1,
1736
+ "default": 15,
1737
+ "x-stim": {
1738
+ "key": "maintenance.worktreeCheckMinutes",
1739
+ "kind": "number",
1740
+ "scopes": [
1741
+ "machine"
1742
+ ],
1743
+ "env": "STIM_MAINTENANCE_WORKTREE_CHECK_MINUTES"
1744
+ }
1745
+ },
1746
+ "sweepHours": {
1747
+ "description": "Age sweep interval in hours; 0 turns the age sweep off",
1748
+ "type": "integer",
1749
+ "minimum": 0,
1750
+ "default": 24,
1751
+ "x-stim": {
1752
+ "key": "maintenance.sweepHours",
1753
+ "kind": "number",
1754
+ "scopes": [
1755
+ "machine"
1756
+ ],
1757
+ "env": "STIM_MAINTENANCE_SWEEP_HOURS"
1758
+ }
1759
+ },
1760
+ "olderThanDays": {
1761
+ "description": "Age in days for the age sweep: unused workspace build outputs and shared cache entries",
1762
+ "type": "integer",
1763
+ "minimum": 1,
1764
+ "default": 7,
1765
+ "x-stim": {
1766
+ "key": "maintenance.olderThanDays",
1767
+ "kind": "number",
1768
+ "scopes": [
1769
+ "machine"
1770
+ ],
1771
+ "env": "STIM_MAINTENANCE_OLDER_THAN_DAYS"
1772
+ }
1773
+ },
1774
+ "protectRecentHours": {
1775
+ "description": "Cache entries used within this many hours are never evicted",
1776
+ "type": "integer",
1777
+ "minimum": 0,
1778
+ "default": 2,
1779
+ "x-stim": {
1780
+ "key": "maintenance.protectRecentHours",
1781
+ "kind": "number",
1782
+ "scopes": [
1783
+ "machine"
1784
+ ],
1785
+ "env": "STIM_MAINTENANCE_PROTECT_RECENT_HOURS"
1786
+ }
1787
+ },
1788
+ "removeFinishedWorktrees": {
1789
+ "description": "Remove clean linked worktrees whose branch or pull request finished, under gc.worktreeGraceMinutes",
1790
+ "type": "boolean",
1791
+ "default": true,
1792
+ "x-stim": {
1793
+ "key": "maintenance.removeFinishedWorktrees",
1794
+ "kind": "boolean",
1795
+ "scopes": [
1796
+ "machine"
1797
+ ],
1798
+ "env": "STIM_MAINTENANCE_REMOVE_FINISHED_WORKTREES"
1799
+ }
1800
+ },
1690
1801
  "workspaceOutputsMaxGb": {
1691
1802
  "description": "Workspace build-output cap in GiB; 0 means no cap",
1692
1803
  "type": "number",
@@ -1749,6 +1860,20 @@
1749
1860
  "env": "STIM_CACHES_SWIFT_COMPILATION_CACHE_MAX_GB"
1750
1861
  }
1751
1862
  },
1863
+ "ccacheMaxGb": {
1864
+ "description": "ccache size limit in GiB, passed to ccache as CCACHE_MAXSIZE; ccache evicts by itself",
1865
+ "type": "number",
1866
+ "exclusiveMinimum": 0,
1867
+ "default": 5,
1868
+ "x-stim": {
1869
+ "key": "caches.ccacheMaxGb",
1870
+ "kind": "number",
1871
+ "scopes": [
1872
+ "machine"
1873
+ ],
1874
+ "env": "STIM_CACHES_CCACHE_MAX_GB"
1875
+ }
1876
+ },
1752
1877
  "buildCache": {
1753
1878
  "description": "Absolute path of the shared build cache",
1754
1879
  "type": "string",
@@ -1832,6 +1957,25 @@
1832
1957
  },
1833
1958
  "additionalProperties": false
1834
1959
  },
1960
+ "debug": {
1961
+ "type": "object",
1962
+ "properties": {
1963
+ "logs": {
1964
+ "description": "Debug-level logging. While on, the CLI records its commands, child processes and requests to other Macs, and stim-server records every request with its timings, under STIM_HOME/logs/debug/ with rotation. Nothing is sent anywhere, and records never carry arguments, tokens or tickets",
1965
+ "type": "boolean",
1966
+ "default": false,
1967
+ "x-stim": {
1968
+ "key": "debug.logs",
1969
+ "kind": "boolean",
1970
+ "scopes": [
1971
+ "machine"
1972
+ ],
1973
+ "env": "STIM_DEBUG"
1974
+ }
1975
+ }
1976
+ },
1977
+ "additionalProperties": false
1978
+ },
1835
1979
  "hosting": {
1836
1980
  "type": "object",
1837
1981
  "properties": {
@@ -1928,8 +2072,53 @@
1928
2072
  ]
1929
2073
  }
1930
2074
  },
2075
+ "buildPoolDisabled": {
2076
+ "description": "Members excluded from this requester's automatic build placement: local or exact remote.machines entries. Explicit placement and running builds are unaffected; at least one local or configured, approved remote member must stay enabled",
2077
+ "type": "array",
2078
+ "items": {
2079
+ "type": "string"
2080
+ },
2081
+ "default": [],
2082
+ "x-stim": {
2083
+ "key": "remote.buildPoolDisabled",
2084
+ "kind": "strings",
2085
+ "scopes": [
2086
+ "machine"
2087
+ ]
2088
+ }
2089
+ },
2090
+ "devicePoolDisabled": {
2091
+ "description": "Members excluded from this requester's automatic simulator and emulator placement: local or exact remote.machines entries. Explicit placement and existing sessions are unaffected; at least one local or configured, approved remote member must stay enabled",
2092
+ "type": "array",
2093
+ "items": {
2094
+ "type": "string"
2095
+ },
2096
+ "default": [],
2097
+ "x-stim": {
2098
+ "key": "remote.devicePoolDisabled",
2099
+ "kind": "strings",
2100
+ "scopes": [
2101
+ "machine"
2102
+ ]
2103
+ }
2104
+ },
2105
+ "easFallback": {
2106
+ "description": "When ios.remote or android.remote is auto, this Mac is at its concurrency.maxDevices cap and no Mac in remote.machines takes the run, run the simulator or emulator on a billed EAS Simulator instead of waiting or refusing, when eas-cli can",
2107
+ "type": "boolean",
2108
+ "default": false,
2109
+ "x-stim": {
2110
+ "key": "remote.easFallback",
2111
+ "kind": "boolean",
2112
+ "scopes": [
2113
+ "machine",
2114
+ "workspace",
2115
+ "repo",
2116
+ "committed"
2117
+ ]
2118
+ }
2119
+ },
1931
2120
  "build": {
1932
- "description": "Build placement: auto follows remote.buildMode with local fallback; local always builds here; a name in remote.machines requires that remote Mac without fallback. The ios, android and macos --remote-build flag overrides this setting and its environment override",
2121
+ "description": "Build placement: auto follows remote.buildMode within enabled automatic pool members; local always builds here; a name in remote.machines requires that remote Mac without fallback. The ios, android and macos --remote-build flag overrides this setting and its environment override",
1933
2122
  "type": "string",
1934
2123
  "pattern": "^[A-Za-z0-9][A-Za-z0-9.-]*(?::(?!0+$)(?:[0-5]?[0-9]{1,4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$",
1935
2124
  "default": "auto",
@@ -1943,7 +2132,7 @@
1943
2132
  }
1944
2133
  },
1945
2134
  "buildMode": {
1946
- "description": "When remote.build is auto, where iOS simulator Debug, Android emulator debug and macOS SwiftPM Debug builds run: auto builds here while this Mac has a free concurrency.maxBuilds slot and its load is under server.maxLoadPerCore, and otherwise builds on a less loaded Mac in remote.machines; force builds on a remote Mac whenever one can take the build; off always builds here",
2135
+ "description": "When remote.build is auto, where iOS simulator Debug, Android emulator debug and macOS SwiftPM Debug builds run: auto builds here while this Mac has a free concurrency.maxBuilds slot and its load is under server.maxLoadPerCore, and otherwise builds on a less loaded Mac in remote.machines; force builds on an enabled remote Mac whenever one can take the build; off builds here when local is enabled in remote.buildPoolDisabled",
1947
2136
  "type": "string",
1948
2137
  "enum": [
1949
2138
  "auto",
@@ -1,13 +1,13 @@
1
- import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
- import { d as getConfigDir } from "./config-D0DbpZtM.mjs";
3
- import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
1
+ import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
4
3
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
5
- import { g as releaseBuildLock, m as acquireBuildLock } from "./device-lease-DpoS36_u.mjs";
6
- import { f as resolveEasCliBin } from "./remote-cache-Ci4DQYYj.mjs";
7
- import { _ as easCliSupport, s as readInstalledEasCliVersion, v as easCliUpgradeRemedy } from "./device-remote-hFSkpfQu.mjs";
8
- import { createHash } from "node:crypto";
4
+ import { d as getConfigDir } from "./config-DC5jEtd1.mjs";
5
+ import { g as releaseBuildLock, m as acquireBuildLock } from "./device-lease-Cu7PtQpZ.mjs";
6
+ import { f as resolveEasCliBin } from "./remote-cache-N3hAEaAL.mjs";
7
+ import { s as readInstalledEasCliVersion, v as easCliSupport, y as easCliUpgradeRemedy } from "./device-remote-B5GiUifk.mjs";
9
8
  import { existsSync, realpathSync, statSync } from "node:fs";
10
9
  import { join } from "node:path";
10
+ import { createHash } from "node:crypto";
11
11
  //#region src/engine/eas-build.ts
12
12
  const MIN_EAS_CLI_BUILD_DOWNLOAD_VERSION = "18.9.0";
13
13
  function isEasBuildFailure(result) {
@@ -1,9 +1,9 @@
1
- import { B as parseDeviceSlotKey, H as projectDeviceSlots, p as getProject } from "./config-D0DbpZtM.mjs";
2
- import { r as readWorkspaceState$1 } from "./workspace-state-DqcCbpE7.mjs";
3
- import { n as fileLeaseIo } from "./device-lease-DpoS36_u.mjs";
4
- import { E as getAvdNameForSerial, O as listAdbDevices } from "./android-B_YNZy61.mjs";
5
- import { u as listAllIosSims } from "./ios-DSfnPfse.mjs";
6
- import { f as deviceShellArg } from "./app-install-VPkI5WEg.mjs";
1
+ import { B as parseDeviceSlotKey, H as projectDeviceSlots, p as getProject } from "./config-DC5jEtd1.mjs";
2
+ import { r as readWorkspaceState$1 } from "./workspace-state-CR9X86xJ.mjs";
3
+ import { n as fileLeaseIo } from "./device-lease-Cu7PtQpZ.mjs";
4
+ import { E as getAvdNameForSerial, O as listAdbDevices } from "./android-BdQC6zs1.mjs";
5
+ import { d as listAllIosSims } from "./ios-BWbHFZVz.mjs";
6
+ import { f as deviceShellArg } from "./app-install-CFI4ptUL.mjs";
7
7
  import { hostedNativeRecords } from "@stim-cli/core/state";
8
8
  //#region src/engine/slot-launch.ts
9
9
  function launchSlotScope(root, slot = "default") {
@@ -1,4 +1,4 @@
1
- import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
1
+ import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
2
  //#region src/engine/spawn-claims.ts
3
3
  const declaring = /* @__PURE__ */ new Set();
4
4
  const running = /* @__PURE__ */ new Set();
@@ -2,6 +2,7 @@ import { basename, dirname, join } from "node:path";
2
2
  import { fileURLToPath } from "node:url";
3
3
  //#region src/spawn-entry.ts
4
4
  const DEV_ENTRIES = {
5
+ "api-run": "./api-run.ts",
5
6
  "supervisor-run": "./supervisor/run.ts",
6
7
  "collector-run": "./collector/run.ts",
7
8
  "web-run": "./web/run.ts",
@@ -1,4 +1,4 @@
1
- import { t as getExecutor } from "./exec-CaErVv7t.mjs";
1
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
2
2
  import { cpSync, existsSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync } from "node:fs";
3
3
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
4
  import { validMacosResourceDestination } from "@stim-cli/core";
@@ -19,6 +19,16 @@ function validateInfoPlist(root, product, infoPlist) {
19
19
  minimumSystemVersion: plist.LSMinimumSystemVersion
20
20
  };
21
21
  }
22
+ function setBundleName(plistPath, name) {
23
+ const exec = getExecutor();
24
+ for (const key of ["CFBundleDisplayName", "CFBundleName"]) exec.runFile("plutil", [
25
+ "-replace",
26
+ key,
27
+ "-string",
28
+ name,
29
+ plistPath
30
+ ]);
31
+ }
22
32
  function resourceError(key, entry, reason) {
23
33
  throw new Error(`${key} entry ${JSON.stringify(entry)}: ${reason}. See stim guide macos.`);
24
34
  }
@@ -73,7 +83,7 @@ function resolveBundleExtras(root, repository, resources = {}, assetCatalog) {
73
83
  assetCatalog: catalog
74
84
  };
75
85
  }
76
- function stageBundle(root, product, infoPlist, bin, bundle, bundleId, extras = { resources: {} }) {
86
+ function stageBundle(root, product, infoPlist, bin, bundle, bundleId, extras = { resources: {} }, displayName) {
77
87
  const { minimumSystemVersion } = validateInfoPlist(root, product, infoPlist);
78
88
  for (const entry of readdirSync(bin).filter((name) => name.endsWith(".bundle"))) for (const [destination, source] of Object.entries(extras.resources)) if (overlaps(destination, entry)) resourceError(`macos.resources[${JSON.stringify(destination)}]`, source, `destination collides with ${entry}`);
79
89
  const exec = getExecutor();
@@ -93,6 +103,7 @@ function stageBundle(root, product, infoPlist, bin, bundle, bundleId, extras = {
93
103
  `Set :CFBundleIdentifier ${bundleId}`,
94
104
  join(contents, "Info.plist")
95
105
  ]);
106
+ if (displayName !== void 0) setBundleName(join(contents, "Info.plist"), displayName);
96
107
  for (const entry of readdirSync(bin)) if (entry.endsWith(".framework")) {
97
108
  const target = join(contents, "Frameworks", entry);
98
109
  cpSync(join(bin, entry), target, {
@@ -140,4 +151,4 @@ function stageBundle(root, product, infoPlist, bin, bundle, bundleId, extras = {
140
151
  ]);
141
152
  }
142
153
  //#endregion
143
- export { stageBundle as n, validateInfoPlist as r, resolveBundleExtras as t };
154
+ export { validateInfoPlist as i, setBundleName as n, stageBundle as r, resolveBundleExtras as t };
@@ -1,2 +1,2 @@
1
- import { a as registerStart, c as startDevServer, d as tailLines, f as wantsExpoOwnTunnel, i as readLogTail, l as startFacts, n as liveSupervisor, o as resolveWorkspaceMetroPort, r as parseWait, s as startCommand, t as failureEvidence, u as supervisorEntry } from "./start-DUz3mYdb.mjs";
1
+ import { a as registerStart, c as startDevServer, d as tailLines, f as wantsExpoOwnTunnel, i as readLogTail, l as startFacts, n as liveSupervisor, o as resolveWorkspaceMetroPort, r as parseWait, s as startCommand, t as failureEvidence, u as supervisorEntry } from "./start-DtxthMfI.mjs";
2
2
  export { startCommand as default, failureEvidence, liveSupervisor, parseWait, readLogTail, registerStart, resolveWorkspaceMetroPort, startDevServer, startFacts, supervisorEntry, tailLines, wantsExpoOwnTunnel };
@@ -1,28 +1,27 @@
1
- import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
- import { E as upsertProject, p as getProject } from "./config-D0DbpZtM.mjs";
3
- import { t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
4
- import { n as windowsLauncherArgs } from "./detached-entry-CiTEgMR1.mjs";
5
- import { _ as stepTimer, l as phaseLine } from "./command-output-CDAIFD-8.mjs";
6
- import { G as detectProviders, H as unknownSettingKeys, K as planMetroReach, M as remoteIosSetting, N as resolveCacheProviderConfig, P as resolveSettings, R as settingShapeErrors, S as metroTunnelSettingError, V as tunnelModeSetting, W as PUBLIC_METRO_ENV, b as metroIdleStopMinutesSetting, d as deviceIdleShutdownMinutesSetting, gt as repoRoot, i as SETTING_SHAPE_REMEDY, it as gitCommonDir, j as remoteAndroidSetting, k as publicUrlSetting, u as cacheProviderSettingError, w as ngrokUrlSetting, x as metroPortSetting } from "./settings-Cfd-0r2d.mjs";
7
- import { f as readAppConfigText, n as appProjectProblem, p as readAppJson, r as detectIsExpo, s as findProjectRoot$1, t as NO_PROJECT_REFUSAL } from "./project-D47Rh0ly.mjs";
8
- import { l as resolveProjectMetro, o as pidExists, p as reserveMetroPort, u as signalProcessTree } from "./metro-g8NqiJp-.mjs";
9
- import { c as writeWorkspaceState, g as workspaceAgentDeviceDir, i as recordWorkspaceUse, m as supervisorLogFile, n as clearWorkspaceStateKeys, r as readWorkspaceState$1, u as ensureWorkspaceStorage, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
10
- import { l as stopOwnedMetroForReset, t as budgetGate } from "./budget-DfcgFdQB.mjs";
11
- import { c as readMetroTunnel, i as clearManagedMetroTunnel } from "./state-BKa8wNN5.mjs";
12
- import { a as workspaceLinks, i as workspaceLinkLine } from "./stim-desktop-Cnz8CPnl.mjs";
13
- import { a as terminateChild, c as withManagedTunnelLock, i as stopTunnel, o as withManagedRemoteWorktreeLock, r as startTunnelSequence, t as resolveSupervisorTarget } from "./ownership-BMLqyBgJ.mjs";
14
- import { n as workspaceProcessLockError, t as withWorkspaceProcessLock } from "./workspace-process-lock-2mNzOlaB.mjs";
15
- import { i as levelRank } from "./ndjson-PclOIwVY.mjs";
16
- import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
17
- import { d as readProjectConfig } from "./remote-cache-Ci4DQYYj.mjs";
1
+ import { t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
+ import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
3
+ import { t as spawnEntry } from "./spawn-entry-Dcb7sDUz.mjs";
4
+ import { _ as stepTimer, l as phaseLine } from "./command-output-Bt8ygHE7.mjs";
5
+ import { E as upsertProject, p as getProject } from "./config-DC5jEtd1.mjs";
6
+ import { c as writeWorkspaceState, g as workspaceAgentDeviceDir, i as recordWorkspaceUse, m as supervisorLogFile, n as clearWorkspaceStateKeys, r as readWorkspaceState$1, u as ensureWorkspaceStorage, x as workspaceLogsDir$1 } from "./workspace-state-CR9X86xJ.mjs";
7
+ import { E as readMetroTunnel, S as clearManagedMetroTunnel, _ as readAppJson, g as readAppConfigText, p as detectIsExpo, r as findProjectRoot, s as projectProblem, t as NO_PROJECT_REFUSAL } from "./project-B5eQ1USs.mjs";
8
+ import { A as publicUrlSetting, B as settingShapeErrors, F as resolveCacheProviderConfig, I as resolveSettings, J as planMetroReach, K as PUBLIC_METRO_ENV, M as remoteAndroidSetting, P as remoteIosSetting, S as metroTunnelSettingError, U as tunnelModeSetting, W as unknownSettingKeys, b as metroIdleStopMinutesSetting, d as deviceIdleShutdownMinutesSetting, i as SETTING_SHAPE_REMEDY, mt as repoRoot, nt as gitCommonDir, q as detectProviders, u as cacheProviderSettingError, w as ngrokUrlSetting, x as metroPortSetting } from "./settings-CxgngUZk.mjs";
9
+ import { d as signalProcessTree, g as PortInspectionError, h as PORT_INSPECTION_REMEDY, m as reserveMetroPort, s as pidExists, u as resolveProjectMetro } from "./metro-DI2AjPF_.mjs";
10
+ import { d as stopOwnedMetroForReset, t as budgetGate } from "./budget-Dz-kyXLv.mjs";
11
+ import { _ as terminateChild, b as withManagedTunnelLock, g as stopTunnel, h as startTunnelSequence, m as resolveSupervisorTarget, v as withManagedRemoteWorktreeLock } from "./workspaces-Djb2gfi9.mjs";
12
+ import { a as workspaceLinks, i as workspaceLinkLine } from "./stim-desktop-C65jk_q2.mjs";
13
+ import { a as withWorkspaceProcessLock, o as workspaceProcessLockError } from "./named-ports-B4iWH4E-.mjs";
14
+ import { i as levelRank } from "./ndjson-LGZAMsqa.mjs";
15
+ import { d as readProjectConfig } from "./remote-cache-N3hAEaAL.mjs";
16
+ import { n as windowsLauncherArgs } from "./detached-entry-pB_IPfV4.mjs";
18
17
  import { appendFileSync, mkdirSync, openSync, readFileSync } from "node:fs";
19
18
  import { dirname } from "node:path";
20
- import { EventEmitter } from "node:events";
21
- import { existsSync as existsSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1 } from "fs";
22
19
  import { join as join$1 } from "path";
23
20
  import { IDLE_STOP_KEY, queryLogs } from "@stim-cli/core/state";
24
21
  import chalk from "chalk";
22
+ import { existsSync as existsSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1 } from "fs";
25
23
  import { CACHE_PROVIDER_ENV, cacheProviderEnv } from "@stim-cli/cache";
24
+ import { EventEmitter } from "node:events";
26
25
  //#region src/workspace/app-id.ts
27
26
  function configString(config, platform, key) {
28
27
  if (!config || typeof config !== "object") return null;
@@ -251,13 +250,13 @@ function registerStart(program, overrides = {}) {
251
250
  remedy: "Pass a whole number of seconds, e.g. --wait 90."
252
251
  });
253
252
  const waitSeconds = wait.seconds;
254
- const root = findProjectRoot$1(process.cwd());
253
+ const root = findProjectRoot(process.cwd());
255
254
  if (!root) return fail(NO_PROJECT_REFUSAL);
256
- const projectProblem = appProjectProblem(root);
257
- if (projectProblem) return fail({
255
+ const problem = projectProblem(root, "dev-server");
256
+ if (problem) return fail({
258
257
  code: "STIM_NO_PROJECT",
259
- message: projectProblem.message,
260
- remedy: projectProblem.remedy
258
+ message: problem.message,
259
+ remedy: problem.remedy
261
260
  });
262
261
  try {
263
262
  ensureWorkspaceStorage(root);
@@ -973,7 +972,7 @@ async function resolveWorkspaceMetroPort(root, note, command, reserve = true) {
973
972
  const pinned = setting.port;
974
973
  const project = getProject(root);
975
974
  const recorded = project?.metroPort;
976
- if (pinned === null && command === "web") return recorded ?? await reserveMetroPort(root);
975
+ if (pinned === null && command === "web") return recorded ?? await reservePort(root, null);
977
976
  if (recorded) {
978
977
  const supervisor = resolveSupervisorTarget({
979
978
  state: readWorkspaceState$1(root)?.supervisor,
@@ -1005,17 +1004,25 @@ async function resolveWorkspaceMetroPort(root, note, command, reserve = true) {
1005
1004
  } else if (recorded) {
1006
1005
  const held = await resolveProjectMetro(recorded, root);
1007
1006
  if (!held.notOurs) return recorded;
1008
- const fresh = await reserveMetroPort(root);
1009
- if (fresh !== recorded) {
1007
+ const fresh = await reservePort(root, null);
1008
+ if (typeof fresh === "number" && fresh !== recorded) {
1010
1009
  note(chalk.yellow(`Port ${recorded} is held by something else (${held.notOurs}).`));
1011
1010
  note(chalk.dim(`Reserved port ${fresh} for this project instead.`));
1012
1011
  }
1013
1012
  return fresh;
1014
1013
  }
1015
1014
  if (!reserve && pinned !== null) return pinned;
1015
+ return reservePort(root, pinned);
1016
+ }
1017
+ async function reservePort(root, pinned) {
1016
1018
  try {
1017
1019
  return await reserveMetroPort(root, void 0, void 0, pinned);
1018
1020
  } catch (error) {
1021
+ if (error instanceof PortInspectionError) return {
1022
+ code: error.code,
1023
+ message: error.reason,
1024
+ remedy: PORT_INSPECTION_REMEDY
1025
+ };
1019
1026
  return {
1020
1027
  code: "STIM_BAD_ARG",
1021
1028
  message: error.message,
@@ -1,11 +1,11 @@
1
- import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
2
- import { o as pidExists } from "./metro-g8NqiJp-.mjs";
3
- import { a as updateWorkspaceState, c as writeWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey, v as workspaceDir, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
1
+ import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
+ import { a as updateWorkspaceState, c as writeWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey, v as workspaceDir, x as workspaceLogsDir$1 } from "./workspace-state-CR9X86xJ.mjs";
3
+ import { s as pidExists } from "./metro-DI2AjPF_.mjs";
4
4
  import { readFileSync, readlinkSync, rmSync } from "node:fs";
5
5
  import { join } from "node:path";
6
- import { rotatedLogPath } from "@stim-cli/core";
7
6
  import { WEB_VIEWPORTS } from "@stim-cli/core/state";
8
7
  import { hostname } from "node:os";
8
+ import { rotatedLogPath } from "@stim-cli/core";
9
9
  //#region src/web/profile.ts
10
10
  const SINGLETON_FILES = [
11
11
  "SingletonLock",
@@ -1,11 +1,13 @@
1
- import { t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
2
- import { a as updateWorkspaceState, r as readWorkspaceState$1, v as workspaceDir, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
1
+ import { t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
+ import { a as updateWorkspaceState, r as readWorkspaceState$1, v as workspaceDir, x as workspaceLogsDir$1 } from "./workspace-state-CR9X86xJ.mjs";
3
+ import { existsSync } from "node:fs";
3
4
  import { join } from "node:path";
4
5
  import { readMacosRecord } from "@stim-cli/core/state";
5
6
  //#region src/macos/state.ts
6
7
  const macosDir = (root) => join(workspaceDir(root), "macos");
7
8
  const macosLogFile = (root) => join(workspaceLogsDir$1(root), "macos.ndjson");
8
9
  const macosRuntimeClaim = (root) => join(macosDir(root), "runtime.lock");
10
+ const macosAppPresent = (root) => readWorkspaceState$1(root)?.macos !== void 0 || existsSync(macosDir(root));
9
11
  function macosProcess(pid) {
10
12
  const processToken = (0, process_identity_exports.captureProcessToken)(pid);
11
13
  const start = (0, process_identity_exports.processStartMicros)(pid);
@@ -38,4 +40,4 @@ function updateMacosRecord(root, owner, patch) {
38
40
  return updated;
39
41
  }
40
42
  //#endregion
41
- export { requiredMacosRecord as a, macosRuntimeClaim as i, macosLogFile as n, updateMacosRecord as o, macosProcess as r, macosDir as t };
43
+ export { macosRuntimeClaim as a, macosProcess as i, macosDir as n, requiredMacosRecord as o, macosLogFile as r, updateMacosRecord as s, macosAppPresent as t };
@@ -1,10 +1,9 @@
1
1
  import "@stim-cli/core/state";
2
- import * as import__stim_cli_core_process_identity from "@stim-cli/core/process-identity";
3
- //#endregion
2
+ import { ProcessRecord } from "@stim-cli/core/process-identity";
4
3
  //#region src/supervisor/state.d.ts
5
4
  declare const MODE_BARE = "bare-inproc";
6
5
  declare const MODE_EXPO = "expo-child";
7
- declare function clearWorkspaceSupervisor(root: string, expected?: process_identity_d_exports.ProcessRecord | null): boolean;
6
+ declare function clearWorkspaceSupervisor(root: string, expected?: ProcessRecord | null): boolean;
8
7
  declare function clearExpoMetroTunnel(root: string): void;
9
8
  declare function writePidFile(root: string, pid: number): string;
10
9
  declare function readPidFile(root: string): number | null;
@@ -1,8 +1,8 @@
1
- import { j as formatBytes } from "./config-D0DbpZtM.mjs";
2
- import { o as formatLongDuration } from "./command-output-CDAIFD-8.mjs";
3
- import { gt as repoRoot, it as gitCommonDir } from "./settings-Cfd-0r2d.mjs";
4
- import { s as findProjectRoot$1 } from "./project-D47Rh0ly.mjs";
5
- import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-BK41vnzN.mjs";
1
+ import { o as formatLongDuration } from "./command-output-Bt8ygHE7.mjs";
2
+ import { j as formatBytes } from "./config-DC5jEtd1.mjs";
3
+ import { r as findProjectRoot } from "./project-B5eQ1USs.mjs";
4
+ import { mt as repoRoot, nt as gitCommonDir } from "./settings-CxgngUZk.mjs";
5
+ import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-Bjxu_VmX.mjs";
6
6
  import { archivedUsage, readArchives, readStatsReport, statsProjectKey } from "@stim-cli/core/state";
7
7
  import chalk from "chalk";
8
8
  //#region src/commands/stats.ts
@@ -13,7 +13,7 @@ function statsCommand(program) {
13
13
  program.command("stats").description("Show how many `ios` and `android` runs this project and this machine have recorded, how many hit the build cache, and an estimate of the time that cache saved.").option("--json", "print the aggregates as JSON").action(async (opts) => {
14
14
  const agentDevice = await getAgentDeviceUsage();
15
15
  const swiftpmCache = await getSwiftpmCacheUsage();
16
- const root = findProjectRoot$1(process.cwd());
16
+ const root = findProjectRoot(process.cwd());
17
17
  const key = root ? statsProjectKey({
18
18
  root,
19
19
  commonDir: gitCommonDir(root),
@@ -1,4 +1,4 @@
1
- import { t as resolveMaintenanceSettings } from "./settings-BBpMcDbD.mjs";
1
+ import { t as resolveMaintenanceSettings } from "./settings-Djl-mpjX.mjs";
2
2
  import { maintenanceRunClaims, readMaintenanceState } from "@stim-cli/core/state";
3
3
  import { claimRemoveCommand, readClaimSet } from "@stim-cli/core/ownership-claim";
4
4
  //#region src/maintenance/status.ts
@@ -17,7 +17,9 @@ function maintenanceStatus() {
17
17
  } } : {},
18
18
  lastChecks: {
19
19
  pressure: state?.lastAt.pressure ?? null,
20
- size: state?.lastAt.size ?? null
20
+ size: state?.lastAt.size ?? null,
21
+ worktree: state?.lastAt.worktree ?? null,
22
+ sweep: state?.lastAt.sweep ?? null
21
23
  },
22
24
  pressure: state?.pressure ?? null,
23
25
  sizes: state?.sizes ?? [],
@@ -37,9 +39,9 @@ function maintenanceLine(status, includeLabel = true) {
37
39
  minute: "2-digit"
38
40
  }) : null;
39
41
  const outputs = status.plan.filter((action) => action.kind === "would-clear-outputs");
40
- const summary = outputs.length ? `would clear build outputs of ${outputs.length} ${outputs.length === 1 ? "workspace" : "workspaces"} (${(outputs.reduce((sum, action) => sum + action.bytes, 0) / 1024 ** 3).toFixed(1)} GB)` : `${status.plan.length} planned actions`;
42
+ const summary = status.mode === "on" && status.lastPass ? `${status.lastPass.actions} actions, ${(status.lastPass.freedBytes / 1024 ** 3).toFixed(1)} GB freed` : outputs.length ? `would clear build outputs of ${outputs.length} ${outputs.length === 1 ? "workspace" : "workspaces"} (${(outputs.reduce((sum, action) => sum + action.bytes, 0) / 1024 ** 3).toFixed(1)} GB)` : `${status.plan.length} planned actions`;
41
43
  const disk = status.pressure?.disk.map((volume) => `disk ${(volume.freeMb / 1024).toFixed(1)} GB free on ${volume.volume}`).join(", ");
42
- return `${includeLabel ? `Auto maintenance (${status.mode === "report" ? "report only" : "off"}): ` : ""}${at ? `${at}: ` : ""}${status.lastPass ? summary : "no pass has run yet"}${disk ? `; ${disk}` : ""}${status.running ? "; running" : ""}${status.lastPass?.blocked.length ? `; ${status.lastPass.blocked.join("; ")}` : ""}${status.invalid ? `; invalid: ${status.invalid}` : ""}${status.claim ? `; unresolved claim: ${status.claim.unresolved}; ${status.claim.removeCommand}` : ""}`;
44
+ return `${includeLabel ? `Auto maintenance (${status.mode === "report" ? "report only" : status.mode}): ` : ""}${at ? `${at}: ` : ""}${status.lastPass ? summary : "no pass has run yet"}${disk ? `; ${disk}` : ""}${status.running ? "; running" : ""}${status.lastPass?.blocked.length ? `; ${status.lastPass.blocked.join("; ")}` : ""}${status.invalid ? `; invalid: ${status.invalid}` : ""}${status.claim ? `; unresolved claim: ${status.claim.unresolved}; ${status.claim.removeCommand}` : ""}`;
43
45
  }
44
46
  function maintenanceLines(status) {
45
47
  const line = maintenanceLine(status);