stim 1.27.0 → 1.29.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 (154) hide show
  1. package/dist/{acquire-artifact-BKN2Yuhg.mjs → acquire-artifact-C2DKfenN.mjs} +1 -1
  2. package/dist/{act-ROviTF_t.mjs → act-CrTcskiE.mjs} +502 -34
  3. package/dist/{activity-Cd-ysFes.mjs → activity-BR5oHSO5.mjs} +6 -5
  4. package/dist/{agent-device-usage-output-C5nCKWp9.mjs → agent-device-usage-output-W0x4SoC7.mjs} +4 -4
  5. package/dist/{android-DriNoAVy.mjs → android-BHKgeOuq.mjs} +5 -5
  6. package/dist/{android--HBgpvpW.mjs → android-BPmCmyAy.mjs} +5 -5
  7. package/dist/{android-Deb9X3_Y.mjs → android-CLU_MMnb.mjs} +1 -1
  8. package/dist/{android-cas-D5e6ecUg.mjs → android-cas-BH6K12__.mjs} +4 -4
  9. package/dist/{android-Cd6w7_qw.mjs → android-l616dRP1.mjs} +42 -39
  10. package/dist/{android-project-DUGMbq28.d.mts → android-project-CCEQyYJK.d.mts} +6 -2
  11. package/dist/api.d.mts +8 -5
  12. package/dist/api.mjs +27 -27
  13. package/dist/{apk-signed-tail-BHQHx3Rm.mjs → apk-signed-tail-B-wKoF_8.mjs} +2 -2
  14. package/dist/{artifact-0AGJYB9O.mjs → artifact-DHuFYfhD.mjs} +12 -12
  15. package/dist/{artifact-faemIZv5.mjs → artifact-Dm9ScLrh.mjs} +12 -12
  16. package/dist/{auto-placement-z-H5pJza.mjs → auto-placement-C8sJsyMN.mjs} +8 -8
  17. package/dist/{browser-web-slD8AvLp.mjs → browser-web-_tQTbQUs.mjs} +12 -12
  18. package/dist/{build-hS0QyFlQ.mjs → build-DtCU9Kim.mjs} +23 -23
  19. package/dist/{build-cache-gBJ-WKzA.mjs → build-cache-BGwTsIEa.mjs} +4 -4
  20. package/dist/{build-plan-CBqYbzYM.mjs → build-plan-CWyjMPKo.mjs} +6 -6
  21. package/dist/{cache-manifest-DEjqGGat.mjs → cache-manifest-evF_zJ9U.mjs} +1 -1
  22. package/dist/cache-manifest.mjs +1 -1
  23. package/dist/{ccache-BWTze1Ls.mjs → ccache-DsDkdP72.mjs} +19 -18
  24. package/dist/{cli-ftXDLto1.mjs → cli-3fjOg-Oc.mjs} +19 -19
  25. package/dist/cli.mjs +1 -1
  26. package/dist/{client-xsdxrhWA.mjs → client-BTUH8TF1.mjs} +41 -8
  27. package/dist/collector-run.mjs +5 -5
  28. package/dist/{command-output-Dj-WT4BP.mjs → command-output-DjCsmzLZ.mjs} +1 -1
  29. package/dist/{config-Cn94Jc0g.mjs → config-AbUjIBOQ.mjs} +121 -19
  30. package/dist/{dependencies-BGokZ-Ng.mjs → dependencies-CHNqX6Pr.mjs} +38 -38
  31. package/dist/{dependency-state-C3OtgG94.mjs → dependency-state-CPKAKCZ8.mjs} +1 -1
  32. package/dist/{dev-client-BMca82xo.mjs → dev-client-CROrxj1x.mjs} +2 -2
  33. package/dist/{device-tM41-TUq.mjs → device-Bmm5qjM-.mjs} +14 -14
  34. package/dist/device-BvpasThQ.mjs +297 -0
  35. package/dist/{device-capacity-6LP7QsaA.mjs → device-capacity-B2ChA-bz.mjs} +86 -18
  36. package/dist/device-host-worker.mjs +15 -13
  37. package/dist/{device-ios-534c14fz.mjs → device-ios-CYzivd31.mjs} +9 -9
  38. package/dist/{device-lease-run-DwsGfjUN.mjs → device-lease-run-qRq_2W2V.mjs} +4 -4
  39. package/dist/{device-pool-BnQqvs6o.mjs → device-pool-CrmiE4_x.mjs} +3 -3
  40. package/dist/{device-BJm0irrq.mjs → device-provision-CK2XiEp1.mjs} +11 -302
  41. package/dist/{doctor-Dbx1ZpD2.mjs → doctor-BO_kaFWX.mjs} +1 -1
  42. package/dist/{doctor-DyqE9n1J.mjs → doctor-Cp4-HN1f.mjs} +20 -15
  43. package/dist/{doctor-F-3VUUyN.mjs → doctor-Dr3C1iXV.mjs} +19 -19
  44. package/dist/doctor-fingerprint.mjs +1 -1
  45. package/dist/{doctor-watchman-CxDbyrrt.mjs → doctor-watchman-CJr2aXXv.mjs} +4 -4
  46. package/dist/{eas-build-CjNSWmjo.mjs → eas-build-D-9HmGZS.mjs} +2 -2
  47. package/dist/{eas-fallback-9fqb46kW.mjs → eas-fallback-Cemt2GVL.mjs} +4 -4
  48. package/dist/{eas-session-ledger-DrP4OuuM.mjs → eas-session-ledger-B0KLZx5m.mjs} +36 -7
  49. package/dist/{error-diagnostics-snej9k4j.mjs → error-diagnostics-CV_1RoEH.mjs} +8 -8
  50. package/dist/{gc-CGZ1Yg88.mjs → gc-CKHqL4aS.mjs} +81 -18
  51. package/dist/{gc-BRwAY3qT.mjs → gc-DjXwQXHK.mjs} +2 -2
  52. package/dist/{guide-_rfEh_zM.mjs → guide-CeRlWVsS.mjs} +230 -62
  53. package/dist/{hosted-android-BMKzUNnY.mjs → hosted-android-DI_vvv7U.mjs} +5 -6
  54. package/dist/{hosted-client-D7Pk_Oo1.mjs → hosted-client-CgoxdU9j.mjs} +44 -17
  55. package/dist/{hosted-logs-B1gqQuva.mjs → hosted-logs-C-4INmkn.mjs} +17 -8
  56. package/dist/{hosted-logs-sync-Dg3qrZmV.mjs → hosted-logs-sync-Bf5s02fi.mjs} +5 -5
  57. package/dist/{hosted-macos-B9w4H8hc.mjs → hosted-macos-Doh85YUM.mjs} +5 -5
  58. package/dist/{hosted-native-CdgaiuyP.mjs → hosted-native-DvZENAL-.mjs} +11 -8
  59. package/dist/{idle-shutdown-Cbvo5KEh.mjs → idle-shutdown-BM37gMfU.mjs} +7 -7
  60. package/dist/{ios-Bk4mWbtS.mjs → ios-CNDH6fNF.mjs} +8 -8
  61. package/dist/{ios-E26qSpkb.mjs → ios-CoMCWfub.mjs} +4 -4
  62. package/dist/{ios-B5HlVMhQ.mjs → ios-UM_dManb.mjs} +31 -29
  63. package/dist/{ios-device-C_QkIf1Z.mjs → ios-device-L1-pota_.mjs} +1 -1
  64. package/dist/{ios-project-D8Jcy_br.mjs → ios-project-DJYptOCh.mjs} +7 -7
  65. package/dist/{ios-state-BZ03NFgF.mjs → ios-state-Ce_dystM.mjs} +1 -1
  66. package/dist/{js-swap-Dg2a945i.mjs → js-swap-BthE4kZC.mjs} +4 -4
  67. package/dist/{launch-CRyBeNsA.mjs → launch-D798aSm8.mjs} +19 -19
  68. package/dist/{lightened-BCsdAGj_.mjs → lightened-vSxkstg6.mjs} +4 -4
  69. package/dist/{logs-aJQb-RDg.mjs → logs-BND8MiBq.mjs} +9 -8
  70. package/dist/{logs-CC_-ZzEE.mjs → logs-CilPftm3.mjs} +5 -5
  71. package/dist/{macos-BGmTpnv9.mjs → macos-BOQrKYeJ.mjs} +1 -1
  72. package/dist/{macos-DlCBhMw5.mjs → macos-CxUi9xcE.mjs} +20 -20
  73. package/dist/macos-run.mjs +1 -1
  74. package/dist/maintenance-run.mjs +13 -9
  75. package/dist/{metro-CvyD-xwe.mjs → metro-BMQHczcf.mjs} +2 -2
  76. package/dist/{metro-gateway-BnHdqMO_.mjs → metro-request-BtF7ox53.mjs} +25 -46
  77. package/dist/{named-ports-BCyMWA6b.mjs → named-ports-DcktE2Pw.mjs} +2 -2
  78. package/dist/{native-android-DlpxCyOP.mjs → native-android-BkhrCjdX.mjs} +16 -16
  79. package/dist/{native-gradle-artifact-inputs-C13qT7R_.mjs → native-gradle-artifact-inputs-Cw4P6Gyr.mjs} +3 -3
  80. package/dist/{native-runtime-DqaIBO5w.mjs → native-runtime-DyH2gkXK.mjs} +6 -6
  81. package/dist/{native-xcode-inputs-B1W8SrxB.mjs → native-xcode-inputs-DV8jr3kJ.mjs} +2 -2
  82. package/dist/{native-xcode-ios-QPP0Rm68.mjs → native-xcode-ios-DdpPG2iT.mjs} +15 -15
  83. package/dist/{ndjson-Dy2W4vRa.mjs → ndjson-CrjIsGzw.mjs} +2 -2
  84. package/dist/offload-worker.d.mts +1 -1
  85. package/dist/offload-worker.mjs +22 -22
  86. package/dist/{ownership-Bx-0cku-.mjs → ownership-Dtz9G5Gl.mjs} +2 -2
  87. package/dist/{phone-reverses-C9yAaKEv.mjs → phone-reverses-DZRad8HT.mjs} +4 -4
  88. package/dist/{placement-log-BXUbiZM6.mjs → placement-log-CoN6xrjY.mjs} +1 -1
  89. package/dist/{plan-placement-UxnQjv5Z.mjs → plan-placement-7sHuqR-r.mjs} +6 -6
  90. package/dist/{ports-uUrghqWN.mjs → ports-VQSAPZhl.mjs} +3 -3
  91. package/dist/{prebuild-BDpToDgR.mjs → prebuild-Bqp0LFGN.mjs} +9 -9
  92. package/dist/{project-DYj-HVx6.mjs → project-D1n0K4yg.mjs} +15 -15
  93. package/dist/{react-native-android-DDBccgJw.mjs → react-native-android-FQ-yX3Mv.mjs} +22 -22
  94. package/dist/{react-native-build-DaK2IFyP.mjs → react-native-build-D58bIqV9.mjs} +7 -7
  95. package/dist/{react-native-doctor-B-Mw6DcR.mjs → react-native-doctor-AkUH2aca.mjs} +5 -5
  96. package/dist/{react-native-ios-DjYwUF9U.mjs → react-native-ios-Dmsv8j7T.mjs} +14 -14
  97. package/dist/{recordings-C20iUZfp.mjs → recordings-CHMaF73C.mjs} +1 -1
  98. package/dist/{reload-fUdkH2_p.mjs → reload-BV0nD-k9.mjs} +14 -14
  99. package/dist/{reload-DJBeF_rC.mjs → reload-CDKEzzaf.mjs} +1 -1
  100. package/dist/{remote-y6n99WMW.mjs → remote-C8xyslUa.mjs} +9 -9
  101. package/dist/{result-CTqBw2Te.mjs → result-9fqcJ90W.mjs} +16 -16
  102. package/dist/{run-DaCeNKRm.mjs → run-BQAmrohh.mjs} +2 -2
  103. package/dist/{selection-Bs8phwhN.mjs → selection-D1ZDzHFX.mjs} +105 -62
  104. package/dist/{server-bare-BOh-iZEj.mjs → server-bare-CEQdB_F4.mjs} +37 -1
  105. package/dist/{server-command-8CuA51Cv.mjs → server-command-RlS-Kl4a.mjs} +5 -5
  106. package/dist/server-expo-BVV9qy31.mjs +2 -0
  107. package/dist/{server-expo-ABQs2XFA.mjs → server-expo-bB1VV2k-.mjs} +8 -5
  108. package/dist/{settings-CMHhQNwI.mjs → settings-BcVCcAT5.mjs} +2 -2
  109. package/dist/{settings-BDVI8Ivc.mjs → settings-D776ygML.mjs} +47 -3
  110. package/dist/{settings-Djl-mpjX.mjs → settings-D9LtQaUw.mjs} +2 -1
  111. package/dist/{settings-payload-cm60Zhib.mjs → settings-payload-_aatELz2.mjs} +4 -4
  112. package/dist/{settings-write-BdNRLlBn.mjs → settings-write-CkTVGQ4O.mjs} +5 -5
  113. package/dist/settings.schema.json +58 -9
  114. package/dist/{simslim-DCQwzoPy.mjs → simslim-CbpHERcv.mjs} +1 -1
  115. package/dist/{slot-launch-0l7RqSpr.mjs → slot-launch-Dbgfh8gc.mjs} +6 -6
  116. package/dist/{stage-F4cAfJGi.mjs → stage-BuHuRj1y.mjs} +1 -1
  117. package/dist/{start-DcqnF9p8.mjs → start-Cr-c3Xhq.mjs} +1 -1
  118. package/dist/{start-DrPwER_2.mjs → start-Dlv4XXTP.mjs} +11 -11
  119. package/dist/{state-CZxLyetD.mjs → state-C2AUjjhg.mjs} +1 -1
  120. package/dist/{state-BX1y5syV.mjs → state-D5ZxwCGJ.mjs} +2 -2
  121. package/dist/{stats-GxuCbles.mjs → stats-D5c-uIBp.mjs} +4 -4
  122. package/dist/{status-7ULDEJ1e.mjs → status-CK7ZoEhV.mjs} +2 -2
  123. package/dist/{status-BfnK9pUd.mjs → status-D6PBK6_-.mjs} +49 -26
  124. package/dist/{status-Bj7ZYvvc.mjs → status-DbQv--Yb.mjs} +1 -1
  125. package/dist/{status-watch-BfabQn03.mjs → status-watch-okrpea4i.mjs} +17 -6
  126. package/dist/status-worker.mjs +1 -1
  127. package/dist/{stim-desktop-CbWo21kb.mjs → stim-desktop-CYXLFpFS.mjs} +1 -1
  128. package/dist/{stop-x1Yu3He4.mjs → stop-CHtAiv79.mjs} +2 -2
  129. package/dist/{stop-D-EAr25B.mjs → stop-p9uSKuGE.mjs} +20 -19
  130. package/dist/{stop-CH79S3IZ.mjs → stop-uRQ-zYcl.mjs} +9 -5
  131. package/dist/supervisor-run.d.mts +1 -0
  132. package/dist/supervisor-run.mjs +243 -65
  133. package/dist/{support-Be0UeVZU.mjs → support-BMpQIug0.mjs} +11 -10
  134. package/dist/{support-CNg_YsOk.mjs → support-PFyTkrnr.mjs} +4 -4
  135. package/dist/{swiftpm-artifact-inputs-uPqYvGBv.mjs → swiftpm-artifact-inputs-Cddq6jN2.mjs} +1 -1
  136. package/dist/{swiftpm-macos-Ch4YjY_A.mjs → swiftpm-macos-BSj9iZlI.mjs} +8 -8
  137. package/dist/{toolchain-JYAOquPg.mjs → toolchain-B-mzR9Rh.mjs} +1 -1
  138. package/dist/{toolchain-CbCG6C5Z.mjs → toolchain-CLGnEUgT.mjs} +4 -4
  139. package/dist/{trigger-DMou-X7j.mjs → trigger-CfnOfpDd.mjs} +1 -1
  140. package/dist/trigger-DBZ-GBrl.mjs +2 -0
  141. package/dist/{warm-progress-C0RsbngN.mjs → warm-progress--KkkBBaq.mjs} +3 -3
  142. package/dist/web-BxSo493O.mjs +2 -0
  143. package/dist/web-run.mjs +5 -5
  144. package/dist/{web-Cq_AQ4DK.mjs → web-xlVssjQf.mjs} +8 -8
  145. package/dist/{workspace-state-BjqdjnJR.mjs → workspace-state-DGwkPXwq.mjs} +2 -2
  146. package/dist/{workspaces-DFbj07jp.mjs → workspaces-CvSYD_78.mjs} +106 -26
  147. package/dist/{worktree-COAJ3-OD.mjs → worktree-CaQBf6kh.mjs} +26 -47
  148. package/dist/worktree-DTOIohFe.mjs +2 -0
  149. package/package.json +7 -7
  150. package/shim/bundle-response.cjs +37 -0
  151. package/dist/server-expo-Ba_Y21vB.mjs +0 -2
  152. package/dist/trigger-qp2ji5wE.mjs +0 -2
  153. package/dist/web-Je6abcpz.mjs +0 -2
  154. package/dist/worktree-JGUd_53L.mjs +0 -2
@@ -1,25 +1,25 @@
1
1
  import { D as ownership_claim_exports, S as process_identity_exports, b as operationState, c as throwIfCancelled, d as workspaceProcessLockError, f as workspaceProcessLockPath, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, o as cancellableSleep, t as getExecutor, u as withWorkspaceProcessLock, v as stopDeclaringSpawnsOn } from "./exec-aULwtNly.mjs";
2
- import { A as workspaceName$1, E as workspaceDir, l as withWorkspaceStateLockAsync, o as updateWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey, u as workspaceLastUsed, w as workspaceAgentDeviceDir } from "./workspace-state-BjqdjnJR.mjs";
3
- import { D as withConfigLock$1, F as isOnMountedVolume, G as projectDeviceSlots, H as deviceSlotPlatforms, I as listMountedVolumes, L as measuredDirectorySizeAsync, O as withConfigLockAsync$1, P as formatBytes, _ as loadConfig$1, d as getConfigDir, g as isPathPrefix$1, j as acquireAvdClaim, p as getProject } from "./config-Cn94Jc0g.mjs";
2
+ import { A as workspaceName$1, E as workspaceDir, l as withWorkspaceStateLockAsync, o as updateWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey, u as workspaceLastUsed, w as workspaceAgentDeviceDir } from "./workspace-state-DGwkPXwq.mjs";
3
+ import { D as withConfigLock$1, F as isOnMountedVolume, G as projectDeviceSlots, H as deviceSlotPlatforms, I as listMountedVolumes, L as measuredDirectorySizeAsync, O as withConfigLockAsync$1, P as formatBytes, _ as loadConfig$1, d as getConfigDir, g as isPathPrefix$1, j as acquireAvdClaim, p as getProject } from "./config-AbUjIBOQ.mjs";
4
4
  import { t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
5
- import { a as formatElapsed, d as quotedPath$1, l as phaseLine, o as formatLongDuration, u as plural } from "./command-output-Dj-WT4BP.mjs";
5
+ import { a as formatElapsed, d as quotedPath$1, l as phaseLine, o as formatLongDuration, u as plural } from "./command-output-DjCsmzLZ.mjs";
6
6
  import { c as gitQuiet, l as gitQuietAsync, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
7
- import { Lt as repoRootAsync, pt as resolveTailscaleBinary } from "./settings-BDVI8Ivc.mjs";
8
- import { a as macosRuntimeClaim, n as macosDir } from "./state-CZxLyetD.mjs";
9
- import { Ct as forgetCreatedDeviceAsync, G as ownedAvdSerialResolverAsync, H as ownedAvdMatchesConfiguration, K as ownedAvdSystemImage, L as listOrphanedAvdDirectories, S as deleteAvd, St as forgetCreatedDevice, Tt as recordCreatedDevice, V as ownedAvdDirectory, W as ownedAvdSerialResolver, _t as parkSim, bt as removeParkedAfter, g as avdPathExists, ht as eraseParkedAfter, it as shutdownAndroidEmulator, j as listAdbDevicesAsync, lt as wipeAvdUserData, nt as resolveOwnedAvdSerialAsync, p as assertOwnedAvdStoppedAsync, st as waitForAndroidEmulatorShutdown, ut as isStimOwnedAvd, v as avdStorageRoots, wt as readCreatedDevices$1, yt as readParked } from "./android-DriNoAVy.mjs";
10
- import { c as pidExists, f as signalProcessTree, p as signalProcessTreeAsync } from "./metro-CvyD-xwe.mjs";
11
- import { _ as chromeProcessStateAsync, c as webClaimRoot, i as clearWebRecord, o as readWebRecord, p as webProfileDir, t as CDP_PORT_LABEL, u as webFacts, v as liveProfileHolder, y as removeSingletonFiles } from "./state-BX1y5syV.mjs";
7
+ import { Pt as lockReason, Vt as repoRootAsync, Xt as worktreeLockAsync, Yt as worktreeLock, pt as resolveTailscaleBinary } from "./settings-D776ygML.mjs";
8
+ import { a as macosRuntimeClaim, n as macosDir } from "./state-C2AUjjhg.mjs";
9
+ import { Ct as forgetCreatedDeviceAsync, G as ownedAvdSerialResolverAsync, H as ownedAvdMatchesConfiguration, K as ownedAvdSystemImage, L as listOrphanedAvdDirectories, S as deleteAvd, St as forgetCreatedDevice, Tt as recordCreatedDevice, V as ownedAvdDirectory, W as ownedAvdSerialResolver, _t as parkSim, bt as removeParkedAfter, g as avdPathExists, ht as eraseParkedAfter, it as shutdownAndroidEmulator, j as listAdbDevicesAsync, lt as wipeAvdUserData, nt as resolveOwnedAvdSerialAsync, p as assertOwnedAvdStoppedAsync, st as waitForAndroidEmulatorShutdown, ut as isStimOwnedAvd, v as avdStorageRoots, wt as readCreatedDevices$1, yt as readParked } from "./android-BHKgeOuq.mjs";
10
+ import { c as pidExists, f as signalProcessTree, p as signalProcessTreeAsync } from "./metro-BMQHczcf.mjs";
11
+ import { _ as chromeProcessStateAsync, c as webClaimRoot, i as clearWebRecord, o as readWebRecord, p as webProfileDir, t as CDP_PORT_LABEL, u as webFacts, v as liveProfileHolder, y as removeSingletonFiles } from "./state-D5ZxwCGJ.mjs";
12
12
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
13
- import { N as listBuildLocks, d as readAgentDeviceRecords, i as createActivityReaderAsync, r as createActivityReader, s as idleForMs, t as agentDeviceDaemon } from "./activity-Cd-ysFes.mjs";
14
- import { C as renameIosSim, D as resolveOwnedIosSim, c as eraseIosSim, f as listAllIosSimsAsync, k as shutdownIosSim, o as deleteIosSim, p as listIosDeviceTypesAsync, s as deleteParkedIosSim, v as parkedSimName, y as parseRuntimeVersion } from "./ios-E26qSpkb.mjs";
15
- import { r as releaseBrowserPort } from "./named-ports-BCyMWA6b.mjs";
13
+ import { N as listBuildLocks, d as readAgentDeviceRecords, i as createActivityReaderAsync, r as createActivityReader, s as idleForMs, t as agentDeviceDaemon } from "./activity-BR5oHSO5.mjs";
14
+ import { C as renameIosSim, D as resolveOwnedIosSim, c as eraseIosSim, f as listAllIosSimsAsync, k as shutdownIosSim, o as deleteIosSim, p as listIosDeviceTypesAsync, s as deleteParkedIosSim, v as parkedSimName, y as parseRuntimeVersion } from "./ios-CoMCWfub.mjs";
15
+ import { r as releaseBrowserPort } from "./named-ports-DcktE2Pw.mjs";
16
16
  import { createHash, randomUUID } from "node:crypto";
17
17
  import { closeSync, existsSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, rmdirSync, statSync, unlinkSync, watch, writeFileSync } from "node:fs";
18
18
  import { isDeepStrictEqual } from "node:util";
19
19
  import { homedir } from "node:os";
20
20
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
21
21
  import { ambientContext, ambientEnv, ambientWrite, withDirLock, workspaceName } from "@stim-cli/core";
22
- import { BUILD_HISTORY_KEY, BUILD_HISTORY_LIMIT, BUILD_LEDGER_CAP, BUILD_PHASES, LAST_BUILD_KEYS, STATS_VERSION, buildLedgerFile, buildLedgerLock, buildSlotsDir, decodeStats, hostedNativeRecords, isJsonObject, lastNativeUseFrom, macosAppState, parseHostedNativePlacement, parseMissReason, readJsonFile, readMacosRecord, readRunEstimates, readStats as readStats$1, requireAutomaticMachine, statsFile, statsProjectKey as statsProjectKey$1, trace, trimCapacityRefusals, trimCapacityWaits, trimSamples, tryAcquireBuildSlotClaim, unreadableHostedNative, wholePhases, workspaceBuildDetailFile } from "@stim-cli/core/state";
22
+ import { BUILD_HISTORY_KEY, BUILD_HISTORY_LIMIT, BUILD_LEDGER_CAP, BUILD_PHASES, LAST_BUILD_KEYS, STATS_VERSION, buildLedgerFile, buildLedgerLock, buildSlotsDir, decodeStats, hostedAppAttempt, hostedNativeRecords, isJsonObject, lastNativeUseFrom, loadPerCore, macosAppState, parseHostedNativePlacement, parseMissReason, readJsonFile, readMacosRecord, readRunEstimates, readStats as readStats$1, requireAutomaticMachine, statsFile, statsProjectKey as statsProjectKey$1, trace, trimCapacityRefusals, trimCapacityWaits, trimSamples, tryAcquireBuildSlotClaim, unreadableHostedNative, wholePhases, workspaceBuildDetailFile } from "@stim-cli/core/state";
23
23
  import { basename as basename$1, dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, relative as relative$1 } from "path";
24
24
  import { request } from "node:https";
25
25
  import chalk from "chalk";
@@ -104,7 +104,8 @@ function toRecord(holder) {
104
104
  index: typeof details.index === "number" ? details.index : null,
105
105
  projectRoot: typeof details.projectRoot === "string" ? details.projectRoot : null,
106
106
  startedAt: holder.startedAt || null,
107
- logFile: typeof details.logFile === "string" ? details.logFile : null
107
+ logFile: typeof details.logFile === "string" ? details.logFile : null,
108
+ client: details.offloaded === true && typeof details.client === "string" ? details.client : null
108
109
  };
109
110
  }
110
111
  function tryAcquireBuildSlot({ max, root = null, logFile = null }) {
@@ -130,7 +131,8 @@ function tryAcquireBuildSlot({ max, root = null, logFile = null }) {
130
131
  index: got.index,
131
132
  projectRoot: root,
132
133
  startedAt: got.claim.startedAt,
133
- logFile
134
+ logFile,
135
+ client: null
134
136
  },
135
137
  claim: got.claim
136
138
  };
@@ -224,12 +226,37 @@ function listBuildSlots() {
224
226
  projectRoot: info?.projectRoot ?? null,
225
227
  startedAt: info?.startedAt ?? null,
226
228
  logFile: info?.logFile ?? null,
229
+ client: info?.client ?? null,
227
230
  alive: survey.live.length > 0,
228
231
  unresolved: survey.unresolved.length > 0
229
232
  });
230
233
  }
231
234
  return slots;
232
235
  }
236
+ /** The `concurrency.maxBuilds` slots a new build could take, `0` to `max - 1`, and who holds each busy one. */
237
+ function buildSlotUsage(max, slots = listBuildSlots()) {
238
+ const holders = slots.flatMap(({ index, alive, unresolved, projectRoot, client, startedAt }) => {
239
+ if (index === null || index >= max) return [];
240
+ if (alive) return [{
241
+ slot: index,
242
+ workspace: projectRoot,
243
+ client,
244
+ since: startedAt
245
+ }];
246
+ return unresolved ? [{
247
+ slot: index,
248
+ workspace: null,
249
+ client: null,
250
+ since: null,
251
+ unresolved: true
252
+ }] : [];
253
+ }).toSorted((a, b) => a.slot - b.slot);
254
+ return {
255
+ max,
256
+ inUse: holders.length,
257
+ holders
258
+ };
259
+ }
233
260
  //#endregion
234
261
  //#region src/devices/report-only-usage.ts
235
262
  function canonical$1(path) {
@@ -1763,6 +1790,7 @@ function buildLedgerRecord(run) {
1763
1790
  remedy: text(extras.remedy),
1764
1791
  phase: run.phase
1765
1792
  };
1793
+ const bootStartedAt = run.boot ? Date.parse(run.boot.startedAt) : NaN;
1766
1794
  const where = placement.machine ? `on ${placement.machine}` : "here";
1767
1795
  const cacheText = cache.result === "hit" ? `cache hit${cache.source === "remote" ? " (remote)" : ""}` : cache.result;
1768
1796
  const summary = `${platform} build ${outcome} ${where} in ${formatElapsed(durationMs)} (${cacheText})`;
@@ -1793,6 +1821,11 @@ function buildLedgerRecord(run) {
1793
1821
  name: device,
1794
1822
  ...runtime ? { runtime } : {}
1795
1823
  } } : {},
1824
+ ...run.loadPerCore === void 0 ? {} : { loadPerCore: run.loadPerCore },
1825
+ ...run.boot && Number.isFinite(bootStartedAt) ? { boot: {
1826
+ startedAt: bootStartedAt,
1827
+ loadPerCore: run.boot.loadPerCore
1828
+ } } : {},
1796
1829
  stimVersion: run.version
1797
1830
  };
1798
1831
  }
@@ -1869,6 +1902,7 @@ const NO_BUILD_PROGRESS = {
1869
1902
  place: () => {},
1870
1903
  waitingOn: () => {},
1871
1904
  waitingFor: () => {},
1905
+ bootStarted: () => {},
1872
1906
  output: () => {},
1873
1907
  durations: () => ({}),
1874
1908
  phase: () => null,
@@ -1949,7 +1983,7 @@ function projectHistory(projectKey) {
1949
1983
  return;
1950
1984
  }
1951
1985
  }
1952
- function startBuildProgress({ root, platform, slot, claim, now = Date.now, note = () => {} }) {
1986
+ function startBuildProgress({ root, platform, slot, claim, now = Date.now, load = () => loadPerCore().loadPerCore, note = () => {} }) {
1953
1987
  const startedAt = new Date(now()).toISOString();
1954
1988
  const record = {
1955
1989
  platform,
@@ -1966,7 +2000,8 @@ function startBuildProgress({ root, platform, slot, claim, now = Date.now, note
1966
2000
  path: claim.path,
1967
2001
  claimId: claim.claimId,
1968
2002
  pid: claim.owner.pid
1969
- }
2003
+ },
2004
+ loadPerCore: load()
1970
2005
  };
1971
2006
  let warned = false;
1972
2007
  const guard = (fn) => {
@@ -2080,6 +2115,14 @@ function startBuildProgress({ root, platform, slot, claim, now = Date.now, note
2080
2115
  else delete record.waitingFor;
2081
2116
  write();
2082
2117
  },
2118
+ bootStarted() {
2119
+ if (record.boot) return;
2120
+ record.boot = {
2121
+ startedAt: new Date(now()).toISOString(),
2122
+ loadPerCore: load()
2123
+ };
2124
+ write();
2125
+ },
2083
2126
  waitingOn(holder) {
2084
2127
  if (holder === null) {
2085
2128
  if (!record.waitingOn) return;
@@ -2214,7 +2257,9 @@ function updateFinishedBuild(root, record, ran, { update, now, artifactOnly }) {
2214
2257
  id: own.claim.claimId,
2215
2258
  phases,
2216
2259
  phase: own.phase,
2217
- ...offload ? { offload } : {}
2260
+ ...offload ? { offload } : {},
2261
+ ...own.loadPerCore === void 0 ? {} : { loadPerCore: own.loadPerCore },
2262
+ ...own.boot ? { boot: own.boot } : {}
2218
2263
  });
2219
2264
  }
2220
2265
  const entry = {
@@ -2318,6 +2363,7 @@ function parseActiveBuild(value) {
2318
2363
  const estimate = parseEstimate(record.estimate);
2319
2364
  const activity = parseActivity(record.activity);
2320
2365
  const offload = parseOffload(record.offload);
2366
+ const boot = parseBoot(record.boot);
2321
2367
  return {
2322
2368
  platform: record.platform,
2323
2369
  slot: typeof record.slot === "string" ? record.slot : "default",
@@ -2335,6 +2381,8 @@ function parseActiveBuild(value) {
2335
2381
  ...record.outcome === "hit" || record.outcome === "cold" ? { outcome: record.outcome } : {},
2336
2382
  ...estimate ? { estimate } : {},
2337
2383
  ...activity ? { activity } : {},
2384
+ ...isLoad(record.loadPerCore) ? { loadPerCore: record.loadPerCore } : {},
2385
+ ...boot ? { boot } : {},
2338
2386
  claim: {
2339
2387
  root: claim.root,
2340
2388
  path: typeof claim.path === "string" ? claim.path : "",
@@ -2343,6 +2391,16 @@ function parseActiveBuild(value) {
2343
2391
  }
2344
2392
  };
2345
2393
  }
2394
+ function isLoad(value) {
2395
+ return typeof value === "number" && Number.isFinite(value) && value >= 0;
2396
+ }
2397
+ function parseBoot(value) {
2398
+ if (!isJsonObject(value) || typeof value.startedAt !== "string" || !isLoad(value.loadPerCore)) return null;
2399
+ return {
2400
+ startedAt: value.startedAt,
2401
+ loadPerCore: value.loadPerCore
2402
+ };
2403
+ }
2346
2404
  function parseOffload(value) {
2347
2405
  if (!isJsonObject(value) || typeof value.host !== "string" || !isJsonObject(value.phaseMs)) return null;
2348
2406
  const phaseMs = {};
@@ -2827,10 +2885,20 @@ function failedBundleListing(record, error) {
2827
2885
  if (!open.trim()) throw unverified(record.pid, `lsof failed (${error.message.split("\n")[0]})`);
2828
2886
  return open;
2829
2887
  }
2888
+ /** The attempt directories under a hosted session's `apps`, each of which holds one `App.app`. */
2889
+ function hostedBundleDirs(area) {
2890
+ const apps = join(area, "apps");
2891
+ if (process.platform !== "darwin" || !existsSync(apps)) return [];
2892
+ if (realpathSync(apps) !== apps) throw new Error("Hosted app data resolves outside its private area.");
2893
+ return readdirSync(apps).filter((attempt) => hostedAppAttempt(attempt)).map((attempt) => join(apps, attempt)).filter((dir) => lstatSync(dir, { throwIfNoEntry: false })?.isDirectory());
2894
+ }
2830
2895
  /** Verifies owned bundle instances without blocking on process and executable probes. */
2831
- async function runningBundleInstancesAsync(root, operation) {
2896
+ function runningBundleInstancesAsync(root, operation) {
2897
+ return runningInstancesInAsync(bundleDirs(root), operation);
2898
+ }
2899
+ /** Verifies the running copies of app bundles directly inside `dirs`. */
2900
+ async function runningInstancesInAsync(dirs, operation) {
2832
2901
  operation?.signal.throwIfAborted();
2833
- const dirs = bundleDirs(root);
2834
2902
  if (!dirs.length) return [];
2835
2903
  const listing = await runOperationFile(operation, getExecutor(), "ps", [
2836
2904
  "-axww",
@@ -3871,11 +3939,14 @@ function recentNativeUseReason(nativeUsed, now) {
3871
3939
  return now - nativeUsed < 9e5 ? `ran ios, android or macos within the last ${LIGHTEN_AFTER_MS / 6e4} minutes` : null;
3872
3940
  }
3873
3941
  const DAY_MS = 864e5;
3942
+ function keptByLock(entry) {
3943
+ return entry.keptCode === "locked" || entry.keptCode === "lock-unknown";
3944
+ }
3874
3945
  function planWorkspaceOutputs(entries, { olderThan, now }) {
3875
- return entries.map(({ dir, projectRoot, problem, inTreeDirs = [], bytes, lastUsed, nativeUsed, inUse }) => {
3946
+ return entries.map(({ dir, projectRoot, problem, inTreeDirs = [], bytes, lastUsed, nativeUsed, inUse, lock }) => {
3876
3947
  const recentNative = recentNativeUseReason(nativeUsed, now);
3877
3948
  const idleDays = Number.isFinite(lastUsed) ? Math.max(0, Math.floor((now - lastUsed) / DAY_MS)) : null;
3878
- const [keptCode, keptReason] = projectRoot === null ? ["unresolved", `workspace directory not resolved: ${problem ?? "unknown project root"}`] : inUse.length ? ["in-use", `in use: ${inUse.join("; ")}`] : recentNative ? ["recently-used", recentNative] : olderThan === null ? [null, null] : idleDays === null ? ["last-use-unknown", "its last use is unknown"] : idleDays < olderThan ? ["recently-used", `used ${idleDays}d ago, within --older-than ${olderThan}`] : [null, null];
3949
+ const [keptCode, keptReason] = projectRoot === null ? ["unresolved", `workspace directory not resolved: ${problem ?? "unknown project root"}`] : lock ? [lock === "locked" ? "locked" : "lock-unknown", lockReason(lock)] : inUse.length ? ["in-use", `in use: ${inUse.join("; ")}`] : recentNative ? ["recently-used", recentNative] : olderThan === null ? [null, null] : idleDays === null ? ["last-use-unknown", "its last use is unknown"] : idleDays < olderThan ? ["recently-used", `used ${idleDays}d ago, within --older-than ${olderThan}`] : [null, null];
3879
3950
  return {
3880
3951
  dir,
3881
3952
  projectRoot,
@@ -3889,6 +3960,11 @@ function planWorkspaceOutputs(entries, { olderThan, now }) {
3889
3960
  });
3890
3961
  }
3891
3962
  const SIZE_TIMEOUT_MS = 6e4;
3963
+ const gitRead = (operation, signal) => ({
3964
+ env: operation?.env,
3965
+ signal: signal ?? operation?.signal,
3966
+ declareFor: operation
3967
+ });
3892
3968
  function outputPaths(dir) {
3893
3969
  const paths = WORKSPACE_OUTPUT_DIRS.map((name) => join$1(dir, name)).filter((path) => existsSync$1(path));
3894
3970
  const macos = join$1(dir, "macos");
@@ -3915,9 +3991,9 @@ async function outputBytes(entries, timeoutMs, signal, operation) {
3915
3991
  return own.includes(null) ? null : own.reduce((total, size) => total + (size ?? 0), 0);
3916
3992
  });
3917
3993
  }
3918
- function collectWorkspaceOutputs({ olderThan, now, exclude = [], measure = true, sizeTimeoutMs = SIZE_TIMEOUT_MS, signal, operation, lighten = false }) {
3994
+ function collectWorkspaceOutputs({ olderThan, now, exclude = [], only, measure = true, sizeTimeoutMs = SIZE_TIMEOUT_MS, signal, operation, lighten = false }) {
3919
3995
  const mountedVolumes = listMountedVolumes();
3920
- const outputEntries = (entries, inTree = /* @__PURE__ */ new Map()) => entries.filter((entry) => !exclude.includes(entry.dir)).filter((entry) => entry.projectRoot === null || isOnMountedVolume(entry.projectRoot, mountedVolumes)).map((entry) => {
3996
+ const outputEntries = (entries, inTree = /* @__PURE__ */ new Map()) => entries.filter((entry) => !exclude.includes(entry.dir)).filter((entry) => only === void 0 || entry.projectRoot !== null && canonicalPath(entry.projectRoot) === only).filter((entry) => entry.projectRoot === null || isOnMountedVolume(entry.projectRoot, mountedVolumes)).map((entry) => {
3921
3997
  const inTreeDirs = inTree.get(entry.dir) ?? [];
3922
3998
  return Object.assign({}, entry, {
3923
3999
  inTreeDirs,
@@ -3937,7 +4013,8 @@ function collectWorkspaceOutputs({ olderThan, now, exclude = [], measure = true,
3937
4013
  const inUseOf = (root) => lighten ? workspaceBuildReasons(root) : workspaceInUse(root);
3938
4014
  if (!measure && !signal) return report(outputEntries(listWorkspaceDirs()).map(({ paths: _paths, ...entry }) => Object.assign({}, entry, {
3939
4015
  bytes: null,
3940
- inUse: entry.projectRoot === null ? [] : inUseOf(entry.projectRoot)
4016
+ inUse: entry.projectRoot === null ? [] : inUseOf(entry.projectRoot),
4017
+ lock: entry.projectRoot === null ? null : worktreeLock(entry.projectRoot)
3941
4018
  })));
3942
4019
  return (async () => {
3943
4020
  const sizes = [];
@@ -3948,11 +4025,13 @@ function collectWorkspaceOutputs({ olderThan, now, exclude = [], measure = true,
3948
4025
  }
3949
4026
  const entries = outputEntries(listed, inTree);
3950
4027
  const bytes = measure ? await outputBytes(entries.map((entry) => entry.paths), sizeTimeoutMs, signal, operation) : [];
4028
+ const locks = await mapLimited(entries, sizeConcurrency(operation), async ({ projectRoot }) => projectRoot === null ? null : worktreeLockAsync(projectRoot, gitRead(operation, signal)));
3951
4029
  for (const [index, { paths: _paths, ...entry }] of entries.entries()) {
3952
4030
  signal?.throwIfAborted();
3953
4031
  sizes.push({
3954
4032
  ...entry,
3955
4033
  bytes: bytes[index] ?? null,
4034
+ lock: locks[index] ?? null,
3956
4035
  inUse: entry.projectRoot === null ? [] : !signal ? inUseOf(entry.projectRoot) : lighten ? await workspaceBuildReasonsAsync(entry.projectRoot, signal, operation) : await workspaceInUseAsync(entry.projectRoot, {}, signal, operation)
3957
4036
  });
3958
4037
  }
@@ -3984,7 +4063,8 @@ async function clearWorkspaceOutputs(report, { olderThan, now = Date.now(), oper
3984
4063
  problem: null,
3985
4064
  lastUsed: workspaceLastUsed(root),
3986
4065
  nativeUsed: lighten ? lastNativeUseFrom(readWorkspaceState$1(root)) : NaN,
3987
- inUse: lighten && workspaceBuildInProgress(root) ? [BUILD_IN_PROGRESS] : []
4066
+ inUse: lighten && workspaceBuildInProgress(root) ? [BUILD_IN_PROGRESS] : [],
4067
+ lock: await worktreeLockAsync(root, gitRead(operation, signal))
3988
4068
  }], {
3989
4069
  olderThan,
3990
4070
  now
@@ -4106,4 +4186,4 @@ function sizeText(bytes) {
4106
4186
  return bytes === null ? "size unknown" : formatBytes(bytes);
4107
4187
  }
4108
4188
  //#endregion
4109
- export { STIM_VERSION as $, collectIdleDevicesAsync as A, activeBuildState as B, terminateChild as C, createGcResults as Ct, withManagedTunnelRemovalLock as D, readConcurrency as Dt, withManagedTunnelLock as E, mapLimited as Et, parseIdleDuration as F, parseActiveBuild as G, buildStatusLine as H, shutDownIdleDevices as I, runFailureRecord as J, recordBuildPhase as K, workspaceBuildInProgress as L, collectOwnedDeviceActivityAsync as M, idleDeviceLines as N, runningBundleInstancesAsync as O, sizeConcurrency as Ot, idleShutdownCandidates as P, errorRemedy as Q, ACTIVE_BUILD_KEY as R, stopTunnel as S, GC_OUTPUT as St, withManagedRemoteWorktreeRemovalLock as T, eachLimited as Tt, bundlingActivity as U, buildReport as V, estimateBuild as W, tapBuildLog as X, startBuildProgress as Y, thrownRunFailureRecord as Z, withIdleWorkspace as _, measureDu as _t, collectOrphanedWorkspaces as a, recordRunStats as at, resolveSupervisorTarget as b, listBuildSlots as bt, isInsideWorkspaces as c, eraseParkedIosSim as ct, rootPresence as d, teardownOwnedBrowser as dt, createRunRecorder as et, sizeText as f, teardownOwnedIosSim as ft, emptyWorkspaceDir as g, canonical$1 as gt, ARTIFACT_DIRS as h, probePublicHttp as ht, clearWorkspaceOutputs as i, recordCapacityWait as it, collectOwnedDeviceActivity as j, collectIdleDevices as k, listWorkspaceDirs as l, teardownBrowserHeld as lt, workspaceDirRemoved as m, teardownParkedIosSim as mt, REBUILD_COST as n, readStats$1 as nt, collectWorkspaceOutputs as o, statsProjectKey$1 as ot, workspaceBuildReasons as p, teardownParkedAvd as pt, recordFinishedBuild as q, WORKSPACE_OUTPUT_DIRS as r, recordCapacityRefusal as rt, deleteOrphanedWorkspaces as s, eraseParkedAvd as st, LIGHTEN_AFTER_MS as t, readRunEstimates as tt, recentNativeUseReason as u, teardownOwnedAvd as ut, workspaceInUse as v, writeUsageCache as vt, withManagedRemoteWorktreeLock as w, takeGcResults as wt, startTunnelSequence as x, releaseBuildSlot as xt, workspaceInUseAsync as y, acquireBuildSlot as yt, NO_BUILD_PROGRESS as z };
4189
+ export { tapBuildLog as $, runningBundleInstancesAsync as A, mapLimited as At, workspaceBuildInProgress as B, stopTunnel as C, buildSlotUsage as Ct, withManagedTunnelLock as D, createGcResults as Dt, withManagedRemoteWorktreeRemovalLock as E, GC_OUTPUT as Et, collectOwnedDeviceActivityAsync as F, buildStatusLine as G, NO_BUILD_PROGRESS as H, idleDeviceLines as I, parseActiveBuild as J, bundlingActivity as K, idleShutdownCandidates as L, collectIdleDevices as M, sizeConcurrency as Mt, collectIdleDevicesAsync as N, withManagedTunnelRemovalLock as O, takeGcResults as Ot, collectOwnedDeviceActivity as P, startBuildProgress as Q, parseIdleDuration as R, startTunnelSequence as S, acquireBuildSlot as St, withManagedRemoteWorktreeLock as T, releaseBuildSlot as Tt, activeBuildState as U, ACTIVE_BUILD_KEY as V, buildReport as W, recordFinishedBuild as X, recordBuildPhase as Y, runFailureRecord as Z, emptyWorkspaceDir as _, teardownParkedIosSim as _t, collectOrphanedWorkspaces as a, readStats$1 as at, workspaceInUseAsync as b, measureDu as bt, isInsideWorkspaces as c, recordRunStats as ct, recentNativeUseReason as d, eraseParkedIosSim as dt, thrownRunFailureRecord as et, rootPresence as f, teardownBrowserHeld as ft, ARTIFACT_DIRS as g, teardownParkedAvd as gt, workspaceDirRemoved as h, teardownOwnedIosSim as ht, clearWorkspaceOutputs as i, readRunEstimates as it, runningInstancesInAsync as j, readConcurrency as jt, hostedBundleDirs as k, eachLimited as kt, keptByLock as l, statsProjectKey$1 as lt, workspaceBuildReasons as m, teardownOwnedBrowser as mt, REBUILD_COST as n, STIM_VERSION as nt, collectWorkspaceOutputs as o, recordCapacityRefusal as ot, sizeText as p, teardownOwnedAvd as pt, estimateBuild as q, WORKSPACE_OUTPUT_DIRS as r, createRunRecorder as rt, deleteOrphanedWorkspaces as s, recordCapacityWait as st, LIGHTEN_AFTER_MS as t, errorRemedy as tt, listWorkspaceDirs as u, eraseParkedAvd as ut, withIdleWorkspace as v, probePublicHttp as vt, terminateChild as w, listBuildSlots as wt, resolveSupervisorTarget as x, writeUsageCache as xt, workspaceInUse as y, canonical$1 as yt, shutDownIdleDevices as z };
@@ -1,32 +1,32 @@
1
1
  import { D as ownership_claim_exports, S as process_identity_exports, b as operationState, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, n as isTimeoutError, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-aULwtNly.mjs";
2
- import { E as workspaceDir, a as recordWorkspaceUseAsync, l as withWorkspaceStateLockAsync, r as readWorkspaceState$1, w as workspaceAgentDeviceDir } from "./workspace-state-BjqdjnJR.mjs";
3
- import { E as upsertProject, G as projectDeviceSlots, L as measuredDirectorySizeAsync, O as withConfigLockAsync$1, S as removeProject, _ as loadConfig$1, a as clearDevice, d as getConfigDir, g as isPathPrefix$1, j as acquireAvdClaim, p as getProject } from "./config-Cn94Jc0g.mjs";
4
- import { a as formatElapsed, h as shortUdid, i as formatDuration, l as phaseLine, p as releasedLeaseFact, u as plural } from "./command-output-Dj-WT4BP.mjs";
2
+ import { E as workspaceDir, a as recordWorkspaceUseAsync, l as withWorkspaceStateLockAsync, r as readWorkspaceState$1, w as workspaceAgentDeviceDir } from "./workspace-state-DGwkPXwq.mjs";
3
+ import { E as upsertProject, G as projectDeviceSlots, L as measuredDirectorySizeAsync, O as withConfigLockAsync$1, S as removeProject, _ as loadConfig$1, a as clearDevice, d as getConfigDir, g as isPathPrefix$1, j as acquireAvdClaim, p as getProject } from "./config-AbUjIBOQ.mjs";
4
+ import { a as formatElapsed, h as shortUdid, i as formatDuration, l as phaseLine, p as releasedLeaseFact, u as plural } from "./command-output-DjCsmzLZ.mjs";
5
5
  import { c as gitQuiet, l as gitQuietAsync, o as git, r as childEnvironment, s as gitAsync, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
6
- import { At as listWorktreesAsync, Ct as hasPopulatedSubmodulesAsync, Et as isPodInstallChurn, Ft as removeWorktreeAsync, Ht as sourceCheckoutOf, Nt as podsOutOfSync, Pt as readWorktreeExclude, Q as resolveSettings, Rt as resolveFullRef, St as gitCommonDirOnDisk, Tt as hasUncommittedWorkAsync, Ut as unpushedCommitsAsync, V as readCommittedSettings, Vt as restoreFileAsync, Wt as warmWorktreePaths, X as resolveProjectSettings, Xt as moveIgnoredTreesToTrash, Y as resolveIosProjectDir, Yt as disposeTrash, Zt as restoreTrashedTrees, _ as inertSettingWarning, _t as depsOutOfSync, a as SETTING_SHAPE_REMEDY, gt as deleteBranchAsync, ht as cloneIgnoredEntries, jt as locallyKnownUpstream, mt as branchExistsAsync, rt as settingShapeErrors, st as unknownSettingKeys, wt as hasRemoteAsync, xt as gitCommonDirAsync, yt as dirtyPathsAsync, zt as resolveFullRefAsync } from "./settings-BDVI8Ivc.mjs";
7
- import { F as readRemoteSessionId, M as readMetroTunnel, O as clearManagedMetroTunnel, P as readRemoteSession, T as MODE_COMMAND, i as findProjectRoot$1, k as clearRemoteSession, o as isMobileProject } from "./project-DYj-HVx6.mjs";
8
- import { t as macosAppPresent } from "./state-CZxLyetD.mjs";
9
- import { a as workspaceLinkLine, o as workspaceLinks } from "./stim-desktop-CbWo21kb.mjs";
10
- import { ft as POOL_SETTING_REMEDY, vt as parkedMaxSetting } from "./android-DriNoAVy.mjs";
11
- import { c as pidExists, d as resolveProjectMetro, p as signalProcessTreeAsync, r as killMetroTreeAsync } from "./metro-CvyD-xwe.mjs";
12
- import { A as diskPressureLevel, D as requestDevServerStop, En as runProcessOperation, G as planCacheEmptying, Ln as resolveEasCliBin, N as lowestFree, Ot as endRecordedSession, _ as resolveBudget, g as readVolumeSpaceAsync, h as readVolumeSpace, k as withdrawDevServerStopRequest, p as machineNumber, ur as discoverCaches } from "./ccache-BWTze1Ls.mjs";
13
- import { o as readWebRecord } from "./state-BX1y5syV.mjs";
14
- import { D as withManagedTunnelRemovalLock, S as stopTunnel, T as withManagedRemoteWorktreeRemovalLock, _ as withIdleWorkspace, b as resolveSupervisorTarget, dt as teardownOwnedBrowser, ft as teardownOwnedIosSim, g as emptyWorkspaceDir, o as collectWorkspaceOutputs, ut as teardownOwnedAvd } from "./workspaces-DFbj07jp.mjs";
6
+ import { Ct as gitCommonDirOnDisk, Dt as isPodInstallChurn, Et as hasUncommittedWorkAsync, Ft as matchWorktreeEntry, Gt as restoreFileAsync, Ht as resolveFullRef, It as nativeCanonicalPath, Jt as warmWorktreePaths, Kt as sourceCheckoutOf, Lt as podsOutOfSync, Mt as locallyKnownUpstream, Q as resolveSettings, Rt as readWorktreeExclude, St as gitCommonDirAsync, Tt as hasRemoteAsync, Ut as resolveFullRefAsync, V as readCommittedSettings, X as resolveProjectSettings, Y as resolveIosProjectDir, _ as inertSettingWarning, _t as deleteBranchAsync, a as SETTING_SHAPE_REMEDY, bt as dirtyPathsAsync, gt as cloneIgnoredEntries, ht as branchExistsAsync, jt as listWorktreesAsync, nn as moveIgnoredTreesToTrash, qt as unpushedCommitsAsync, rn as restoreTrashedTrees, rt as settingShapeErrors, st as unknownSettingKeys, tn as disposeTrash, vt as depsOutOfSync, wt as hasPopulatedSubmodulesAsync, zt as removeWorktreeAsync } from "./settings-D776ygML.mjs";
7
+ import { F as readRemoteSessionId, M as readMetroTunnel, O as clearManagedMetroTunnel, P as readRemoteSession, T as MODE_COMMAND, i as findProjectRoot$1, k as clearRemoteSession, o as isMobileProject } from "./project-D1n0K4yg.mjs";
8
+ import { t as macosAppPresent } from "./state-C2AUjjhg.mjs";
9
+ import { a as workspaceLinkLine, o as workspaceLinks } from "./stim-desktop-CYXLFpFS.mjs";
10
+ import { ft as POOL_SETTING_REMEDY, vt as parkedMaxSetting } from "./android-BHKgeOuq.mjs";
11
+ import { c as pidExists, d as resolveProjectMetro, p as signalProcessTreeAsync, r as killMetroTreeAsync } from "./metro-BMQHczcf.mjs";
12
+ import { A as diskPressureLevel, D as requestDevServerStop, En as runProcessOperation, G as planCacheEmptying, Ln as resolveEasCliBin, N as lowestFree, Ot as endRecordedSession, _ as resolveBudget, g as readVolumeSpaceAsync, h as readVolumeSpace, k as withdrawDevServerStopRequest, p as machineNumber, ur as discoverCaches } from "./ccache-DsDkdP72.mjs";
13
+ import { o as readWebRecord } from "./state-D5ZxwCGJ.mjs";
14
+ import { C as stopTunnel, E as withManagedRemoteWorktreeRemovalLock, O as withManagedTunnelRemovalLock, _ as emptyWorkspaceDir, ht as teardownOwnedIosSim, mt as teardownOwnedBrowser, o as collectWorkspaceOutputs, pt as teardownOwnedAvd, v as withIdleWorkspace, x as resolveSupervisorTarget } from "./workspaces-CvSYD_78.mjs";
15
15
  import { t as canonicalPath } from "./paths-BsJMoPP2.mjs";
16
- import { D as runCaptured, O as runPodInstall, S as DEPS_ERROR, T as readPodState, Y as podInstallCommand, ct as cacheUser, j as HEARTBEAT_INTERVAL_MS, w as podsAreStale } from "./toolchain-CbCG6C5Z.mjs";
17
- import { D as releaseWorkspaceLeases, t as agentDeviceDaemon } from "./activity-Cd-ysFes.mjs";
18
- import { R as readHostMemoryPressure, z as readHostMemoryPressureAsync } from "./ios-E26qSpkb.mjs";
19
- import { t as clearNamedPorts } from "./named-ports-BCyMWA6b.mjs";
20
- import { t as resolveMaintenanceSettings } from "./settings-Djl-mpjX.mjs";
21
- import { i as stopHostedAndroid } from "./hosted-android-BMKzUNnY.mjs";
22
- import { a as stopHostedIos, n as removePhoneReverses } from "./phone-reverses-C9yAaKEv.mjs";
23
- import { n as stopMacosApp } from "./stop-CH79S3IZ.mjs";
24
- import { n as verifyCollectorOwnership } from "./ownership-Bx-0cku-.mjs";
16
+ import { D as runCaptured, O as runPodInstall, S as DEPS_ERROR, T as readPodState, Y as podInstallCommand, ct as cacheUser, j as HEARTBEAT_INTERVAL_MS, w as podsAreStale } from "./toolchain-CLGnEUgT.mjs";
17
+ import { D as releaseWorkspaceLeases, t as agentDeviceDaemon } from "./activity-BR5oHSO5.mjs";
18
+ import { R as readHostMemoryPressure, z as readHostMemoryPressureAsync } from "./ios-CoMCWfub.mjs";
19
+ import { t as clearNamedPorts } from "./named-ports-DcktE2Pw.mjs";
20
+ import { t as resolveMaintenanceSettings } from "./settings-D9LtQaUw.mjs";
21
+ import { i as stopHostedAndroid } from "./hosted-android-DI_vvv7U.mjs";
22
+ import { a as stopHostedIos, n as removePhoneReverses } from "./phone-reverses-DZRad8HT.mjs";
23
+ import { r as stopMacosApp } from "./stop-uRQ-zYcl.mjs";
24
+ import { n as verifyCollectorOwnership } from "./ownership-Dtz9G5Gl.mjs";
25
25
  import { o as pullRequestLookupAsync, r as endedPullRequest } from "./pull-request-BzLmzAIQ.mjs";
26
- import { c as mergeStateAsync, d as forgetStatusMeasures, t as startWarmProgress } from "./warm-progress-C0RsbngN.mjs";
27
- import { r as workspaceRecordingEnabled } from "./recordings-C20iUZfp.mjs";
28
- import { i as installedNpmTreeProblems, n as hasInstalledDependencies, t as dependencyState } from "./dependency-state-C3OtgG94.mjs";
29
- import { a as discoverXcodeProject } from "./react-native-build-DaK2IFyP.mjs";
26
+ import { c as mergeStateAsync, d as forgetStatusMeasures, t as startWarmProgress } from "./warm-progress--KkkBBaq.mjs";
27
+ import { r as workspaceRecordingEnabled } from "./recordings-CHMaF73C.mjs";
28
+ import { i as installedNpmTreeProblems, n as hasInstalledDependencies, t as dependencyState } from "./dependency-state-CPKAKCZ8.mjs";
29
+ import { a as discoverXcodeProject } from "./react-native-build-D58bIqV9.mjs";
30
30
  import { claimRemoveCommand, clearFreeClaimSet, readClaimSet, releaseClaim, tryAcquireClaim } from "@stim-cli/core/ownership-claim";
31
31
  import { createHash, randomUUID } from "node:crypto";
32
32
  import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
@@ -3181,32 +3181,11 @@ function excludePodChurn(lines, iosDirs = []) {
3181
3181
  restore
3182
3182
  };
3183
3183
  }
3184
- function nativeCanonicalPath(path) {
3185
- const missing = [];
3186
- for (let existing = resolve$1(path);; existing = dirname$1(existing)) try {
3187
- return resolve$1(realpathSync$1.native(existing), ...missing);
3188
- } catch {
3189
- if (dirname$1(existing) === existing) return resolve$1(path);
3190
- missing.unshift(basename$1(existing));
3191
- }
3192
- }
3193
3184
  /** Other worktrees git lists inside `path`, which removing `path` would delete with it. */
3194
3185
  function nestedWorktrees(entries, path) {
3195
3186
  const root = nativeCanonicalPath(path);
3196
3187
  return entries.filter((candidate) => !candidate.bare && nativeCanonicalPath(candidate.path) !== root).filter((candidate) => isPathPrefix$1(root, nativeCanonicalPath(candidate.path))).map((candidate) => candidate.path);
3197
3188
  }
3198
- function matchWorktreeEntry(entries, path) {
3199
- let best = null;
3200
- const target = nativeCanonicalPath(path);
3201
- (entries || []).forEach((entry, index) => {
3202
- if (!entry?.path || !isPathPrefix$1(nativeCanonicalPath(entry.path), target)) return;
3203
- if (!best || entry.path.length > best.path.length) best = {
3204
- ...entry,
3205
- index
3206
- };
3207
- });
3208
- return best;
3209
- }
3210
3189
  function removalRemedy(dirtyLines, { worktree = "<worktree>" } = {}) {
3211
3190
  const tracked = [];
3212
3191
  const untracked = [];
@@ -3925,4 +3904,4 @@ function worktreeCommand(program) {
3925
3904
  registerRemove(worktree);
3926
3905
  }
3927
3906
  //#endregion
3928
- export { reclaimProject as A, measureSizes as C, stimCliEntries as D, serviceRunningFrom as E, sweepArchiveStaging as M, worktreeArchiveLimits as N, stimCliUseOf as O, measurePressureAsync as S, uncommittedActivityOf as T, worktreeCommand as _, matchWorktreeEntry as a, measureDiskAsync as b, reclaimKeys as c, removalBlockers as d, removalPath as f, warmedWorkspace as g, warmWorktreeTarget as h, excludeWatchmanCookies as i, deleteSelectedArchives as j, describeDereferenced as k, registerRemove as l, removeWorktreeTarget as m, dependencyInstallCommand as n, nestedWorktrees as o, removalRemedy as p, excludePodChurn as r, porcelainPath as s, customIosDirs as t, registerWarm as u, cacheBlocked as v, sizeScanDeferred as w, measurePressure as x, measureDisk as y };
3907
+ export { deleteSelectedArchives as A, sizeScanDeferred as C, stimCliUseOf as D, stimCliEntries as E, worktreeArchiveLimits as M, describeDereferenced as O, measureSizes as S, serviceRunningFrom as T, cacheBlocked as _, nestedWorktrees as a, measurePressure as b, registerRemove as c, removalPath as d, removalRemedy as f, worktreeCommand as g, warmedWorkspace as h, excludeWatchmanCookies as i, sweepArchiveStaging as j, reclaimProject as k, registerWarm as l, warmWorktreeTarget as m, dependencyInstallCommand as n, porcelainPath as o, removeWorktreeTarget as p, excludePodChurn as r, reclaimKeys as s, customIosDirs as t, removalBlockers as u, measureDisk as v, uncommittedActivityOf as w, measurePressureAsync as x, measureDiskAsync as y };
@@ -0,0 +1,2 @@
1
+ import { a as nestedWorktrees, c as registerRemove, d as removalPath, f as removalRemedy, g as worktreeCommand, h as warmedWorkspace, i as excludeWatchmanCookies, l as registerWarm, m as warmWorktreeTarget, n as dependencyInstallCommand, o as porcelainPath, p as removeWorktreeTarget, r as excludePodChurn, s as reclaimKeys, t as customIosDirs, u as removalBlockers } from "./worktree-CaQBf6kh.mjs";
2
+ export { customIosDirs, worktreeCommand as default, dependencyInstallCommand, excludePodChurn, excludeWatchmanCookies, nestedWorktrees, porcelainPath, reclaimKeys, registerRemove, registerWarm, removalBlockers, removalPath, removalRemedy, removeWorktreeTarget, warmWorktreeTarget, warmedWorkspace };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stim",
3
- "version": "1.27.0",
3
+ "version": "1.29.0",
4
4
  "description": "Stim: fast, isolated React Native environments for coding agents",
5
5
  "keywords": [
6
6
  "agent",
@@ -53,11 +53,11 @@
53
53
  },
54
54
  "dependencies": {
55
55
  "@expo/fingerprint": "^0.21.5",
56
- "@stim-cli/agent-driver": "1.27.0",
57
- "@stim-cli/agent-driver-agent-device": "1.27.0",
58
- "@stim-cli/cache": "1.27.0",
59
- "@stim-cli/core": "1.27.0",
60
- "@stim-cli/metro": "1.27.0",
56
+ "@stim-cli/agent-driver": "1.29.0",
57
+ "@stim-cli/agent-driver-agent-device": "1.29.0",
58
+ "@stim-cli/cache": "1.29.0",
59
+ "@stim-cli/core": "1.29.0",
60
+ "@stim-cli/metro": "1.29.0",
61
61
  "@xmldom/xmldom": "0.9.12",
62
62
  "chalk": "^6.0.0",
63
63
  "commander": "^15.0.0",
@@ -66,7 +66,7 @@
66
66
  "ws": "^8.21.3"
67
67
  },
68
68
  "devDependencies": {
69
- "@stim-cli/expo-build-cache": "1.27.0",
69
+ "@stim-cli/expo-build-cache": "1.29.0",
70
70
  "@types/cross-spawn": "^6.0.6",
71
71
  "@types/which": "^3.0.4",
72
72
  "@types/ws": "^8.18.1",
@@ -9,6 +9,12 @@ const PROGRESS_PART = /^\{"done":(\d+),"total":(\d+),"percent":(\d+)\}$/;
9
9
  const PROGRESS_INTERVAL_MS = 1000;
10
10
  const MANIFEST_PATHS = new Set(['/', '/manifest', '/index.exp']);
11
11
  const observedServers = new WeakSet();
12
+ // Metro's HmrServer reports no reporter event when it pushes a change: it sends `update-start` with
13
+ // `isInitialUpdate: false` over the `/hot` websocket, and `isInitialUpdate: true` when a client registers.
14
+ // https://github.com/facebook/metro/blob/main/packages/metro/src/HmrServer.js (`_handleFileChange`)
15
+ const HMR_UPDATE = ['"type":"update-start"', '"isInitialUpdate":false'];
16
+ const HMR_UPDATE_INTERVAL_MS = 60_000;
17
+ const hmrServers = new WeakSet();
12
18
 
13
19
  function clientPidFromLsof(output, clientPort, serverPort) {
14
20
  const connection = new RegExp(`:${clientPort}->\\S*:${serverPort}$`);
@@ -78,8 +84,39 @@ function observeManifestRequests(server, write) {
78
84
  });
79
85
  }
80
86
 
87
+ function observeHmrUpdates(server, write) {
88
+ if (!server || hmrServers.has(server)) return;
89
+ hmrServers.add(server);
90
+ let recordedAt = 0;
91
+ server.prependListener('upgrade', (req, socket) => {
92
+ let pathname;
93
+ try {
94
+ pathname = new URL(req.url, 'http://localhost').pathname;
95
+ } catch {
96
+ return;
97
+ }
98
+ if (pathname !== '/hot') return;
99
+ const send = socket.write;
100
+ socket.write = function (chunk, ...rest) {
101
+ const now = Date.now();
102
+ if (
103
+ now - recordedAt >= HMR_UPDATE_INTERVAL_MS &&
104
+ (typeof chunk === 'string' || Buffer.isBuffer(chunk)) &&
105
+ HMR_UPDATE.every((part) => chunk.includes(part))
106
+ ) {
107
+ recordedAt = now;
108
+ try {
109
+ write({ ts: now, src: 'metro', level: 'debug', event: 'hmr_update', msg: 'HMR update sent to the app' });
110
+ } catch {}
111
+ }
112
+ return send.call(this, chunk, ...rest);
113
+ };
114
+ });
115
+ }
116
+
81
117
  function bundleResponseMiddleware(write, { runLsof, manifests = false } = {}) {
82
118
  return (req, res, next) => {
119
+ observeHmrUpdates(req.socket.server, write);
83
120
  if (req.method === 'GET' && req.url === '/_stim/metro-warmup') {
84
121
  if (manifests) observeManifestRequests(req.socket.server, write);
85
122
  res.end('ready');
@@ -1,2 +0,0 @@
1
- import { m as startExpoServer } from "./server-expo-ABQs2XFA.mjs";
2
- export { startExpoServer };
@@ -1,2 +0,0 @@
1
- import { t as triggerMaintenance } from "./trigger-DMou-X7j.mjs";
2
- export { triggerMaintenance };
@@ -1,2 +0,0 @@
1
- import { n as webCommand, t as runWeb } from "./web-Cq_AQ4DK.mjs";
2
- export { webCommand as default, runWeb };
@@ -1,2 +0,0 @@
1
- import { _ as worktreeCommand, a as matchWorktreeEntry, c as reclaimKeys, d as removalBlockers, f as removalPath, g as warmedWorkspace, h as warmWorktreeTarget, i as excludeWatchmanCookies, l as registerRemove, m as removeWorktreeTarget, n as dependencyInstallCommand, o as nestedWorktrees, p as removalRemedy, r as excludePodChurn, s as porcelainPath, t as customIosDirs, u as registerWarm } from "./worktree-COAJ3-OD.mjs";
2
- export { customIosDirs, worktreeCommand as default, dependencyInstallCommand, excludePodChurn, excludeWatchmanCookies, matchWorktreeEntry, nestedWorktrees, porcelainPath, reclaimKeys, registerRemove, registerWarm, removalBlockers, removalPath, removalRemedy, removeWorktreeTarget, warmWorktreeTarget, warmedWorkspace };