stim 1.37.0 → 1.38.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 (140) hide show
  1. package/dist/{acquire-artifact-zBUbPuDP.mjs → acquire-artifact-QKPDkesw.mjs} +1 -1
  2. package/dist/{act-BGAFjY8f.mjs → act-Bh3t-NuH.mjs} +23 -29
  3. package/dist/{activity-CdpXXSq2.mjs → activity-CANftndU.mjs} +3 -3
  4. package/dist/{agent-device-usage-output-D0582GHy.mjs → agent-device-usage-output-CuROXefb.mjs} +3 -3
  5. package/dist/{android-CGctfYpv.mjs → android-27_JgJ1T.mjs} +3 -3
  6. package/dist/{android-CaSsewbu.mjs → android-Biwc4Dck.mjs} +5 -5
  7. package/dist/{android-BPBARZMR.mjs → android-DGLG_VQ3.mjs} +1 -1
  8. package/dist/{android-BBwLpxRh.mjs → android-Z6Eev9rL.mjs} +44 -38
  9. package/dist/{android-cas-p8gna03x.mjs → android-cas-BDAwwL82.mjs} +2 -2
  10. package/dist/{android-image-DY8KxK2m.mjs → android-image-BcUD6bPi.mjs} +2 -2
  11. package/dist/api.d.mts +2 -2
  12. package/dist/api.mjs +25 -25
  13. package/dist/{apk-signed-tail-BMv-KLcB.mjs → apk-signed-tail-DHMkXs4s.mjs} +2 -2
  14. package/dist/{artifact-BsimBWxG.mjs → artifact-Dc1GsK7o.mjs} +28 -14
  15. package/dist/{artifact-BrNZTZtA.mjs → artifact-sGoFVK1q.mjs} +11 -11
  16. package/dist/{auto-placement-CFKNrWLU.mjs → auto-placement-RNh4kx2T.mjs} +6 -6
  17. package/dist/{browser-web-YFsgCP_a.mjs → browser-web-7Oj57Roa.mjs} +10 -10
  18. package/dist/{build-DIhuoozz.mjs → build-DkE5vjp1.mjs} +22 -22
  19. package/dist/{build-cache-Dt-dhCJF.mjs → build-cache-CJ65Efv7.mjs} +7 -4
  20. package/dist/{build-plan-CgnLDof9.mjs → build-plan-DWajg5l_.mjs} +7 -6
  21. package/dist/{cli-BGUrlSH3.mjs → cli-BSlwv9hI.mjs} +18 -18
  22. package/dist/cli.mjs +1 -1
  23. package/dist/{client-DU6dnGX1.mjs → client-qwmHFSga.mjs} +12 -8
  24. package/dist/collector-run.mjs +3 -3
  25. package/dist/{command-output-ByEmIwur.mjs → command-output-DsjhOzJ3.mjs} +1 -1
  26. package/dist/{dependencies-BozoTBqa.mjs → dependencies-oku1ZLep.mjs} +76 -41
  27. package/dist/{dependency-state-BQeC4FVn.mjs → dependency-state-CBhPJAs_.mjs} +1 -1
  28. package/dist/{dev-client-3SQzMRXZ.mjs → dev-client-DL5UtVdx.mjs} +2 -2
  29. package/dist/{device-DGMvzoZZ.mjs → device-CxMwX0VO.mjs} +15 -14
  30. package/dist/{device-android-CBat355q.mjs → device-android-CSlBXuh_.mjs} +7 -7
  31. package/dist/{device-capacity-DWUOvY13.mjs → device-capacity-D_IlxZRL.mjs} +78 -31
  32. package/dist/device-host-worker.mjs +24 -12
  33. package/dist/{device-pool-B8IqZKqm.mjs → device-pool-BEaTdtss.mjs} +2 -2
  34. package/dist/{device-provision-DWAoSKEw.mjs → device-provision-C9NPdCne.mjs} +8 -8
  35. package/dist/{device-BIg1iExg.mjs → device-yfuJ-v4s.mjs} +9 -9
  36. package/dist/{doctor-CxgR5vPi.mjs → doctor-BAA3zN5U.mjs} +1 -1
  37. package/dist/{doctor-CPzwqcXY.mjs → doctor-BQ1Kl44s.mjs} +13 -19
  38. package/dist/{doctor-Bknt0121.mjs → doctor-QNzDE4aW.mjs} +18 -18
  39. package/dist/doctor-fingerprint.mjs +1 -1
  40. package/dist/{doctor-watchman-CPE4C8KV.mjs → doctor-watchman-B8e3s9ko.mjs} +3 -3
  41. package/dist/{eas-build-CwOXKJwa.mjs → eas-build-4rg9WpEg.mjs} +2 -2
  42. package/dist/{eas-fallback-Cnb12a50.mjs → eas-fallback-UGo0SG7T.mjs} +3 -3
  43. package/dist/{eas-session-ledger-TE1miVz5.mjs → eas-session-ledger-BDpSdFDM.mjs} +4 -4
  44. package/dist/{error-diagnostics-CXTT3bYC.mjs → error-diagnostics-CW9xl6ot.mjs} +7 -7
  45. package/dist/{gc-0jdcnDHs.mjs → gc-3DHVCn-k.mjs} +49 -33
  46. package/dist/{gc-1ZLq1djg.mjs → gc-BQ5dXnC7.mjs} +2 -2
  47. package/dist/{guide-COxIANZu.mjs → guide-DqJCc4vW.mjs} +138 -43
  48. package/dist/{hosted-android-D8JbIzgC.mjs → hosted-android-gwLspaz6.mjs} +3 -3
  49. package/dist/{hosted-client-BLwuXEZS.mjs → hosted-client-B_h_bTlz.mjs} +2 -2
  50. package/dist/{hosted-logs-BWEQNJx_.mjs → hosted-logs-BpQSRDRU.mjs} +15 -8
  51. package/dist/{hosted-logs-sync-uWSrH2mf.mjs → hosted-logs-sync-D3L1hDpM.mjs} +5 -5
  52. package/dist/{hosted-macos-BnCYAv1y.mjs → hosted-macos-GK4O1s7x.mjs} +5 -5
  53. package/dist/{hosted-native-OBT2sJxn.mjs → hosted-native-B6ur_0OJ.mjs} +7 -7
  54. package/dist/{ios-Bjz7aPLy.mjs → ios-Bi0bQiZ_.mjs} +8 -8
  55. package/dist/{ios-BveW7qK1.mjs → ios-DQEzde6f.mjs} +9 -6
  56. package/dist/{ios-CGyx4PA7.mjs → ios-M7nRVb33.mjs} +94 -32
  57. package/dist/{ios-device-ByrDWSpC.mjs → ios-device-BLm1BZB4.mjs} +1 -1
  58. package/dist/{ios-project-XHg87vyQ.mjs → ios-project-Bsm-eqwv.mjs} +6 -6
  59. package/dist/ios-runtime-DLiKoOkd.mjs +150 -0
  60. package/dist/{ios-signing-CRYQ1W42.mjs → ios-signing-rWR_Mu5Z.mjs} +1 -1
  61. package/dist/{ios-state-enWc5P6U.mjs → ios-state-tzD0s7pt.mjs} +1 -1
  62. package/dist/{js-swap-C6vl3vEd.mjs → js-swap-Cuky0ZAQ.mjs} +5 -5
  63. package/dist/{launch-f3RnbFW5.mjs → launch-B-pkNlqg.mjs} +17 -17
  64. package/dist/{lightened-Cdfmo8MO.mjs → lightened-KHWHmzGs.mjs} +4 -4
  65. package/dist/{logs-x3em2-oI.mjs → logs-B0etn-BD.mjs} +6 -6
  66. package/dist/{logs-DAjxBF3c.mjs → logs-HomiqPhV.mjs} +4 -4
  67. package/dist/{macos-ZfpWlzBO.mjs → macos-C5liDnbP.mjs} +1 -1
  68. package/dist/macos-run.mjs +1 -1
  69. package/dist/{macos-D_LAseN9.mjs → macos-zMxSibx5.mjs} +18 -19
  70. package/dist/maintenance-run.mjs +4 -4
  71. package/dist/{metro-TIQ1Wft-.mjs → metro-Cj6W4qOO.mjs} +1 -1
  72. package/dist/{metro-request-DcUxyaq8.mjs → metro-request-BWCl3Zco.mjs} +1 -1
  73. package/dist/{prebuild-BKkj3OyL.mjs → miss-reason-CeHvzeVm.mjs} +10 -270
  74. package/dist/{named-ports-BfEMi9bK.mjs → named-ports-DZ8DrkH1.mjs} +1 -1
  75. package/dist/{native-android-COOrNDk2.mjs → native-android-DtWLzg6g.mjs} +15 -15
  76. package/dist/{native-gradle-artifact-inputs-B4Mwydmf.mjs → native-gradle-artifact-inputs-D4w20_6d.mjs} +3 -3
  77. package/dist/{native-runtime-UxUBU8up.mjs → native-runtime-BfvvAJLd.mjs} +6 -6
  78. package/dist/{native-xcode-inputs-DUv7Q3ok.mjs → native-xcode-inputs-BHvnAq4o.mjs} +2 -2
  79. package/dist/{native-xcode-ios-DXcteLVi.mjs → native-xcode-ios-CYxrg_kK.mjs} +15 -15
  80. package/dist/offload-worker.mjs +19 -18
  81. package/dist/{ownership-CQTg6v1d.mjs → ownership-BLgOimfp.mjs} +2 -2
  82. package/dist/{phone-reverses-CHtco460.mjs → phone-reverses-vRveZKSG.mjs} +3 -3
  83. package/dist/{placement-log-oQnELAvQ.mjs → placement-log-CM0DSELs.mjs} +1 -1
  84. package/dist/{plan-placement-45EOlIG1.mjs → plan-placement-CIrvKq8y.mjs} +5 -5
  85. package/dist/{ports-DKO7EUNt.mjs → ports-CKORWlC0.mjs} +2 -2
  86. package/dist/{project-BCtQz48d.mjs → project-DIo71tGq.mjs} +14 -14
  87. package/dist/{react-native-android-MI4ktuhL.mjs → react-native-android-B7VYSlKj.mjs} +36 -27
  88. package/dist/{react-native-build-dixAL2G8.mjs → react-native-build-CFYTYmG4.mjs} +10 -7
  89. package/dist/{react-native-doctor-CvkWincj.mjs → react-native-doctor-CnpVfE0k.mjs} +5 -5
  90. package/dist/{react-native-ios-DF5otoBR.mjs → react-native-ios-ByeXo_NP.mjs} +15 -14
  91. package/dist/{recorded-build-CGHGCO8m.mjs → recorded-build-B4prJjSD.mjs} +1 -1
  92. package/dist/{recordings-BcOzqFD1.mjs → recordings-Byu5SzlI.mjs} +1 -1
  93. package/dist/{reload-DWxmO9dY.mjs → reload-DANrKhQR.mjs} +1 -1
  94. package/dist/{reload-DGWfNFwQ.mjs → reload-DTd9g1EG.mjs} +13 -13
  95. package/dist/{remote-DWYGW2f5.mjs → remote-BWuq9qHV.mjs} +3 -3
  96. package/dist/{remote-CV2jBcLv.mjs → remote-NOM82XE0.mjs} +8 -8
  97. package/dist/{result-CWyxwPvZ.mjs → result-C-ISEJ5F.mjs} +15 -15
  98. package/dist/{run-FZtMQgrx.mjs → run-DQwx6djG.mjs} +1 -1
  99. package/dist/{server-bare-Ksh1NKeI.mjs → server-bare-B_wRfchQ.mjs} +1 -1
  100. package/dist/{server-command-BO2DIsJV.mjs → server-command-DgXYowQf.mjs} +5 -5
  101. package/dist/{server-expo-ZS9_WaNG.mjs → server-expo-ByBM8DVv.mjs} +9 -7
  102. package/dist/server-expo-D7rwjAFp.mjs +2 -0
  103. package/dist/{settings-TYrzDh8T.mjs → settings-BthPoY3t.mjs} +2 -2
  104. package/dist/{settings-Ag4pbs0z.mjs → settings-Cz8kQJzr.mjs} +44 -8
  105. package/dist/{settings-payload-CUM0DYwz.mjs → settings-payload-BOcxsZ6k.mjs} +2 -2
  106. package/dist/{settings-write-D_9_IEx7.mjs → settings-write-BuMPL1rd.mjs} +3 -3
  107. package/dist/settings.schema.json +32 -2
  108. package/dist/{slot-launch-DW_29Bmu.mjs → slot-launch-BIm9w8kH.mjs} +5 -5
  109. package/dist/{stage-_8k8p7uq.mjs → stage-CX1Byp3n.mjs} +5 -4
  110. package/dist/{start-CdgtOksb.mjs → start-BZWr85b2.mjs} +1 -1
  111. package/dist/{start-CzBB5R7N.mjs → start-DI0ofPO-.mjs} +8 -8
  112. package/dist/{state-DsrFh3yv.mjs → state-45P8Kd6Z.mjs} +1 -1
  113. package/dist/{state-CfP-ccP8.mjs → state-C2vELPyr.mjs} +2 -2
  114. package/dist/{stats-BgTyuzib.mjs → stats-BDljWVWU.mjs} +3 -3
  115. package/dist/{status-C7Zzb-Eh.mjs → status-BG2S-a1d.mjs} +1 -1
  116. package/dist/{status-Bcdy5eHt.mjs → status-DEZjHP4q.mjs} +27 -29
  117. package/dist/{status-watch-DY0EZcmg.mjs → status-watch-Cs18eFkQ.mjs} +4 -4
  118. package/dist/status-worker.mjs +1 -1
  119. package/dist/{stop-iGkvEvDn.mjs → stop-B2zDplJa.mjs} +2 -2
  120. package/dist/{stop-CkmBkNyg.mjs → stop-BPrTEOaz.mjs} +14 -14
  121. package/dist/{stop-CbxsTKyZ.mjs → stop-DrxHVVX9.mjs} +4 -4
  122. package/dist/supervisor-run.mjs +11 -11
  123. package/dist/{support-CfYmOdQs.mjs → support-BeVRaMWT.mjs} +9 -9
  124. package/dist/{support-JZ4KRW0C.mjs → support-DBKG3Yyb.mjs} +5 -5
  125. package/dist/{swiftpm-artifact-inputs-C1rZDRDs.mjs → swiftpm-artifact-inputs-CfNAb6Vm.mjs} +1 -1
  126. package/dist/{swiftpm-macos-DRTjC7Ff.mjs → swiftpm-macos-xdHjJHIj.mjs} +7 -7
  127. package/dist/toolchain-CTsPS5tL.mjs +2 -0
  128. package/dist/{toolchain-BeD7tbBW.mjs → toolchain-CZvtCZ-m.mjs} +9 -6
  129. package/dist/{warm-progress-CJQ8tk5O.mjs → warm-progress-D3a0KviW.mjs} +17 -13
  130. package/dist/{web-BXbmysa1.mjs → web-BvAweypa.mjs} +6 -6
  131. package/dist/web-DDL3usMb.mjs +2 -0
  132. package/dist/web-run.mjs +4 -4
  133. package/dist/{workspace-state-DOPXG2Gp.mjs → workspace-state-CHEN_xzy.mjs} +1 -1
  134. package/dist/{workspaces-DCzDzydB.mjs → workspaces-BgAYIccE.mjs} +213 -50
  135. package/dist/{worktree-6ngObKkw.mjs → worktree-C0YZ6mnk.mjs} +1 -1
  136. package/dist/{worktree-BAC43Kio.mjs → worktree-kGPE9Pcw.mjs} +335 -33
  137. package/package.json +7 -7
  138. package/dist/server-expo-9hQwyLze.mjs +0 -2
  139. package/dist/toolchain-CNlKc9pH.mjs +0 -2
  140. package/dist/web-BcaySU05.mjs +0 -2
@@ -1,12 +1,12 @@
1
1
  import { t as getExecutor } from "./exec-L37dbiIb.mjs";
2
- import { r as readWorkspaceState$1 } from "./workspace-state-DOPXG2Gp.mjs";
3
- import { v as launchErrorPreview } from "./command-output-ByEmIwur.mjs";
2
+ import { r as readWorkspaceState$1 } from "./workspace-state-CHEN_xzy.mjs";
3
+ import { v as launchErrorPreview } from "./command-output-DsjhOzJ3.mjs";
4
4
  import { ft as deviceSlotKey, m as getProject, pt as deviceSlotPlatforms } from "./config-CNmN-ndb.mjs";
5
- import { I as readWorkspaceLaunches } from "./project-BCtQz48d.mjs";
6
- import { o as androidHome, u as androidToolCwd } from "./android-CGctfYpv.mjs";
7
- import { d as resolveProjectMetro } from "./metro-TIQ1Wft-.mjs";
8
- import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-BPBARZMR.mjs";
9
- import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-CdpXXSq2.mjs";
5
+ import { I as readWorkspaceLaunches } from "./project-DIo71tGq.mjs";
6
+ import { o as androidHome, u as androidToolCwd } from "./android-27_JgJ1T.mjs";
7
+ import { d as resolveProjectMetro } from "./metro-Cj6W4qOO.mjs";
8
+ import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-DGLG_VQ3.mjs";
9
+ import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-CANftndU.mjs";
10
10
  import { r as deviceConsoleLevel } from "./ios-device-ygijU78G.mjs";
11
11
  import { createHash, randomUUID } from "node:crypto";
12
12
  import { existsSync, readFileSync, renameSync } from "node:fs";
@@ -1,24 +1,24 @@
1
1
  import { D as ownership_claim_exports, T as process_identity_exports, _ as declareSpawnsOn, d as throwIfCancelled, f as WorkspaceProcessCleanupError, t as getExecutor, w as withDrainingCancellation, x as stopDeclaringSpawnsOn } from "./exec-L37dbiIb.mjs";
2
- import { E as workspaceDir, u as workspaceLastUsed } from "./workspace-state-DOPXG2Gp.mjs";
3
- import { d as quotedPath$1, h as shortUdid, o as formatLongDuration, u as plural } from "./command-output-ByEmIwur.mjs";
2
+ import { E as workspaceDir, u as workspaceLastUsed } from "./workspace-state-CHEN_xzy.mjs";
3
+ import { d as quotedPath$1, h as shortUdid, o as formatLongDuration, u as plural } from "./command-output-DsjhOzJ3.mjs";
4
4
  import { A as withConfigLockAsync$1, C as removeProject, N as acquireAvdClaim, at as isAbsentPath, ct as measuredDirectorySizeAsync, d as getConfigDir, gt as projectDeviceSlots, it as formatBytes, ot as isOnMountedVolume, rt as directorySizeAsync, st as listMountedVolumes, v as loadConfig$1 } from "./config-CNmN-ndb.mjs";
5
5
  import { t as runOperationFile } from "./operation-exec-DNynwpqO.mjs";
6
- import { $t as TRASH_MANIFEST, Ft as matchWorktreeEntry, Wt as resolveSourceCheckoutAsync, Zt as TRASH_CLAIMS, en as deleteTrashEntry, jt as listWorktreesAsync } from "./settings-Ag4pbs0z.mjs";
7
- import { i as findProjectRoot$1, v as detectIsExpo } from "./project-BCtQz48d.mjs";
8
- import { B as listOrphanedAvdDirectories, Et as readCreatedDevices$1, R as listAvdsAsync, Tt as forgetCreatedDeviceAsync, U as ownedAvdDirectory, bt as parkedMaxSetting, h as avdNameAbsent, mt as POOL_SETTING_REMEDY } from "./android-CGctfYpv.mjs";
9
- import { Ar as sizeCaches, At as deleteParkedAvds, Bt as unverifiedDeviceCommand, Cr as scopedMemoryReport, Dt as collectDeviceLeases, Et as DEVICE_LIST_TIMEOUT_MS, Ft as deviceSweepIsScoped, Gt as withRemoteSessionGcLocks, Ht as collectEasSessionSweep, It as eraseParkedDevices, Lt as findOrphanedDevices, Mt as deleteProjectDevices, Or as discoverCaches, Ot as collectParkedAvds, Pt as describeUnverifiableDevices, Rt as findStaleDeviceRecords, Sr as reclaimMemory, St as includesGradleVersions, Tr as phase, Tt as collectInventory, Ut as deleteEasSessions, Vt as withAndroidAvdSizes, Wn as runProcessOperation, Wt as describeError, _r as memoryCacheKind, _t as collectGradleVersions, br as memorySweepIsScoped, bt as gradleVersionLines, ct as includesParkedDevices, dt as isWorkspacesScope, fr as parseArchiveSelector, ft as planCacheEmptying, gt as trimCaches, hr as collectMemoryReport, ht as selectsBeyondCaches, it as openGcLog, jt as deleteParkedSims, kt as collectParkedSims, lt as includesRecordings, mt as selectCaches, nn as withEasProjectLock, nt as gcOptionsOf, ot as emptyCaches, pt as previewScopedEmptying, st as includesArchives, ut as includesWorkspaceOutputs, vr as memoryLines, wt as getMachineCacheReport, xr as memoryWorkPending, xt as gradleVersionsPending, yr as memoryScope, yt as deleteGradleVersions, zt as findStaleProjectDevices } from "./device-capacity-DWUOvY13.mjs";
10
- import { n as easMachineStateRoot$1, o as removeEasSessionClaimAsync, r as readEasSessionLedger$1 } from "./eas-session-ledger-TE1miVz5.mjs";
11
- import { At as mapLimited, Dt as createGcResults, Et as GC_OUTPUT, I as idleDeviceLines, M as collectIdleDevices, Mt as sizeConcurrency, N as collectIdleDevicesAsync, R as parseIdleDuration, a as collectOrphanedWorkspaces, b as workspaceInUseAsync, c as isInsideWorkspaces, f as rootPresence, g as ARTIFACT_DIRS, i as clearWorkspaceOutputs, jt as readConcurrency, kt as eachLimited, n as REBUILD_COST, o as collectWorkspaceOutputs, p as sizeText, r as WORKSPACE_OUTPUT_DIRS, s as deleteOrphanedWorkspaces, t as LIGHTEN_AFTER_MS, u as listWorkspaceDirs, v as withIdleWorkspace, wt as listBuildSlots, z as shutDownIdleDevices } from "./workspaces-DCzDzydB.mjs";
12
- import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
13
- import { N as listBuildLocks, k as removeExpiredLease } from "./activity-CdpXXSq2.mjs";
14
- import { d as listAllIosSims, f as listAllIosSimsAsync } from "./ios-BveW7qK1.mjs";
6
+ import { $t as TRASH_MANIFEST, Ft as matchWorktreeEntry, Wt as resolveSourceCheckoutAsync, Zt as TRASH_CLAIMS, en as deleteTrashEntry, jt as listWorktreesAsync } from "./settings-Cz8kQJzr.mjs";
7
+ import { i as findProjectRoot$1, v as detectIsExpo } from "./project-DIo71tGq.mjs";
8
+ import { B as listOrphanedAvdDirectories, Et as readCreatedDevices$1, R as listAvdsAsync, Tt as forgetCreatedDeviceAsync, U as ownedAvdDirectory, bt as parkedMaxSetting, h as avdNameAbsent, mt as POOL_SETTING_REMEDY } from "./android-27_JgJ1T.mjs";
9
+ import { At as collectParkedSims, Bt as findOrphanedDevices, Cr as memorySweepIsScoped, Ct as includesGradleVersions, Dt as DEVICE_LIST_TIMEOUT_MS, Er as scopedMemoryReport, Et as collectInventory, Gt as collectEasSessionSweep, Ht as findStaleProjectDevices, It as describeUnverifiableDevices, Jt as withRemoteSessionGcLocks, Kt as deleteEasSessions, Lt as deviceSweepIsScoped, Mt as deleteParkedSims, Nr as sizeCaches, Nt as deleteProjectDevices, Or as phase, Ot as collectDeviceLeases, Pt as describeDeadProjectDevices, Rt as eraseParkedDevices, Sr as memoryScope, St as gradleVersionsPending, Tr as reclaimMemory, Tt as getMachineCacheReport, Ut as unverifiedDeviceCommand, Vt as findStaleDeviceRecords, Wt as withAndroidAvdSizes, _t as trimCaches, an as withEasProjectLock, br as memoryCacheKind, bt as deleteGradleVersions, ct as includesParkedDevices, dt as isWorkspacesScope, ft as markOverCapCompilationCache, gt as selectsBeyondCaches, hr as parseArchiveSelector, ht as selectCaches, it as openGcLog, jr as discoverCaches, jt as deleteParkedAvds, kt as collectParkedAvds, lt as includesRecordings, mt as previewScopedEmptying, nt as gcOptionsOf, ot as emptyCaches, pt as planCacheEmptying, qn as runProcessOperation, qt as describeError, st as includesArchives, ut as includesWorkspaceOutputs, vr as collectMemoryReport, vt as collectGradleVersions, wr as memoryWorkPending, xr as memoryLines, xt as gradleVersionLines, zt as findDeadProjectOwnedDevices } from "./device-capacity-D_IlxZRL.mjs";
10
+ import { n as easMachineStateRoot$1, o as removeEasSessionClaimAsync, r as readEasSessionLedger$1 } from "./eas-session-ledger-BDpSdFDM.mjs";
11
+ import { At as eachLimited, B as shutDownIdleDevices, Dt as GC_OUTPUT, L as idleDeviceLines, Mt as readConcurrency, N as collectIdleDevices, Nt as sizeConcurrency, Ot as createGcResults, P as collectIdleDevicesAsync, S as pruneEmptyProcessLockDirs, Tt as listBuildSlots, a as collectOrphanedWorkspaces, b as workspaceInUseAsync, c as isInsideWorkspaces, f as rootPresence, g as ARTIFACT_DIRS, i as clearWorkspaceOutputs, jt as mapLimited, n as REBUILD_COST, o as collectWorkspaceOutputs, p as sizeText, r as WORKSPACE_OUTPUT_DIRS, s as deleteOrphanedWorkspaces, t as LIGHTEN_AFTER_MS, u as listWorkspaceDirs, v as withIdleWorkspace, z as parseIdleDuration } from "./workspaces-BgAYIccE.mjs";
15
12
  import { t as resolveMaintenanceSettings } from "./settings-D9LtQaUw.mjs";
16
- import { r as readCollectors } from "./ownership-CQTg6v1d.mjs";
17
- import { A as deleteSelectedArchives, O as classifyProjectEntries, j as sweepArchiveStaging, k as reclaimProject } from "./worktree-BAC43Kio.mjs";
18
- import { p as writeCacheFile } from "./warm-progress-CJQ8tk5O.mjs";
19
- import { a as restoreProblem, o as workspaceKeys } from "./lightened-Cdfmo8MO.mjs";
20
- import { C as candidateRootsAsync, D as worktreeRemovalReason, E as worktreePullRequestNote, S as maintenancePinned, T as removeWorktrees, _ as finishedWorkspaces, a as previewMaintenance, b as cachedDeviceActivity, c as deleteTempLeftovers, d as appRoots, f as artifactWorktrees, g as stopIdleWorkspace, h as planIdleStop, l as tempLeftoverLines, m as collectArtifactsAsync, o as triggeringRoot, p as clearArtifact, s as collectTempLeftovers, t as deleteIdleWorkspaceDevices, u as tempLeftoverSection, w as collectWorktreeSweep, x as cachedDeviceActivityAsync, y as ownedDeviceUsage } from "./act-BGAFjY8f.mjs";
21
- import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-D0582GHy.mjs";
13
+ import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
14
+ import { N as listBuildLocks, k as removeExpiredLease } from "./activity-CANftndU.mjs";
15
+ import { d as listAllIosSims, f as listAllIosSimsAsync } from "./ios-DQEzde6f.mjs";
16
+ import { r as readCollectors } from "./ownership-BLgOimfp.mjs";
17
+ import { A as deleteSelectedArchives, O as classifyProjectEntries, j as sweepArchiveStaging, k as reclaimProject } from "./worktree-kGPE9Pcw.mjs";
18
+ import { p as writeCacheFile } from "./warm-progress-D3a0KviW.mjs";
19
+ import { a as restoreProblem, o as workspaceKeys } from "./lightened-KHWHmzGs.mjs";
20
+ import { C as candidateRootsAsync, D as worktreeRemovalReason, E as worktreePullRequestNote, S as maintenancePinned, T as removeWorktrees, _ as finishedWorkspaces, a as previewMaintenance, b as cachedDeviceActivity, c as deleteTempLeftovers, d as appRoots, f as artifactWorktrees, g as stopIdleWorkspace, h as planIdleStop, l as tempLeftoverLines, m as collectArtifactsAsync, o as triggeringRoot, p as clearArtifact, s as collectTempLeftovers, t as deleteIdleWorkspaceDevices, u as tempLeftoverSection, w as collectWorktreeSweep, x as cachedDeviceActivityAsync, y as ownedDeviceUsage } from "./act-Bh3t-NuH.mjs";
21
+ import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-CuROXefb.mjs";
22
22
  import { claimRemoveCommand, isClaimRefusal, isClaimUnavailable, readClaimSet, releaseClaim, tryAcquireClaim } from "@stim-cli/core/ownership-claim";
23
23
  import { existsSync, lstatSync, readFileSync, readdirSync, statSync } from "node:fs";
24
24
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
@@ -121,10 +121,6 @@ function archiveWorkPending(selection, otherWork) {
121
121
  //#endregion
122
122
  //#region src/commands/gc/eas-ledger.ts
123
123
  const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
124
- /**
125
- * An entry is dropped only when its id cannot be an EAS session id and its workspace root is provably gone:
126
- * absolute, missing, and on a mounted volume, the same proof gc uses for dead project entries.
127
- */
128
124
  function isStaleEasLedgerEntry(claim, mountedVolumes, exists = existsSync) {
129
125
  if (UUID.test(claim.sessionId)) return false;
130
126
  const root = claim.workspaceRoot;
@@ -238,7 +234,11 @@ function machineCacheLines(report, now = Date.now()) {
238
234
  }
239
235
  //#endregion
240
236
  //#region src/commands/gc/status-caches.ts
241
- const KINDS = ["disk-usage", "pull-request"];
237
+ const KINDS = [
238
+ "disk-usage",
239
+ "pull-request",
240
+ "git-merge"
241
+ ];
242
242
  const KEPT_REASON = {
243
243
  unreadable: "the file records no readable path of its own",
244
244
  unknown: "Stim cannot tell whether the folder it measures still exists",
@@ -1000,7 +1000,7 @@ function orphanedWorkspaceLines(orphaned) {
1000
1000
  const lines = [`Orphaned workspace directories (${orphaned.length}):`];
1001
1001
  for (const entry of orphaned) {
1002
1002
  lines.push(` ${entry.dir}${entry.bytes === void 0 ? "" : ` - ${sizeText(entry.bytes)}`}`);
1003
- lines.push(` recorded project root ${entry.projectRoot} is gone and no registry entry names it`);
1003
+ lines.push(entry.projectRoot === null ? " it is empty and has no workspace.json" : ` ${entry.residue ? "the project root its logs name" : "recorded project root"} ${entry.projectRoot} is gone and no registry entry names it`);
1004
1004
  }
1005
1005
  lines.push(" --delete re-checks each directory, then removes it whole.");
1006
1006
  return lines;
@@ -2296,7 +2296,7 @@ async function collectGcReport({ olderThan = null, cache = null, worktrees = fal
2296
2296
  const selected = selectCaches(discoverCaches(env, operation?.cwd), scope).filter((c) => !withWorkspaces || !isInsideWorkspaces(c.dir));
2297
2297
  if (selected.length) phase("caches", `measuring ${plural(selected.length, "shared cache")}`, operation);
2298
2298
  const sized = await sizeCaches(selected, operation);
2299
- const caches = scope === null ? previewScopedEmptying(sized, env) : planCacheEmptying(sized, all, env);
2299
+ const caches = scope === null ? markOverCapCompilationCache(previewScopedEmptying(sized, env), env) : planCacheEmptying(sized, all, env);
2300
2300
  if (scope) return {
2301
2301
  archives: includesArchives(scope) ? await collectArchives(scope, olderThan, now, operation?.signal) : void 0,
2302
2302
  skipped: [],
@@ -2446,14 +2446,14 @@ async function collectGcReport({ olderThan = null, cache = null, worktrees = fal
2446
2446
  const unsweepableReason = cfg === null ? "no Stim config found" : deviceSweepIsScoped(env) ? "STIM_HOME scopes this config, but simulators and AVDs are machine-global" : null;
2447
2447
  phase("devices", "listing simulators and emulators", operation);
2448
2448
  if (unsweepableReason) {
2449
- let simNames = [];
2449
+ let allSims = [];
2450
2450
  let avdNames = [];
2451
2451
  try {
2452
- simNames = (await listAllIosSimsAsync({
2452
+ allSims = await listAllIosSimsAsync({
2453
2453
  timeoutMs: DEVICE_LIST_TIMEOUT_MS,
2454
2454
  operation,
2455
2455
  signal: operation?.signal
2456
- })).map((s) => s.name);
2456
+ });
2457
2457
  } catch (error) {
2458
2458
  if (error instanceof WorkspaceProcessCleanupError) throw error;
2459
2459
  operation?.signal.throwIfAborted();
@@ -2468,7 +2468,14 @@ async function collectGcReport({ olderThan = null, cache = null, worktrees = fal
2468
2468
  if (error instanceof WorkspaceProcessCleanupError) throw error;
2469
2469
  operation?.signal.throwIfAborted();
2470
2470
  }
2471
- deviceSweepNotices.push(...describeUnverifiableDevices(simNames, avdNames, { reason: unsweepableReason }));
2471
+ const deadOwned = cfg === null ? [] : findDeadProjectOwnedDevices({
2472
+ config: cfg,
2473
+ deadProjects,
2474
+ sims: allSims,
2475
+ avds: avdNames
2476
+ });
2477
+ const deadOwnedIds = new Set(deadOwned.map((device) => device.id));
2478
+ deviceSweepNotices.push(...describeDeadProjectDevices(deadOwned), ...describeUnverifiableDevices(allSims.filter((sim) => !deadOwnedIds.has(sim.udid)).map((sim) => sim.name), avdNames.filter((name) => !deadOwnedIds.has(name)), { reason: unsweepableReason }));
2472
2479
  } else {
2473
2480
  let sims = [];
2474
2481
  let simsChecked = true;
@@ -2891,6 +2898,7 @@ async function pruneDeadProjects(deadProjects, output, operation) {
2891
2898
  }
2892
2899
  const result = await reclaimProject(path, {
2893
2900
  archive: { removedBy: "gc" },
2901
+ deleteOwnedDevices: deviceSweepIsScoped(operation?.env ?? process.env),
2894
2902
  stopRequester: { by: "stim gc --delete" },
2895
2903
  operation
2896
2904
  }).catch((error) => {
@@ -2921,7 +2929,10 @@ async function pruneDeadProjects(deadProjects, output, operation) {
2921
2929
  if (result.killedPid) output.log(chalk.dim(` killed orphaned Metro pid ${result.killedPid}`));
2922
2930
  if (result.stoppedSession) output.log(chalk.dim(` stopped remote session ${result.stoppedSession}`));
2923
2931
  if (result.stoppedTunnel) output.log(chalk.dim(` stopped ${result.stoppedTunnel} tunnel`));
2924
- for (const name of result.deletedDevices) output.record("device", "done", name);
2932
+ for (const name of result.deletedDevices) {
2933
+ output.log(chalk.dim(` deleted owned device ${name}`));
2934
+ output.record("device", "done", name);
2935
+ }
2925
2936
  for (const s of result.skippedDevices) {
2926
2937
  output.log(chalk.yellow(` ${s.name}: ${s.reason}`));
2927
2938
  output.record("device", result.failedDevices.includes(s) ? "failed" : "kept", s.name, {
@@ -2965,7 +2976,7 @@ async function reclaimParkedDevices(report, deps, output) {
2965
2976
  }
2966
2977
  function reportActionable(report) {
2967
2978
  const { deadProjects, invalidProjects, orphanedDevices, staleDevices, staleDeviceRecords, buildLocks, buildSlots, deviceLeases, easSessionSweep, caches, olderThan, all, cacheScope: cache } = report;
2968
- return archiveWorkPending(report.archives, deadProjects.length + invalidProjects.length > 0 || report.orphanedWorkspaces.length > 0 || Boolean(report.workspaceOutputs?.workspaces.some((entry) => entry.willClear)) || Boolean(report.worktreeDependencies?.candidates.length) || report.workspaceLogs.some((entry) => entry.willTrim) || report.recordings.some((entry) => entry.willDelete && !entry.withWorkspace) || Boolean(report.tempLeftovers?.entries.some((entry) => entry.willDelete)) || Boolean(report.trash?.entries.some((entry) => entry.willDelete)) || Boolean(report.worktreeSweep?.worktrees.some((entry) => !entry.skipped)) || report.parkedSims.length > 0 || report.parkedAvds.length + report.parkedHostedDevices.filter((device) => device.listed !== false).length > 0 || orphanedDevices.length > 0 || staleDevices.length + report.finishedDevices.length > 0 || staleDeviceRecords.length > 0 || report.staleLedgerEntries.length + report.staleEasLedgerEntries.length > 0 || report.staleStatusCaches.length > 0 || buildLocks.stale.length > 0 || buildSlots.stale.length > 0 || deviceLeases.expired.length > 0 || easSessionSweep.orphaned.length > 0 || (olderThan !== null || all) && caches.length > 0 || scopedWorkPending(cache, report));
2979
+ return archiveWorkPending(report.archives, deadProjects.length + invalidProjects.length > 0 || report.orphanedWorkspaces.length > 0 || Boolean(report.workspaceOutputs?.workspaces.some((entry) => entry.willClear)) || Boolean(report.worktreeDependencies?.candidates.length) || report.workspaceLogs.some((entry) => entry.willTrim) || report.recordings.some((entry) => entry.willDelete && !entry.withWorkspace) || Boolean(report.tempLeftovers?.entries.some((entry) => entry.willDelete)) || Boolean(report.trash?.entries.some((entry) => entry.willDelete)) || Boolean(report.worktreeSweep?.worktrees.some((entry) => !entry.skipped)) || report.parkedSims.length > 0 || report.parkedAvds.length + report.parkedHostedDevices.filter((device) => device.listed !== false).length > 0 || orphanedDevices.length > 0 || staleDevices.length + report.finishedDevices.length > 0 || staleDeviceRecords.length > 0 || report.staleLedgerEntries.length + report.staleEasLedgerEntries.length > 0 || report.staleStatusCaches.length > 0 || buildLocks.stale.length > 0 || buildSlots.stale.length > 0 || deviceLeases.expired.length > 0 || easSessionSweep.orphaned.length > 0 || (olderThan !== null || all) && caches.length > 0 || caches.some((entry) => entry.willEmpty) || scopedWorkPending(cache, report));
2969
2980
  }
2970
2981
  async function runGcCore(opts, deps, execution, reportOnly = false) {
2971
2982
  const { output, takeResults } = execution;
@@ -3117,6 +3128,10 @@ async function runGcCore(opts, deps, execution, reportOnly = false) {
3117
3128
  output.record("buildLock", "done", `${lock.platform} build lock`, { id: lock.path });
3118
3129
  output.log(chalk.green(`Cleared the ${lock.platform} build lock left by pid ${lock.pid ?? "?"} (${lock.projectRoot || "unrecorded workspace"})`));
3119
3130
  }
3131
+ if (report.cacheScope === null) {
3132
+ const emptyLockDirs = pruneEmptyProcessLockDirs();
3133
+ if (emptyLockDirs > 0) output.log(chalk.dim(`Removed ${emptyLockDirs} empty process lock entries`));
3134
+ }
3120
3135
  for (const slot of buildSlots.stale) {
3121
3136
  throwIfCancelled(signal, "GC");
3122
3137
  const cleared = (0, ownership_claim_exports.clearFreeClaimSet)({
@@ -3171,12 +3186,13 @@ async function runGcCore(opts, deps, execution, reportOnly = false) {
3171
3186
  throwIfCancelled(signal, "GC");
3172
3187
  if (all) deleteFailures += await emptyCaches(caches, output, signal, deps.operation);
3173
3188
  else if (olderThan === null) {
3174
- if (caches.length) output.log(chalk.dim("Shared caches left alone: pass --cache all to empty them, or --older-than <days> to trim them."));
3175
- } else deleteFailures += (await trimCaches(caches, olderThan, output, signal, deps.operation)).failures;
3189
+ if (caches.some((entry) => !entry.willEmpty)) output.log(chalk.dim("Shared caches left alone: pass --cache all to empty them, or --older-than <days> to trim them."));
3190
+ } else deleteFailures += (await trimCaches(caches.filter((entry) => !entry.willEmpty), olderThan, output, signal, deps.operation)).failures;
3191
+ if (!all) deleteFailures += await emptyCaches(caches.filter((entry) => entry.willEmpty), output, signal, deps.operation);
3176
3192
  return payload(deleteFailures);
3177
3193
  }
3178
3194
  function gcCommand(program) {
3179
- program.command("gc").description("Report what Stim has left behind: dead project entries, orphaned workspace directories, clean Stim-managed linked worktrees whose branch is merged or whose pull request was merged or closed, orphaned owned devices and EAS sessions, records of devices that no longer exist, build locks whose builder is gone, expired physical-device leases, the shared build caches, the build outputs and logs of each workspace, the memory of watchman and of the Gradle and Kotlin daemons, and recognized leftovers in TMPDIR. Reports by default; pass --delete to act.").option("--worktrees", "also remove clean, idle Stim-managed linked worktrees, not only merged ones: with --delete run `stim worktree remove` (never --force) on each; idle means unused for --older-than days, 7 without it").option("--delete", "actually prune the reported entries, reap the reported devices, lighten every workspace that is not building and ran no ios, android or macos command in the last 15 minutes by clearing its build outputs, a running dev server or booted device included, trim its Metro, client and device logs to their newest 8 MiB, and, unless maintenance.mode is off, stop each workspace idle past maintenance.idleStopHours as stim stop does").option("--older-than <days>", "also reap owned devices whose workspace has not been used this long, trim shared cache entries nothing has used in that time and device recordings made before it, and clear workspace build outputs only for workspaces idle this long and parked devices only once parked this long", (v) => {
3195
+ program.command("gc").description("Report what Stim has left behind: dead project entries, orphaned workspace directories, clean Stim-managed linked worktrees whose branch is merged or whose pull request was merged or closed, orphaned owned devices and EAS sessions, records of devices that no longer exist, build locks whose builder is gone, expired physical-device leases, the shared build caches, the build outputs and logs of each workspace, the memory of watchman and of the Gradle and Kotlin daemons, and recognized leftovers in TMPDIR. Reports by default; pass --delete to act.").option("--worktrees", "also remove clean, idle Stim-managed linked worktrees, not only merged ones: with --delete run `stim worktree remove` (never --force) on each; idle means unused for --older-than days, 7 without it").option("--delete", "actually prune the reported entries, reap the reported devices, lighten every workspace that is not building and ran no ios, android or macos command in the last 15 minutes by clearing its build outputs, a running dev server or booted device included, trim its Metro, client and device logs to their newest 8 MiB, and, unless maintenance.mode is off, stop each workspace idle past maintenance.idleStopHours as stim stop does, and shut down the shared watchman daemon (after removing its stale roots) when no client, subscription or trigger uses it").option("--older-than <days>", "also reap owned devices whose workspace has not been used this long, trim shared cache entries nothing has used in that time and device recordings made before it, and clear workspace build outputs only for workspaces idle this long and parked devices only once parked this long", (v) => {
3180
3196
  const n = parseInt(v, 10);
3181
3197
  if (!Number.isFinite(n) || String(n) !== String(v).trim()) throw new InvalidArgumentError("must be a whole number of days, e.g. --older-than 30");
3182
3198
  return n;
@@ -1,3 +1,3 @@
1
- import { Lt as findOrphanedDevices, Nt as describeParkedSims, Pt as describeUnverifiableDevices, Rt as findStaleDeviceRecords, jt as deleteParkedSims, mt as selectCaches, zt as findStaleProjectDevices } from "./device-capacity-DWUOvY13.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-0jdcnDHs.mjs";
1
+ import { Bt as findOrphanedDevices, Ft as describeParkedSims, Ht as findStaleProjectDevices, It as describeUnverifiableDevices, Mt as deleteParkedSims, Vt as findStaleDeviceRecords, ht as selectCaches } from "./device-capacity-D_IlxZRL.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-3DHVCn-k.mjs";
3
3
  export { collectGcReport, gcCommand as default, deleteParkedSims, describeParkedSims, describeUnverifiableDevices, executeGc, findOrphanedDevices, findStaleDeviceRecords, findStaleProjectDevices, formatGcReport, readGcReport, runGc, selectCaches, withGcMaintenanceClaim };
@@ -1,8 +1,8 @@
1
- import { t as ANDROID_AVD_CONFIG_HELP } from "./settings-Ag4pbs0z.mjs";
2
- import { i as findProjectRoot$1 } from "./project-BCtQz48d.mjs";
3
- import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-TE1miVz5.mjs";
4
- import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-CPE4C8KV.mjs";
5
- import "./status-watch-DY0EZcmg.mjs";
1
+ import { t as ANDROID_AVD_CONFIG_HELP } from "./settings-Cz8kQJzr.mjs";
2
+ import { i as findProjectRoot$1 } from "./project-DIo71tGq.mjs";
3
+ import { h as RECENT_LAUNCH_MS } from "./eas-session-ledger-BDpSdFDM.mjs";
4
+ import { o as guideStatus, t as WATCHMAN_NESTED_WORKTREES } from "./doctor-watchman-B8e3s9ko.mjs";
5
+ import "./status-watch-Cs18eFkQ.mjs";
6
6
  import { SETTINGS, SETTINGS_SCHEMA_URL, TUTORIAL_VERSION } from "@stim-cli/core/state";
7
7
  import chalk from "chalk";
8
8
  //#region src/guide/agent.ts
@@ -1641,7 +1641,8 @@ RULES
1641
1641
  invalidProjects { path } the registry key is not absolute
1642
1642
  orphanedPorts { project, label, port }
1643
1643
  orphanedWorkspaces { dir, projectRoot, bytes } --delete removes the
1644
- whole workspace directory
1644
+ whole workspace directory; projectRoot is null
1645
+ for an empty directory with no workspace.json
1645
1646
  linkedWorktrees { path, idleDays, mergedInto, pullRequest,
1646
1647
  pullRequestUnknown, willRemove, reason,
1647
1648
  detail, eligibleAt, buildState } mergedInto is the
@@ -1732,9 +1733,10 @@ RULES
1732
1733
  whose absolute workspace root is missing on a
1733
1734
  mounted volume; --delete forgets the entry
1734
1735
  only and contacts no EAS session
1735
- staleStatusCaches { kind: "disk-usage" | "pull-request", path,
1736
- file, bytes } entries of $STIM_HOME/disk-usage
1737
- and pull-requests whose path is gone from a
1736
+ staleStatusCaches { kind: "disk-usage" | "pull-request" | "git-merge",
1737
+ path, file, bytes } entries of
1738
+ $STIM_HOME/disk-usage, pull-requests and
1739
+ git-merge whose path is gone from a
1738
1740
  mounted volume; --delete removes the file
1739
1741
  idleDevices { kind, id, name, project, slot, lastActivityAt,
1740
1742
  idleForMs, buildInProgress } booted owned
@@ -1869,12 +1871,14 @@ RULES
1869
1871
  "busy" | "unknown", reclaimable, reason,
1870
1872
  detail } without --cache, or with --cache
1871
1873
  watchman or gradle-daemons; reclaimable marks
1872
- the ones gc --delete --cache <cacheKind>
1873
- would stop (\`guide cleanup memory\`)
1874
+ the ones gc --delete would stop (watchman) or
1875
+ gc --delete --cache gradle-daemons would
1876
+ (\`guide cleanup memory\`)
1874
1877
  watchmanRoots { path, stale: "missing" | "pruned-worktree" |
1875
1878
  null, subscriptions, triggers, removable,
1876
1879
  detail } removable marks the stale roots
1877
- --cache watchman would watch-del
1880
+ gc --delete (or --cache watchman) would
1881
+ watch-del
1878
1882
  memoryNotices { message } why the memory sweep was skipped
1879
1883
  bytes is null when the size is unknown: not measured, or the measurement
1880
1884
  failed. idleDays is null when the last use is unknown. listed is false for
@@ -2860,6 +2864,9 @@ project's before exiting. You get your shell back with a bundler running: no
2860
2864
  backgrounding idiom, no sleep, no poll loop, and no chance of building against
2861
2865
  another worktree's bundler.
2862
2866
 
2867
+ If Expo cannot be resolved in a linked worktree, run \`stim worktree warm\`
2868
+ there before retrying. The refusal also names dependency installation.
2869
+
2863
2870
  --json one line of facts on stdout, everything else on stderr:
2864
2871
  { port, supervisorPid, mode, logsDir, alreadyRunning }
2865
2872
  --wait <seconds> how long to wait for server and remote tunnel readiness
@@ -3028,8 +3035,9 @@ WHAT THE SUPERVISOR IS
3028
3035
  for the bundle lines.
3029
3036
 
3030
3037
  expo-child and command-child put the Node the app pins (.nvmrc,
3031
- .node-version, .tool-versions nodejs, or package.json volta.node) first
3032
- on PATH when an nvm, fnm, Volta, asdf, mise or linked Homebrew
3038
+ .node-version, .tool-versions nodejs, or package.json volta.node), looking
3039
+ from the app directory up to its repository or worktree root, first on PATH
3040
+ when an nvm, fnm, Volta, asdf, mise or linked Homebrew
3033
3041
  node/node@NN install satisfies the pin and the node already on PATH does
3034
3042
  not; the metro log then records a project_node event naming it. When no
3035
3043
  install has the version the pin names, the newest install of the pinned
@@ -4057,7 +4065,8 @@ Branch on the code, never on the message.`,
4057
4065
  the first diagnostics are the phase names and the last error lines the
4058
4066
  script printed, ahead of the compiler diagnostics.
4059
4067
  Three Android refusals share this code without gradle itself failing:
4060
- - NO ANDROID SDK, before gradle starts: nothing exists at the SDK path
4068
+ - NO ANDROID SDK, before gradle starts: local React Native emulator runs
4069
+ refuse before Metro or device setup. Nothing exists at the SDK path
4061
4070
  Stim resolves (ANDROID_HOME, else ANDROID_SDK_ROOT, else the default
4062
4071
  location), and there is no android/local.properties. Set ANDROID_HOME to the SDK or write sdk.dir
4063
4072
  into android/local.properties; \`stim doctor --platform android\` reports
@@ -4299,7 +4308,9 @@ too old to speak protocol 2, incompatible
4299
4308
  toolchain/runtime/CPU, low disk, busy, sync/build failure, artifact failure,
4300
4309
  or a checkout that changed while it built. Unsupported build kinds also refuse.
4301
4310
  No local xcodebuild, Gradle or SwiftPM compile or alternate machine follows a
4302
- refusal. For stim ios, a toolchain difference on the named machine, such as Xcode,
4311
+ refusal. For stim android, a known toolchain refusal on the named machine stops
4312
+ before prebuild; busy, low disk and unreachable are checked again afterward.
4313
+ For stim ios, a toolchain difference on the named machine, such as Xcode,
4303
4314
  the simulator runtime or the CPU, refuses before this machine runs prebuild or pod
4304
4315
  install, even when prebuild would have produced an app the local cache already holds, or the
4305
4316
  machine already holds the exact artifact. A
@@ -4794,7 +4805,8 @@ so a Debug run on one is wired to a LAN origin instead of localhost.`,
4794
4805
  owned by this Stim home, or it is not booted or running. Permission and push
4795
4806
  also refuse when no app is recorded for the device. Run the platform command
4796
4807
  the remedy names (\`stim ios\` or \`stim android\`, with \`--slot\` for a named
4797
- slot) and retry. No tool runs before this refusal.`
4808
+ slot) and retry. A non-Mac client cannot run a local iOS simulator; run the
4809
+ iOS tool on a Mac with a local Stim-owned simulator. No tool runs before this refusal.`
4798
4810
  },
4799
4811
  STIM_DEVICE_TOOL_UNSUPPORTED: {
4800
4812
  summary: "that device tool has no equivalent on that platform",
@@ -5576,6 +5588,16 @@ not on any remote" (worktree remove)
5576
5588
  source path and warm cannot move it, it prints "removed <dir>/Pods/Manifest.lock
5577
5589
  so pod install runs" and \`stim ios\` runs \`pod install\`.
5578
5590
 
5591
+ "carry left out <app>/<platform>: <reason>"
5592
+ The app is an Expo project whose ios/ or android/ Git ignores, and Stim
5593
+ cannot show the source checkout's copy was generated from the app's current
5594
+ inputs: Stim has no prebuild record for it, its last prebuild did not
5595
+ finish, or the record names an earlier native fingerprint. Warm does not
5596
+ copy it, so the first \`stim <platform>\` in this worktree generates it
5597
+ fresh. Nothing to fix. To let later warms copy it, delete <platform>/ in
5598
+ the source checkout and run \`stim <platform>\` there, so Stim generates it
5599
+ fresh and records that.
5600
+
5579
5601
  "carry carried <dir>/Pods but there is no <dir>/Podfile.lock"
5580
5602
  Warm copied Pods but the destination has no Podfile.lock. Follow the printed
5581
5603
  pod-install command before building.
@@ -6203,7 +6225,9 @@ not the caller's. The returned fingerprint remains null; transfer digests never
6203
6225
  become reusable APK cache keys. Workers with native-gradle-peer-cache can offer a
6204
6226
  completed APK for declared source and resolved variant, ABI and build options,
6205
6227
  rechecking current private inputs against the saved receipt at offer and fetch.
6206
- A hit skips source upload and compilation even while that worker is busy or
6228
+ When this machine has a JDK, native-gradle-peer-jdk also selects that exact
6229
+ JDK major for the private-input check. Older workers skip this lookup and use
6230
+ normal build placement. A hit skips source upload and compilation even while that worker is busy or
6207
6231
  this machine has room. A miss follows normal placement; older Gradle workers
6208
6232
  still build normally. Off mode, explicit local builds and disabled remote cache
6209
6233
  reads skip peer lookup. Hosts without native-gradle-build refuse before upload.
@@ -6232,6 +6256,7 @@ cleanup stops that workspace, including resources created before a build fails.
6232
6256
 
6233
6257
  Or install npm install --global @stim-cli/ci and use stim-ci directly.
6234
6258
  Platforms: ios, android, macos, web. Everything after -- is argv, not a shell.
6259
+ Without --, run installs and launches the app, then stops it with exit code 0.
6235
6260
  build is the only step that compiles (or restores from the cache, or with
6236
6261
  --eas-profile downloads an EAS development build). It records the app for this
6237
6262
  checkout, platform and selectors (iOS scheme and configuration, Android variant)
@@ -6714,8 +6739,10 @@ ${HOSTED_RECORDING("simulator")}
6714
6739
 
6715
6740
  If hosting.agentDriver is none, the driver cannot enforce its policy, or the
6716
6741
  host does not advertise hosted-ios-agent, agent reports
6717
- { driver: 'none', setting: 'hosting.agentDriver' }. Update the host and check
6718
- its setting and agent-device installation. No other simulator becomes reachable.
6742
+ { driver: 'none', setting: 'hosting.agentDriver' }. A run whose host disables
6743
+ the driver prints a notice; plain status also names the host setting when
6744
+ agent control is unavailable. Update the host and check its setting and
6745
+ agent-device installation. No other simulator becomes reachable.
6719
6746
  Client hello carries only name and version, not features, so the host cannot gate
6720
6747
  daemon startup or grant issuance on client support. The client checks the host's
6721
6748
  hosted-ios-agent feature before using a grant.
@@ -7759,7 +7786,7 @@ WHAT MAKES THE CACHE ACTUALLY HIT: .FINGERPRINTIGNORE
7759
7786
  looks exactly like a cache that is not there.
7760
7787
 
7761
7788
  Stim ignores paths a fresh checkout never has and no native Debug build
7762
- reads: android/local.properties, android/.idea, *.xcodeproj/xcuserdata, and,
7789
+ reads: android/local.properties, android/.idea, *.xcodeproj/xcuserdata, .git (and its contents), .expo, and,
7763
7790
  while a .gitignore pattern matches them (even when committed), the
7764
7791
  \`react-native bundle\` output ios/main.jsbundle and ios/assets. A project
7765
7792
  does not repeat those.
@@ -8072,7 +8099,7 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8072
8099
  summary: "every flag per command, Android variants and flavors, the per-run simulator model, runtime and system image",
8073
8100
  body: () => `THE OPTION SURFACE, IN FULL
8074
8101
  start --json --wait <seconds> --remote --reset-cache
8075
- ios --remote-build <local|auto|remote|remote-only|name> --slot <name> --json --plan --no-metro-check --no-build-cache --scheme <name> --configuration <name> --device-type <name> --runtime <version> --simulator-app <xcode|siniulator|stim-desktop> --device [udid] --wait <seconds> --no-wait --remote <eas|proxy|local|auto|remote|remote-only|machine>
8102
+ ios --remote-build <local|auto|remote|remote-only|name> --slot <name> --json --plan --no-metro-check --no-build-cache --scheme <name> --configuration <name> --device-type <name> --runtime <version> --install-runtime --simulator-app <xcode|siniulator|stim-desktop> --device [udid] --wait <seconds> --no-wait --remote <eas|proxy|local|auto|remote|remote-only|machine>
8076
8103
  android --remote-build <local|auto|remote|remote-only|name> --slot <name> --json --plan --no-metro-check --no-build-cache --variant <name> --system-image <id> --device-profile <id> --device [serial] --wait <seconds> --no-wait --remote <proxy|eas|local|auto|remote|remote-only|machine>
8077
8104
  ios/android --wait bounds owned-device slot waits (default 600s), or physical
8078
8105
  leases with --device (default 60s). Remote targets do not join this local
@@ -8291,6 +8318,17 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8291
8318
  cannot (stale node_modules, a leftover path, an error), warm deletes
8292
8319
  ios/Pods/Manifest.lock so \`stim ios\` runs \`pod install\`.
8293
8320
 
8321
+ In an Expo project whose ios/ or android/ Git ignores, warm copies that
8322
+ directory only when the source's last Stim prebuild of it ran on the app's
8323
+ current native fingerprint, and records the same prebuild in the worktree.
8324
+ Otherwise it leaves the directory out and prints
8325
+ "carry left out <app>/<platform>: <reason>"; the first
8326
+ \`stim <platform>\` there generates it fresh. A directory generated outside
8327
+ Stim has no record and is left out. To make it eligible, delete it in the
8328
+ source checkout and run \`stim <platform>\` there so Stim generates it
8329
+ fresh; running Stim over the existing directory records it as current even
8330
+ when it came from an older template.
8331
+
8294
8332
  Other generated state stays eligible: .gradle, .cxx, *.tsbuildinfo, build
8295
8333
  directories, and embedded JavaScript need project-specific decisions about
8296
8334
  regeneration. Native intermediates can record the source checkout's paths;
@@ -8354,6 +8392,26 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
8354
8392
  ios.runtime, android.systemImage, android.deviceProfile) for that one
8355
8393
  invocation, exactly as \`--configuration\` overrides ios.configuration.
8356
8394
 
8395
+ \`stim ios --runtime 26.5 --install-runtime --remote local\` installs that
8396
+ missing iOS runtime with Xcode, then continues the run. Use
8397
+ \`--remote <mac>\` for a named approved hosting Mac, including from Linux.
8398
+ ios.autoInstallRuntime enables the same opt-in for an explicit ios.runtime
8399
+ or --runtime version; it defaults to false. Installation requires an exact
8400
+ major.minor[.patch] version, about 8-10 GB to download (actual size varies),
8401
+ and at least 20 GB free on the simulator volume for download and unpacking.
8402
+ A child-aware ownership claim serializes Stim installs in this Mac's Stim
8403
+ home and the installer takes an available build slot. Run output shows
8404
+ Xcode progress locally and periodic waiting messages remotely; status shows
8405
+ the install phase and remote machine. Without opt-in, a missing runtime
8406
+ still refuses. Automatic placement, eas/proxy and physical-device runs do
8407
+ not install runtimes: choose --remote local or one named Mac first.
8408
+ Xcode Settings > Components lists downloadable versions supported by Xcode;
8409
+ Stim retains Xcode's error for unavailable versions. Installed versions
8410
+ appear in stim doctor and xcrun simctl list runtimes. Runtimes are shared
8411
+ Xcode components, not Stim-owned devices: remove them manually through
8412
+ Xcode Settings > Components after checking other workspaces no longer need
8413
+ them. Stim does not prune them.
8414
+
8357
8415
  A name that is not INSTALLED on this machine refuses with STIM_BAD_ARG
8358
8416
  before anything is created, and the message lists the installed names, so a
8359
8417
  wrong guess is one command, not a created simulator. A blank value is the
@@ -9085,8 +9143,9 @@ In on mode a pass runs, cheapest to rebuild first:
9085
9143
  3. build-cache and Metro entries, least recently used first, down to
9086
9144
  maintenance.capTargetPercent of caches.buildCacheMaxGb or
9087
9145
  caches.metroCacheMaxGb, and entries unused for olderThanDays
9088
- 4. the Swift compilation cache, emptied whole, only below
9089
- budget.hardFloorDiskGb, and kept while an iOS build holds its shared
9146
+ 4. the Swift compilation cache, emptied whole once it is over
9147
+ caches.swiftCompilationCacheMaxGb (default 0, no cap), whatever the free
9148
+ disk, and kept while an iOS build holds its shared
9090
9149
  claim (taken for each xcodebuild run that compiles with it) or that
9091
9150
  claim is unresolved; the emptying holds the exclusive claim
9092
9151
  5. linked worktrees whose branch or pull request finished (gc's finished
@@ -9284,8 +9343,9 @@ WHAT RECLAIMS AN OWNED DEVICE
9284
9343
  shuts DOWN (never deletes) owned devices with no
9285
9344
  driver, claim or activity for that long
9286
9345
 
9287
- \`gc --delete --cache watchman\` and \`gc --delete --cache gradle-daemons\`
9288
- stop shared helper processes, not devices (\`guide cleanup memory\`).
9346
+ \`gc --delete\` also shuts down an unused watchman daemon, and \`gc --delete
9347
+ --cache gradle-daemons\` stops idle Gradle and Kotlin daemons. They are shared
9348
+ helper processes, not devices (\`guide cleanup memory\`).
9289
9349
 
9290
9350
  \`worktree remove\` and \`gc --delete\` are the only two commands that delete;
9291
9351
  \`gc --delete\` deletes worktrees only through \`worktree remove\`. \`gc
@@ -9758,8 +9818,15 @@ ORPHANED WORKSPACE DIRECTORIES
9758
9818
  "Orphaned workspace directories" when the recorded project root is gone,
9759
9819
  its volume is mounted, no registry key equals it or sits under it, and the
9760
9820
  workspace is not in use. \`gc --delete\` re-checks each one, then removes
9761
- it. A directory with a missing or unparseable workspace.json, or a root on
9762
- an unmounted volume, is reported under Skipped and never deleted.
9821
+ it. A directory with an unparseable workspace.json, or a root on an
9822
+ unmounted volume, is reported under Skipped and never deleted.
9823
+ A directory with no workspace.json that holds only leftovers of a removed
9824
+ workspace is reported the same way: maintenance.ndjson, log-error-index.json,
9825
+ ended-agents.json, empty lock files and an agent-device directory with no
9826
+ running daemon. It counts as gone when it is empty, or when the project
9827
+ root its maintenance log names maps to the directory name and is gone. Any
9828
+ other file (state.json, for one), a held lock or a log naming no root keeps
9829
+ it under Skipped. The empty directory report has no project root.
9763
9830
 
9764
9831
  DELETED WORKTREES STILL REGISTERED
9765
9832
  A worktree deleted outside Stim keeps its registry entry; \`stim status\`
@@ -9794,9 +9861,11 @@ TMPDIR LEFTOVERS
9794
9861
  STALE STATUS CACHE ENTRIES
9795
9862
  \`stim status\` caches each folder's size under $STIM_HOME/disk-usage and
9796
9863
  each worktree's pull request under $STIM_HOME/pull-requests, which the
9797
- maintenance worktree check and \`gc --delete\` also write. \`worktree
9864
+ maintenance worktree check and \`gc --delete\` also write. The merge check
9865
+ caches each worktree's verdict under $STIM_HOME/git-merge. \`worktree
9798
9866
  remove\` drops the entries of the worktree it removed (its checkout,
9799
- node_modules and workspace folder, and its pull request), not the size
9867
+ node_modules and workspace folder, its pull request and its merge
9868
+ verdict), not the size
9800
9869
  entries of its owned devices' data folders. \`gc\` reports the
9801
9870
  entries of a folder or worktree that was removed some other way under "Stale
9802
9871
  status cache entries", and \`gc --delete\` removes them. An entry counts as
@@ -9855,6 +9924,10 @@ WHICH stim-* DEVICES gc DELETES
9855
9924
  \`rm -rf <dir>\` for AVD data with no registration), and
9856
9925
  never runs it. Boot, shutdown and teardown re-check ownership by the same
9857
9926
  rule, so a device that stops matching is left alone.
9927
+ With STIM_HOME set, gc skips the device sweep because simulators and AVDs
9928
+ are machine-global, but pruning a dead project still deletes the devices its
9929
+ record marks as owned. gc lists them as to be deleted under "Device sweep
9930
+ notices"; every other stim-* device is reported as not touched.
9858
9931
 
9859
9932
  ANDROID DATA WITHOUT A REGISTRATION
9860
9933
  \`gc\` also reports stim-*.avd directories whose .ini registration is
@@ -9874,6 +9947,9 @@ BUILD LOCKS
9874
9947
  \`gc --delete\` clears them. A lock whose builder IS running is a build in
9875
9948
  progress -- it is named in the report and touched by nothing, because
9876
9949
  removing it would put a second workspace on the same compile.
9950
+ \`gc --delete\` also removes the empty directories under ~/.stim/process-locks
9951
+ that removed projects and worktrees leave behind; it never touches a lock
9952
+ that holds a claim.
9877
9953
 
9878
9954
  DEVICE LEASES
9879
9955
  A workspace can hold a timed lease on a physical device. The lease is one
@@ -10024,7 +10100,7 @@ THE ONE CASE GC WILL NOT REAP
10024
10100
  Wall-clock timestamps and command names are not ownership proof.`
10025
10101
  },
10026
10102
  memory: {
10027
- summary: "watchman and Gradle and Kotlin daemon memory in gc, and when gc --delete --cache watchman or gradle-daemons stops them",
10103
+ summary: "watchman and Gradle and Kotlin daemon memory in gc, and when gc --delete and gc --delete --cache gradle-daemons stop them",
10028
10104
  body: () => `MEMORY
10029
10105
  Every \`gc\` without --cache, and \`gc --cache watchman\` or
10030
10106
  \`gc --cache gradle-daemons\`, reports the long-lived helpers that grow while
@@ -10032,19 +10108,22 @@ THE ONE CASE GC WILL NOT REAP
10032
10108
  daemons. Each line gives the pid, physical footprint (the measure status
10033
10109
  uses; resident size when the footprint cannot be read), uptime and whether
10034
10110
  it is idle, and a kept one says why. The reclaimable line totals what
10035
- the two commands below would free now.
10111
+ the commands below would free now.
10036
10112
 
10037
- Only these two commands stop anything, and each acts only on its own kind.
10038
- Neither a plain \`gc --delete\` nor \`--cache all\` touches them:
10039
- stim gc --delete --cache watchman
10113
+ Watchman is stopped by a plain \`gc --delete\` and by \`gc --delete --cache
10114
+ watchman\`; \`--cache all\` and every other \`--cache\` value leave it alone.
10115
+ The Gradle and Kotlin daemons are stopped only by \`--cache gradle-daemons\`:
10116
+ stim gc --delete (or: stim gc --delete --cache watchman)
10040
10117
  runs \`watchman watch-del\` on each stale root
10041
10118
  with no subscription or trigger, then
10042
10119
  \`watchman shutdown-server\` only when
10043
10120
  \`debug-status\` lists no client but gc's own
10044
- call and no root has a trigger; otherwise
10045
- the daemon is kept and the report names
10046
- each client, as the Stim workspace whose
10047
- dev server it belongs to where it can
10121
+ call, every root's subscriptions and
10122
+ triggers were readable and no root has a
10123
+ trigger; otherwise the daemon is kept and
10124
+ the report names each client, as the Stim
10125
+ workspace whose dev server it belongs to
10126
+ where it can
10048
10127
  stim gc --delete --cache gradle-daemons
10049
10128
  stops each Gradle daemon its own
10050
10129
  \`gradle --status\` reports IDLE, then each
@@ -10271,8 +10350,13 @@ DEVICE RECORDINGS
10271
10350
  stays.
10272
10351
 
10273
10352
  SHARED BUILD CACHES
10274
- The caches that make a second workspace fast are alive by design and never
10275
- included in a plain \`gc --delete\`. Every \`gc\` run reports them anyway,
10353
+ The caches that make a second workspace fast are alive by design and, with
10354
+ one exception, not touched by a plain \`gc --delete\`. The exception is the
10355
+ Swift compilation cache (the Xcode CAS under $STIM_HOME/compilation-cache):
10356
+ once it is over caches.swiftCompilationCacheMaxGb (default 0, no cap), a
10357
+ plain \`gc --delete\` empties it whole, since age trimming would corrupt its
10358
+ index. It is kept, with the build named, while an iOS build holds its shared
10359
+ claim or that claim is unresolved. Every \`gc\` run reports them anyway,
10276
10360
  each row tagged (registered) or (detected), with its size:
10277
10361
  stim gc # report, caches included
10278
10362
  stim gc --delete --older-than 30 # trim entries nothing has used
@@ -10399,6 +10483,15 @@ KEYS STIM READS
10399
10483
  The \`--runtime\` flag overrides this per invocation,
10400
10484
  and an uninstalled version refuses the same way,
10401
10485
  naming the layer the value came from
10486
+ ios.autoInstallRuntime false (default). With true and an explicit ios.runtime
10487
+ or --runtime version, install a missing iOS runtime
10488
+ with Xcode on the local or named approved Mac before
10489
+ continuing. --install-runtime opts in for one run.
10490
+ Requires 20 GB free for download and unpacking;
10491
+ typically downloads 8-10 GB (actual size varies).
10492
+ Automatic placement, eas/proxy and physical phones
10493
+ do not install runtimes. Shared runtimes are removed
10494
+ manually in Xcode Settings > Components.
10402
10495
  ios.scheme e.g. "RNTester" -- the shared Xcode scheme to build
10403
10496
  when the workspace lists several and none matches
10404
10497
  its name, which otherwise refuses with
@@ -11366,7 +11459,7 @@ stats. A listed paired name with a cache hit compiles nothing, contacts no worke
11366
11459
  and records buildMachine with builtOn absent. Build failures retain the selected
11367
11460
  value; builtOn is here or the configured machine entry when compilation ran.
11368
11461
  Prebuild and pod install still run on this machine before a named offload; stim ios
11369
- checks the machine's toolchain first. A refusal
11462
+ and stim android check the machine's toolchain first. A refusal
11370
11463
  starts no local xcodebuild, Gradle or SwiftPM compile.
11371
11464
  A React Native offload sends the tracked and untracked files, and the gitignored
11372
11465
  files the native fingerprint hashes or the Expo config reads, such as .env.local
@@ -11460,7 +11553,9 @@ do not query peer caches. Older workers continue normal placement. This peer
11460
11553
  lookup also covers declared native Gradle worker APKs when the worker supports
11461
11554
  native-gradle-peer-cache. It rechecks current private inputs against the saved
11462
11555
  receipt at offer and fetch for the requested source, resolved variant, ABI and
11463
- build options. Caller fingerprints stay null; worker keys stay worker-scoped.
11556
+ build options. With a known local JDK, lookup also requires native-gradle-peer-jdk
11557
+ and rechecks on that exact JDK major; older workers use normal build placement.
11558
+ Caller fingerprints stay null; worker keys stay worker-scoped.
11464
11559
  React Native and Expo development builds also query enabled paired workers
11465
11560
  with react-native-peer-cache after local and configured-provider misses. Their
11466
11561
  post-mutation fingerprint, native build choices and compatible toolchain must