stim 1.20.2 → 1.22.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 (231) hide show
  1. package/README.md +141 -8
  2. package/dist/acquire-artifact-Co2k4f7O.mjs +171 -0
  3. package/dist/act-DsuqEkiM.mjs +2801 -0
  4. package/dist/activity-CMLmzp7o.mjs +1397 -0
  5. package/dist/{agent-device-usage-output-Dzgv6lgR.mjs → agent-device-usage-output-DUFaTMdd.mjs} +23 -67
  6. package/dist/{android-DCKZrNvV.mjs → android-ByRMUoiJ.mjs} +157 -93
  7. package/dist/{android-Mz_Inn3w.mjs → android-C7sVmyI9.mjs} +299 -116
  8. package/dist/{android-Dlzxshgp.mjs → android-DGkNqa_c.mjs} +5 -5
  9. package/dist/{android-HqP1_vB_.mjs → android-DR5lZ2Az.mjs} +2 -2
  10. package/dist/android-cas-compiler.mjs +2 -2
  11. package/dist/{android-cas-Bl-cLJBk.mjs → android-cas-ngferVq2.mjs} +7 -6
  12. package/dist/android-project-BCAAmMwz.mjs +12 -0
  13. package/dist/android-project-DVWyCbWU.d.mts +391 -0
  14. package/dist/api.d.mts +810 -64
  15. package/dist/api.mjs +782 -1
  16. package/dist/{artifact-HSwkIWEQ.mjs → artifact-8EY8SAPw.mjs} +240 -213
  17. package/dist/{artifact-D3czlUvT.mjs → artifact-DJPy518Y.mjs} +203 -164
  18. package/dist/artifact-platform-CXcmX_j3.mjs +27 -0
  19. package/dist/{browser-web-CA-F1GQo.mjs → browser-web-Bcv99PBM.mjs} +194 -64
  20. package/dist/budget-Cvwn54qV.mjs +9285 -0
  21. package/dist/{build-DYDbfkk5.mjs → build-CabC3G23.mjs} +153 -98
  22. package/dist/build-cache-Dv7RN200.mjs +602 -0
  23. package/dist/build-plan-DUC8Ka9y.mjs +248 -0
  24. package/dist/{cache-manifest-XH-fvDUj.mjs → cache-manifest-DSeQjt-Q.mjs} +2 -2
  25. package/dist/cache-manifest.mjs +1 -1
  26. package/dist/{ccache-zdKiYQ3E.mjs → ccache-Btwc36-I.mjs} +10 -9
  27. package/dist/{cdp-Dq_ypAlJ.mjs → cdp-3fwICjzi.mjs} +18 -5
  28. package/dist/{chrome-BnzZMqsR.mjs → chrome-Bbw689-6.mjs} +7 -4
  29. package/dist/{cli-CLP3diBm.mjs → cli-CHZa9Lvk.mjs} +20 -20
  30. package/dist/cli.mjs +1 -1
  31. package/dist/client-OyRoEuSr.mjs +1577 -0
  32. package/dist/collector-run.d.mts +4 -40
  33. package/dist/collector-run.mjs +9 -8
  34. package/dist/{command-output-BTy8hZ0F.mjs → command-output-gwpm28fu.mjs} +1 -1
  35. package/dist/config-DlrsduwG.mjs +955 -0
  36. package/dist/{created-devices-Dzd5C2LF.mjs → created-devices-x9rN6bhs.mjs} +14 -4
  37. package/dist/{dependency-state-DG0p31-y.mjs → dependency-state-1I9KZT1Y.mjs} +20 -5
  38. package/dist/{detached-entry-B9C_zeQC.mjs → detached-entry-BwNEtIrP.mjs} +1 -1
  39. package/dist/{dev-client-DAWVIGBu.mjs → dev-client-BSDR5h3F.mjs} +2 -2
  40. package/dist/{device-BECOiufl.mjs → device-B-L3Fbxy.mjs} +91 -34
  41. package/dist/device-DklWZLqb.mjs +1068 -0
  42. package/dist/{device-capacity-CBUAcRyQ.mjs → device-capacity-DK5_EwRS.mjs} +42 -13
  43. package/dist/device-host-worker.mjs +76 -79
  44. package/dist/{device-ios-COSi6oS1.mjs → device-ios-DoB6KFCO.mjs} +77 -51
  45. package/dist/{device-lease-run-Cw2M4z51.mjs → device-lease-run-xJPQ_QQG.mjs} +14 -26
  46. package/dist/{device-pool-Bf-pOhSw.mjs → device-pool-BMkdsefq.mjs} +5 -5
  47. package/dist/{doctor-kfMBnUw6.mjs → doctor-Bo7BXLux.mjs} +271 -320
  48. package/dist/{doctor-CB8oZKCk.mjs → doctor-D5_EzwfA.mjs} +186 -91
  49. package/dist/doctor-fingerprint-DZLoYFVb.mjs +16 -0
  50. package/dist/doctor-fingerprint.mjs +19 -0
  51. package/dist/doctor-thjWAV0z.mjs +2 -0
  52. package/dist/{doctor-watchman-BRyV2adA.mjs → doctor-watchman-N2wDotwQ.mjs} +40 -21
  53. package/dist/{eas-build-JyfqyHfC.mjs → eas-build-CwknaQYj.mjs} +53 -20
  54. package/dist/{build-plan-B7SZsc2N.mjs → eas-fallback-CSgAulr5.mjs} +41 -214
  55. package/dist/{watchman-CPQFZLXY.mjs → eas-session-ledger-DlY_serQ.mjs} +230 -11
  56. package/dist/{error-diagnostics-BR677IDM.mjs → error-diagnostics-DBWO2rxE.mjs} +172 -82
  57. package/dist/exec-DEoAhcze.mjs +858 -0
  58. package/dist/exec-DnYc4HGH.d.mts +78 -0
  59. package/dist/{gc-qWOMdnER.mjs → gc-CXxN-4SE.mjs} +1091 -1029
  60. package/dist/gc-DnNDQyaP.mjs +3 -0
  61. package/dist/{guide-G9cAbVAc.mjs → guide-Br0LEfKy.mjs} +1165 -297
  62. package/dist/{hosted-android-C3MHGld1.mjs → hosted-android-B-9f-jkd.mjs} +10 -8
  63. package/dist/{hosted-client-ZEKpS9vw.mjs → hosted-client-DZAPrcro.mjs} +34 -19
  64. package/dist/{hosted-ios-l-o3iM9J.mjs → hosted-ios-CsCS21hn.mjs} +1 -1
  65. package/dist/{hosted-logs-EzQM7-3Z.mjs → hosted-logs-FIRx9X2f.mjs} +77 -43
  66. package/dist/{hosted-macos-BACVAVqE.mjs → hosted-macos-_awYSpfv.mjs} +35 -22
  67. package/dist/{hosted-native-A4s1QPXe.mjs → hosted-native-BdzE668-.mjs} +49 -27
  68. package/dist/idle-C4cZ757K.d.mts +24 -0
  69. package/dist/{idle-shutdown-DtxhPTKe.mjs → idle-shutdown-DDg3SdvY.mjs} +11 -10
  70. package/dist/ios-CDvlmUs7.d.mts +24 -0
  71. package/dist/{ios-BwVCF7oA.mjs → ios-Ds1clbIt.mjs} +8 -8
  72. package/dist/{ios-device-D7pi2Sca.mjs → ios-device--h_-8ENa.mjs} +51 -26
  73. package/dist/{ios-device-B5veSDDQ.mjs → ios-device-BXZ0c7Kb.mjs} +1 -1
  74. package/dist/{ios-RkW4pnQf.mjs → ios-hcBpnEGk.mjs} +200 -93
  75. package/dist/{ios-Ce7bc7br.mjs → ios-pm4nL6By.mjs} +160 -108
  76. package/dist/{ios-project-K9hY_Jab.mjs → ios-project-CZhKODF3.mjs} +13 -13
  77. package/dist/ios-signing-BtAffm0A.mjs +489 -0
  78. package/dist/{ios-state-CBLe1xYw.mjs → ios-state-Dtw5K2aI.mjs} +1 -1
  79. package/dist/{ios-nOLJGVdy.mjs → ios-xtlRHaeB.mjs} +1 -1
  80. package/dist/{js-swap-Bb3nsS07.mjs → js-swap-Bwhh4S7V.mjs} +30 -25
  81. package/dist/{launch-C3qJ6Agb.mjs → launch-BjxemNpK.mjs} +85 -543
  82. package/dist/{launch-F4sOqAhB.mjs → launch-CCzXlc8r.mjs} +91 -90
  83. package/dist/logs-BfwwadsZ.mjs +479 -0
  84. package/dist/logs-jTS_lHSo.mjs +248 -0
  85. package/dist/{macos-D7uDvO-z.mjs → macos-DVlSSyUg.mjs} +1 -1
  86. package/dist/macos-NfV2D7dO.mjs +694 -0
  87. package/dist/macos-run.mjs +1 -1
  88. package/dist/maintenance-run.mjs +123 -248
  89. package/dist/{metro-DnCEjCxs.mjs → metro-DiXtA3Ty.mjs} +107 -30
  90. package/dist/metro-gateway-CKZqKqx7.mjs +209 -0
  91. package/dist/{named-ports-4WopRPg-.mjs → named-ports-DkEzOfzO.mjs} +42 -90
  92. package/dist/native-android-CqgnOgsT.mjs +645 -0
  93. package/dist/native-gradle-artifact-inputs-DHFnmrVf.mjs +270 -0
  94. package/dist/native-gradle-inputs-Dnh84Zbd.mjs +211 -0
  95. package/dist/native-inputs-TRTTTRxt.mjs +91 -0
  96. package/dist/native-run-NwUuxbkg.mjs +276 -0
  97. package/dist/{native-runtime-k8dTIrbK.mjs → native-runtime-B7KIafpM.mjs} +11 -9
  98. package/dist/native-source-Y0yLhFyQ.mjs +133 -0
  99. package/dist/{native-xcode-inputs-CykopJdM.mjs → native-xcode-inputs-D_VOfFL7.mjs} +26 -18
  100. package/dist/{native-xcode-ios-Bbf30Gm0.mjs → native-xcode-ios-BYDOHWLN.mjs} +104 -60
  101. package/dist/{ndjson-GOnbyvso.mjs → ndjson-CgE_o3Dl.mjs} +3 -3
  102. package/dist/offload-worker.d.mts +59 -41
  103. package/dist/offload-worker.mjs +478 -115
  104. package/dist/operation-exec-BW0em61G.mjs +171 -0
  105. package/dist/{ownership-DCtw_2IA.mjs → ownership-C5fo5Edb.mjs} +3 -3
  106. package/dist/{page-DRHy329N.mjs → page-DBL2PiUU.mjs} +12 -5
  107. package/dist/paths-BsJMoPP2.mjs +12 -0
  108. package/dist/paths-DQtTgsBf.mjs +42 -0
  109. package/dist/{placement-log-MOfPVgaM.mjs → placement-log-BnGgJRRZ.mjs} +5 -5
  110. package/dist/{plan-placement-V0TdzYXp.mjs → plan-placement-DIsMtN-d.mjs} +15 -11
  111. package/dist/{ports-DdSUicVo.mjs → ports-Cy1RkmuQ.mjs} +3 -3
  112. package/dist/prebuild-D4JoEAEs.mjs +484 -0
  113. package/dist/{project-_phNIJfs.mjs → project-wM_XFTvE.mjs} +65 -37
  114. package/dist/{pull-request-CQ8sPbZa.mjs → pull-request-W1IuLXDt.mjs} +102 -20
  115. package/dist/pull-request-eODyIqZF.d.mts +124 -0
  116. package/dist/pull-requests.d.mts +2 -120
  117. package/dist/pull-requests.mjs +2 -2
  118. package/dist/{react-native-android-CM1XRDwv.mjs → react-native-android-6OZ7MSM7.mjs} +121 -72
  119. package/dist/{gradle-DSrXb6lG.mjs → react-native-build-Dvd8hC21.mjs} +292 -15
  120. package/dist/react-native-doctor-DsoSF1Y9.mjs +234 -0
  121. package/dist/{react-native-ios-Dhq_eiYQ.mjs → react-native-ios-4u1Rn-GR.mjs} +71 -39
  122. package/dist/{recordings-D0d5aQt0.mjs → recordings-CQmfzAh7.mjs} +12 -9
  123. package/dist/registration-BcRgF6Ox.mjs +51 -0
  124. package/dist/{reload-C8JhxjSh.mjs → reload-BzkYabB-.mjs} +94 -47
  125. package/dist/reload-D7AVlb8N.mjs +2 -0
  126. package/dist/{remote-BiR6aYjy.mjs → remote-DjGDmlTZ.mjs} +26 -18
  127. package/dist/result-D2Ykz_iD.mjs +435 -0
  128. package/dist/{run-BtPgpKks.mjs → run-DidHghD1.mjs} +5 -5
  129. package/dist/selection-DSMbWEX2.mjs +620 -0
  130. package/dist/{server-bare-R2m_gsH8.mjs → server-bare-CafzuyFB.mjs} +3 -4
  131. package/dist/{server-command-CTtCkmcQ.mjs → server-command-C6QjeupS.mjs} +14 -7
  132. package/dist/{server-expo-DsguMGUF.mjs → server-expo-CrjB29pq.mjs} +54 -11
  133. package/dist/server-expo-D58c9L0M.mjs +2 -0
  134. package/dist/{settings-B717odTD.mjs → settings-C7O8A6ZI.mjs} +309 -119
  135. package/dist/settings-DpR-1Wnn.mjs +114 -0
  136. package/dist/settings-write-CzD60rOD.mjs +360 -0
  137. package/dist/settings.schema.json +176 -16
  138. package/dist/{simslim-CCr3rE-A.mjs → simslim-BNckWpXi.mjs} +14 -12
  139. package/dist/{slot-launch-DPt0m9Nd.mjs → slot-launch-CbfmNgM6.mjs} +15 -20
  140. package/dist/{spawn-entry-Dcb7sDUz.mjs → spawn-entry-jw19m8Nl.mjs} +0 -1
  141. package/dist/stage-Bps5oius.mjs +200 -0
  142. package/dist/{start-TXeMmmO2.mjs → start-Br-oxqMD.mjs} +1 -1
  143. package/dist/start-EojN4WFz.mjs +1364 -0
  144. package/dist/{state-D1Icyjlu.mjs → state--smjFSTL.mjs} +55 -13
  145. package/dist/{state-CG_OFoaA.mjs → state-08I3hw3_.mjs} +3 -2
  146. package/dist/{stats-BoY5sEPU.mjs → stats-D3GerlFW.mjs} +7 -13
  147. package/dist/stats-report-BzaPrRm6.mjs +16 -0
  148. package/dist/{status-BTA7kKiQ.mjs → status-BRROykC8.mjs} +7 -5
  149. package/dist/status-EvrK72L2.mjs +2 -0
  150. package/dist/{status-WgFbkRzj.mjs → status-WBDajew2.mjs} +554 -452
  151. package/dist/{status-watch-C23ILtf9.mjs → status-watch-Bg_u-pwR.mjs} +222 -25
  152. package/dist/status-worker.d.mts +1 -0
  153. package/dist/status-worker.mjs +19 -0
  154. package/dist/stim-desktop-D5OGpYZM.mjs +112 -0
  155. package/dist/{stop-DR6VoDIk.mjs → stop-DTZ9uTw3.mjs} +2 -2
  156. package/dist/{stop-DPEhunlw.mjs → stop-Dky10AEJ.mjs} +33 -23
  157. package/dist/{stop-BNmBMi1F.mjs → stop-Mv6W9FAk.mjs} +137 -98
  158. package/dist/supervisor-run.d.mts +8 -17
  159. package/dist/supervisor-run.mjs +56 -28
  160. package/dist/{support-CwjbFs9H.mjs → support-CNioewsd.mjs} +14 -14
  161. package/dist/{support-DMTqj3Hm.mjs → support-yUiOjnVY.mjs} +20 -13
  162. package/dist/swiftpm-artifact-inputs-DFcGsXDP.mjs +153 -0
  163. package/dist/swiftpm-macos-BIak-Rxv.mjs +532 -0
  164. package/dist/toolchain-BY8X8HXx.mjs +2 -0
  165. package/dist/toolchain-DpJMHq0n.mjs +876 -0
  166. package/dist/{trigger-CigAYjeL.mjs → trigger-Cbyc41d_.mjs} +21 -6
  167. package/dist/trigger-yb_nFzPF.mjs +2 -0
  168. package/dist/{warm-progress-BuY-Fvfn.mjs → warm-progress-CA3TgT3-.mjs} +263 -156
  169. package/dist/web-CZ07gd77.mjs +2 -0
  170. package/dist/{web-BDBMxDpx.mjs → web-DKx6yoFA.mjs} +20 -14
  171. package/dist/web-run.mjs +13 -12
  172. package/dist/windows-report.d.mts +1 -0
  173. package/dist/windows-report.mjs +18 -0
  174. package/dist/windows-report.ps1 +43 -0
  175. package/dist/{workspace-state-DJt_MMvf.mjs → workspace-state-U08dEzhG.mjs} +62 -58
  176. package/dist/{workspaces-C36s2jb9.mjs → workspaces-CpANmBlq.mjs} +1723 -1286
  177. package/dist/{worktree-CgvJYJ-Q.mjs → worktree-CHecZ4Oq.mjs} +1097 -547
  178. package/dist/worktree-ZqZVjD9K.mjs +2 -0
  179. package/dist/xcode-BXn9-xYx.mjs +896 -0
  180. package/package.json +7 -5
  181. package/shim/android-audio/Main.java +24 -0
  182. package/shim/android-audio/README.md +17 -0
  183. package/shim/android-audio.jar +0 -0
  184. package/shim/android-optimizations.gradle +7 -5
  185. package/dist/activity-BSV745Kz.mjs +0 -629
  186. package/dist/api-qvOzWyfO.mjs +0 -154
  187. package/dist/api-run.mjs +0 -294
  188. package/dist/app-install-BIKtMfPq.mjs +0 -896
  189. package/dist/artifact-lifecycle-DzPpBYvK.mjs +0 -30
  190. package/dist/budget-f7516Zk0.mjs +0 -4106
  191. package/dist/build-facts-DcLv2HSd.d.mts +0 -111
  192. package/dist/cancellation-C_22VQTH.mjs +0 -24
  193. package/dist/client-qQAaXSUs.mjs +0 -1771
  194. package/dist/config-BYDxlMY3.mjs +0 -562
  195. package/dist/device-DuiPJQSn.mjs +0 -290
  196. package/dist/device-lease-BX1sJQ2E.mjs +0 -1224
  197. package/dist/device-remote-xRT0Vmo9.mjs +0 -1272
  198. package/dist/eas-session-ledger-Cm0Gwq2F.mjs +0 -207
  199. package/dist/exec-DqKo9GKJ.mjs +0 -268
  200. package/dist/git-DDfFzkMm.mjs +0 -45
  201. package/dist/launch-verify-B6Q8hZP-.mjs +0 -428
  202. package/dist/logs-BGrEUaEs.mjs +0 -383
  203. package/dist/macos-Ch5VJmcS.mjs +0 -584
  204. package/dist/metro-gateway-CX9Xlkq2.mjs +0 -103
  205. package/dist/miss-reason-mKzZ4VvN.mjs +0 -238
  206. package/dist/native-android-D5qc3-_v.mjs +0 -226
  207. package/dist/native-gradle-inputs-BsLRrl7u.mjs +0 -349
  208. package/dist/ndjson-Du3j0AQ9.d.mts +0 -17
  209. package/dist/plan-C4TjdPsR.mjs +0 -260
  210. package/dist/prebuild-DYbucPXy.mjs +0 -212
  211. package/dist/preview-78a9kR_-.mjs +0 -1011
  212. package/dist/react-native-build-CtCccJtb.mjs +0 -239
  213. package/dist/react-native-doctor-CfRnFfjs.mjs +0 -78
  214. package/dist/remote-cache-OyOyVIS3.mjs +0 -526
  215. package/dist/result-CaJg5Iat.mjs +0 -186
  216. package/dist/server-expo-Bigriskl.mjs +0 -2
  217. package/dist/settings-BORNaaCO.mjs +0 -402
  218. package/dist/settings-vk3mJGSm.d.mts +0 -13
  219. package/dist/spawn-claims-DVS5RkMS.mjs +0 -72
  220. package/dist/stage-KNTQopqv.mjs +0 -157
  221. package/dist/start-BWqzODpb.mjs +0 -1116
  222. package/dist/stim-desktop-BzBN2Em2.mjs +0 -63
  223. package/dist/swiftpm-macos-DRNVJWlb.mjs +0 -119
  224. package/dist/tailnet-Dh-qiYzG.mjs +0 -265
  225. package/dist/toolchain-BFkAcstd.mjs +0 -2
  226. package/dist/toolchain-DxSsNssu.mjs +0 -1657
  227. package/dist/trigger-9_USgmxz.mjs +0 -2
  228. package/dist/web-Dq-i3wzJ.mjs +0 -2
  229. package/dist/worktree-DpLdCHga.mjs +0 -2
  230. package/dist/{api-run.d.mts → doctor-fingerprint.d.mts} +0 -0
  231. package/dist/{errors-DzkMYh8Q.mjs → errors-ccaPc4ox.mjs} +2 -2
@@ -1,207 +0,0 @@
1
- import { t as getExecutor } from "./exec-DqKo9GKJ.mjs";
2
- import { D as withDirLock } from "./workspace-state-DJt_MMvf.mjs";
3
- import { accessSync, constants, existsSync, mkdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
4
- import { delimiter, dirname, join, resolve } from "node:path";
5
- import { easMachineStateRoot, easMachineStateRoot as easMachineStateRoot$1, easSessionLedgerFile, easSessionLedgerLock, readEasSessionLedger, readEasSessionLedger as readEasSessionLedger$1, validEasSessionClaim } from "@stim-cli/core/state";
6
- //#region src/diagnostics/stim-installations.ts
7
- const VERSION_OUTPUT_LIMIT = 4096;
8
- function parsedVersion(version) {
9
- const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(version);
10
- if (!match) return null;
11
- const core = [
12
- match[1],
13
- match[2],
14
- match[3]
15
- ];
16
- if (core.some((part) => part.length > 1 && part.startsWith("0"))) return null;
17
- const prereleaseParts = match[4]?.split(".");
18
- if (prereleaseParts?.some((part) => !part || /^\d+$/.test(part) && part.length > 1 && part.startsWith("0"))) return null;
19
- const prerelease = prereleaseParts?.map((part) => /^\d+$/.test(part) ? Number(part) : part);
20
- return {
21
- core: core.map(Number),
22
- prerelease: prerelease ?? null
23
- };
24
- }
25
- function compareStimVersions(left, right) {
26
- const a = parsedVersion(left);
27
- const b = parsedVersion(right);
28
- if (!a || !b) return null;
29
- for (let index = 0; index < a.core.length; index += 1) {
30
- const difference = (a.core[index] ?? 0) - (b.core[index] ?? 0);
31
- if (difference !== 0) return difference;
32
- }
33
- if (!a.prerelease && !b.prerelease) return 0;
34
- if (!a.prerelease) return 1;
35
- if (!b.prerelease) return -1;
36
- for (let index = 0; index < Math.max(a.prerelease.length, b.prerelease.length); index += 1) {
37
- const x = a.prerelease[index];
38
- const y = b.prerelease[index];
39
- if (x === void 0) return -1;
40
- if (y === void 0) return 1;
41
- if (x === y) continue;
42
- if (typeof x === "number" && typeof y === "number") return x - y;
43
- if (typeof x === "number") return -1;
44
- if (typeof y === "number") return 1;
45
- return x < y ? -1 : 1;
46
- }
47
- return 0;
48
- }
49
- function parseStimVersionOutput(output) {
50
- const version = output?.split("\n")[0]?.trim() ?? "";
51
- return parsedVersion(version) ? version.replace(/^v/, "") : null;
52
- }
53
- function executableNames(platform) {
54
- return platform === "win32" ? [
55
- "stim.cmd",
56
- "stim.exe",
57
- "stim"
58
- ] : ["stim"];
59
- }
60
- function stimExecutablePaths(pathValue, { platform = process.platform, cwd = process.cwd() } = {}) {
61
- const found = [];
62
- const seen = /* @__PURE__ */ new Set();
63
- for (const entry of pathValue.split(delimiter)) {
64
- const directory = resolve(cwd, entry || ".");
65
- for (const name of executableNames(platform)) {
66
- const path = join(directory, name);
67
- try {
68
- accessSync(path, platform === "win32" ? constants.F_OK : constants.X_OK);
69
- if (!statSync(path).isFile()) continue;
70
- const realPath = realpathSync(path);
71
- if (seen.has(realPath)) continue;
72
- seen.add(realPath);
73
- found.push({
74
- path,
75
- realPath
76
- });
77
- } catch {}
78
- }
79
- }
80
- return found;
81
- }
82
- function canonicalPath(path) {
83
- if (!path) return null;
84
- try {
85
- return realpathSync(resolve(path));
86
- } catch {
87
- return resolve(path);
88
- }
89
- }
90
- function analyzeStimVersions(runningVersion, runningPath, installations) {
91
- const candidates = [runningVersion, ...installations.map((entry) => entry.version)];
92
- const versions = [...new Set(candidates)].filter((version) => version !== null && compareStimVersions(version, version) !== null).toSorted((left, right) => -(compareStimVersions(left, right) ?? 0));
93
- const highestVersion = versions[0] ?? null;
94
- const resolved = installations[0] ?? null;
95
- return {
96
- runningVersion,
97
- runningPath,
98
- resolved,
99
- installations,
100
- versions,
101
- highestVersion,
102
- resolvedIsOlder: Boolean(resolved?.version && highestVersion && (compareStimVersions(resolved.version, highestVersion) ?? 0) < 0)
103
- };
104
- }
105
- function probeStimVersion(path, timeoutMs) {
106
- return new Promise((resolveProbe) => {
107
- let settled = false;
108
- let output = "";
109
- const finish = (version) => {
110
- if (settled) return;
111
- settled = true;
112
- clearTimeout(timer);
113
- resolveProbe(version);
114
- };
115
- let child;
116
- try {
117
- child = getExecutor().spawn(path, ["--version"], {
118
- stdio: [
119
- "ignore",
120
- "pipe",
121
- "ignore"
122
- ],
123
- detached: process.platform !== "win32"
124
- });
125
- } catch {
126
- resolveProbe(null);
127
- return;
128
- }
129
- const timer = setTimeout(() => {
130
- try {
131
- if (process.platform !== "win32" && child.pid) process.kill(-child.pid, "SIGKILL");
132
- else child.kill("SIGKILL");
133
- } catch {}
134
- finish(null);
135
- }, timeoutMs);
136
- child.stdout?.on("data", (chunk) => {
137
- if (output.length < VERSION_OUTPUT_LIMIT) output += String(chunk).slice(0, VERSION_OUTPUT_LIMIT - output.length);
138
- });
139
- child.on("error", () => finish(null));
140
- child.on("close", (code) => finish(code === 0 ? parseStimVersionOutput(output) : null));
141
- });
142
- }
143
- async function inspectStimVersions(runningVersion, { pathValue = process.env.PATH ?? "", runningPath = process.argv[1], probeTimeoutMs = 5e3 } = {}) {
144
- const paths = stimExecutablePaths(pathValue);
145
- const versions = await Promise.all(paths.map((entry) => probeStimVersion(entry.path, probeTimeoutMs)));
146
- const installations = paths.map((entry, index) => ({
147
- path: entry.path,
148
- realPath: entry.realPath,
149
- version: versions[index] ?? null
150
- }));
151
- return analyzeStimVersions(runningVersion, canonicalPath(runningPath), installations);
152
- }
153
- //#endregion
154
- //#region src/engine/eas-machine-root-guard-env.ts
155
- const EAS_TEST_GUARD_ROOT_ENV = "STIM_TEST_GUARD_REAL_EAS_ROOT";
156
- //#endregion
157
- //#region src/engine/eas-session-ledger.ts
158
- function assertEasMachineRootWritable(root) {
159
- const guardedRoot = process.env[EAS_TEST_GUARD_ROOT_ENV];
160
- if (!guardedRoot || resolve(root) !== resolve(guardedRoot)) return;
161
- throw new Error(`Refusing to write the real EAS machine root ${root} from a test process. Pass a temporary ledgerRoot, machineRoot, or easLedgerRoot, or point HOME (and USERPROFILE on Windows) at a temporary directory.`);
162
- }
163
- function writeLedger(root, ledger) {
164
- mkdirSync(root, { recursive: true });
165
- const file = easSessionLedgerFile(root);
166
- const tmp = `${file}.${process.pid}.${Math.random().toString(36).slice(2)}.tmp`;
167
- writeFileSync(tmp, `${JSON.stringify(ledger, null, 2)}\n`);
168
- try {
169
- renameSync(tmp, file);
170
- } catch (error) {
171
- rmSync(tmp, { force: true });
172
- throw error;
173
- }
174
- }
175
- function recordEasSessionClaim(claim, root = easMachineStateRoot()) {
176
- assertEasMachineRootWritable(root);
177
- const normalized = validEasSessionClaim(claim.sessionId, claim);
178
- if (!normalized) throw new Error(`Invalid EAS session claim for ${claim.sessionId}.`);
179
- withDirLock(easSessionLedgerLock(root), () => {
180
- const current = readEasSessionLedger(root);
181
- if (!current.safe) throw new Error(current.notice ?? "EAS ownership ledger is unreadable.");
182
- current.claims.set(normalized.sessionId, normalized);
183
- writeLedger(root, {
184
- version: 1,
185
- claims: Object.fromEntries(current.claims)
186
- });
187
- }, { ensureParent: () => mkdirSync(dirname(easSessionLedgerLock(root)), { recursive: true }) });
188
- }
189
- function removeEasSessionClaim(sessionId, root = easMachineStateRoot(), when = () => true) {
190
- const file = easSessionLedgerFile(root);
191
- if (!existsSync(file)) return false;
192
- assertEasMachineRootWritable(root);
193
- return withDirLock(easSessionLedgerLock(root), () => {
194
- const current = readEasSessionLedger(root);
195
- if (!current.safe) return false;
196
- const claim = current.claims.get(sessionId);
197
- if (!claim || !when(claim)) return false;
198
- current.claims.delete(sessionId);
199
- writeLedger(root, {
200
- version: 1,
201
- claims: Object.fromEntries(current.claims)
202
- });
203
- return true;
204
- });
205
- }
206
- //#endregion
207
- export { removeEasSessionClaim as a, recordEasSessionClaim as i, easMachineStateRoot$1 as n, compareStimVersions as o, readEasSessionLedger$1 as r, inspectStimVersions as s, assertEasMachineRootWritable as t };
@@ -1,268 +0,0 @@
1
- import { execSync } from "child_process";
2
- import spawn from "cross-spawn";
3
- import which from "which";
4
- import { basename } from "path";
5
- import { createDebugLog, runId } from "@stim-cli/core/state";
6
- //#region src/debug-log.ts
7
- const debugLog = createDebugLog("cli", { base: () => ({ runId: runId() }) });
8
- //#endregion
9
- //#region src/exec.ts
10
- const MAX_BUFFER = 67108864;
11
- function budgetMs(timeoutMs) {
12
- if (timeoutMs === "unbounded") return void 0;
13
- if (!(timeoutMs > 0)) throw new RangeError(`timeoutMs must be a positive number of milliseconds or 'unbounded', got ${timeoutMs}`);
14
- return timeoutMs;
15
- }
16
- /** Whether an exec error is a child killed for exceeding its `timeoutMs`. */
17
- function isTimeoutError(error) {
18
- return typeof error === "object" && error !== null && "code" in error && error.code === "ETIMEDOUT";
19
- }
20
- function nameTimeout(error, command, timeoutMs) {
21
- if (error?.code === "ETIMEDOUT" && error instanceof Error) error.message = `Command timed out after ${timeoutMs}ms: ${command}`;
22
- return error;
23
- }
24
- const WINDOWS_BATCH_FILE = /\.(?:bat|cmd)$/i;
25
- const BATCH_UNSAFE_ARGUMENT = /["\r\n]/;
26
- function isUnsafeBatchSpawn(target, args, platform = process.platform) {
27
- return platform === "win32" && WINDOWS_BATCH_FILE.test(target) && args.some((arg) => BATCH_UNSAFE_ARGUMENT.test(arg));
28
- }
29
- function refuseUnsafeBatchArguments(file, args) {
30
- if (process.platform !== "win32") return;
31
- const target = which.sync(file, { nothrow: true }) ?? file;
32
- if (isUnsafeBatchSpawn(target, args)) throw new Error(`Refusing to run ${basename(target)}: an argument contains a character cmd.exe could misinterpret (a double quote or a line break).`);
33
- }
34
- function redactError(error, values) {
35
- const secrets = values?.filter(Boolean) ?? [];
36
- if (secrets.length === 0 || !error || typeof error !== "object") return error;
37
- const scrub = (text) => secrets.reduce((acc, secret) => acc.split(secret).join("***"), text);
38
- const fields = error;
39
- for (const key of Object.getOwnPropertyNames(error)) {
40
- const value = fields[key];
41
- if (typeof value === "string") fields[key] = scrub(value);
42
- else if (Array.isArray(value)) fields[key] = value.map((item) => typeof item === "string" ? scrub(item) : item);
43
- }
44
- return error;
45
- }
46
- const defaultExecutor = {
47
- run(cmd, { timeoutMs, killSignal, cwd, env }) {
48
- const opts = {
49
- encoding: "utf-8",
50
- stdio: [
51
- "pipe",
52
- "pipe",
53
- "pipe"
54
- ],
55
- maxBuffer: MAX_BUFFER
56
- };
57
- const timeout = budgetMs(timeoutMs);
58
- if (timeout !== void 0) opts.timeout = timeout;
59
- if (killSignal) opts.killSignal = killSignal;
60
- if (cwd) opts.cwd = cwd;
61
- if (env) opts.env = {
62
- ...process.env,
63
- ...env
64
- };
65
- try {
66
- return String(execSync(cmd, opts)).trim();
67
- } catch (error) {
68
- throw nameTimeout(error, cmd, timeoutMs);
69
- }
70
- },
71
- runFile(file, args = [], { timeoutMs, killSignal, cwd, env, omitEnv, input, untrimmed, rejectStderr, detachedSilent, redact }) {
72
- const opts = {
73
- encoding: "utf-8",
74
- stdio: detachedSilent ? "ignore" : [
75
- "pipe",
76
- "pipe",
77
- "pipe"
78
- ],
79
- maxBuffer: MAX_BUFFER
80
- };
81
- if (detachedSilent) opts.detached = true;
82
- const timeout = budgetMs(timeoutMs);
83
- if (timeout !== void 0) opts.timeout = timeout;
84
- if (killSignal) opts.killSignal = killSignal;
85
- if (cwd) opts.cwd = cwd;
86
- if (input !== void 0) opts.input = input;
87
- if (env || omitEnv?.length) {
88
- const childEnv = {
89
- ...process.env,
90
- ...env
91
- };
92
- for (const key of omitEnv ?? []) delete childEnv[key];
93
- opts.env = childEnv;
94
- }
95
- refuseUnsafeBatchArguments(file, args);
96
- const result = spawn.sync(file, args, opts);
97
- if (result.error) throw redactError(nameTimeout(Object.assign(result.error, result), [file, ...args].join(" "), timeoutMs), redact);
98
- if (result.status !== 0 || rejectStderr && String(result.stderr ?? "").trim()) {
99
- const stderr = String(result.stderr ?? "");
100
- const message = `Command failed: ${[file, ...args].join(" ")}${stderr ? `\n${stderr}` : ""}`;
101
- throw redactError(Object.assign(new Error(message), result), redact);
102
- }
103
- if (detachedSilent) return "";
104
- return untrimmed ? String(result.stdout) : String(result.stdout).trim();
105
- },
106
- runFileAsync(file, args = [], { timeoutMs, killSignal, cwd, env, omitEnv, rejectStderr, onSpawn, detachedSilent, redact }) {
107
- const command = [file, ...args].join(" ");
108
- return new Promise((resolve, reject) => {
109
- refuseUnsafeBatchArguments(file, args);
110
- const timeout = budgetMs(timeoutMs);
111
- const opts = detachedSilent ? {
112
- stdio: "ignore",
113
- detached: true
114
- } : { stdio: [
115
- "ignore",
116
- "pipe",
117
- "pipe"
118
- ] };
119
- if (cwd) opts.cwd = cwd;
120
- if (env || omitEnv?.length) {
121
- const childEnv = {
122
- ...process.env,
123
- ...env
124
- };
125
- for (const key of omitEnv ?? []) delete childEnv[key];
126
- opts.env = childEnv;
127
- }
128
- const child = spawn(file, args, opts);
129
- try {
130
- onSpawn?.(child);
131
- } catch (error) {
132
- child.kill("SIGKILL");
133
- reject(error);
134
- return;
135
- }
136
- const stdout = [];
137
- const stderr = [];
138
- let timedOut = false;
139
- const timer = timeout === void 0 ? void 0 : setTimeout(() => {
140
- timedOut = true;
141
- child.kill(killSignal ?? "SIGTERM");
142
- }, timeout);
143
- child.stdout?.on("data", (chunk) => stdout.push(chunk));
144
- child.stderr?.on("data", (chunk) => stderr.push(chunk));
145
- child.on("error", (error) => {
146
- clearTimeout(timer);
147
- reject(redactError(error, redact));
148
- });
149
- child.on("close", (status, signal) => {
150
- clearTimeout(timer);
151
- const out = Buffer.concat(stdout).toString("utf-8");
152
- const err = Buffer.concat(stderr).toString("utf-8");
153
- const result = {
154
- status,
155
- signal,
156
- stdout: out,
157
- stderr: err
158
- };
159
- if (timedOut) reject(redactError(nameTimeout(Object.assign(new Error(command), result, { code: "ETIMEDOUT" }), command, timeoutMs), redact));
160
- else if (status !== 0 || rejectStderr && err.trim()) reject(redactError(Object.assign(/* @__PURE__ */ new Error(`Command failed: ${command}${err ? `\n${err}` : ""}`), result), redact));
161
- else resolve(detachedSilent ? "" : out.trim());
162
- });
163
- });
164
- },
165
- runQuiet(cmd, opts) {
166
- budgetMs(opts.timeoutMs);
167
- try {
168
- return this.run(cmd, opts);
169
- } catch {
170
- return null;
171
- }
172
- },
173
- runFileQuiet(file, args, opts) {
174
- budgetMs(opts.timeoutMs);
175
- try {
176
- return this.runFile(file, args, opts);
177
- } catch {
178
- return null;
179
- }
180
- },
181
- spawn(cmd, args = [], opts = {}) {
182
- refuseUnsafeBatchArguments(cmd, args);
183
- return spawn(cmd, args, opts);
184
- },
185
- findExecutable(name) {
186
- return which.sync(name, { nothrow: true });
187
- }
188
- };
189
- /** The program a call runs, without its arguments: those can carry tokens. */
190
- const programOf = (command) => basename(command.trim().split(/\s+/)[0] ?? "");
191
- function outcomeOf(error) {
192
- const { status, signal, code } = error ?? {};
193
- return {
194
- ok: false,
195
- ...typeof status === "number" ? { exit: status } : {},
196
- ...signal ? { signal } : {},
197
- ...code ? { code } : {}
198
- };
199
- }
200
- let executionId = 0;
201
- function timedSync(fn, program) {
202
- return (...args) => {
203
- if (!debugLog.enabled()) return fn(...args);
204
- const id = ++executionId;
205
- const name = program(...args);
206
- const started = performance.now();
207
- debugLog.log("exec.start", {
208
- program: name,
209
- executionId: id
210
- });
211
- try {
212
- const out = fn(...args);
213
- debugLog.log("exec", {
214
- program: name,
215
- executionId: id,
216
- ms: Math.round(performance.now() - started),
217
- ok: true
218
- });
219
- return out;
220
- } catch (error) {
221
- debugLog.log("exec", {
222
- program: name,
223
- executionId: id,
224
- ms: Math.round(performance.now() - started),
225
- ...outcomeOf(error)
226
- });
227
- throw error;
228
- }
229
- };
230
- }
231
- let active = {
232
- ...defaultExecutor,
233
- run: timedSync((cmd, opts) => defaultExecutor.run(cmd, opts), programOf),
234
- runFile: timedSync((file, args, opts) => defaultExecutor.runFile(file, args, opts), (file) => basename(file)),
235
- async runFileAsync(file, args, opts) {
236
- if (!debugLog.enabled()) return defaultExecutor.runFileAsync(file, args, opts);
237
- const id = ++executionId;
238
- const name = basename(file);
239
- const started = performance.now();
240
- debugLog.log("exec.start", {
241
- program: name,
242
- executionId: id
243
- });
244
- try {
245
- const out = await defaultExecutor.runFileAsync(file, args, opts);
246
- debugLog.log("exec", {
247
- program: name,
248
- executionId: id,
249
- ms: Math.round(performance.now() - started),
250
- ok: true
251
- });
252
- return out;
253
- } catch (error) {
254
- debugLog.log("exec", {
255
- program: name,
256
- executionId: id,
257
- ms: Math.round(performance.now() - started),
258
- ...outcomeOf(error)
259
- });
260
- throw error;
261
- }
262
- }
263
- };
264
- function getExecutor() {
265
- return active;
266
- }
267
- //#endregion
268
- export { isTimeoutError as n, debugLog as r, getExecutor as t };
@@ -1,45 +0,0 @@
1
- import { t as getExecutor } from "./exec-DqKo9GKJ.mjs";
2
- //#region src/workspace/git.ts
3
- const GIT_TIMEOUT_MS = 1e4;
4
- const GIT_CONCURRENCY = 6;
5
- function gitCall(cwd, args, { write, timeoutMs = GIT_TIMEOUT_MS, ...opts }) {
6
- return {
7
- args: [
8
- ...write ? [] : ["--no-optional-locks"],
9
- "-C",
10
- cwd,
11
- ...args
12
- ],
13
- opts: {
14
- ...opts,
15
- timeoutMs
16
- }
17
- };
18
- }
19
- /** Runs git in `cwd`, bounded by `timeoutMs` (10 s by default); throws like `runFile`. */
20
- function git(cwd, args, opts = {}) {
21
- const call = gitCall(cwd, args, opts);
22
- return getExecutor().runFile("git", call.args, call.opts);
23
- }
24
- /** `git`, returning null instead of throwing. */
25
- function gitQuiet(cwd, args, opts = {}) {
26
- const call = gitCall(cwd, args, opts);
27
- return getExecutor().runFileQuiet("git", call.args, call.opts);
28
- }
29
- const queue = [];
30
- let running = 0;
31
- /** `git` without blocking the event loop, at most six at a time; the budget starts when the call leaves the queue. */
32
- async function gitAsync(cwd, args, opts = {}) {
33
- if (running < GIT_CONCURRENCY) running++;
34
- else await new Promise((proceed) => queue.push(proceed));
35
- try {
36
- const call = gitCall(cwd, args, opts);
37
- return await getExecutor().runFileAsync("git", call.args, call.opts);
38
- } finally {
39
- const next = queue.shift();
40
- if (next) next();
41
- else running--;
42
- }
43
- }
44
- //#endregion
45
- export { gitAsync as n, gitQuiet as r, git as t };