stim 1.26.0 → 1.27.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 (171) hide show
  1. package/dist/{acquire-artifact-DVsvSwf7.mjs → acquire-artifact-BKN2Yuhg.mjs} +2 -2
  2. package/dist/{act-C-BqJEpu.mjs → act-ROviTF_t.mjs} +297 -122
  3. package/dist/{activity-Lnb_EoRY.mjs → activity-Cd-ysFes.mjs} +6 -6
  4. package/dist/{agent-device-usage-output-DbXy5tg8.mjs → agent-device-usage-output-C5nCKWp9.mjs} +5 -5
  5. package/dist/{android-CSbLRD53.mjs → android--HBgpvpW.mjs} +5 -5
  6. package/dist/{android-CiNQw3kq.mjs → android-Cd6w7_qw.mjs} +96 -43
  7. package/dist/{android-B5P81yI-.mjs → android-Deb9X3_Y.mjs} +37 -15
  8. package/dist/{android-DTAcRwBC.mjs → android-DriNoAVy.mjs} +23 -18
  9. package/dist/{android-cas-BTVhZ0Qs.mjs → android-cas-D5e6ecUg.mjs} +4 -4
  10. package/dist/android-cas-compiler.mjs +1 -1
  11. package/dist/api.d.mts +13 -3
  12. package/dist/api.mjs +39 -29
  13. package/dist/{apk-signed-tail-B46U9hXc.mjs → apk-signed-tail-BHQHx3Rm.mjs} +2 -2
  14. package/dist/{artifact-BxREhAaV.mjs → artifact-0AGJYB9O.mjs} +18 -23
  15. package/dist/{artifact-CsAP6AGK.mjs → artifact-faemIZv5.mjs} +19 -24
  16. package/dist/{artifact-platform-CMRc0M_r.mjs → artifact-platform-BO2Uvk_A.mjs} +1 -1
  17. package/dist/auto-placement-z-H5pJza.mjs +350 -0
  18. package/dist/{browser-web-rYPyqhTf.mjs → browser-web-slD8AvLp.mjs} +16 -16
  19. package/dist/{build-cache-DrXNCy3T.mjs → build-cache-gBJ-WKzA.mjs} +43 -21
  20. package/dist/{build-DPhApsjV.mjs → build-hS0QyFlQ.mjs} +35 -31
  21. package/dist/{build-plan-DrMMdayj.mjs → build-plan-CBqYbzYM.mjs} +7 -6
  22. package/dist/{cache-manifest-BEZ9Bpl1.mjs → cache-manifest-DEjqGGat.mjs} +1 -1
  23. package/dist/cache-manifest.mjs +1 -1
  24. package/dist/{budget-k2mZGvvk.mjs → ccache-BWTze1Ls.mjs} +560 -1603
  25. package/dist/{cdp-BG3FJCCx.mjs → cdp-C3svvXiE.mjs} +1 -1
  26. package/dist/{chrome-BvV8ssI3.mjs → chrome-DyDWurWG.mjs} +1 -1
  27. package/dist/{cli-BBKFGOFl.mjs → cli-ftXDLto1.mjs} +24 -23
  28. package/dist/cli.mjs +1 -1
  29. package/dist/{client-D9CaRks-.mjs → client-xsdxrhWA.mjs} +48 -62
  30. package/dist/collector-run.d.mts +10 -9
  31. package/dist/collector-run.mjs +42 -27
  32. package/dist/{command-output-BF5AR2dL.mjs → command-output-Dj-WT4BP.mjs} +1 -1
  33. package/dist/{config-BktkY_zC.mjs → config-Cn94Jc0g.mjs} +23 -4
  34. package/dist/{dependencies-Dw6wfQdv.mjs → dependencies-BGokZ-Ng.mjs} +108 -60
  35. package/dist/{dependency-state-DFB41vfr.mjs → dependency-state-C3OtgG94.mjs} +14 -7
  36. package/dist/{detached-entry-KmieOKgN.mjs → detached-entry-BPlSaCwC.mjs} +1 -1
  37. package/dist/{dev-client-DXR_tPVY.mjs → dev-client-BMca82xo.mjs} +2 -2
  38. package/dist/{device-BcYeHSFu.mjs → device-BJm0irrq.mjs} +16 -16
  39. package/dist/{device-capacity-DCSvUF0l.mjs → device-capacity-6LP7QsaA.mjs} +101 -16
  40. package/dist/device-host-worker.mjs +19 -19
  41. package/dist/{device-ios-BLGfXQeK.mjs → device-ios-534c14fz.mjs} +251 -23
  42. package/dist/{device-lease-run-BmvIl7bI.mjs → device-lease-run-DwsGfjUN.mjs} +5 -5
  43. package/dist/{device-pool-Dluix4H3.mjs → device-pool-BnQqvs6o.mjs} +3 -3
  44. package/dist/{device-BK-zwyd_.mjs → device-tM41-TUq.mjs} +25 -24
  45. package/dist/{doctor-Cp-BhzTS.mjs → doctor-Dbx1ZpD2.mjs} +1 -1
  46. package/dist/{doctor-Bhg1ii70.mjs → doctor-DyqE9n1J.mjs} +28 -16
  47. package/dist/{doctor-OnwP94ne.mjs → doctor-F-3VUUyN.mjs} +76 -32
  48. package/dist/{doctor-fingerprint-D3a04Mhu.mjs → doctor-fingerprint-o7ZI9YLn.mjs} +1 -1
  49. package/dist/doctor-fingerprint.mjs +1 -1
  50. package/dist/{doctor-watchman-BStK05nt.mjs → doctor-watchman-CxDbyrrt.mjs} +5 -5
  51. package/dist/{eas-build-Dsj93iM9.mjs → eas-build-CjNSWmjo.mjs} +4 -4
  52. package/dist/eas-fallback-9fqb46kW.mjs +87 -0
  53. package/dist/{eas-session-ledger-B5vygTiD.mjs → eas-session-ledger-DrP4OuuM.mjs} +6 -6
  54. package/dist/{error-diagnostics-BOOm9Db7.mjs → error-diagnostics-snej9k4j.mjs} +51 -25
  55. package/dist/{exec-VFRpu1iA.mjs → exec-aULwtNly.mjs} +57 -6
  56. package/dist/{gc-C_79zvz4.mjs → gc-BRwAY3qT.mjs} +2 -2
  57. package/dist/{gc-ldgr-hXU.mjs → gc-CGZ1Yg88.mjs} +160 -45
  58. package/dist/{guide-D7K0X6KG.mjs → guide-_rfEh_zM.mjs} +580 -183
  59. package/dist/{hosted-android-Bk54ej6n.mjs → hosted-android-BMKzUNnY.mjs} +4 -4
  60. package/dist/{hosted-client-fHO8yqzc.mjs → hosted-client-D7Pk_Oo1.mjs} +12 -8
  61. package/dist/{hosted-logs-BfbmDM4M.mjs → hosted-logs-B1gqQuva.mjs} +8 -8
  62. package/dist/{hosted-logs-sync-B0pvmOk-.mjs → hosted-logs-sync-Dg3qrZmV.mjs} +5 -5
  63. package/dist/{hosted-macos-CPl0OZ9h.mjs → hosted-macos-B9w4H8hc.mjs} +6 -6
  64. package/dist/{hosted-native-CpDB3-PO.mjs → hosted-native-CdgaiuyP.mjs} +17 -16
  65. package/dist/{idle-shutdown-FfxL1KdG.mjs → idle-shutdown-Cbvo5KEh.mjs} +7 -8
  66. package/dist/{ios-ftxdQbJS.mjs → ios-B5HlVMhQ.mjs} +92 -37
  67. package/dist/{ios-B7-lToDu.mjs → ios-Bk4mWbtS.mjs} +8 -8
  68. package/dist/{ios-ENC4sRPA.mjs → ios-CsRVik64.mjs} +7 -1
  69. package/dist/{ios-WxpDJ5T1.mjs → ios-E26qSpkb.mjs} +27 -11
  70. package/dist/{ios-device-CsyryvpT.mjs → ios-device-C_QkIf1Z.mjs} +3 -3
  71. package/dist/{ios-device-B6HK951C.mjs → ios-device-CiBA-er9.mjs} +1 -1
  72. package/dist/{ios-project-Ty5pHl9O.mjs → ios-project-D8Jcy_br.mjs} +22 -9
  73. package/dist/{ios-signing-4c_qXvQm.mjs → ios-signing-BJzvDPfU.mjs} +2 -2
  74. package/dist/{ios-state-Cw7-WQf2.mjs → ios-state-BZ03NFgF.mjs} +1 -1
  75. package/dist/{js-swap-BMhXYVDS.mjs → js-swap-Dg2a945i.mjs} +8 -7
  76. package/dist/{launch-DOp8RjDz.mjs → launch-CRyBeNsA.mjs} +42 -38
  77. package/dist/lightened-BCsdAGj_.mjs +171 -0
  78. package/dist/{logs-dQDki6Tt.mjs → logs-CC_-ZzEE.mjs} +7 -7
  79. package/dist/{logs-s1dRIG1E.mjs → logs-aJQb-RDg.mjs} +46 -21
  80. package/dist/{macos-B0VEV3Gf.mjs → macos-BGmTpnv9.mjs} +1 -1
  81. package/dist/{macos-DBBPNnIA.mjs → macos-DlCBhMw5.mjs} +73 -38
  82. package/dist/macos-run.mjs +1 -1
  83. package/dist/maintenance-run.mjs +7 -7
  84. package/dist/{metro-CjC10t6E.mjs → metro-CvyD-xwe.mjs} +4 -4
  85. package/dist/{metro-gateway-B6_PgD0L.mjs → metro-gateway-BnHdqMO_.mjs} +3 -3
  86. package/dist/{named-ports-BG0j1X4g.mjs → named-ports-BCyMWA6b.mjs} +3 -3
  87. package/dist/{native-android-CL2NGiik.mjs → native-android-DlpxCyOP.mjs} +17 -18
  88. package/dist/{native-gradle-artifact-inputs-btSUulme.mjs → native-gradle-artifact-inputs-C13qT7R_.mjs} +5 -5
  89. package/dist/{native-runtime-Dq3RBcON.mjs → native-runtime-DqaIBO5w.mjs} +9 -8
  90. package/dist/{native-source-D-4Dh4JU.mjs → native-source-D1AzWiuP.mjs} +1 -1
  91. package/dist/{native-xcode-inputs-BW7H8JGu.mjs → native-xcode-inputs-B1W8SrxB.mjs} +3 -3
  92. package/dist/{native-xcode-ios-CBXJAxfC.mjs → native-xcode-ios-QPP0Rm68.mjs} +17 -17
  93. package/dist/{ndjson-CgE_o3Dl.mjs → ndjson-Dy2W4vRa.mjs} +2 -2
  94. package/dist/offload-worker.mjs +23 -24
  95. package/dist/{operation-exec-CUZifp6Z.mjs → operation-exec-Dp4FuIGR.mjs} +1 -1
  96. package/dist/{ownership-BjYvMNX_.mjs → ownership-Bx-0cku-.mjs} +3 -3
  97. package/dist/{page-CzEA_-5_.mjs → page-CQJlcj3x.mjs} +2 -2
  98. package/dist/{phone-reverses-lmj6kcPm.mjs → phone-reverses-C9yAaKEv.mjs} +18 -4
  99. package/dist/{placement-log-DIFPQAXp.mjs → placement-log-BXUbiZM6.mjs} +3 -3
  100. package/dist/{plan-placement-IiiSQhtz.mjs → plan-placement-UxnQjv5Z.mjs} +36 -10
  101. package/dist/{ports-C2_w1Z0Z.mjs → ports-uUrghqWN.mjs} +3 -3
  102. package/dist/{prebuild-gmouvmJZ.mjs → prebuild-BDpToDgR.mjs} +16 -17
  103. package/dist/{project-BUu6Is4k.mjs → project-DYj-HVx6.mjs} +17 -17
  104. package/dist/{pull-request-CbNlkFok.mjs → pull-request-BzLmzAIQ.mjs} +2 -2
  105. package/dist/pull-requests.mjs +1 -1
  106. package/dist/{react-native-android-Cgg99REN.mjs → react-native-android-DDBccgJw.mjs} +32 -26
  107. package/dist/{react-native-build-oNwqF5Wb.mjs → react-native-build-DaK2IFyP.mjs} +9 -9
  108. package/dist/{react-native-doctor-BhA3KUte.mjs → react-native-doctor-B-Mw6DcR.mjs} +6 -6
  109. package/dist/{react-native-ios-B-nf4rjN.mjs → react-native-ios-DjYwUF9U.mjs} +23 -17
  110. package/dist/{recordings-BldzVKq0.mjs → recordings-C20iUZfp.mjs} +1 -1
  111. package/dist/{registration-CN6nlhcD.mjs → registration-BwCe64PH.mjs} +1 -1
  112. package/dist/{reload-C9OduiNc.mjs → reload-DJBeF_rC.mjs} +1 -1
  113. package/dist/{reload-CCR7KC_l.mjs → reload-fUdkH2_p.mjs} +16 -16
  114. package/dist/{remote-C8S7FlPF.mjs → remote-y6n99WMW.mjs} +22 -9
  115. package/dist/{result-7F5hEwQJ.mjs → result-CTqBw2Te.mjs} +32 -21
  116. package/dist/{run-BqB0v3pt.mjs → run-DaCeNKRm.mjs} +3 -3
  117. package/dist/{selection-BNPBZ6T5.mjs → selection-Bs8phwhN.mjs} +37 -29
  118. package/dist/{server-bare-A75rDIdD.mjs → server-bare-BOh-iZEj.mjs} +2 -2
  119. package/dist/{server-command-CssKFOD7.mjs → server-command-8CuA51Cv.mjs} +6 -6
  120. package/dist/{server-expo-eQfOdydb.mjs → server-expo-ABQs2XFA.mjs} +4 -4
  121. package/dist/server-expo-Ba_Y21vB.mjs +2 -0
  122. package/dist/{settings-CosW5X-S.mjs → settings-BDVI8Ivc.mjs} +331 -62
  123. package/dist/{settings-OaGQF-ri.mjs → settings-CMHhQNwI.mjs} +24 -3
  124. package/dist/settings-payload-cm60Zhib.mjs +257 -0
  125. package/dist/settings-write-BdNRLlBn.mjs +185 -0
  126. package/dist/settings.schema.json +51 -33
  127. package/dist/{simslim-Bax1qcxu.mjs → simslim-DCQwzoPy.mjs} +2 -2
  128. package/dist/{slot-launch-CYCEhfBY.mjs → slot-launch-0l7RqSpr.mjs} +6 -6
  129. package/dist/{stage-jKQ7CP_B.mjs → stage-F4cAfJGi.mjs} +2 -2
  130. package/dist/{start-C_wefNKB.mjs → start-DcqnF9p8.mjs} +1 -1
  131. package/dist/{start-_BdJ32cZ.mjs → start-DrPwER_2.mjs} +27 -22
  132. package/dist/{state-C1i2nMOP.mjs → state-BX1y5syV.mjs} +4 -4
  133. package/dist/{state-C4OdpOTF.mjs → state-CZxLyetD.mjs} +2 -2
  134. package/dist/{stats-tEpEEH-u.mjs → stats-GxuCbles.mjs} +5 -5
  135. package/dist/{stats-report-n2U5plhk.mjs → stats-report-B86Cv7Uc.mjs} +1 -1
  136. package/dist/{status-CRXz-Gtj.mjs → status-7ULDEJ1e.mjs} +1 -1
  137. package/dist/{status-DQrqodLj.mjs → status-BfnK9pUd.mjs} +25 -25
  138. package/dist/{status-B9M7x4CZ.mjs → status-Bj7ZYvvc.mjs} +1 -1
  139. package/dist/{status-watch-B5wDIH_o.mjs → status-watch-BfabQn03.mjs} +5 -5
  140. package/dist/status-worker.mjs +1 -1
  141. package/dist/{stim-desktop-6Dqp-gjX.mjs → stim-desktop-CbWo21kb.mjs} +2 -2
  142. package/dist/{stop-ySNQHXMG.mjs → stop-CH79S3IZ.mjs} +5 -5
  143. package/dist/{stop-DRqQVqDJ.mjs → stop-D-EAr25B.mjs} +21 -20
  144. package/dist/{stop-CmdNhGlC.mjs → stop-x1Yu3He4.mjs} +2 -2
  145. package/dist/supervisor-run.mjs +17 -17
  146. package/dist/{support-CVOCp0Ft.mjs → support-Be0UeVZU.mjs} +10 -10
  147. package/dist/{support-BGSCBoib.mjs → support-CNg_YsOk.mjs} +6 -6
  148. package/dist/{swiftpm-artifact-inputs-CfUzt_0Z.mjs → swiftpm-artifact-inputs-uPqYvGBv.mjs} +4 -4
  149. package/dist/{swiftpm-macos-x6HPpl_2.mjs → swiftpm-macos-Ch4YjY_A.mjs} +11 -12
  150. package/dist/{toolchain-J4J8MrAr.mjs → toolchain-CbCG6C5Z.mjs} +321 -15
  151. package/dist/{toolchain-DoavrvIA.mjs → toolchain-JYAOquPg.mjs} +1 -1
  152. package/dist/{trigger-KVaWWNyn.mjs → trigger-DMou-X7j.mjs} +2 -2
  153. package/dist/trigger-qp2ji5wE.mjs +2 -0
  154. package/dist/{warm-progress-DvhTX_eu.mjs → warm-progress-C0RsbngN.mjs} +731 -727
  155. package/dist/{web-Bihbf7-u.mjs → web-Cq_AQ4DK.mjs} +9 -9
  156. package/dist/web-Je6abcpz.mjs +2 -0
  157. package/dist/web-run.mjs +9 -9
  158. package/dist/windows-report.mjs +1 -1
  159. package/dist/{workspace-state-pUg3_RRA.mjs → workspace-state-BjqdjnJR.mjs} +3 -3
  160. package/dist/{workspaces-g2lhdBXF.mjs → workspaces-DFbj07jp.mjs} +1795 -70
  161. package/dist/{worktree-BKuklFh_.mjs → worktree-COAJ3-OD.mjs} +934 -514
  162. package/dist/{worktree-Bm4cb-nU.mjs → worktree-JGUd_53L.mjs} +1 -1
  163. package/package.json +7 -7
  164. package/dist/ccache-Bx5TbxwG.mjs +0 -143
  165. package/dist/eas-fallback-FwkeqqGi.mjs +0 -381
  166. package/dist/hosted-ios-D55QhYaD.mjs +0 -15
  167. package/dist/native-run-BfIDFKLH.mjs +0 -275
  168. package/dist/server-expo-wvcj5tiZ.mjs +0 -2
  169. package/dist/settings-write-QjYfSrjF.mjs +0 -360
  170. package/dist/trigger-DzJu208Q.mjs +0 -2
  171. package/dist/web-BFLueSh-.mjs +0 -2
@@ -1,9 +1,9 @@
1
- import { D as ownership_claim_exports, S as process_identity_exports, m as declareSpawnsOn, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-VFRpu1iA.mjs";
2
- import { M as withDirLock$1, N as withDirLockAsync$1, c as withWorkspaceStateLock, d as writeWorkspaceState, k as workspaceLogsDir$1, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1 } from "./workspace-state-pUg3_RRA.mjs";
3
- import { U as parseDeviceSlotKey, V as deviceSlotKey, d as getConfigDir, q as validateDeviceSlot } from "./config-BktkY_zC.mjs";
4
- import { a as formatElapsed, i as formatDuration, m as shortHash } from "./command-output-BF5AR2dL.mjs";
5
- import { n as runOperationFileQuiet } from "./operation-exec-CUZifp6Z.mjs";
6
- import { S as resolveBuild } from "./build-cache-DrXNCy3T.mjs";
1
+ import { D as ownership_claim_exports, S as process_identity_exports, m as declareSpawnsOn, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-aULwtNly.mjs";
2
+ import { M as withDirLock$1, N as withDirLockAsync$1, c as withWorkspaceStateLock, d as writeWorkspaceState, k as workspaceLogsDir$1, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1 } from "./workspace-state-BjqdjnJR.mjs";
3
+ import { U as parseDeviceSlotKey, V as deviceSlotKey, d as getConfigDir, q as validateDeviceSlot } from "./config-Cn94Jc0g.mjs";
4
+ import { a as formatElapsed, i as formatDuration, m as shortHash } from "./command-output-Dj-WT4BP.mjs";
5
+ import { n as runOperationFileQuiet } from "./operation-exec-Dp4FuIGR.mjs";
6
+ import { C as resolveBuild } from "./build-cache-gBJ-WKzA.mjs";
7
7
  import { randomBytes } from "node:crypto";
8
8
  import { closeSync, fstatSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
9
9
  import { homedir } from "node:os";
@@ -1,8 +1,8 @@
1
- import { S as process_identity_exports } from "./exec-VFRpu1iA.mjs";
2
- import { P as formatBytes } from "./config-BktkY_zC.mjs";
3
- import { o as formatLongDuration } from "./command-output-BF5AR2dL.mjs";
4
- import { F as measureDu, I as writeUsageCache, P as canonical, c as listWorkspaceDirs } from "./workspaces-g2lhdBXF.mjs";
5
- import { c as parseAgentDeviceRecord, o as envDir, u as processMatches } from "./activity-Lnb_EoRY.mjs";
1
+ import { S as process_identity_exports } from "./exec-aULwtNly.mjs";
2
+ import { P as formatBytes } from "./config-Cn94Jc0g.mjs";
3
+ import { o as formatLongDuration } from "./command-output-Dj-WT4BP.mjs";
4
+ import { _t as measureDu, gt as canonical, l as listWorkspaceDirs, vt as writeUsageCache } from "./workspaces-DFbj07jp.mjs";
5
+ import { c as parseAgentDeviceRecord, o as envDir, u as processMatches } from "./activity-Cd-ysFes.mjs";
6
6
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
7
7
  import { homedir } from "node:os";
8
8
  import { isAbsolute, join, relative, sep } from "node:path";
@@ -1,6 +1,6 @@
1
- import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BF5AR2dL.mjs";
2
- import { E as resolveVariant, T as resolveSystemImage, _ as findAapt, b as noDeviceDiagnostic, d as androidVariantSetting, f as apkDevClientFacts, g as dumpApkManifest, h as displayPath, i as NO_FINGERPRINT, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme, u as androidSystemImageSetting, x as parseXmltree, y as isReleaseVariant } from "./support-BGSCBoib.mjs";
3
- import { r as lastBuildRecord, t as androidFacts } from "./result-7F5hEwQJ.mjs";
4
- import { i as runAndroidOperation, n as registerAndroid, r as runAndroid, t as androidCommand } from "./android-CiNQw3kq.mjs";
5
- import { a as collectorLogFile, o as killPreviousCollector, s as startCollector } from "./launch-DOp8RjDz.mjs";
1
+ import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-Dj-WT4BP.mjs";
2
+ import { E as resolveVariant, T as resolveSystemImage, _ as findAapt, b as noDeviceDiagnostic, d as androidVariantSetting, f as apkDevClientFacts, g as dumpApkManifest, h as displayPath, i as NO_FINGERPRINT, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme, u as androidSystemImageSetting, x as parseXmltree, y as isReleaseVariant } from "./support-CNg_YsOk.mjs";
3
+ import { r as lastBuildRecord, t as androidFacts } from "./result-CTqBw2Te.mjs";
4
+ import { i as runAndroidOperation, n as registerAndroid, r as runAndroid, t as androidCommand } from "./android-Cd6w7_qw.mjs";
5
+ import { a as collectorLogFile, o as killPreviousCollector, s as startCollector } from "./launch-CRyBeNsA.mjs";
6
6
  export { NO_DEVICE, NO_FINGERPRINT, androidDevClientScheme, androidFacts, androidSystemImageSetting, androidVariantSetting, apkDevClientFacts, apkPackage, collectorLogFile, androidCommand as default, displayPath, dumpApkManifest, findAapt, formatDuration, isReleaseVariant, killPreviousCollector, lastBuildRecord, noDeviceDiagnostic, parseXmltree, phaseLine, registerAndroid, resolveSystemImage, resolveVariant, runAndroid, runAndroidOperation, shortHash, startCollector };
@@ -1,42 +1,43 @@
1
- import { D as ownership_claim_exports, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { a as recordWorkspaceUseAsync, f as writeWorkspaceStateAsync, g as emulatorLogFile, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-pUg3_RRA.mjs";
3
- import { B as deviceSlotFileKey, E as upsertProject, H as deviceSlotPlatforms, O as withConfigLockAsync$1, W as parseDeviceSlotOption, p as getProject, q as validateDeviceSlot, u as getConcurrencyLimits } from "./config-BktkY_zC.mjs";
4
- import { _ as stepTimer, f as refuseNoProject, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-BF5AR2dL.mjs";
5
- import { K as resolveCacheProviderConfig, M as metroPortSetting, P as metroWarmupUrlSetting, R as projectSettingsContextAsync, U as remoteEasFallbackSetting, X as resolveSettings, Y as resolveProjectSettingsAsync, a as SETTING_SHAPE_REMEDY, g as deviceReclaimIdleMinutesSetting, it as tunnelModeSetting, lt as detectProviders, z as publicUrlSetting } from "./settings-CosW5X-S.mjs";
6
- import { f as projectRegistry, i as findProjectRoot$1, l as projectShortcut, t as NO_PROJECT_REFUSAL, z as writeWorkspaceLaunchAsync } from "./project-BUu6Is4k.mjs";
7
- import { A as listAdbDevices, Dt as configuredAndroidEmulatorApp, I as listInstalledSystemImages, Y as physicalDeviceModel, Z as probeEmulatorSerial, a as androidDeviceAbi, ct as waitForBoot, nt as resolveOwnedAvdSerialAsync, rt as resolvePhysicalDevice } from "./android-DTAcRwBC.mjs";
8
- import { c as pidExists, d as resolveProjectMetro } from "./metro-CjC10t6E.mjs";
9
- import { r as createNdjsonWriter } from "./ndjson-CgE_o3Dl.mjs";
10
- import { An as launchAndroidApp, En as installAndroidApp, G as runFailureRecord, I as NO_BUILD_PROGRESS, J as thrownRunFailureRecord, K as startBuildProgress, Kt as ensureMetroReachable, Q as recordCapacityRefusal, Un as runProcessOperation, Ut as binOnPath, Vn as exitAfterFlush, X as readRunEstimates, Y as createRunRecorder, Yt as remoteAndroidDeps, Zt as resolveRemoteContext, dn as verifyLaunch, er as resolveEasCliBin, et as recordRunStats, hn as DEFAULT_METRO_PORT, jn as launchAndroidReleaseApp, mn as ADB_INSTALL_TIMEOUT_MS, nr as uploadRemote, q as tapBuildLog, qn as checkEasAuth, qt as ensureRemoteBootOwned, t as budgetGate, tr as resolveRemote, tt as statsProjectKey$1, un as verifyAndroidReleaseLaunch, ur as ownedSessionName } from "./budget-k2mZGvvk.mjs";
11
- import { d as runCancellationSignal, f as withNativeBuildRun, r as cancelledFailure, u as runCancellation } from "./native-run-BfIDFKLH.mjs";
12
- import { L as acquireBuildSlot, z as releaseBuildSlot } from "./workspaces-g2lhdBXF.mjs";
13
- import { F as waitForBuild, M as acquireBuildLock, P as releaseBuildLock } from "./activity-Lnb_EoRY.mjs";
14
- import { w as storedAppId } from "./build-cache-DrXNCy3T.mjs";
15
- import { t as CCACHE_NOT_RUN } from "./ccache-Bx5TbxwG.mjs";
16
- import { S as setRemoteLogSink } from "./client-D9CaRks-.mjs";
17
- import { a as parseBuildMachineOption, l as resolveBuildPlacement } from "./selection-BNPBZ6T5.mjs";
18
- import { r as hostedMetroSettings } from "./metro-gateway-B6_PgD0L.mjs";
19
- import { a as writeHostedAndroidAsync, i as writeDevicePlacementAsync, t as readHostedAndroid } from "./ios-state-Cw7-WQf2.mjs";
20
- import { n as prepareHostedAndroid, t as placeHostedAndroid } from "./hosted-android-Bk54ej6n.mjs";
21
- import { n as verifyCollectorOwnership } from "./ownership-BjYvMNX_.mjs";
22
- import { c as startDevServer } from "./start-_BdJ32cZ.mjs";
23
- import { a as acquireRunLease, d as runLease, f as waitFlagConflict, o as leaseExpiryText, u as releaseLeaseOnAbort } from "./device-lease-run-BmvIl7bI.mjs";
24
- import { n as DeviceAdmissionRefusal, r as checkDeviceCapacity } from "./device-capacity-DCSvUF0l.mjs";
25
- import { a as resolveEasDevelopmentBuild, r as isEasBuildFailure } from "./eas-build-Dsj93iM9.mjs";
26
- import { t as followHostedLaunchLogs } from "./hosted-logs-sync-B0pvmOk-.mjs";
27
- import { f as settleFingerprintCheck } from "./prebuild-gmouvmJZ.mjs";
28
- import { n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-Dq3RBcON.mjs";
29
- import { n as devicePlacementRecord } from "./placement-log-DIFPQAXp.mjs";
30
- import { S as pooledAndroidDevice, a as PLATFORM, b as noDeviceDiagnostic, g as dumpApkManifest, h as displayPath, o as androidBuildOptions, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme } from "./support-BGSCBoib.mjs";
31
- import { t as acquireAndroidArtifact } from "./artifact-BxREhAaV.mjs";
32
- import { a as persistLastBuild, c as androidDeviceSelectorRefusal, i as logPostBuildFailure, n as finishAndroidUpload, o as persistThrownBuild, s as reportAndroidResult, u as resolveAndroidRunPlan } from "./result-7F5hEwQJ.mjs";
33
- import { n as automaticDevicePlacement, r as devicePlacementLine, t as checkEasFallback } from "./eas-fallback-FwkeqqGi.mjs";
34
- import { i as verifyAndroidMetroRun, r as finishAndroidRun } from "./launch-DOp8RjDz.mjs";
35
- import { a as AvdRecoveryError, i as AvdBootError, n as ensureBooted, o as warmMetro, r as ensureOwnedDevice, t as didSetUpDevice } from "./device-BK-zwyd_.mjs";
36
- import { t as selectFromPool } from "./device-pool-Dluix4H3.mjs";
1
+ import { D as ownership_claim_exports, t as getExecutor } from "./exec-aULwtNly.mjs";
2
+ import { a as recordWorkspaceUseAsync, f as writeWorkspaceStateAsync, g as emulatorLogFile, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-BjqdjnJR.mjs";
3
+ import { B as deviceSlotFileKey, E as upsertProject, H as deviceSlotPlatforms, O as withConfigLockAsync$1, W as parseDeviceSlotOption, p as getProject, q as validateDeviceSlot, u as getConcurrencyLimits } from "./config-Cn94Jc0g.mjs";
4
+ import { _ as stepTimer, f as refuseNoProject, g as stepClock, i as formatDuration, l as phaseLine } from "./command-output-Dj-WT4BP.mjs";
5
+ import { B as publicUrlSetting, F as metroWarmupUrlSetting, J as resolveCacheProviderConfig, N as metroPortSetting, Q as resolveSettings, W as remoteEasFallbackSetting, Z as resolveProjectSettingsAsync, a as SETTING_SHAPE_REMEDY, dt as detectProviders, g as deviceReclaimIdleMinutesSetting, ot as tunnelModeSetting, z as projectSettingsContextAsync } from "./settings-BDVI8Ivc.mjs";
6
+ import { f as projectRegistry, i as findProjectRoot$1, l as projectShortcut, t as NO_PROJECT_REFUSAL, z as writeWorkspaceLaunchAsync } from "./project-DYj-HVx6.mjs";
7
+ import { A as listAdbDevices, Dt as configuredAndroidEmulatorApp, I as listInstalledSystemImages, Y as physicalDeviceModel, Z as probeEmulatorSerial, a as androidDeviceAbi, ct as waitForBoot, nt as resolveOwnedAvdSerialAsync, rt as resolvePhysicalDevice } from "./android-DriNoAVy.mjs";
8
+ import { c as pidExists, d as resolveProjectMetro } from "./metro-CvyD-xwe.mjs";
9
+ import { i as createNdjsonWriter } from "./ndjson-Dy2W4vRa.mjs";
10
+ import { An as checkEasAuth, At as ensureRemoteBootOwned, En as runProcessOperation, Et as binOnPath, Jt as verifyLaunch, Ln as resolveEasCliBin, Mt as remoteAndroidDeps, Pt as resolveRemoteContext, Qt as DEFAULT_METRO_PORT, Rn as resolveRemote, Zt as ADB_INSTALL_TIMEOUT_MS, c as budgetGate, kt as ensureMetroReachable, ln as installAndroidApp, mn as launchAndroidReleaseApp, pn as launchAndroidApp, qn as ownedSessionName, qt as verifyAndroidReleaseLaunch, t as CCACHE_NOT_RUN, wn as exitAfterFlush, zn as uploadRemote } from "./ccache-BWTze1Ls.mjs";
11
+ import { J as runFailureRecord, X as tapBuildLog, Y as startBuildProgress, Z as thrownRunFailureRecord, at as recordRunStats, et as createRunRecorder, ot as statsProjectKey$1, rt as recordCapacityRefusal, tt as readRunEstimates, xt as releaseBuildSlot, yt as acquireBuildSlot, z as NO_BUILD_PROGRESS } from "./workspaces-DFbj07jp.mjs";
12
+ import { Q as cancelledFailure, at as runCancellation, ot as runCancellationSignal, st as withNativeBuildRun } from "./toolchain-CbCG6C5Z.mjs";
13
+ import { F as waitForBuild, M as acquireBuildLock, P as releaseBuildLock } from "./activity-Cd-ysFes.mjs";
14
+ import { T as storedAppId } from "./build-cache-gBJ-WKzA.mjs";
15
+ import { S as setRemoteLogSink } from "./client-xsdxrhWA.mjs";
16
+ import { d as resolveBuildPlacement, s as parseBuildMachineOption } from "./selection-Bs8phwhN.mjs";
17
+ import { r as hostedMetroSettings } from "./metro-gateway-BnHdqMO_.mjs";
18
+ import { a as writeHostedAndroidAsync, i as writeDevicePlacementAsync, t as readHostedAndroid } from "./ios-state-BZ03NFgF.mjs";
19
+ import { n as prepareHostedAndroid, t as placeHostedAndroid } from "./hosted-android-BMKzUNnY.mjs";
20
+ import { n as verifyCollectorOwnership } from "./ownership-Bx-0cku-.mjs";
21
+ import { i as restoreLightenedDependencies, n as printLightenedFailure } from "./lightened-BCsdAGj_.mjs";
22
+ import { c as startDevServer } from "./start-DrPwER_2.mjs";
23
+ import { a as acquireRunLease, d as runLease, f as waitFlagConflict, o as leaseExpiryText, u as releaseLeaseOnAbort } from "./device-lease-run-DwsGfjUN.mjs";
24
+ import { n as DeviceAdmissionRefusal, r as checkDeviceCapacity } from "./device-capacity-6LP7QsaA.mjs";
25
+ import { a as resolveEasDevelopmentBuild, r as isEasBuildFailure } from "./eas-build-CjNSWmjo.mjs";
26
+ import { t as followHostedLaunchLogs } from "./hosted-logs-sync-Dg3qrZmV.mjs";
27
+ import { f as settleFingerprintCheck } from "./prebuild-BDpToDgR.mjs";
28
+ import { i as launchOutcomeRecord, n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-DqaIBO5w.mjs";
29
+ import { n as devicePlacementRecord } from "./placement-log-BXUbiZM6.mjs";
30
+ import { S as pooledAndroidDevice, a as PLATFORM, b as noDeviceDiagnostic, g as dumpApkManifest, h as displayPath, o as androidBuildOptions, p as apkPackage, r as NO_DEVICE, s as androidDevClientScheme } from "./support-CNg_YsOk.mjs";
31
+ import { t as acquireAndroidArtifact } from "./artifact-0AGJYB9O.mjs";
32
+ import { a as persistLastBuild, c as androidDeviceSelectorRefusal, i as logPostBuildFailure, n as finishAndroidUpload, o as persistThrownBuild, s as reportAndroidResult, u as resolveAndroidRunPlan } from "./result-CTqBw2Te.mjs";
33
+ import { n as devicePlacementLine, t as automaticDevicePlacement } from "./auto-placement-z-H5pJza.mjs";
34
+ import { i as verifyAndroidMetroRun, r as finishAndroidRun } from "./launch-CRyBeNsA.mjs";
35
+ import { t as checkEasFallback } from "./eas-fallback-9fqb46kW.mjs";
36
+ import { a as AvdRecoveryError, i as AvdBootError, n as ensureBooted, o as warmMetro, r as ensureOwnedDevice, t as didSetUpDevice } from "./device-tM41-TUq.mjs";
37
+ import { t as selectFromPool } from "./device-pool-BnQqvs6o.mjs";
37
38
  import { t as unsupportedPlan } from "./project-plan-BPwbLwQu.mjs";
38
- import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-DrMMdayj.mjs";
39
- import { basename, join } from "node:path";
39
+ import { a as refusePlan, i as printPlan, n as planFlagRefusal } from "./build-plan-CBqYbzYM.mjs";
40
+ import { join } from "node:path";
40
41
  import { workspaceId } from "@stim-cli/core";
41
42
  import { hostedAndroidStatus, parseMachine } from "@stim-cli/core/state";
42
43
  import chalk from "chalk";
@@ -86,7 +87,7 @@ async function connectAndroidHosting({ root, slot, machine, release, appMode = r
86
87
  } };
87
88
  }
88
89
  }
89
- async function selectAndroidPlacement({ target: selected, automatic = automaticDevicePlacement, checkBudget = budgetGate, note, phase, log, fromFlag, noWait, buildMachine, localSelectors, eas, ...args }) {
90
+ async function selectAndroidPlacement({ target: selected, automatic = automaticDevicePlacement, checkBudget = budgetGate, note, phase, log, fromFlag, noWait, waitMs, signal, buildMachine, localSelectors, eas, ...args }) {
90
91
  const appMode = args.appMode ?? (args.release ? "release" : "development");
91
92
  const selectors = selected.kind === "hosted" ? {
92
93
  ...selected.systemImage ? { systemImage: selected.systemImage } : {},
@@ -119,15 +120,20 @@ async function selectAndroidPlacement({ target: selected, automatic = automaticD
119
120
  root: args.root,
120
121
  slot: args.slot,
121
122
  platform: "android",
123
+ ...selected.placement ? { placement: selected.placement } : {},
122
124
  ...appMode === "process" ? { appMode } : {},
123
125
  selectors,
124
126
  buildMachine,
125
127
  noWait,
128
+ ...waitMs === void 0 ? {} : { waitMs },
129
+ onWait: (line) => phase("placement:", line),
130
+ signal,
126
131
  ...eas ? { eas } : {}
127
132
  });
128
133
  phase("placement:", devicePlacementLine(placed.placement, placed.skipped));
129
134
  log?.(devicePlacementRecord({
130
135
  platform: "android",
136
+ selected: selected.placement,
131
137
  fromFlag,
132
138
  easFallback: Boolean(eas),
133
139
  placed
@@ -173,6 +179,11 @@ async function selectAndroidPlacement({ target: selected, automatic = automaticD
173
179
  devicePlacement: placed.placement
174
180
  };
175
181
  } catch (error) {
182
+ if (signal?.aborted) return { failure: {
183
+ code: "STIM_CANCELLED",
184
+ message: "The run was cancelled while it waited for a remote machine.",
185
+ remedy: "Run the command again when you want the app on a device."
186
+ } };
176
187
  return { failure: {
177
188
  code: error.code ?? "STIM_HOSTING_REFUSED",
178
189
  message: error.message,
@@ -187,6 +198,7 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
187
198
  if (!artifact.apkPath || !packageName) return fail("STIM_INSTALL_FAILED", "The built APK has no package identity.");
188
199
  const devClientScheme = appMode === "development" && isExpo ? await resolveDevClientScheme(root, artifact.apkPath) ?? void 0 : void 0;
189
200
  const launchedAt = now();
201
+ let marked = false;
190
202
  try {
191
203
  const run = await place(target, {
192
204
  root,
@@ -199,7 +211,25 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
199
211
  metroPort,
200
212
  selectors,
201
213
  ...appMode === "development" && isExpo ? { devClientScheme } : {},
202
- reserved: (placement) => writePlacement(root, slot, placement),
214
+ reserved: (placement) => {
215
+ if (placement.device && !marked) {
216
+ marked = true;
217
+ report.writer.write({
218
+ src: "build",
219
+ level: "info",
220
+ marker: true,
221
+ event: "launch_attempt",
222
+ ts: now(),
223
+ platform: "android",
224
+ appId: packageName,
225
+ deviceId: placement.session,
226
+ remote: true,
227
+ host: target.host.machine,
228
+ msg: `launching ${packageName} on ${target.host.machine}`
229
+ });
230
+ }
231
+ return writePlacement(root, slot, placement);
232
+ },
203
233
  note: out,
204
234
  enterPhase
205
235
  });
@@ -214,6 +244,7 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
214
244
  }, slot);
215
245
  let launched = run.launched;
216
246
  let launchWarning;
247
+ let unattributed = false;
217
248
  if (appMode === "development") {
218
249
  const hostedLogs = followLogs(root, slot, "android", launchedAt);
219
250
  let verification;
@@ -244,7 +275,17 @@ async function finishHostedAndroidRun({ target, artifact, root, slot = "default"
244
275
  if (verification.state === "fatal") return fail("STIM_LAUNCH_FAILED", "The app failed its launch readiness check.", `Read the launch error above or run \`stim logs --errors\`. The full timeline is in ${logsDir}.`, { lastBuildStatus: true });
245
276
  launched = verification.state === true ? true : verification.state === "bundling" ? "bundling" : "unverified";
246
277
  launchWarning = verification.warning;
278
+ unattributed = verification.unattributed ?? false;
247
279
  }
280
+ report.writer.write(launchOutcomeRecord({
281
+ launchState: launched,
282
+ release,
283
+ process: appMode === "process",
284
+ bundleId: packageName,
285
+ configuration: report.variant,
286
+ metroPort,
287
+ unattributed
288
+ }));
248
289
  if (launched === "unverified") out(`Launch on ${target.host.machine} is unverified; check the hosted app, then retry stim android --remote ${target.host.machine}.`);
249
290
  const host = hostedAndroidStatus(run.placement);
250
291
  report.record.deviceName = host.device?.name ?? null;
@@ -337,8 +378,8 @@ function androidCommand(program) {
337
378
  registerAndroid(program);
338
379
  }
339
380
  function registerAndroid(program) {
340
- program.command("android").description("Build (or install from the shared cache), install and launch this workspace's Android app on its owned emulator. React Native and Expo Debug runs start the dev server when it is not running.").option("--eas-profile <name>", "Download a matching EAS development build; on a miss, print the build command without running it").option("--slot <name>", "Reusable device slot within this workspace (default: default)", parseDeviceSlotOption).option("--remote-build <value>", "Build on auto, local, or one named machine; a name refuses without fallback", parseBuildMachineOption).option("--json", "Emit the facts as a single JSON line on stdout; every other line goes to stderr").option("--plan", "Predict the next build without building, booting or installing: resolve the fingerprint, check the local then remote cache, and print the expected cache result and duration. Writes no Stim state.").option("--no-metro-check", "Skip the reserved-port Metro health check and do not start it (the app will load no bundle unless something else serves it)").option("--no-build-cache", "Build fresh, ignoring cached artifacts (local and the project's build-cache provider); the fresh build still replaces the cache entry").option("--variant <name>", "Gradle variant to assemble and install (e.g. productionDebug on a flavored project); overrides the android.variant setting. A variant ending in Release embeds the JS bundle and skips Metro entirely. Default: debug").option("--system-image <id>", "Android system image to create this workspace's owned AVD from, as the sdkmanager package id (e.g. \"system-images;android-36;google_apis;arm64-v8a\"). Overrides the android.systemImage setting for this invocation. An unknown id refuses with STIM_BAD_ARG and prints the installed images.").option("--device-profile <id>", "Hardware profile to create this workspace's owned AVD with, as an `avdmanager list device -c` id (e.g. \"pixel_fold\", \"pixel_tablet\"). Overrides the android.deviceProfile setting for this invocation. An unknown id refuses with STIM_BAD_ARG and prints the available ids.").option("--device [serial]", "Install and launch on a connected physical device instead of this workspace's owned emulator. With no serial, the first connected device this workspace can lease is used. Stim never creates, boots, or deletes a physical device.").option("--remote <target>", "Run on eas, proxy, or a named approved Mac from remote.machines; auto places on an approved Mac when this machine is full or busy; local runs here, whatever android.remote says", (value) => {
341
- if (!parseMachine(value)) throw new InvalidArgumentError("expected eas, proxy, auto, local, or a tailnet machine name");
381
+ program.command("android").description("Build (or install from the shared cache), install and launch this workspace's Android app on its owned emulator. React Native and Expo Debug runs start the dev server when it is not running.").option("--eas-profile <name>", "Download a matching EAS development build; on a miss, print the build command without running it").option("--slot <name>", "Reusable device slot within this workspace (default: default)", parseDeviceSlotOption).option("--remote-build <value>", "Build on local, auto, remote (remote machines first), remote-only (never here), or one named machine; a name refuses without fallback", parseBuildMachineOption).option("--json", "Emit the facts as a single JSON line on stdout; every other line goes to stderr").option("--plan", "Predict the next build without building, booting or installing: resolve the fingerprint, check the local then remote cache, and print the expected cache result and duration. Writes no Stim state.").option("--no-metro-check", "Skip the reserved-port Metro health check and do not start it (the app will load no bundle unless something else serves it)").option("--no-build-cache", "Build fresh, ignoring cached artifacts (local and the project's build-cache provider); the fresh build still replaces the cache entry").option("--variant <name>", "Gradle variant to assemble and install (e.g. productionDebug on a flavored project); overrides the android.variant setting. A variant ending in Release embeds the JS bundle and skips Metro entirely. Default: debug").option("--system-image <id>", "Android system image to create this workspace's owned AVD from, as the sdkmanager package id (e.g. \"system-images;android-36;google_apis;arm64-v8a\"). Overrides the android.systemImage setting for this invocation. An unknown id refuses with STIM_BAD_ARG and prints the installed images.").option("--device-profile <id>", "Hardware profile to create this workspace's owned AVD with, as an `avdmanager list device -c` id (e.g. \"pixel_fold\", \"pixel_tablet\"). Overrides the android.deviceProfile setting for this invocation. An unknown id refuses with STIM_BAD_ARG and prints the available ids.").option("--device [serial]", "Install and launch on a connected physical device instead of this workspace's owned emulator. With no serial, the first connected device this workspace can lease is used. Stim never creates, boots, or deletes a physical device.").option("--remote <target>", "Run on eas, proxy, or a named approved Mac from remote.machines; auto places on an approved Mac when this machine is full or busy; remote tries remote.machines in order first and runs here only when none takes it; remote-only never runs here; local runs here, whatever android.remote says", (value) => {
382
+ if (!parseMachine(value)) throw new InvalidArgumentError("expected eas, proxy, local, auto, remote, remote-only, or a tailnet machine name");
342
383
  return value;
343
384
  }).option("--wait <seconds>", "How long to wait for another workspace to release the device it leases, before refusing with STIM_DEVICE_BUSY (default 60, 0 refuses at once). Without --device, wait for an owned-device slot (default 600 seconds; --no-wait refuses immediately).").option("--no-wait", "Install on a device another workspace leases instead of waiting: this run takes no lease and, when both workspaces build the same app id, the install terminates the holder's running app. Without --device, refuse a full device cap or existing slot queue immediately.").action(async (opts) => {
344
385
  if (opts.plan) return planAndroid(opts);
@@ -361,6 +402,14 @@ function runAndroidOperation(context, root, opts = {}) {
361
402
  platform: PLATFORM,
362
403
  slot: opts.slot ?? "default"
363
404
  }, async (claim) => {
405
+ const lightened = await restoreLightenedDependencies(root, context);
406
+ if (lightened) {
407
+ printLightenedFailure(context, lightened, Boolean(opts.json));
408
+ return {
409
+ ok: false,
410
+ error: lightened
411
+ };
412
+ }
364
413
  await recordWorkspaceUseAsync(root, /* @__PURE__ */ new Date(), context.env, context.cwd, context.signal);
365
414
  const progress = startBuildProgress({
366
415
  root,
@@ -628,6 +677,8 @@ async function runAndroid(options = {}) {
628
677
  status: "failed",
629
678
  errorCode: code,
630
679
  diagnostics: rawDiagnostics,
680
+ message,
681
+ remedy,
631
682
  out
632
683
  });
633
684
  logPostBuildFailure(artifactAcquired, writer, runFailureRecord({
@@ -733,7 +784,6 @@ async function runAndroid(options = {}) {
733
784
  automatic: plan.target.kind === "hosted" && plan.target.machine === "auto",
734
785
  signal: runCancellationSignal(context),
735
786
  waitMs: plan.deviceSlotWaitMs,
736
- displayName: basename(root),
737
787
  reclaimIdleMinutes: deviceReclaimIdleMinutesSetting(settings),
738
788
  waitingFor: (info) => progress.waitingFor(info, "device-slot"),
739
789
  onWait: (ms) => {
@@ -754,6 +804,8 @@ async function runAndroid(options = {}) {
754
804
  appMode,
755
805
  metroCheck,
756
806
  noWait: plan.deviceSlotWaitMs === 0,
807
+ waitMs: plan.deviceSlotWaitMs,
808
+ signal: settingsSignal,
757
809
  buildMachine: options.buildMachine,
758
810
  read: options.readHostedAndroid,
759
811
  resolveSerial: resolveAvdSerial,
@@ -1068,6 +1120,7 @@ async function runAndroid(options = {}) {
1068
1120
  }
1069
1121
  record.avdName = device.avdName ?? null;
1070
1122
  record.deviceName = device.deviceName ?? device.avdName ?? null;
1123
+ record.deviceSerial = device.serial;
1071
1124
  record.systemImage = device.systemImage;
1072
1125
  record.deviceProfile = device.deviceProfile;
1073
1126
  let preparedArtifact;
@@ -1,5 +1,5 @@
1
- import { t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { u as androidToolCwd } from "./android-DTAcRwBC.mjs";
1
+ import { t as getExecutor } from "./exec-aULwtNly.mjs";
2
+ import { u as androidToolCwd } from "./android-DriNoAVy.mjs";
3
3
  //#region src/collector/android.ts
4
4
  const LEVEL_BY_LETTER = {
5
5
  V: "debug",
@@ -111,10 +111,19 @@ function logcatArgs(serial, pid) {
111
111
  "time,epoch"
112
112
  ];
113
113
  }
114
- function androidClockOffset(serial, { exec = getExecutor(), now = Date.now } = {}) {
114
+ function killOnAbort(signal) {
115
+ if (!signal) return {};
116
+ return { onSpawn(child) {
117
+ const kill = () => child.kill("SIGKILL");
118
+ signal.addEventListener("abort", kill, { once: true });
119
+ child.once("close", () => signal.removeEventListener("abort", kill));
120
+ if (signal.aborted) kill();
121
+ } };
122
+ }
123
+ async function androidClockOffset(serial, { exec = getExecutor(), now = Date.now, signal } = {}) {
115
124
  const before = now();
116
125
  try {
117
- const output = exec.runFile("adb", [
126
+ const output = (await exec.runFileAsync("adb", [
118
127
  "-s",
119
128
  serial,
120
129
  "shell",
@@ -122,8 +131,9 @@ function androidClockOffset(serial, { exec = getExecutor(), now = Date.now } = {
122
131
  "+%s%3N"
123
132
  ], {
124
133
  timeoutMs: 1e3,
125
- cwd: androidToolCwd()
126
- }).trim();
134
+ cwd: androidToolCwd(),
135
+ ...killOnAbort(signal)
136
+ })).trim();
127
137
  const after = now();
128
138
  if (!/^\d{13}$/.test(output) || after < before || after - before > 1e3) return null;
129
139
  return Math.round((before + after) / 2) - Number(output);
@@ -136,25 +146,31 @@ function parsePidof(text) {
136
146
  const pid = Number(first);
137
147
  return Number.isInteger(pid) && pid > 0 ? pid : null;
138
148
  }
139
- function resolveAppPid(serial, packageName, { exec = null } = {}) {
149
+ async function resolveAppPid(serial, packageName, { exec = null, signal } = {}) {
140
150
  const e = exec || getExecutor();
141
151
  try {
142
- return parsePidof(e.runFile("adb", [
152
+ return parsePidof(await e.runFileAsync("adb", [
143
153
  "-s",
144
154
  serial,
145
155
  "shell",
146
156
  "pidof",
147
157
  "-s",
148
158
  packageName
149
- ], { timeoutMs: 1e4 }));
159
+ ], {
160
+ timeoutMs: 1e4,
161
+ ...killOnAbort(signal)
162
+ }));
150
163
  } catch {
151
164
  return null;
152
165
  }
153
166
  }
154
- async function waitForAppPid({ serial, packageName, timeoutMs = 3e4, pollMs = 500, exec = null, now = Date.now, sleep = defaultSleep }) {
167
+ async function waitForAppPid({ serial, packageName, timeoutMs = 3e4, pollMs = 500, exec = null, signal, now = Date.now, sleep = defaultSleep }) {
155
168
  const deadline = now() + timeoutMs;
156
169
  for (;;) {
157
- const pid = resolveAppPid(serial, packageName, { exec });
170
+ const pid = await resolveAppPid(serial, packageName, {
171
+ exec,
172
+ signal
173
+ });
158
174
  if (pid) return {
159
175
  ok: true,
160
176
  pid
@@ -184,7 +200,7 @@ function pidWatchInterval() {
184
200
  const override = Number(process.env.STIM_PID_WATCH_MS);
185
201
  return Number.isFinite(override) && override > 0 ? override : PID_WATCH_MS;
186
202
  }
187
- function watchAppPid({ serial, packageName, pid, intervalMs = null, exec = null, onChange, resolve = resolveAppPid, setTimer = setTimeout, clearTimer = clearTimeout }) {
203
+ function watchAppPid({ serial, packageName, pid, intervalMs = null, exec = null, signal, onChange, resolve = resolveAppPid, setTimer = setTimeout, clearTimer = clearTimeout }) {
188
204
  const every = intervalMs ?? pidWatchInterval();
189
205
  let current = pid;
190
206
  let stopped = false;
@@ -194,7 +210,10 @@ function watchAppPid({ serial, packageName, pid, intervalMs = null, exec = null,
194
210
  if (stopped) return;
195
211
  let next = null;
196
212
  try {
197
- next = resolve(serial, packageName, { exec });
213
+ next = await resolve(serial, packageName, {
214
+ exec,
215
+ signal
216
+ });
198
217
  } catch {}
199
218
  if (next && next !== current) {
200
219
  current = next;
@@ -211,9 +230,12 @@ function watchAppPid({ serial, packageName, pid, intervalMs = null, exec = null,
211
230
  if (timer) clearTimer(timer);
212
231
  timer = null;
213
232
  },
214
- probe() {
233
+ async probe() {
215
234
  try {
216
- return resolve(serial, packageName, { exec });
235
+ return await resolve(serial, packageName, {
236
+ exec,
237
+ signal
238
+ });
217
239
  } catch {
218
240
  return null;
219
241
  }
@@ -1,10 +1,10 @@
1
- import { D as ownership_claim_exports, S as process_identity_exports, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, o as cancellableSleep, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-VFRpu1iA.mjs";
2
- import { M as withDirLock$1, N as withDirLockAsync$1 } from "./workspace-state-pUg3_RRA.mjs";
3
- import { C as saveConfig, D as withConfigLock$1, G as projectDeviceSlots, H as deviceSlotPlatforms, K as removeSlotDevice, O as withConfigLockAsync$1, _ as loadConfig$1, c as ensureConfig, d as getConfigDir, f as getConfigPath$1, z as assignSlotDevice } from "./config-BktkY_zC.mjs";
4
- import { n as runOperationFileQuiet, t as runOperationFile } from "./operation-exec-CUZifp6Z.mjs";
5
- import { c as androidDataPartitionSizeBytes } from "./settings-CosW5X-S.mjs";
6
- import { i as stimDesktopInstalledAsync, n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-6Dqp-gjX.mjs";
7
- import { c as pidExists, p as signalProcessTreeAsync } from "./metro-CjC10t6E.mjs";
1
+ import { D as ownership_claim_exports, S as process_identity_exports, l as WorkspaceProcessCleanupError, m as declareSpawnsOn, o as cancellableSleep, t as getExecutor, v as stopDeclaringSpawnsOn } from "./exec-aULwtNly.mjs";
2
+ import { M as withDirLock$1, N as withDirLockAsync$1 } from "./workspace-state-BjqdjnJR.mjs";
3
+ import { C as saveConfig, D as withConfigLock$1, G as projectDeviceSlots, H as deviceSlotPlatforms, K as removeSlotDevice, O as withConfigLockAsync$1, _ as loadConfig$1, c as ensureConfig, d as getConfigDir, f as getConfigPath$1, z as assignSlotDevice } from "./config-Cn94Jc0g.mjs";
4
+ import { n as runOperationFileQuiet, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
5
+ import { c as androidDataPartitionSizeBytes } from "./settings-BDVI8Ivc.mjs";
6
+ import { i as stimDesktopInstalledAsync, n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-CbWo21kb.mjs";
7
+ import { c as pidExists, p as signalProcessTreeAsync } from "./metro-CvyD-xwe.mjs";
8
8
  import { renameSync, rmSync, writeFileSync } from "node:fs";
9
9
  import { isDeepStrictEqual } from "node:util";
10
10
  import { join } from "node:path";
@@ -1421,16 +1421,25 @@ function listAvdEmulatorProcesses(avdName, platform) {
1421
1421
  ], { timeoutMs: 5e3 });
1422
1422
  return out === null ? null : parseAvdEmulatorProcesses(out, avdName);
1423
1423
  }
1424
+ const PROCESS_TABLE_READ_TIMEOUTS_MS = [5e3, 15e3];
1425
+ async function readProcessTableAsync(operation, args, options = {}) {
1426
+ for (const timeoutMs of PROCESS_TABLE_READ_TIMEOUTS_MS) {
1427
+ const out = await runOperationFileQuiet(operation, getExecutor(), "ps", args, {
1428
+ timeoutMs,
1429
+ killSignal: "SIGKILL",
1430
+ ...options
1431
+ });
1432
+ if (out !== null) return out;
1433
+ }
1434
+ return null;
1435
+ }
1424
1436
  async function listAvdEmulatorProcessesAsync(avdName, platform, operation) {
1425
1437
  if (platform === "win32") return [];
1426
- const out = await runOperationFileQuiet(operation, getExecutor(), "ps", [
1438
+ const out = await readProcessTableAsync(operation, [
1427
1439
  "-axww",
1428
1440
  "-o",
1429
1441
  "pid=,command="
1430
- ], {
1431
- timeoutMs: 5e3,
1432
- killSignal: "SIGKILL"
1433
- });
1442
+ ]);
1434
1443
  return out === null ? null : parseAvdEmulatorProcesses(out, avdName);
1435
1444
  }
1436
1445
  function scanAvdEmulatorProcesses(avdName, platform, listProcesses) {
@@ -1463,16 +1472,12 @@ async function assertOwnedAvdStoppedAsync(avdName, operation, resolveDirectory =
1463
1472
  if (processes === null) throw new Error(`Could not read the process table to verify that owned AVD ${avdName} stopped.`);
1464
1473
  const live = new Set(processes);
1465
1474
  if (processId !== null && pidExists(processId)) {
1466
- const stat = process.platform === "win32" ? null : await runOperationFileQuiet(operation, getExecutor(), "ps", [
1475
+ const stat = process.platform === "win32" ? null : await readProcessTableAsync(operation, [
1467
1476
  "-o",
1468
1477
  "stat=",
1469
1478
  "-p",
1470
1479
  String(processId)
1471
- ], {
1472
- timeoutMs: 5e3,
1473
- killSignal: "SIGKILL",
1474
- cwd: operation?.cwd
1475
- });
1480
+ ], { cwd: operation?.cwd });
1476
1481
  if (stat === null || !stat.trim().startsWith("Z")) live.add(processId);
1477
1482
  }
1478
1483
  if (live.size) throw new Error(`Owned AVD ${avdName} still has a live emulator process (${[...live].join(", ")}).`);
@@ -1,7 +1,7 @@
1
- import { M as withDirLock$1, _ as ensureWorkspaceStorage } from "./workspace-state-pUg3_RRA.mjs";
2
- import { d as getConfigDir } from "./config-BktkY_zC.mjs";
3
- import { m as defaultAndroidLayout } from "./settings-CosW5X-S.mjs";
4
- import { r as register } from "./cache-manifest-BEZ9Bpl1.mjs";
1
+ import { M as withDirLock$1, _ as ensureWorkspaceStorage } from "./workspace-state-BjqdjnJR.mjs";
2
+ import { d as getConfigDir } from "./config-Cn94Jc0g.mjs";
3
+ import { m as defaultAndroidLayout } from "./settings-BDVI8Ivc.mjs";
4
+ import { r as register } from "./cache-manifest-DEjqGGat.mjs";
5
5
  import { createHash, randomUUID } from "node:crypto";
6
6
  import { accessSync, constants, existsSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, writeFileSync } from "node:fs";
7
7
  import { join } from "node:path";
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
+ import { t as getExecutor } from "./exec-aULwtNly.mjs";
3
3
  import { createHash, randomUUID } from "node:crypto";
4
4
  import { appendFileSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
5
5
  import { join } from "node:path";
package/dist/api.d.mts CHANGED
@@ -19,7 +19,7 @@ interface ReleasedLease {
19
19
  }
20
20
  //#endregion
21
21
  //#region src/commands/gc/results.d.ts
22
- type GcResultKind = "archive" | "device" | "parkedDevice" | "parkedHostedDevice" | "idleDevice" | "deviceRecord" | "workspaceOutputs" | "recording" | "workspaceDirectory" | "project" | "buildLock" | "buildSlot" | "deviceLease" | "easSession" | "worktree" | "cache" | "statusCache" | "tempLeftover" | "trash" | "watchmanRoot" | "watchman" | "gradleDaemon" | "gradleVersion" | "kotlinDaemon" | "devServer" | "workspaceLogs" | "ledgerEntry" | "easLedgerEntry";
22
+ type GcResultKind = "archive" | "device" | "parkedDevice" | "parkedHostedDevice" | "idleDevice" | "deviceRecord" | "workspaceOutputs" | "worktreeDependencies" | "recording" | "workspaceDirectory" | "project" | "buildLock" | "buildSlot" | "deviceLease" | "easSession" | "worktree" | "cache" | "statusCache" | "tempLeftover" | "trash" | "watchmanRoot" | "watchman" | "gradleDaemon" | "gradleVersion" | "kotlinDaemon" | "devServer" | "workspaceLogs" | "ledgerEntry" | "easLedgerEntry";
23
23
  type GcResultStatus = "done" | "kept" | "failed";
24
24
  interface GcResult {
25
25
  kind: GcResultKind;
@@ -259,8 +259,12 @@ interface DoctorReport {
259
259
  maintenance: ReturnType<typeof maintenanceStatus> & {
260
260
  logPath: string;
261
261
  };
262
- remoteMachines: BuildMachinesInspection["machines"];
263
- deviceHosts: Awaited<ReturnType<typeof inspectDeviceHostMachines>>["machines"];
262
+ remoteMachines: Array<BuildMachinesInspection["machines"][number] & {
263
+ priority?: number;
264
+ }>;
265
+ deviceHosts: Array<Awaited<ReturnType<typeof inspectDeviceHostMachines>>["machines"][number] & {
266
+ priority?: number;
267
+ }>;
264
268
  toolchain: ToolchainReport | null;
265
269
  findings: Finding[];
266
270
  }
@@ -684,6 +688,11 @@ interface GcJsonSections {
684
688
  reason: WorkspaceLogsKeptCode | null;
685
689
  detail: string | null;
686
690
  }[];
691
+ worktreeDependencies: {
692
+ path: string;
693
+ willDelete: boolean;
694
+ detail: string | null;
695
+ }[];
687
696
  recordings: {
688
697
  dir: string;
689
698
  projectRoot: string | null;
@@ -697,6 +706,7 @@ interface GcJsonSections {
697
706
  workspaceBuildOutputs: {
698
707
  dir: string;
699
708
  projectRoot: string | null;
709
+ inTreeDirs: string[];
700
710
  bytes: number | null;
701
711
  idleDays: number | null;
702
712
  willClear: boolean;