stim 1.17.2 → 1.18.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 (150) hide show
  1. package/README.md +50 -1
  2. package/dist/{activity-IRvJY_ru.mjs → activity-BxnkDZDi.mjs} +4 -4
  3. package/dist/{agent-device-usage-output-BK41vnzN.mjs → agent-device-usage-output-CZ66YA4T.mjs} +8 -8
  4. package/dist/android-BKA16DTf.mjs +4 -0
  5. package/dist/{android-B9yaNKwa.mjs → android-BvwuMUJ9.mjs} +192 -98
  6. package/dist/{android-DE4v59Mb.mjs → android-CBwCNicO.mjs} +2 -2
  7. package/dist/{android-B_YNZy61.mjs → android-DC3ZLuw0.mjs} +9 -9
  8. package/dist/{android-cas-ZFpjJBL_.mjs → android-cas-BBFyr9CA.mjs} +5 -5
  9. package/dist/android-cas-compiler.mjs +2 -2
  10. package/dist/api-D0VtFhqk.mjs +152 -0
  11. package/dist/api-run.d.mts +1 -0
  12. package/dist/api-run.mjs +145 -0
  13. package/dist/api.d.mts +212 -0
  14. package/dist/api.mjs +2 -0
  15. package/dist/{app-install-VPkI5WEg.mjs → app-install-D-PUENug.mjs} +3 -3
  16. package/dist/{attempt-Bk2ouQVL.mjs → attempt-DW-mQqM7.mjs} +14 -4
  17. package/dist/{budget-DfcgFdQB.mjs → budget-DIhL2BKx.mjs} +1578 -58
  18. package/dist/build-facts-DcLv2HSd.d.mts +111 -0
  19. package/dist/{cache-manifest-DnUHBJaU.mjs → cache-manifest-BI7ozfmH.mjs} +3 -3
  20. package/dist/cache-manifest.mjs +1 -1
  21. package/dist/{chrome-BrcVWQyD.mjs → chrome-DJnmnS5q.mjs} +1 -1
  22. package/dist/cli-DNJMwADx.mjs +68 -0
  23. package/dist/cli.mjs +1 -1
  24. package/dist/{client-SvBdgObD.mjs → client-DzhapoMB.mjs} +139 -32
  25. package/dist/collector-run.mjs +9 -9
  26. package/dist/{command-output-CDAIFD-8.mjs → command-output-CBtzyIgF.mjs} +2 -2
  27. package/dist/{config-D0DbpZtM.mjs → config-CgYMahz7.mjs} +5 -5
  28. package/dist/{created-devices-CpvzBL25.mjs → created-devices-DKbeWsiK.mjs} +2 -2
  29. package/dist/{dependency-state-CLcBHH2M.mjs → dependency-state-xKoOypBm.mjs} +2 -2
  30. package/dist/{detached-entry-CiTEgMR1.mjs → detached-entry-BLfcgc4O.mjs} +1 -1
  31. package/dist/{dev-client-B-XC4uRH.mjs → dev-client-CLnIH02x.mjs} +2 -2
  32. package/dist/{device-C8IOoJPv.mjs → device-D7oCHGWi.mjs} +8 -8
  33. package/dist/{device-capacity-ZC4XSZ4R.mjs → device-capacity-EUOOYr8T.mjs} +13 -13
  34. package/dist/device-host-worker.mjs +19 -19
  35. package/dist/{device-ios-C2Um-XUR.mjs → device-ios-6MewKKnc.mjs} +13 -13
  36. package/dist/{device-lease-DpoS36_u.mjs → device-lease-Co-EwifR.mjs} +9 -9
  37. package/dist/{device-lease-run-B8YltIH_.mjs → device-lease-run-w1xhCqIW.mjs} +4 -4
  38. package/dist/{device-pool-3o7s5lo4.mjs → device-pool-F5WvRPtD.mjs} +3 -3
  39. package/dist/{device-remote-hFSkpfQu.mjs → device-remote-tHbd1fKy.mjs} +15 -15
  40. package/dist/{doctor-CFv1fCrF.mjs → doctor-B9ckYUoU.mjs} +33 -30
  41. package/dist/{error-diagnostics-C-NMnhrk.mjs → error-diagnostics-BRXOqDzG.mjs} +11 -11
  42. package/dist/{exec-CaErVv7t.mjs → exec-DWhCZDGm.mjs} +65 -2
  43. package/dist/{gc-DEmkg3Xh.mjs → gc-Dh6mXOKC.mjs} +23 -469
  44. package/dist/{gradle-dJpre3Yn.mjs → gradle-C6GKnunQ.mjs} +6 -6
  45. package/dist/{guide-status-Du-ZQ3FD.mjs → guide-status-Bhf9SJXc.mjs} +3 -3
  46. package/dist/{guide-CSmhMTf8.mjs → guide-tm6igAaa.mjs} +290 -53
  47. package/dist/{hosted-android-E1Heoqnv.mjs → hosted-android-Bv285t_t.mjs} +3 -3
  48. package/dist/{hosted-client-Bp4knSwu.mjs → hosted-client-C-rMtppF.mjs} +2 -2
  49. package/dist/{hosted-ios-BnbeYOUD.mjs → hosted-ios-D5mNmtj4.mjs} +1 -1
  50. package/dist/{hosted-logs-OcgIBvCT.mjs → hosted-logs-DN8Iz4mJ.mjs} +9 -9
  51. package/dist/{hosted-macos-DcxKjtfH.mjs → hosted-macos-B-wEjlwG.mjs} +5 -5
  52. package/dist/{hosted-native-1Ebbig4w.mjs → hosted-native-DeeOG8xZ.mjs} +6 -6
  53. package/dist/{idle-shutdown-IGyNV8Cr.mjs → idle-shutdown-jjtxAn5C.mjs} +7 -8
  54. package/dist/{ios-DSfnPfse.mjs → ios-B3SbOWdw.mjs} +19 -7
  55. package/dist/{ios-Cr1h5gnO.mjs → ios-Bvbf0SGY.mjs} +1 -1
  56. package/dist/{ios-BJ4XUSe1.mjs → ios-CPdkoKaa.mjs} +181 -95
  57. package/dist/ios-DNpdygiv.mjs +7 -0
  58. package/dist/{ios-device-Ee7sDXfp.mjs → ios-device-Bn7jWDB1.mjs} +1 -1
  59. package/dist/{ios-device-pAN4t54-.mjs → ios-device-vOaByMhw.mjs} +3 -3
  60. package/dist/{ios-state-8L3lgum6.mjs → ios-state-B2pES6Vs.mjs} +1 -1
  61. package/dist/{launch-verify-lTnWZikR.mjs → launch-verify-hskNcWkZ.mjs} +5 -5
  62. package/dist/{logs-BAaS7gS2.mjs → logs-1Ylc1Ri6.mjs} +13 -13
  63. package/dist/macos-Ck7OBMNY.mjs +2 -0
  64. package/dist/{macos-BIRQS90f.mjs → macos-DF6C7wUU.mjs} +118 -34
  65. package/dist/macos-run.mjs +1 -1
  66. package/dist/maintenance-run.mjs +349 -47
  67. package/dist/{metro-g8NqiJp-.mjs → metro-Dh8T4Ytd.mjs} +5 -5
  68. package/dist/{metro-gateway-C-ijGI2F.mjs → metro-gateway-CEUw9RMH.mjs} +4 -4
  69. package/dist/{metro-store-CDDZHtPl.mjs → metro-store-BAHFcJm6.mjs} +16 -2
  70. package/dist/{named-ports-C8m8EQs2.mjs → named-ports-BFIz1Shz.mjs} +61 -6
  71. package/dist/{native-run-D1Q56rAD.mjs → native-run-B06FkmZx.mjs} +4 -4
  72. package/dist/{native-runtime-BEK171xQ.mjs → native-runtime-D_603JiC.mjs} +6 -6
  73. package/dist/{ndjson-PclOIwVY.mjs → ndjson-LGZAMsqa.mjs} +8 -4
  74. package/dist/offload-worker.d.mts +3 -17
  75. package/dist/offload-worker.mjs +10 -11
  76. package/dist/{ownership-DyRQru0q.mjs → ownership-D6Se7gg_.mjs} +3 -3
  77. package/dist/{page-QF_Ke10s.mjs → page-Bv9s2KwY.mjs} +1 -1
  78. package/dist/placement-log-BcPhRwR4.mjs +84 -0
  79. package/dist/{build-plan-BDsSi09V.mjs → plan-placement-CtxkCO54.mjs} +122 -48
  80. package/dist/{ports-4nYqxPWC.mjs → ports-BLTtfBq-.mjs} +3 -3
  81. package/dist/{prebuild-D7RUMkwN.mjs → prebuild-juCyreaR.mjs} +5 -5
  82. package/dist/preview-D5V07Nrl.mjs +987 -0
  83. package/dist/{rolldown-runtime-BsOwBuO_.mjs → process-identity-Biv3arCO.mjs} +11 -1
  84. package/dist/{project-D47Rh0ly.mjs → project-C3ChRLZy.mjs} +4 -68
  85. package/dist/projects-DD7dBTCj.mjs +92 -0
  86. package/dist/{pull-request-pxnDCQzn.mjs → pull-request-u4vp7zmK.mjs} +1 -1
  87. package/dist/pull-requests.mjs +1 -1
  88. package/dist/{recordings-BNgsD1Tr.mjs → recordings-BAWltsVt.mjs} +1 -1
  89. package/dist/{reload-DcRxj3qG.mjs → reload-DvyWzVjJ.mjs} +15 -15
  90. package/dist/{remote-cache-Ci4DQYYj.mjs → remote-cache-BGg7aGIZ.mjs} +5 -5
  91. package/dist/{run-CkE9y0nc.mjs → run-vhtDgpHO.mjs} +5 -5
  92. package/dist/{server-bare-BkrSxSsZ.mjs → server-bare-B9E7S1aR.mjs} +4 -5
  93. package/dist/server-expo-Db9HBUoa.mjs +2 -0
  94. package/dist/{server-expo-CHTyXD0G.mjs → server-expo-DoBHhuzK.mjs} +5 -6
  95. package/dist/{settings-SR9OmW9h.mjs → settings-Byp2AQ_E.mjs} +6 -5
  96. package/dist/{settings-Cfd-0r2d.mjs → settings-CQyMElEP.mjs} +24 -763
  97. package/dist/{settings-BBpMcDbD.mjs → settings-Djl-mpjX.mjs} +1 -1
  98. package/dist/settings.schema.json +126 -3
  99. package/dist/{simslim-BWNrc3M3.mjs → simslim-EHBQ2R4G.mjs} +7 -7
  100. package/dist/{slot-launch-DmjBmpQV.mjs → slot-launch-C1nqh4mu.mjs} +6 -6
  101. package/dist/{spawn-claims-D0XfSe8u.mjs → spawn-claims-Kqiifsk2.mjs} +1 -1
  102. package/dist/{spawn-entry-jw19m8Nl.mjs → spawn-entry-Dcb7sDUz.mjs} +1 -0
  103. package/dist/{stage-CzaiwFsI.mjs → stage-g_WqWeaE.mjs} +14 -3
  104. package/dist/{start-DUz3mYdb.mjs → start-D-IeOyoK.mjs} +19 -19
  105. package/dist/{start-AlfCPRVU.mjs → start-NTc1Ifqs.mjs} +1 -1
  106. package/dist/{state-PeQiJuIu.mjs → state-BG-aAk4k.mjs} +4 -4
  107. package/dist/{state-B4PQFXMW.d.mts → state-lKh8shBp.d.mts} +2 -3
  108. package/dist/{state-DyaNTgfR.mjs → state-xnqpx3AD.mjs} +2 -2
  109. package/dist/{stats-Bq4fJOdB.mjs → stats-DY6ekz8F.mjs} +5 -5
  110. package/dist/{status-DlKvVJBE.mjs → status-BEeL6IKz.mjs} +6 -4
  111. package/dist/{status-BA2pehwf.mjs → status-DCjZeE-K.mjs} +33 -34
  112. package/dist/{status-CzS4bPO9.mjs → status-Dcr0Qexd.mjs} +5 -5
  113. package/dist/{stim-desktop-Cnz8CPnl.mjs → stim-desktop-Behws_fi.mjs} +1 -1
  114. package/dist/{stim-installations-QMEI32v1.mjs → stim-installations-aR_WsNOA.mjs} +1 -1
  115. package/dist/{stop-BIiM49EY.mjs → stop-BGhKMOuH.mjs} +5 -5
  116. package/dist/{stop-DQIasgKp.mjs → stop-BTjs3xbc.mjs} +17 -18
  117. package/dist/{stop-zF1y04f2.mjs → stop-DIJtD2GL.mjs} +2 -2
  118. package/dist/supervisor-run.d.mts +24 -22
  119. package/dist/supervisor-run.mjs +21 -22
  120. package/dist/{support-CsJNVfOc.mjs → support-BaayeYCf.mjs} +7 -7
  121. package/dist/{support-WvD__tSV.mjs → support-Bwvbrq5-.mjs} +5 -5
  122. package/dist/{toolchain-DNyR3NPq.mjs → toolchain-Bnyd_K3A.mjs} +471 -22
  123. package/dist/{trigger-Bemu8ytw.mjs → trigger-CJMhwXe8.mjs} +5 -5
  124. package/dist/trigger-DWAq9hkw.mjs +2 -0
  125. package/dist/{warm-progress-DF4JRvYI.mjs → warm-progress-CjB-MP6H.mjs} +7 -7
  126. package/dist/web-B6_bFDn7.mjs +2 -0
  127. package/dist/{web-Dl0KSRHf.mjs → web-DTU0uiWj.mjs} +22 -22
  128. package/dist/web-run.mjs +10 -10
  129. package/dist/{workspace-state-DqcCbpE7.mjs → workspace-state-C59dqG-Z.mjs} +3 -3
  130. package/dist/{ownership-BMLqyBgJ.mjs → workspaces-xXItD8Dj.mjs} +577 -23
  131. package/dist/{worktree-j3IcFAI5.mjs → worktree-BJfnU6r5.mjs} +1 -1
  132. package/dist/{worktree-Be_7NLKy.mjs → worktree-BSYlofkq.mjs} +234 -35
  133. package/dist/worktree-CsKYexJM.mjs +753 -0
  134. package/package.json +10 -5
  135. package/dist/build-progress-D0WkjCPd.mjs +0 -1036
  136. package/dist/build-slots-41v_d2x9.mjs +0 -142
  137. package/dist/cli-CYXb29oE.mjs +0 -51
  138. package/dist/deps-iKw0eD4P.mjs +0 -438
  139. package/dist/errors-B6W7FkxQ.mjs +0 -15
  140. package/dist/idle-BXG__1BA.mjs +0 -176
  141. package/dist/in-use-CvGOUn-x.mjs +0 -130
  142. package/dist/preview-B-g9d7kV.mjs +0 -318
  143. package/dist/process-identity-BmRm1qV0.mjs +0 -12
  144. package/dist/server-expo-CeakhI8P.mjs +0 -2
  145. package/dist/state-BKa8wNN5.mjs +0 -148
  146. package/dist/stop-cause-rhmGfwvt.mjs +0 -97
  147. package/dist/trigger-CXts6qt1.mjs +0 -2
  148. package/dist/watchman-APYjXSQa.mjs +0 -48
  149. package/dist/workspace-process-lock-2mNzOlaB.mjs +0 -58
  150. package/dist/workspaces-Bcib97-6.mjs +0 -306
@@ -1,24 +1,10 @@
1
+ import "./state-lKh8shBp.mjs";
2
+ import { n as CcacheActivity, r as CompilationCacheActivity } from "./build-facts-DcLv2HSd.mjs";
1
3
  import "./ndjson-Du3j0AQ9.mjs";
2
- import "./state-B4PQFXMW.mjs";
3
- import { readFileSync } from "fs";
4
4
  import "@stim-cli/core/state";
5
+ import { readFileSync } from "fs";
5
6
  import "@expo/fingerprint";
6
7
  import "@stim-cli/core/protocol";
7
- //#region src/engine/build-facts.d.ts
8
- interface CompilationCacheActivity {
9
- status: "reported" | "unavailable" | "not-run";
10
- hits: number | null;
11
- cacheableTasks: number | null;
12
- hitRatePercent: number | null;
13
- swiftTargetsWithoutExplicitModules?: number;
14
- }
15
- interface CcacheActivity {
16
- status: "reported" | "unavailable" | "not-run";
17
- hits: number | null;
18
- misses: number | null;
19
- hitRatePercent: number | null;
20
- }
21
- //#endregion
22
8
  //#region src/optimizations.d.ts
23
9
  interface Optimizations {
24
10
  buildCache: boolean;
@@ -1,16 +1,15 @@
1
- import { t as getExecutor } from "./exec-CaErVv7t.mjs";
1
+ import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
2
2
  import { n as stripAnsi } from "./process-output-Fpl8PYi8.mjs";
3
- import { D as fingerprintProject, M as refingerprintAfterMutation } from "./device-lease-DpoS36_u.mjs";
4
- import { T as CCACHE_UNAVAILABLE, d as buildIos, k as resolveCcache, o as workerToolchain, s as manifestDigest } from "./toolchain-DNyR3NPq.mjs";
5
- import { t as logLines } from "./run-CkE9y0nc.mjs";
6
- import { a as runPodInstall, n as podsAreStale, r as readPodState } from "./deps-iKw0eD4P.mjs";
7
- import { n as recordPrebuild, r as runPrebuild, t as planPrebuild } from "./prebuild-D7RUMkwN.mjs";
8
- import { a as gradlewPath, i as buildAndroid, r as assembleTaskFor } from "./gradle-dJpre3Yn.mjs";
9
- import { n as stageBundle, t as resolveBundleExtras } from "./stage-CzaiwFsI.mjs";
10
- import { d as podAction } from "./support-CsJNVfOc.mjs";
11
- import { createHash } from "node:crypto";
3
+ import { D as fingerprintProject, M as refingerprintAfterMutation } from "./device-lease-Co-EwifR.mjs";
4
+ import { F as resolveCcache, _ as buildIos, j as CCACHE_UNAVAILABLE, l as podsAreStale, o as workerToolchain, p as runPodInstall, s as manifestDigest, u as readPodState } from "./toolchain-Bnyd_K3A.mjs";
5
+ import { n as recordPrebuild, r as runPrebuild, t as planPrebuild } from "./prebuild-juCyreaR.mjs";
6
+ import { a as gradlewPath, i as buildAndroid, r as assembleTaskFor } from "./gradle-C6GKnunQ.mjs";
7
+ import { d as podAction } from "./support-BaayeYCf.mjs";
8
+ import { t as logLines } from "./run-vhtDgpHO.mjs";
9
+ import { r as stageBundle, t as resolveBundleExtras } from "./stage-g_WqWeaE.mjs";
12
10
  import { chmodSync, constants, copyFileSync, cpSync, createReadStream, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, symlinkSync, writeFileSync } from "node:fs";
13
11
  import { basename, dirname, join } from "node:path";
12
+ import { createHash } from "node:crypto";
14
13
  //#region src/offload/worker.ts
15
14
  function emit(value) {
16
15
  process.stdout.write(`${JSON.stringify(value)}\n`);
@@ -582,7 +581,7 @@ async function compileAndroid(job, root, log, time) {
582
581
  }
583
582
  async function main() {
584
583
  const mode = process.argv[2];
585
- if (mode === "offer") return emit(workerToolchain());
584
+ if (mode === "offer") return emit(workerToolchain(process.argv[3] ?? null));
586
585
  if (mode === "build") {
587
586
  const chunks = [];
588
587
  for await (const chunk of process.stdin) chunks.push(chunk);
@@ -1,6 +1,6 @@
1
- import { t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
2
- import { o as pidExists } from "./metro-g8NqiJp-.mjs";
3
- import { c as writeWorkspaceState, o as withWorkspaceStateLock, r as readWorkspaceState } from "./workspace-state-DqcCbpE7.mjs";
1
+ import { t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
+ import { o as pidExists } from "./metro-Dh8T4Ytd.mjs";
3
+ import { c as writeWorkspaceState, o as withWorkspaceStateLock, r as readWorkspaceState } from "./workspace-state-C59dqG-Z.mjs";
4
4
  import { realpathSync } from "node:fs";
5
5
  //#region src/collector/state.ts
6
6
  function collectorRoot(root) {
@@ -1,4 +1,4 @@
1
- import { t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
1
+ import { t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
2
  import { t as connectOwnedBrowser } from "./cdp-Dq_ypAlJ.mjs";
3
3
  //#region src/web/page.ts
4
4
  /** The record of a verified live browser: its supervisor and Chrome are the processes the record names. */
@@ -0,0 +1,84 @@
1
+ import { p as buildPlacementSettings } from "./client-DzhapoMB.mjs";
2
+ //#region src/placement-log.ts
3
+ /** `machine` is `local` when the run stays on this Mac. */
4
+ function placementRecord(input) {
5
+ const { choice, fallback } = input;
6
+ const event = input.event ?? (input.kind === "build" ? "build_placement" : "device_placement");
7
+ const base = `${input.kind} placement: ${choice.machine} (${choice.msg})`;
8
+ return {
9
+ src: "placement",
10
+ level: fallback ? "warn" : "info",
11
+ ...input,
12
+ event,
13
+ msg: fallback ? `${base}; fell back: ${fallback.msg}` : base
14
+ };
15
+ }
16
+ function skippedCandidates(skipped) {
17
+ return skipped.map(({ machine, code, reason }) => ({
18
+ machine,
19
+ code,
20
+ msg: reason
21
+ }));
22
+ }
23
+ function devicePlacementRecord({ platform, fromFlag, placed }) {
24
+ return placementRecord({
25
+ kind: "device",
26
+ platform,
27
+ settings: [{
28
+ key: `${platform}.remote`,
29
+ value: "auto",
30
+ from: fromFlag ? "flag" : "setting"
31
+ }],
32
+ candidates: skippedCandidates(placed.skipped),
33
+ choice: {
34
+ machine: placed.placement.machine ?? "local",
35
+ code: placed.code,
36
+ msg: placed.placement.reason
37
+ }
38
+ });
39
+ }
40
+ /**
41
+ * The record for where a build runs. `stays` is the reason this Mac builds it, `chose` the remote Mac that takes it,
42
+ * and `fallback` why a remote Mac that was meant to build it did not.
43
+ */
44
+ function buildPlacementRecord({ platform, buildMachine, candidates = [], ...outcome }) {
45
+ const base = {
46
+ kind: "build",
47
+ platform,
48
+ settings: buildPlacementSettings(buildMachine),
49
+ candidates
50
+ };
51
+ if ("stays" in outcome) return placementRecord({
52
+ ...base,
53
+ choice: {
54
+ machine: "local",
55
+ code: outcome.stays.code,
56
+ msg: outcome.stays.reason
57
+ }
58
+ });
59
+ if ("chose" in outcome) return placementRecord({
60
+ ...base,
61
+ choice: {
62
+ machine: outcome.chose.machine,
63
+ code: "placed",
64
+ msg: outcome.chose.reason
65
+ }
66
+ });
67
+ const { code, reason, machine } = outcome.fallback;
68
+ return placementRecord({
69
+ ...base,
70
+ event: outcome.event ?? "build_placement",
71
+ choice: {
72
+ machine: "local",
73
+ code,
74
+ msg: "building on this Mac"
75
+ },
76
+ fallback: {
77
+ code,
78
+ msg: reason,
79
+ ...machine ? { machine } : {}
80
+ }
81
+ });
82
+ }
83
+ //#endregion
84
+ export { devicePlacementRecord as n, buildPlacementRecord as t };
@@ -1,45 +1,46 @@
1
- import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
- import { D as withConfigLock$1, H as projectDeviceSlots, _ as loadConfig$1, a as clearDevice, b as releaseAndroidConsolePort, i as clearAndroidBootPending, k as acquireAvdClaim, p as getProject, t as allConsolePortsAndSerials, w as setDevice, z as deviceSlotPlatforms } from "./config-D0DbpZtM.mjs";
3
- import { n as ownership_claim_exports } from "./process-identity-BmRm1qV0.mjs";
1
+ import { n as ownership_claim_exports } from "./process-identity-Biv3arCO.mjs";
2
+ import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
4
3
  import { r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
5
- import { i as formatDuration, l as phaseLine, m as shortHash, u as plural } from "./command-output-CDAIFD-8.mjs";
6
- import { Tt as removeTemporaryEntry, a as androidAvdConfigSetting, at as gitCommonDirOnDisk, c as androidDataPartitionSizeGbSetting, wt as makeTemporaryDirectory } from "./settings-Cfd-0r2d.mjs";
7
- import { u as ownedDeviceLabel } from "./project-D47Rh0ly.mjs";
8
- import { o as pidExists } from "./metro-g8NqiJp-.mjs";
9
- import { d as sharedBuildCache } from "./workspace-state-DqcCbpE7.mjs";
10
- import { o as peekBudget } from "./budget-DfcgFdQB.mjs";
11
- import { C as diffFingerprintSources, I as storedSources, w as entryDir, y as artifactIn } from "./device-lease-DpoS36_u.mjs";
12
- import { A as listAvds, B as ownedAvdSystemImage, E as getAvdNameForSerial, F as ownedAvdDeviceProfile, J as resolveOwnedAvdSerial, L as ownedAvdMatchesConfiguration, O as listAdbDevices, P as nextConsolePort, R as ownedAvdName, W as pickDefaultSystemImage, b as createOwnedAvd, f as assertOwnedAvdStopped, ft as parkedMaxSetting, g as avdPoolConfiguration, j as listInstalledSystemImages, n as OWNED_AVD_CONFIG_DEFAULTS, pt as readParked, st as adoptParked, t as DEFAULT_AVD_DEVICE_PROFILE, tt as waitForBoot, ut as isLegacyDeletionClaim, v as bootAndroidEmulator, y as configureNewOwnedAvd } from "./android-B_YNZy61.mjs";
13
- import { j as readHostMemoryPressure, u as listAllIosSims } from "./ios-DSfnPfse.mjs";
14
- import { _ as teardownParkedAvd, m as teardownOwnedAvd } from "./ownership-BMLqyBgJ.mjs";
15
- import { o as estimateBuild, p as readStats$1 } from "./build-progress-D0WkjCPd.mjs";
16
- import { b as tailLines, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-DNyR3NPq.mjs";
17
- import { t as cleanLine } from "./server-expo-CHTyXD0G.mjs";
18
- import { f as namedBuildMachine, m as resolveBuildMachine, v as hostingMachines } from "./client-SvBdgObD.mjs";
19
- import { a as call, o as connectHost } from "./hosted-client-Bp4knSwu.mjs";
20
- import { t as clearDeviceIdleShutdown } from "./idle-shutdown-IGyNV8Cr.mjs";
21
- import { i as countLiveOwnedDevices, n as DeviceAdmissionRefusal, p as withDeviceBootAdmission, s as peekDeviceSlots } from "./device-capacity-ZC4XSZ4R.mjs";
22
- import { i as staleNativeDirRefusal } from "./prebuild-D7RUMkwN.mjs";
23
- import { i as ensureOwnedIosDevice, r as ensureIosBooted } from "./device-ios-C2Um-XUR.mjs";
24
- import { r as readHostedNative, s as writeHostedNative } from "./ios-state-8L3lgum6.mjs";
25
- import { n as prepareHostedNative } from "./hosted-native-1Ebbig4w.mjs";
26
- import { a as easAuthNote } from "./remote-cache-Ci4DQYYj.mjs";
27
- import { t as reconcileSimSlim } from "./simslim-BWNrc3M3.mjs";
28
- import { randomUUID } from "node:crypto";
4
+ import { i as formatDuration, l as phaseLine, m as shortHash, u as plural } from "./command-output-CBtzyIgF.mjs";
5
+ import { D as withConfigLock$1, H as projectDeviceSlots, _ as loadConfig$1, a as clearDevice, b as releaseAndroidConsolePort, i as clearAndroidBootPending, k as acquireAvdClaim, p as getProject, t as allConsolePortsAndSerials, w as setDevice, z as deviceSlotPlatforms } from "./config-CgYMahz7.mjs";
6
+ import { D as makeTemporaryDirectory, O as removeTemporaryEntry, c as gitCommonDirOnDisk } from "./worktree-CsKYexJM.mjs";
7
+ import { u as ownedDeviceLabel } from "./project-C3ChRLZy.mjs";
8
+ import { o as pidExists } from "./metro-Dh8T4Ytd.mjs";
9
+ import { d as sharedBuildCache } from "./workspace-state-C59dqG-Z.mjs";
10
+ import { B as readStats$1, M as estimateBuild, s as peekBudget } from "./budget-DIhL2BKx.mjs";
11
+ import { E as teardownOwnedAvd, k as teardownParkedAvd } from "./workspaces-xXItD8Dj.mjs";
12
+ import { C as diffFingerprintSources, I as storedSources, w as entryDir, y as artifactIn } from "./device-lease-Co-EwifR.mjs";
13
+ import { A as listAvds, B as ownedAvdSystemImage, E as getAvdNameForSerial, F as ownedAvdDeviceProfile, J as resolveOwnedAvdSerial, L as ownedAvdMatchesConfiguration, O as listAdbDevices, P as nextConsolePort, R as ownedAvdName, W as pickDefaultSystemImage, b as createOwnedAvd, f as assertOwnedAvdStopped, ft as parkedMaxSetting, g as avdPoolConfiguration, j as listInstalledSystemImages, n as OWNED_AVD_CONFIG_DEFAULTS, pt as readParked, st as adoptParked, t as DEFAULT_AVD_DEVICE_PROFILE, tt as waitForBoot, ut as isLegacyDeletionClaim, v as bootAndroidEmulator, y as configureNewOwnedAvd } from "./android-DC3ZLuw0.mjs";
14
+ import { M as readHostMemoryPressure, d as listAllIosSims } from "./ios-B3SbOWdw.mjs";
15
+ import { a as androidAvdConfigSetting, c as androidDataPartitionSizeGbSetting } from "./settings-CQyMElEP.mjs";
16
+ import { b as hostingMachines, g as resolveBuildMachine, m as namedBuildMachine } from "./client-DzhapoMB.mjs";
17
+ import { t as clearDeviceIdleShutdown } from "./idle-shutdown-jjtxAn5C.mjs";
18
+ import { i as countLiveOwnedDevices, n as DeviceAdmissionRefusal, p as withDeviceBootAdmission, s as peekDeviceSlots } from "./device-capacity-EUOOYr8T.mjs";
19
+ import { E as tailLines, T as startBuildHeartbeat, g as HEARTBEAT_INTERVAL_MS } from "./toolchain-Bnyd_K3A.mjs";
20
+ import { t as cleanLine } from "./server-expo-DoBHhuzK.mjs";
21
+ import { a as call, o as connectHost } from "./hosted-client-C-rMtppF.mjs";
22
+ import { r as readHostedNative, s as writeHostedNative } from "./ios-state-B2pES6Vs.mjs";
23
+ import { n as prepareHostedNative } from "./hosted-native-DeeOG8xZ.mjs";
24
+ import { a as easAuthNote } from "./remote-cache-BGg7aGIZ.mjs";
25
+ import { t as reconcileSimSlim } from "./simslim-EHBQ2R4G.mjs";
26
+ import { i as ensureOwnedIosDevice, r as ensureIosBooted } from "./device-ios-6MewKKnc.mjs";
27
+ import { i as staleNativeDirRefusal } from "./prebuild-juCyreaR.mjs";
29
28
  import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
30
29
  import { basename, dirname, join, relative } from "node:path";
31
30
  import { LAST_BUILD_KEYS, isJsonObject, loadConfig, machineCapacity, parseHostedChoice, parseHostedNativeOffer, readWorkspaceState } from "@stim-cli/core/state";
32
- import { claimRemoveCommand, clearClaimChild, markClaimChildPending, processGroupAlive, releaseClaim, setClaimChild } from "@stim-cli/core/ownership-claim";
33
- import { captureProcessIdentity } from "@stim-cli/core/process-identity";
34
31
  import chalk from "chalk";
35
32
  import { isDeepStrictEqual } from "node:util";
33
+ import { claimRemoveCommand, clearClaimChild, markClaimChildPending, processGroupAlive, releaseClaim, setClaimChild } from "@stim-cli/core/ownership-claim";
34
+ import { captureProcessIdentity } from "@stim-cli/core/process-identity";
35
+ import { randomUUID } from "node:crypto";
36
36
  import * as expoFingerprint from "@expo/fingerprint";
37
37
  import { resolveTieredBuild } from "@stim-cli/cache";
38
38
  import { request } from "node:http";
39
39
  //#region src/device-host/placement.ts
40
- function local$1(reason, skipped = []) {
40
+ function local$1(code, reason, skipped = []) {
41
41
  return {
42
42
  kind: "local",
43
+ code,
43
44
  reason,
44
45
  skipped
45
46
  };
@@ -50,6 +51,7 @@ function decideDevicePlacement(inputs) {
50
51
  const reason = `recorded session on ${inputs.sticky.machine}`;
51
52
  return {
52
53
  kind: "host",
54
+ code: "sticky",
53
55
  reason,
54
56
  machines: [{
55
57
  machine: inputs.sticky.machine,
@@ -60,6 +62,7 @@ function decideDevicePlacement(inputs) {
60
62
  }
61
63
  return {
62
64
  kind: "local",
65
+ code: "sticky",
63
66
  reason: "this workspace's device runs here",
64
67
  skipped: []
65
68
  };
@@ -69,21 +72,22 @@ function decideDevicePlacement(inputs) {
69
72
  const cannotTake = !(max === 0 || count !== null && count < max) || queued > 0;
70
73
  const usage = max > 0 ? `${count} of ${max} devices in use` : `${count} devices in use, no device cap`;
71
74
  const localReason = count === null ? "cannot tell how many devices run here; local boot admission decides" : cannotTake ? `${usage}${queued ? `, ${queued} runs queued ahead` : ""}` : here.budgetRefusal ?? (here.memoryPressure !== "normal" ? `host memory pressure ${here.memoryPressure ?? "unknown"} here` : `load ${here.loadPerCore.toFixed(1)}/core here, ${usage}`);
72
- if (!offers.length) return local$1("no remote Macs configured; " + localReason);
73
- if (count === null) return local$1(localReason);
74
- if (!cannotTake && here.memoryPressure === "normal" && !here.budgetRefusal && here.loadPerCore < here.maxLoadPerCore) return local$1(localReason);
75
+ if (!offers.length) return local$1("no-remote-mac", "no remote Macs configured; " + localReason);
76
+ if (count === null) return local$1("device-count-unknown", localReason);
77
+ if (!cannotTake && here.memoryPressure === "normal" && !here.budgetRefusal && here.loadPerCore < here.maxLoadPerCore) return local$1("this-mac-free", localReason);
75
78
  const skipped = [];
76
79
  const admitted = [];
77
80
  offers.forEach((probe, index) => {
78
81
  let reason = null;
82
+ let code = "unreachable";
79
83
  if ("failure" in probe) reason = probe.failure;
80
84
  else {
81
85
  const { offer } = probe;
82
- if (offer.declined !== null) reason = `declined: ${offer.declined}`;
83
- else if (offer.platform !== platform || !offer.choice) reason = `no matching ${platform} device choice`;
84
- else if (offer.resources.memoryPressure !== "normal") reason = "host memory pressure unknown or elevated";
85
- else if (offer.capacity.available === 0) reason = "no hosted device capacity available";
86
- else if (!cannotTake && (offer.resources.loadPerCore === null || offer.resources.loadPerCore >= here.loadPerCore)) reason = offer.resources.loadPerCore === null ? "host load unknown while this Mac has room" : "host is not less loaded than this Mac";
86
+ if (offer.declined !== null) [code, reason] = ["declined", `declined: ${offer.declined}`];
87
+ else if (offer.platform !== platform || !offer.choice) [code, reason] = ["no-matching-device", `no matching ${platform} device choice`];
88
+ else if (offer.resources.memoryPressure !== "normal") [code, reason] = ["memory", "host memory pressure unknown or elevated"];
89
+ else if (offer.capacity.available === 0) [code, reason] = ["no-capacity", "no hosted device capacity available"];
90
+ else if (!cannotTake && (offer.resources.loadPerCore === null || offer.resources.loadPerCore >= here.loadPerCore)) [code, reason] = ["load", offer.resources.loadPerCore === null ? "host load unknown while this Mac has room" : "host is not less loaded than this Mac"];
87
91
  else admitted.push({
88
92
  machine: probe.machine,
89
93
  offer,
@@ -92,17 +96,19 @@ function decideDevicePlacement(inputs) {
92
96
  }
93
97
  if (reason) skipped.push({
94
98
  machine: probe.machine,
99
+ code,
95
100
  reason
96
101
  });
97
102
  });
98
103
  admitted.sort((a, b) => Number(b.machine === buildMachine) - Number(a.machine === buildMachine) || (a.offer.resources.loadPerCore ?? Infinity) - (b.offer.resources.loadPerCore ?? Infinity) || b.offer.resources.memoryFreeBytes - a.offer.resources.memoryFreeBytes || a.index - b.index);
99
- if (!admitted.length) return local$1(`${localReason}; no host admits${cannotTake && !noWait ? "; waiting locally if needed" : ""}`, skipped);
104
+ if (!admitted.length) return local$1("no-host-admits", `${localReason}; no host admits${cannotTake && !noWait ? "; waiting locally if needed" : ""}`, skipped);
100
105
  const machines = admitted.map(({ machine, offer }) => ({
101
106
  machine,
102
107
  reason: `${localReason}; ${machine}${machine === buildMachine ? " is the explicit remote Mac," : ""} load ${offer.resources.loadPerCore === null ? "unknown" : offer.resources.loadPerCore.toFixed(1) + "/core"}`
103
108
  }));
104
109
  return {
105
110
  kind: "host",
111
+ code: "placed",
106
112
  machines,
107
113
  reason: machines[0].reason,
108
114
  skipped
@@ -160,7 +166,7 @@ async function probeHost(machine, platform, selectors) {
160
166
  host?.connection.close();
161
167
  }
162
168
  }
163
- function hosted(target, reason, skipped = []) {
169
+ function hosted(target, code, reason, skipped = []) {
164
170
  target.selection = {
165
171
  selected: "auto",
166
172
  reason
@@ -172,16 +178,18 @@ function hosted(target, reason, skipped = []) {
172
178
  machine: target.host.machine,
173
179
  reason
174
180
  },
181
+ code,
175
182
  skipped
176
183
  };
177
184
  }
178
- function local(reason, skipped = []) {
185
+ function local(code, reason, skipped = []) {
179
186
  return {
180
187
  target: null,
181
188
  placement: {
182
189
  decision: "local",
183
190
  reason
184
191
  },
192
+ code,
185
193
  skipped
186
194
  };
187
195
  }
@@ -200,6 +208,7 @@ async function automaticDevicePlacement({ root, slot, platform, selectors, build
200
208
  machine: recorded.machine,
201
209
  reason: recorded.reason ?? decideDevicePlacement({ sticky: { machine: recorded.machine } }).reason
202
210
  },
211
+ code: "sticky",
203
212
  skipped: [],
204
213
  sticky: true
205
214
  };
@@ -207,7 +216,7 @@ async function automaticDevicePlacement({ root, slot, platform, selectors, build
207
216
  }
208
217
  const devices = peek();
209
218
  if (devices.localLive) return {
210
- ...local(decideDevicePlacement({ sticky: { local: true } }).reason),
219
+ ...local("sticky", decideDevicePlacement({ sticky: { local: true } }).reason),
211
220
  sticky: true
212
221
  };
213
222
  const entries = machines();
@@ -232,7 +241,7 @@ async function automaticDevicePlacement({ root, slot, platform, selectors, build
232
241
  buildMachine,
233
242
  noWait
234
243
  });
235
- if (early.kind === "local" && early.skipped.length === 0) return local(early.reason);
244
+ if (early.kind === "local" && early.skipped.length === 0) return local(early.code, early.reason);
236
245
  const probes = await Promise.all(entries.map((machine) => probe(machine, platform, selectors)));
237
246
  const decision = decideDevicePlacement({
238
247
  platform,
@@ -241,9 +250,9 @@ async function automaticDevicePlacement({ root, slot, platform, selectors, build
241
250
  buildMachine,
242
251
  noWait
243
252
  });
244
- if (decision.kind === "local") return local(decision.reason, decision.skipped);
253
+ if (decision.kind === "local") return local(decision.code, decision.reason, decision.skipped);
245
254
  const target = probes.find((each) => each.probe.machine === decision.machines[0].machine).target;
246
- return hosted(target, decision.reason, decision.skipped);
255
+ return hosted(target, decision.code, decision.reason, decision.skipped);
247
256
  }
248
257
  function devicePlacementLine(placement, skipped) {
249
258
  return `${placement.machine ?? "local"}, ${placement.reason}${placement.decision !== "hosted" && skipped.length ? "; " + skipped.map((each) => `${each.machine}: ${each.reason}`).join("; ") : ""}`;
@@ -891,7 +900,7 @@ async function ensureAndroidBooted({ device, deviceSlotWait, projectPath, slot,
891
900
  function didSetUpDevice(device, remote) {
892
901
  return remote ? void 0 : Boolean(device.setup || device.booting);
893
902
  }
894
- async function ensureOwnedDevice({ platform, project, projectPath, slot, settingsRoot = projectPath, label = ownedDeviceLabel(projectPath), settings, flags = {}, note = () => {}, out = () => {}, logFile = null, alive = pidExists, configureAvd = configureNewOwnedAvd, teardownAvd = teardownOwnedAvd, reconcileIosSimulator = reconcileSimSlim }) {
903
+ async function ensureOwnedDevice({ platform, project, projectPath, slot, settingsRoot = projectPath, label = ownedDeviceLabel(projectPath), settings, flags = {}, note = () => {}, out = () => {}, logFile = null, alive = pidExists, configureAvd = configureNewOwnedAvd, teardownAvd = teardownOwnedAvd, reconcileIosSimulator = reconcileSimSlim, simSnapshot }) {
895
904
  clearDeviceIdleShutdown(projectPath, platform, slot);
896
905
  if (slot && slot !== "default") label = `${label}-${slot}`;
897
906
  const record = deviceSlotPlatforms(project, slot)?.[platform] ?? null;
@@ -905,7 +914,8 @@ async function ensureOwnedDevice({ platform, project, projectPath, slot, setting
905
914
  flags,
906
915
  note,
907
916
  out,
908
- reconcileIosSimulator
917
+ reconcileIosSimulator,
918
+ simSnapshot
909
919
  });
910
920
  return ensureOwnedAndroidDevice({
911
921
  record,
@@ -1753,6 +1763,7 @@ function printPlan(plan, json) {
1753
1763
  }
1754
1764
  const slot = plan.slot ? ` [${plan.slot}]` : "";
1755
1765
  console.log(phaseLine("plan", `${plan.platform}${slot} ${shortHash(plan.fingerprint)} -> ${cacheLine(plan)}`));
1766
+ if (plan.placement) console.log(phaseLine("placement", plan.placement));
1756
1767
  if (plan.missReason) console.log(phaseLine("cache", `miss: ${plan.missReason.summary}`));
1757
1768
  if (plan.refusal) {
1758
1769
  console.log(phaseLine("error", plan.refusal.message));
@@ -1782,4 +1793,67 @@ function planFlagRefusal(flag) {
1782
1793
  };
1783
1794
  }
1784
1795
  //#endregion
1785
- export { AvdRecoveryError as _, refusePlan as a, devicePlacementLine as b, skippedMissReason as c, refreshUpdatesManifestFile as d, swapJsBundle as f, AvdBootError as g, ensureOwnedDevice as h, printPlan as i, UPDATES_MANIFEST_NAME as l, ensureBooted as m, planFlagRefusal as n, explainBuildMiss as o, didSetUpDevice as p, planPayload as r, fingerprintErrorMissReason as s, planCachedBuild as t, detectEntryFile as u, warmMetro as v, automaticDevicePlacement as y };
1796
+ //#region src/device-host/plan-placement.ts
1797
+ /**
1798
+ * Where `--plan` assumes the next run puts its simulator or emulator, with no session, reservation or state write.
1799
+ * A named Mac, or the Mac a recorded session already holds, answers with the device its `device-host.offer` would
1800
+ * give; `auto` repeats the placement decision a run makes now and, when that stays on this Mac, notes any Mac
1801
+ * whose device would key differently. The result predicts the cache key only; a run reads its own device.
1802
+ */
1803
+ async function planHostedDevice({ root, slot, platform, machine, selectors, sameKey, deps = {} }) {
1804
+ const { automatic = automaticDevicePlacement, probe = probeHost, machines = hostingMachines } = deps;
1805
+ const named = async (name) => {
1806
+ const result = await probe(name, platform, selectors);
1807
+ if ("failure" in result.probe) return {
1808
+ kind: "unknown",
1809
+ reason: `${name} did not give a ${platform} device (${result.probe.failure})`
1810
+ };
1811
+ const { choice, declined } = result.probe.offer;
1812
+ if (!choice) return {
1813
+ kind: "unknown",
1814
+ reason: `${name} has no ${platform} device for this selection${declined ? ` (${declined})` : ""}`
1815
+ };
1816
+ return {
1817
+ kind: "hosted",
1818
+ choice,
1819
+ placement: `on ${name}`
1820
+ };
1821
+ };
1822
+ if (machine !== "auto") return named(machine);
1823
+ try {
1824
+ const recorded = readHostedNative(root, platform, slot)[slot];
1825
+ if (recorded) return await named(recorded.machine);
1826
+ const placed = await automatic({
1827
+ root,
1828
+ slot,
1829
+ platform,
1830
+ selectors,
1831
+ noWait: false
1832
+ }, {
1833
+ read: () => ({}),
1834
+ write: () => {}
1835
+ });
1836
+ if (placed.target) return {
1837
+ kind: "hosted",
1838
+ choice: placed.target.choice,
1839
+ placement: `on ${placed.target.host.machine}, as auto would now`
1840
+ };
1841
+ const names = machines() ?? [];
1842
+ const differs = (await Promise.all(names.map((name) => probe(name, platform, selectors)))).flatMap(({ probe: each }) => "offer" in each && each.offer.choice && sameKey(each.offer.choice) === false ? [each.machine] : []);
1843
+ if (differs.length) return {
1844
+ kind: "local",
1845
+ placement: `this Mac; auto may use ${differs.join(", ")}, which builds for another architecture, so its key differs`
1846
+ };
1847
+ return {
1848
+ kind: "local",
1849
+ placement: names.length ? `this Mac; auto may use ${names.join(", ")}` : "this Mac"
1850
+ };
1851
+ } catch (error) {
1852
+ return {
1853
+ kind: "unknown",
1854
+ reason: error.message
1855
+ };
1856
+ }
1857
+ }
1858
+ //#endregion
1859
+ export { AvdBootError as _, printPlan as a, automaticDevicePlacement as b, fingerprintErrorMissReason as c, detectEntryFile as d, refreshUpdatesManifestFile as f, ensureOwnedDevice as g, ensureBooted as h, planPayload as i, skippedMissReason as l, didSetUpDevice as m, planCachedBuild as n, refusePlan as o, swapJsBundle as p, planFlagRefusal as r, explainBuildMiss as s, planHostedDevice as t, UPDATES_MANIFEST_NAME as u, AvdRecoveryError as v, devicePlacementLine as x, warmMetro as y };
@@ -1,6 +1,6 @@
1
- import { p as getProject } from "./config-D0DbpZtM.mjs";
2
- import { o as findCommandWorkspace } from "./project-D47Rh0ly.mjs";
3
- import { n as getNamedPort, t as clearNamedPorts } from "./named-ports-C8m8EQs2.mjs";
1
+ import { p as getProject } from "./config-CgYMahz7.mjs";
2
+ import { o as findCommandWorkspace } from "./project-C3ChRLZy.mjs";
3
+ import { n as getNamedPort, t as clearNamedPorts } from "./named-ports-BFIz1Shz.mjs";
4
4
  //#region src/commands/ports.ts
5
5
  async function inProject(action) {
6
6
  try {
@@ -1,9 +1,9 @@
1
- import { t as getExecutor } from "./exec-CaErVv7t.mjs";
1
+ import { t as getExecutor } from "./exec-DWhCZDGm.mjs";
2
2
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
3
- import { r as detectIsExpo } from "./project-D47Rh0ly.mjs";
4
- import { a as updateWorkspaceState, r as readWorkspaceState } from "./workspace-state-DqcCbpE7.mjs";
5
- import { a as spawnDeclared } from "./spawn-claims-D0XfSe8u.mjs";
6
- import { i as expoBinRefusal, r as expoBinPath } from "./server-expo-CHTyXD0G.mjs";
3
+ import { i as detectIsExpo } from "./project-C3ChRLZy.mjs";
4
+ import { a as updateWorkspaceState, r as readWorkspaceState } from "./workspace-state-C59dqG-Z.mjs";
5
+ import { a as spawnDeclared } from "./spawn-claims-Kqiifsk2.mjs";
6
+ import { i as expoBinRefusal, r as expoBinPath } from "./server-expo-DoBHhuzK.mjs";
7
7
  import { existsSync } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  //#region src/engine/prebuild.ts