stim 1.37.0 → 1.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/{acquire-artifact-zBUbPuDP.mjs → acquire-artifact-QKPDkesw.mjs} +1 -1
  2. package/dist/{act-BGAFjY8f.mjs → act-Bh3t-NuH.mjs} +23 -29
  3. package/dist/{activity-CdpXXSq2.mjs → activity-CANftndU.mjs} +3 -3
  4. package/dist/{agent-device-usage-output-D0582GHy.mjs → agent-device-usage-output-CuROXefb.mjs} +3 -3
  5. package/dist/{android-CGctfYpv.mjs → android-27_JgJ1T.mjs} +3 -3
  6. package/dist/{android-CaSsewbu.mjs → android-Biwc4Dck.mjs} +5 -5
  7. package/dist/{android-BPBARZMR.mjs → android-DGLG_VQ3.mjs} +1 -1
  8. package/dist/{android-BBwLpxRh.mjs → android-Z6Eev9rL.mjs} +44 -38
  9. package/dist/{android-cas-p8gna03x.mjs → android-cas-BDAwwL82.mjs} +2 -2
  10. package/dist/{android-image-DY8KxK2m.mjs → android-image-BcUD6bPi.mjs} +2 -2
  11. package/dist/api.d.mts +2 -2
  12. package/dist/api.mjs +25 -25
  13. package/dist/{apk-signed-tail-BMv-KLcB.mjs → apk-signed-tail-DHMkXs4s.mjs} +2 -2
  14. package/dist/{artifact-BsimBWxG.mjs → artifact-Dc1GsK7o.mjs} +28 -14
  15. package/dist/{artifact-BrNZTZtA.mjs → artifact-sGoFVK1q.mjs} +11 -11
  16. package/dist/{auto-placement-CFKNrWLU.mjs → auto-placement-RNh4kx2T.mjs} +6 -6
  17. package/dist/{browser-web-YFsgCP_a.mjs → browser-web-7Oj57Roa.mjs} +10 -10
  18. package/dist/{build-DIhuoozz.mjs → build-DkE5vjp1.mjs} +22 -22
  19. package/dist/{build-cache-Dt-dhCJF.mjs → build-cache-CJ65Efv7.mjs} +7 -4
  20. package/dist/{build-plan-CgnLDof9.mjs → build-plan-DWajg5l_.mjs} +7 -6
  21. package/dist/{cli-BGUrlSH3.mjs → cli-BSlwv9hI.mjs} +18 -18
  22. package/dist/cli.mjs +1 -1
  23. package/dist/{client-DU6dnGX1.mjs → client-qwmHFSga.mjs} +12 -8
  24. package/dist/collector-run.mjs +3 -3
  25. package/dist/{command-output-ByEmIwur.mjs → command-output-DsjhOzJ3.mjs} +1 -1
  26. package/dist/{dependencies-BozoTBqa.mjs → dependencies-oku1ZLep.mjs} +76 -41
  27. package/dist/{dependency-state-BQeC4FVn.mjs → dependency-state-CBhPJAs_.mjs} +1 -1
  28. package/dist/{dev-client-3SQzMRXZ.mjs → dev-client-DL5UtVdx.mjs} +2 -2
  29. package/dist/{device-DGMvzoZZ.mjs → device-CxMwX0VO.mjs} +15 -14
  30. package/dist/{device-android-CBat355q.mjs → device-android-CSlBXuh_.mjs} +7 -7
  31. package/dist/{device-capacity-DWUOvY13.mjs → device-capacity-D_IlxZRL.mjs} +78 -31
  32. package/dist/device-host-worker.mjs +24 -12
  33. package/dist/{device-pool-B8IqZKqm.mjs → device-pool-BEaTdtss.mjs} +2 -2
  34. package/dist/{device-provision-DWAoSKEw.mjs → device-provision-C9NPdCne.mjs} +8 -8
  35. package/dist/{device-BIg1iExg.mjs → device-yfuJ-v4s.mjs} +9 -9
  36. package/dist/{doctor-CxgR5vPi.mjs → doctor-BAA3zN5U.mjs} +1 -1
  37. package/dist/{doctor-CPzwqcXY.mjs → doctor-BQ1Kl44s.mjs} +13 -19
  38. package/dist/{doctor-Bknt0121.mjs → doctor-QNzDE4aW.mjs} +18 -18
  39. package/dist/doctor-fingerprint.mjs +1 -1
  40. package/dist/{doctor-watchman-CPE4C8KV.mjs → doctor-watchman-B8e3s9ko.mjs} +3 -3
  41. package/dist/{eas-build-CwOXKJwa.mjs → eas-build-4rg9WpEg.mjs} +2 -2
  42. package/dist/{eas-fallback-Cnb12a50.mjs → eas-fallback-UGo0SG7T.mjs} +3 -3
  43. package/dist/{eas-session-ledger-TE1miVz5.mjs → eas-session-ledger-BDpSdFDM.mjs} +4 -4
  44. package/dist/{error-diagnostics-CXTT3bYC.mjs → error-diagnostics-CW9xl6ot.mjs} +7 -7
  45. package/dist/{gc-0jdcnDHs.mjs → gc-3DHVCn-k.mjs} +49 -33
  46. package/dist/{gc-1ZLq1djg.mjs → gc-BQ5dXnC7.mjs} +2 -2
  47. package/dist/{guide-COxIANZu.mjs → guide-DqJCc4vW.mjs} +138 -43
  48. package/dist/{hosted-android-D8JbIzgC.mjs → hosted-android-gwLspaz6.mjs} +3 -3
  49. package/dist/{hosted-client-BLwuXEZS.mjs → hosted-client-B_h_bTlz.mjs} +2 -2
  50. package/dist/{hosted-logs-BWEQNJx_.mjs → hosted-logs-BpQSRDRU.mjs} +15 -8
  51. package/dist/{hosted-logs-sync-uWSrH2mf.mjs → hosted-logs-sync-D3L1hDpM.mjs} +5 -5
  52. package/dist/{hosted-macos-BnCYAv1y.mjs → hosted-macos-GK4O1s7x.mjs} +5 -5
  53. package/dist/{hosted-native-OBT2sJxn.mjs → hosted-native-B6ur_0OJ.mjs} +7 -7
  54. package/dist/{ios-Bjz7aPLy.mjs → ios-Bi0bQiZ_.mjs} +8 -8
  55. package/dist/{ios-BveW7qK1.mjs → ios-DQEzde6f.mjs} +9 -6
  56. package/dist/{ios-CGyx4PA7.mjs → ios-M7nRVb33.mjs} +94 -32
  57. package/dist/{ios-device-ByrDWSpC.mjs → ios-device-BLm1BZB4.mjs} +1 -1
  58. package/dist/{ios-project-XHg87vyQ.mjs → ios-project-Bsm-eqwv.mjs} +6 -6
  59. package/dist/ios-runtime-DLiKoOkd.mjs +150 -0
  60. package/dist/{ios-signing-CRYQ1W42.mjs → ios-signing-rWR_Mu5Z.mjs} +1 -1
  61. package/dist/{ios-state-enWc5P6U.mjs → ios-state-tzD0s7pt.mjs} +1 -1
  62. package/dist/{js-swap-C6vl3vEd.mjs → js-swap-Cuky0ZAQ.mjs} +5 -5
  63. package/dist/{launch-f3RnbFW5.mjs → launch-B-pkNlqg.mjs} +17 -17
  64. package/dist/{lightened-Cdfmo8MO.mjs → lightened-KHWHmzGs.mjs} +4 -4
  65. package/dist/{logs-x3em2-oI.mjs → logs-B0etn-BD.mjs} +6 -6
  66. package/dist/{logs-DAjxBF3c.mjs → logs-HomiqPhV.mjs} +4 -4
  67. package/dist/{macos-ZfpWlzBO.mjs → macos-C5liDnbP.mjs} +1 -1
  68. package/dist/macos-run.mjs +1 -1
  69. package/dist/{macos-D_LAseN9.mjs → macos-zMxSibx5.mjs} +18 -19
  70. package/dist/maintenance-run.mjs +4 -4
  71. package/dist/{metro-TIQ1Wft-.mjs → metro-Cj6W4qOO.mjs} +1 -1
  72. package/dist/{metro-request-DcUxyaq8.mjs → metro-request-BWCl3Zco.mjs} +1 -1
  73. package/dist/{prebuild-BKkj3OyL.mjs → miss-reason-CeHvzeVm.mjs} +10 -270
  74. package/dist/{named-ports-BfEMi9bK.mjs → named-ports-DZ8DrkH1.mjs} +1 -1
  75. package/dist/{native-android-COOrNDk2.mjs → native-android-DtWLzg6g.mjs} +15 -15
  76. package/dist/{native-gradle-artifact-inputs-B4Mwydmf.mjs → native-gradle-artifact-inputs-D4w20_6d.mjs} +3 -3
  77. package/dist/{native-runtime-UxUBU8up.mjs → native-runtime-BfvvAJLd.mjs} +6 -6
  78. package/dist/{native-xcode-inputs-DUv7Q3ok.mjs → native-xcode-inputs-BHvnAq4o.mjs} +2 -2
  79. package/dist/{native-xcode-ios-DXcteLVi.mjs → native-xcode-ios-CYxrg_kK.mjs} +15 -15
  80. package/dist/offload-worker.mjs +19 -18
  81. package/dist/{ownership-CQTg6v1d.mjs → ownership-BLgOimfp.mjs} +2 -2
  82. package/dist/{phone-reverses-CHtco460.mjs → phone-reverses-vRveZKSG.mjs} +3 -3
  83. package/dist/{placement-log-oQnELAvQ.mjs → placement-log-CM0DSELs.mjs} +1 -1
  84. package/dist/{plan-placement-45EOlIG1.mjs → plan-placement-CIrvKq8y.mjs} +5 -5
  85. package/dist/{ports-DKO7EUNt.mjs → ports-CKORWlC0.mjs} +2 -2
  86. package/dist/{project-BCtQz48d.mjs → project-DIo71tGq.mjs} +14 -14
  87. package/dist/{react-native-android-MI4ktuhL.mjs → react-native-android-B7VYSlKj.mjs} +36 -27
  88. package/dist/{react-native-build-dixAL2G8.mjs → react-native-build-CFYTYmG4.mjs} +10 -7
  89. package/dist/{react-native-doctor-CvkWincj.mjs → react-native-doctor-CnpVfE0k.mjs} +5 -5
  90. package/dist/{react-native-ios-DF5otoBR.mjs → react-native-ios-ByeXo_NP.mjs} +15 -14
  91. package/dist/{recorded-build-CGHGCO8m.mjs → recorded-build-B4prJjSD.mjs} +1 -1
  92. package/dist/{recordings-BcOzqFD1.mjs → recordings-Byu5SzlI.mjs} +1 -1
  93. package/dist/{reload-DWxmO9dY.mjs → reload-DANrKhQR.mjs} +1 -1
  94. package/dist/{reload-DGWfNFwQ.mjs → reload-DTd9g1EG.mjs} +13 -13
  95. package/dist/{remote-DWYGW2f5.mjs → remote-BWuq9qHV.mjs} +3 -3
  96. package/dist/{remote-CV2jBcLv.mjs → remote-NOM82XE0.mjs} +8 -8
  97. package/dist/{result-CWyxwPvZ.mjs → result-C-ISEJ5F.mjs} +15 -15
  98. package/dist/{run-FZtMQgrx.mjs → run-DQwx6djG.mjs} +1 -1
  99. package/dist/{server-bare-Ksh1NKeI.mjs → server-bare-B_wRfchQ.mjs} +1 -1
  100. package/dist/{server-command-BO2DIsJV.mjs → server-command-DgXYowQf.mjs} +5 -5
  101. package/dist/{server-expo-ZS9_WaNG.mjs → server-expo-ByBM8DVv.mjs} +9 -7
  102. package/dist/server-expo-D7rwjAFp.mjs +2 -0
  103. package/dist/{settings-TYrzDh8T.mjs → settings-BthPoY3t.mjs} +2 -2
  104. package/dist/{settings-Ag4pbs0z.mjs → settings-Cz8kQJzr.mjs} +44 -8
  105. package/dist/{settings-payload-CUM0DYwz.mjs → settings-payload-BOcxsZ6k.mjs} +2 -2
  106. package/dist/{settings-write-D_9_IEx7.mjs → settings-write-BuMPL1rd.mjs} +3 -3
  107. package/dist/settings.schema.json +32 -2
  108. package/dist/{slot-launch-DW_29Bmu.mjs → slot-launch-BIm9w8kH.mjs} +5 -5
  109. package/dist/{stage-_8k8p7uq.mjs → stage-CX1Byp3n.mjs} +5 -4
  110. package/dist/{start-CdgtOksb.mjs → start-BZWr85b2.mjs} +1 -1
  111. package/dist/{start-CzBB5R7N.mjs → start-DI0ofPO-.mjs} +8 -8
  112. package/dist/{state-DsrFh3yv.mjs → state-45P8Kd6Z.mjs} +1 -1
  113. package/dist/{state-CfP-ccP8.mjs → state-C2vELPyr.mjs} +2 -2
  114. package/dist/{stats-BgTyuzib.mjs → stats-BDljWVWU.mjs} +3 -3
  115. package/dist/{status-C7Zzb-Eh.mjs → status-BG2S-a1d.mjs} +1 -1
  116. package/dist/{status-Bcdy5eHt.mjs → status-DEZjHP4q.mjs} +27 -29
  117. package/dist/{status-watch-DY0EZcmg.mjs → status-watch-Cs18eFkQ.mjs} +4 -4
  118. package/dist/status-worker.mjs +1 -1
  119. package/dist/{stop-iGkvEvDn.mjs → stop-B2zDplJa.mjs} +2 -2
  120. package/dist/{stop-CkmBkNyg.mjs → stop-BPrTEOaz.mjs} +14 -14
  121. package/dist/{stop-CbxsTKyZ.mjs → stop-DrxHVVX9.mjs} +4 -4
  122. package/dist/supervisor-run.mjs +11 -11
  123. package/dist/{support-CfYmOdQs.mjs → support-BeVRaMWT.mjs} +9 -9
  124. package/dist/{support-JZ4KRW0C.mjs → support-DBKG3Yyb.mjs} +5 -5
  125. package/dist/{swiftpm-artifact-inputs-C1rZDRDs.mjs → swiftpm-artifact-inputs-CfNAb6Vm.mjs} +1 -1
  126. package/dist/{swiftpm-macos-DRTjC7Ff.mjs → swiftpm-macos-xdHjJHIj.mjs} +7 -7
  127. package/dist/toolchain-CTsPS5tL.mjs +2 -0
  128. package/dist/{toolchain-BeD7tbBW.mjs → toolchain-CZvtCZ-m.mjs} +9 -6
  129. package/dist/{warm-progress-CJQ8tk5O.mjs → warm-progress-D3a0KviW.mjs} +17 -13
  130. package/dist/{web-BXbmysa1.mjs → web-BvAweypa.mjs} +6 -6
  131. package/dist/web-DDL3usMb.mjs +2 -0
  132. package/dist/web-run.mjs +4 -4
  133. package/dist/{workspace-state-DOPXG2Gp.mjs → workspace-state-CHEN_xzy.mjs} +1 -1
  134. package/dist/{workspaces-DCzDzydB.mjs → workspaces-BgAYIccE.mjs} +213 -50
  135. package/dist/{worktree-6ngObKkw.mjs → worktree-C0YZ6mnk.mjs} +1 -1
  136. package/dist/{worktree-BAC43Kio.mjs → worktree-kGPE9Pcw.mjs} +335 -33
  137. package/package.json +7 -7
  138. package/dist/server-expo-9hQwyLze.mjs +0 -2
  139. package/dist/toolchain-CNlKc9pH.mjs +0 -2
  140. package/dist/web-BcaySU05.mjs +0 -2
@@ -1,9 +1,9 @@
1
1
  import { t as getExecutor } from "./exec-L37dbiIb.mjs";
2
- import { n as METRO_COMMAND_PORT } from "./settings-Ag4pbs0z.mjs";
3
- import { T as MODE_COMMAND } from "./project-BCtQz48d.mjs";
4
- import { f as signalProcessTree } from "./metro-TIQ1Wft-.mjs";
2
+ import { n as METRO_COMMAND_PORT } from "./settings-Cz8kQJzr.mjs";
3
+ import { T as MODE_COMMAND } from "./project-DIo71tGq.mjs";
4
+ import { f as signalProcessTree } from "./metro-Cj6W4qOO.mjs";
5
5
  import { i as createNdjsonWriter } from "./ndjson-CrjIsGzw.mjs";
6
- import { g as projectNodeLine, p as recordFromLine, v as withProjectNode, y as superviseChildServer } from "./server-expo-ZS9_WaNG.mjs";
6
+ import { _ as projectNodeLine, b as superviseChildServer, m as repositoryRoot, p as recordFromLine, y as withProjectNode } from "./server-expo-ByBM8DVv.mjs";
7
7
  import { join } from "node:path";
8
8
  import { LOG_ROTATE_BYTES } from "@stim-cli/core";
9
9
  //#region src/supervisor/server-command.ts
@@ -29,7 +29,7 @@ async function startCommandServer({ root, port, logsDir, command, writer = null,
29
29
  msg: "metro.command starts the dev server, so Stim does not add its shared Metro transform store"
30
30
  });
31
31
  const group = platform !== "win32";
32
- const node = withProjectNode(root, process.env);
32
+ const node = withProjectNode(root, process.env, { top: repositoryRoot(root) ?? root });
33
33
  if (node.pinned) log.write({
34
34
  src: "metro",
35
35
  level: "info",
@@ -1,10 +1,10 @@
1
1
  import { l as cancellableSleep, t as getExecutor } from "./exec-L37dbiIb.mjs";
2
2
  import { n as stripAnsi, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
3
- import { X as resolveProjectSettings } from "./settings-Ag4pbs0z.mjs";
4
- import { C as resolvePackageJson } from "./project-BCtQz48d.mjs";
3
+ import { X as resolveProjectSettings } from "./settings-Cz8kQJzr.mjs";
4
+ import { C as resolvePackageJson } from "./project-DIo71tGq.mjs";
5
5
  import { i as createNdjsonWriter } from "./ndjson-CrjIsGzw.mjs";
6
6
  import { a as expoMetroStoreEnv, c as registerMetroStore, f as resolveMetroSharedCache, i as expoMetroConfigPath, n as supervisorError, o as metroStoreConfirmedRoot, s as metroStoreRoot } from "./errors-DHm_U5gv.mjs";
7
- import { accessSync, constants, existsSync, readFileSync } from "node:fs";
7
+ import { accessSync, constants, existsSync, readFileSync, statSync } from "node:fs";
8
8
  import { delimiter, dirname, join } from "node:path";
9
9
  import { LOG_ROTATE_BYTES } from "@stim-cli/core";
10
10
  import { meetsNodePinMajor, projectNodeBin, projectNodePin, resolveNodePinSpec, satisfiesNodePin } from "@stim-cli/core/toolchain";
@@ -191,7 +191,7 @@ function findBinUpward(startDir, name, { exists = existsSync } = {}) {
191
191
  dir = dirname(dir);
192
192
  }
193
193
  }
194
- function repositoryRoot(startDir, exists) {
194
+ function repositoryRoot(startDir, exists = existsSync) {
195
195
  for (let dir = startDir;; dir = dirname(dir)) {
196
196
  if (exists(join(dir, ".git"))) return dir;
197
197
  if (dirname(dir) === dir) return null;
@@ -206,9 +206,11 @@ function isExecutableFile(file) {
206
206
  }
207
207
  }
208
208
  function expoBinRefusal(root, what = "start an Expo dev server for") {
209
+ const repo = repositoryRoot(root, existsSync);
210
+ const linked = repo && statSync(join(repo, ".git"), { throwIfNoEntry: false })?.isFile();
209
211
  return {
210
212
  message: `Cannot ${what} ${root}: the \`expo\` package is not resolvable from it (require.resolve("expo/package.json") failed, and no node_modules/.bin/expo exists in it or in any parent).`,
211
- remedy: "Install the project's dependencies (in a monorepo, from the workspace root), or check that this package really depends on `expo`."
213
+ remedy: (linked ? "Run `stim worktree warm` in this worktree, then retry. " : "") + "Install the project's dependencies (in a monorepo, from the workspace root), or check that this package really depends on `expo`."
212
214
  };
213
215
  }
214
216
  const CROSS = "✖";
@@ -356,7 +358,7 @@ async function startExpoServer({ root, port, logsDir, writer = null, spawnFn = n
356
358
  port
357
359
  });
358
360
  const [command, commandArgs] = platform === "win32" && resolved.source === "package" ? [process.execPath, [bin, ...args]] : [bin, args];
359
- const node = withProjectNode(root, process.env);
361
+ const node = withProjectNode(root, process.env, { top: repositoryRoot(root) ?? root });
360
362
  if (node.pinned) log.write({
361
363
  src: "metro",
362
364
  level: "info",
@@ -401,4 +403,4 @@ async function startExpoServer({ root, port, logsDir, writer = null, spawnFn = n
401
403
  return handle;
402
404
  }
403
405
  //#endregion
404
- export { unmetNodePin as _, expoProxyEnv as a, findBinUpward as c, isDevClientNavigationNotice as d, parseExpoWaitingOnUrl as f, projectNodeLine as g, pathNodeVersion as h, expoBinRefusal as i, inferLevel as l, startExpoServer as m, expoBinFromPackage as n, expoSdkMajor as o, recordFromLine as p, expoBinPath as r, expoTelemetryEnv as s, cleanLine as t, isBundleMarker as u, withProjectNode as v, superviseChildServer as y };
406
+ export { projectNodeLine as _, expoProxyEnv as a, superviseChildServer as b, findBinUpward as c, isDevClientNavigationNotice as d, parseExpoWaitingOnUrl as f, pathNodeVersion as g, startExpoServer as h, expoBinRefusal as i, inferLevel as l, repositoryRoot as m, expoBinFromPackage as n, expoSdkMajor as o, recordFromLine as p, expoBinPath as r, expoTelemetryEnv as s, cleanLine as t, isBundleMarker as u, unmetNodePin as v, withProjectNode as y };
@@ -0,0 +1,2 @@
1
+ import { h as startExpoServer } from "./server-expo-ByBM8DVv.mjs";
2
+ export { startExpoServer };
@@ -1,5 +1,5 @@
1
- import { c as readSettingsPayload, l as settingEntry, o as layerFile, s as readSettingsContext, t as SettingsRefusal } from "./settings-payload-CUM0DYwz.mjs";
2
- import { i as unsetReplacedSetting, n as readScope, r as requireSetting, t as mutateSetting } from "./settings-write-D_9_IEx7.mjs";
1
+ import { c as readSettingsPayload, l as settingEntry, o as layerFile, s as readSettingsContext, t as SettingsRefusal } from "./settings-payload-BOcxsZ6k.mjs";
2
+ import { i as unsetReplacedSetting, n as readScope, r as requireSetting, t as mutateSetting } from "./settings-write-BuMPL1rd.mjs";
3
3
  import { REPLACED_SETTINGS, SETTING_SCOPES } from "@stim-cli/core/state";
4
4
  import chalk from "chalk";
5
5
  //#region src/commands/settings.ts
@@ -6,7 +6,7 @@ import { tmpdir } from "node:os";
6
6
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
7
7
  import { ambientEnv, buildCacheRoot, compiledHelper, configDir } from "@stim-cli/core";
8
8
  import { REMOTE_DEVICE_BACKENDS, REPLACED_SETTINGS, SETTINGS, SETTING_GROUPS, TUNNEL_MODES, WEB_VIEWPORTS, acceptsShape, coerceSettingText, expectedShape, isLayeredSetting, isPathPrefix, placementWord, replacementAdvice, settingDefinition, settingValueError, trashRoot } from "@stim-cli/core/state";
9
- import { basename as basename$1, dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, normalize, relative as relative$1, resolve as resolve$1, sep as sep$1 } from "path";
9
+ import { basename as basename$1, dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, normalize, posix as posix$1, relative as relative$1, resolve as resolve$1, sep as sep$1 } from "path";
10
10
  import { existsSync as existsSync$1, lstatSync as lstatSync$1, readFileSync as readFileSync$1, readdirSync as readdirSync$1, realpathSync as realpathSync$1, statSync as statSync$1 } from "fs";
11
11
  import { fileURLToPath } from "node:url";
12
12
  import { captureProcessIdentity } from "@stim-cli/core/process-identity";
@@ -682,7 +682,7 @@ async function removeKnownCopiedPaths(path, rel, signal, trash) {
682
682
  const root = await realpath(path);
683
683
  for (const known of paths) await removeCopiedPath(root, known, signal, trash);
684
684
  }
685
- async function cloneIgnoredEntries({ root, target, patterns, operation }) {
685
+ async function cloneIgnoredEntries({ root, target, patterns, operation, withhold = () => null }) {
686
686
  const options = {
687
687
  ...childEnvironment(operation.env),
688
688
  signal: operation.signal,
@@ -698,10 +698,24 @@ async function cloneIgnoredEntries({ root, target, patterns, operation }) {
698
698
  const guard = trackedPathsGuard(await listTrackedPaths(target, reads));
699
699
  if (!guard.known) throw new Error("Could not list the destination's tracked files.");
700
700
  const nested = await nestedWorktreePaths(target, reads);
701
- const entries = await listCarryableIgnoredEntries(root, patterns, reads);
701
+ const carryable = await listCarryableIgnoredEntries(root, patterns, reads);
702
+ const keptReason = (rel) => guard.covers(rel) ? "tracked" : overlapsNestedWorktree(rel, nested) ? "nested worktree" : missingDestinationReason(target, rel);
703
+ const checks = /* @__PURE__ */ new Map();
704
+ for (const rel of carryable) {
705
+ let copies;
706
+ try {
707
+ copies = keptReason(rel) === null;
708
+ } catch {
709
+ copies = true;
710
+ }
711
+ const check = copies ? withhold(rel) : null;
712
+ if (check) checks.set(rel, check);
713
+ }
714
+ const entries = [...carryable.filter((rel) => !checks.has(rel)), ...checks.keys()];
702
715
  const copied = [];
703
716
  const skipped = [];
704
717
  const failed = [];
718
+ const withheld = [];
705
719
  let cloned = true;
706
720
  let helper;
707
721
  const clonefile = () => helper ??= clonefileHelper(operation);
@@ -713,7 +727,7 @@ async function cloneIgnoredEntries({ root, target, patterns, operation }) {
713
727
  const to = join$1(target, rel);
714
728
  let copying = false;
715
729
  try {
716
- const reason = guard.covers(rel) ? "tracked" : overlapsNestedWorktree(rel, nested) ? "nested worktree" : missingDestinationReason(target, rel);
730
+ const reason = keptReason(rel);
717
731
  if (reason) {
718
732
  skipped.push({
719
733
  file: rel,
@@ -721,6 +735,14 @@ async function cloneIgnoredEntries({ root, target, patterns, operation }) {
721
735
  });
722
736
  continue;
723
737
  }
738
+ const withholding = await checks.get(rel);
739
+ if (withholding) {
740
+ withheld.push({
741
+ file: rel,
742
+ reason: withholding
743
+ });
744
+ continue;
745
+ }
724
746
  await mkdir(dirname$1(to), { recursive: true });
725
747
  copying = true;
726
748
  const copiedWith = async (file, args) => {
@@ -768,6 +790,7 @@ async function cloneIgnoredEntries({ root, target, patterns, operation }) {
768
790
  copied,
769
791
  skipped,
770
792
  failed,
793
+ withheld,
771
794
  cloned
772
795
  };
773
796
  }
@@ -864,14 +887,27 @@ function installedMatchesLockfile(dir, lockfile, { read = readFileSync$1 } = {})
864
887
  } catch {}
865
888
  return null;
866
889
  }
890
+ function nearestLockfile(target, dir) {
891
+ for (let current = dir;; current = posix$1.dirname(current)) {
892
+ const at = current === "." ? "" : current;
893
+ const name = LOCKFILE_NAMES.find((candidate) => existsSync$1(join$1(target, at, candidate)));
894
+ if (name) return {
895
+ dir: at,
896
+ name
897
+ };
898
+ if (at === "") return null;
899
+ }
900
+ }
867
901
  function depsOutOfSync(root, target, copiedEntries, { read = readFileSync$1 } = {}) {
868
902
  const problems = [];
903
+ const checked = /* @__PURE__ */ new Set();
869
904
  for (const rel of copiedEntries || []) {
870
905
  if (rel !== "node_modules" && !rel.endsWith("/node_modules")) continue;
871
- const dir = rel === "node_modules" ? "" : rel.slice(0, -13);
872
- const name = LOCKFILE_NAMES.find((candidate) => existsSync$1(join$1(target, dir, candidate)));
873
- if (!name) continue;
874
- const installed = installedMatchesLockfile(join$1(target, dir), name, { read });
906
+ const found = nearestLockfile(target, rel === "node_modules" ? "" : rel.slice(0, -13));
907
+ if (!found || checked.has(found.dir)) continue;
908
+ checked.add(found.dir);
909
+ const { dir, name } = found;
910
+ const installed = copiedEntries?.includes(dir ? `${dir}/node_modules` : "node_modules") ? installedMatchesLockfile(join$1(target, dir), name, { read }) : null;
875
911
  if (installed === false) {
876
912
  problems.push({
877
913
  dir: dir || ".",
@@ -1,7 +1,7 @@
1
1
  import { f as getConfigPath$1, g as getRepoSettings, h as getProjectSettings, v as loadConfig$1 } from "./config-CNmN-ndb.mjs";
2
2
  import { a as killOnAbort, i as gitPath } from "./operation-exec-DNynwpqO.mjs";
3
- import { K as removedMachineSettings, V as readCommittedSettings, st as unknownSettingKeys } from "./settings-Ag4pbs0z.mjs";
4
- import { r as findCommandWorkspaceAsync } from "./project-BCtQz48d.mjs";
3
+ import { K as removedMachineSettings, V as readCommittedSettings, st as unknownSettingKeys } from "./settings-Cz8kQJzr.mjs";
4
+ import { r as findCommandWorkspaceAsync } from "./project-DIo71tGq.mjs";
5
5
  import { i as stimDesktopInstalledAsync, n as settingDefault, r as stimDesktopInstalled } from "./stim-desktop-DWGAfaud.mjs";
6
6
  import { join } from "node:path";
7
7
  import { SETTINGS, SETTING_SCOPES, coerceSettingText, isJsonObject, replacementAdvice, settingDefinition, settingValueError } from "@stim-cli/core/state";
@@ -1,9 +1,9 @@
1
1
  import { p as withWorkspaceProcessLock } from "./exec-L37dbiIb.mjs";
2
2
  import { A as withConfigLockAsync$1, M as writeConfigSettingAsync, f as getConfigPath$1 } from "./config-CNmN-ndb.mjs";
3
- import { t as NO_PROJECT_REFUSAL } from "./project-BCtQz48d.mjs";
3
+ import { t as NO_PROJECT_REFUSAL } from "./project-DIo71tGq.mjs";
4
4
  import { i as stimDesktopInstalledAsync } from "./stim-desktop-DWGAfaud.mjs";
5
- import { n as recordingLayers, t as deleteTurnedOffRecordings } from "./recordings-BcOzqFD1.mjs";
6
- import { d as unknownEntries, l as settingEntry, o as layerFile, r as committedDirectory, s as readSettingsContext, t as SettingsRefusal, u as settingExample } from "./settings-payload-CUM0DYwz.mjs";
5
+ import { n as recordingLayers, t as deleteTurnedOffRecordings } from "./recordings-Byu5SzlI.mjs";
6
+ import { d as unknownEntries, l as settingEntry, o as layerFile, r as committedDirectory, s as readSettingsContext, t as SettingsRefusal, u as settingExample } from "./settings-payload-BOcxsZ6k.mjs";
7
7
  import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { configDir } from "@stim-cli/core";
@@ -260,6 +260,21 @@
260
260
  ]
261
261
  }
262
262
  },
263
+ "autoInstallRuntime": {
264
+ "description": "Install an explicitly requested missing iOS simulator runtime on the selected Mac",
265
+ "type": "boolean",
266
+ "default": false,
267
+ "x-stim": {
268
+ "key": "ios.autoInstallRuntime",
269
+ "kind": "boolean",
270
+ "scopes": [
271
+ "machine",
272
+ "workspace",
273
+ "repo",
274
+ "committed"
275
+ ]
276
+ }
277
+ },
263
278
  "configuration": {
264
279
  "description": "Xcode configuration to build, such as Debug or Release",
265
280
  "type": "string",
@@ -1338,6 +1353,21 @@
1338
1353
  ]
1339
1354
  }
1340
1355
  },
1356
+ "autoInstallRuntime": {
1357
+ "description": "Install an explicitly requested missing iOS simulator runtime on the selected Mac",
1358
+ "type": "boolean",
1359
+ "default": false,
1360
+ "x-stim": {
1361
+ "key": "ios.autoInstallRuntime",
1362
+ "kind": "boolean",
1363
+ "scopes": [
1364
+ "machine",
1365
+ "workspace",
1366
+ "repo",
1367
+ "committed"
1368
+ ]
1369
+ }
1370
+ },
1341
1371
  "remote": {
1342
1372
  "description": "Where the iOS simulator runs: local here (overriding a lower layer); auto here first, then a remote.machines entry when this machine is full or busy; remote on a remote.machines entry in order, here only when none takes it; remote-only the same but never here; a machine name exactly that machine; eas or proxy a remote device backend",
1343
1373
  "type": "string",
@@ -2282,10 +2312,10 @@
2282
2312
  }
2283
2313
  },
2284
2314
  "swiftCompilationCacheMaxGb": {
2285
- "description": "Swift compilation-cache cap in GiB; planned emptying is whole; 0 means no cap",
2315
+ "description": "Swift compilation-cache cap in GiB; above it the cache is emptied whole, while no build holds it; 0 means no cap",
2286
2316
  "type": "number",
2287
2317
  "minimum": 0,
2288
- "default": 15,
2318
+ "default": 0,
2289
2319
  "x-stim": {
2290
2320
  "key": "caches.swiftCompilationCacheMaxGb",
2291
2321
  "kind": "number",
@@ -1,9 +1,9 @@
1
- import { r as readWorkspaceState$1 } from "./workspace-state-DOPXG2Gp.mjs";
1
+ import { r as readWorkspaceState$1 } from "./workspace-state-CHEN_xzy.mjs";
2
2
  import { gt as projectDeviceSlots, m as getProject, mt as parseDeviceSlotKey } from "./config-CNmN-ndb.mjs";
3
- import { A as getAvdNameForSerialAsync, P as listAdbDevicesAsync } from "./android-CGctfYpv.mjs";
4
- import { Dn as deviceShellArg } from "./device-capacity-DWUOvY13.mjs";
5
- import { y as fileLeaseIo } from "./activity-CdpXXSq2.mjs";
6
- import { f as listAllIosSimsAsync } from "./ios-BveW7qK1.mjs";
3
+ import { A as getAvdNameForSerialAsync, P as listAdbDevicesAsync } from "./android-27_JgJ1T.mjs";
4
+ import { An as deviceShellArg } from "./device-capacity-D_IlxZRL.mjs";
5
+ import { y as fileLeaseIo } from "./activity-CANftndU.mjs";
6
+ import { f as listAllIosSimsAsync } from "./ios-DQEzde6f.mjs";
7
7
  import { hostedNativeRecords } from "@stim-cli/core/state";
8
8
  //#region src/engine/slot-launch.ts
9
9
  function launchSlotScope(root, slot = "default") {
@@ -1,5 +1,5 @@
1
1
  import { d as throwIfCancelled, t as getExecutor, w as withDrainingCancellation } from "./exec-L37dbiIb.mjs";
2
- import { _t as runCancellationSignal } from "./toolchain-BeD7tbBW.mjs";
2
+ import { mt as runCancellationSignal } from "./toolchain-CZvtCZ-m.mjs";
3
3
  import { existsSync, lstatSync, promises, readdirSync, realpathSync, statSync } from "node:fs";
4
4
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
5
5
  import { validMacosResourceDestination } from "@stim-cli/core";
@@ -108,7 +108,8 @@ async function stageBundle(context, root, product, infoPlist, bin, bundle, bundl
108
108
  await withDrainingCancellation(context, signal, async () => {
109
109
  throwIfCancelled(signal, "macOS bundle staging");
110
110
  const { minimumSystemVersion } = await validateInfoPlist(context, root, product, infoPlist);
111
- for (const entry of readdirSync(bin).filter((name) => name.endsWith(".bundle"))) for (const [destination, source] of Object.entries(extras.resources)) if (overlaps(destination, entry)) resourceError(`macos.resources[${JSON.stringify(destination)}]`, source, `destination collides with ${entry}`);
111
+ const entries = readdirSync(bin);
112
+ for (const entry of entries.filter((name) => name.endsWith(".bundle"))) for (const [destination, source] of Object.entries(extras.resources)) if (overlaps(destination, entry)) resourceError(`macos.resources[${JSON.stringify(destination)}]`, source, `destination collides with ${entry}`);
112
113
  await promises.rm(bundle, {
113
114
  recursive: true,
114
115
  force: true
@@ -126,7 +127,7 @@ async function stageBundle(context, root, product, infoPlist, bin, bundle, bundl
126
127
  join(contents, "Info.plist")
127
128
  ], { timeoutMs: 1e4 });
128
129
  if (displayName !== void 0) await setBundleName(context, join(contents, "Info.plist"), displayName);
129
- for (const entry of readdirSync(bin)) if (entry.endsWith(".framework")) {
130
+ for (const entry of entries) if (entry.endsWith(".framework")) {
130
131
  const target = join(contents, "Frameworks", entry);
131
132
  await copy(context, join(bin, entry), target, {
132
133
  recursive: true,
@@ -141,7 +142,7 @@ async function stageBundle(context, root, product, infoPlist, bin, bundle, bundl
141
142
  ], { timeoutMs: "unbounded" });
142
143
  } else if (entry.endsWith(".bundle")) await copy(context, join(bin, entry), join(contents, "Resources", entry), { recursive: true });
143
144
  const frameworkPath = "@executable_path/../Frameworks";
144
- if (!(await tool(context, "otool", ["-l", executable], { timeoutMs: 3e4 })).includes(frameworkPath)) await tool(context, "install_name_tool", [
145
+ if (entries.some((entry) => entry.endsWith(".framework")) && !(await tool(context, "otool", ["-l", executable], { timeoutMs: 3e4 })).includes(frameworkPath)) await tool(context, "install_name_tool", [
145
146
  "-add_rpath",
146
147
  frameworkPath,
147
148
  executable
@@ -1,2 +1,2 @@
1
- import { a as registerStart, c as startDevServer, d as supervisorSignalable, f as tailLines, i as readLogTail, l as startFacts, n as liveSupervisor, o as resolveWorkspaceMetroPort, p as wantsExpoOwnTunnel, r as parseWait, s as startCommand, t as failureEvidence, u as supervisorEntry } from "./start-CzBB5R7N.mjs";
1
+ import { a as registerStart, c as startDevServer, d as supervisorSignalable, f as tailLines, i as readLogTail, l as startFacts, n as liveSupervisor, o as resolveWorkspaceMetroPort, p as wantsExpoOwnTunnel, r as parseWait, s as startCommand, t as failureEvidence, u as supervisorEntry } from "./start-DI0ofPO-.mjs";
2
2
  export { startCommand as default, failureEvidence, liveSupervisor, parseWait, readLogTail, registerStart, resolveWorkspaceMetroPort, startDevServer, startFacts, supervisorEntry, supervisorSignalable, tailLines, wantsExpoOwnTunnel };
@@ -1,15 +1,15 @@
1
1
  import { D as ownership_claim_exports, T as process_identity_exports, c as waitForGroupExit, d as throwIfCancelled, f as WorkspaceProcessCleanupError, l as cancellableSleep, m as workspaceProcessLockError, o as groupExitBudgetMs, p as withWorkspaceProcessLock, t as getExecutor, w as withDrainingCancellation } from "./exec-L37dbiIb.mjs";
2
- import { S as supervisorLogFile, _ as ensureWorkspaceStorage, i as recordWorkspaceUse, k as workspaceLogsDir$1, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1, s as updateWorkspaceStateAsync, w as workspaceAgentDeviceDir } from "./workspace-state-DOPXG2Gp.mjs";
3
- import { _ as stepTimer, l as phaseLine } from "./command-output-ByEmIwur.mjs";
2
+ import { S as supervisorLogFile, _ as ensureWorkspaceStorage, i as recordWorkspaceUse, k as workspaceLogsDir$1, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1, s as updateWorkspaceStateAsync, w as workspaceAgentDeviceDir } from "./workspace-state-CHEN_xzy.mjs";
3
+ import { _ as stepTimer, l as phaseLine } from "./command-output-DsjhOzJ3.mjs";
4
4
  import { A as withConfigLockAsync$1, O as upsertProject, S as releaseMetroPort, m as getProject } from "./config-CNmN-ndb.mjs";
5
- import { A as metroCommandSetting, B as publicUrlSetting, G as remoteIosSetting, I as ngrokUrlSetting, J as resolveCacheProviderConfig, M as metroIdleStopMinutesSetting, N as metroPortSetting, P as metroTunnelSettingError, U as remoteAndroidSetting, Y as resolveIosProjectDir, Z as resolveProjectSettingsAsync, _ as inertSettingWarning, a as SETTING_SHAPE_REMEDY, dt as detectProviders, ft as planMetroReach, h as deviceIdleShutdownMinutesSetting, j as metroCommandSettingError, m as defaultAndroidLayout, ot as tunnelModeSetting, p as cacheProviderSettingError, q as resolveAndroidLayout, rt as settingShapeErrors, st as unknownSettingKeys, ut as PUBLIC_METRO_ENV } from "./settings-Ag4pbs0z.mjs";
6
- import { E as MODE_EXPO, M as readMetroTunnel, O as clearManagedMetroTunnel, S as readAppJson, T as MODE_COMMAND, c as projectProblem, i as findProjectRoot$1, t as NO_PROJECT_REFUSAL, v as detectIsExpo, w as MODE_BARE, x as readAppConfigText } from "./project-BCtQz48d.mjs";
5
+ import { A as metroCommandSetting, B as publicUrlSetting, G as remoteIosSetting, I as ngrokUrlSetting, J as resolveCacheProviderConfig, M as metroIdleStopMinutesSetting, N as metroPortSetting, P as metroTunnelSettingError, U as remoteAndroidSetting, Y as resolveIosProjectDir, Z as resolveProjectSettingsAsync, _ as inertSettingWarning, a as SETTING_SHAPE_REMEDY, dt as detectProviders, ft as planMetroReach, h as deviceIdleShutdownMinutesSetting, j as metroCommandSettingError, m as defaultAndroidLayout, ot as tunnelModeSetting, p as cacheProviderSettingError, q as resolveAndroidLayout, rt as settingShapeErrors, st as unknownSettingKeys, ut as PUBLIC_METRO_ENV } from "./settings-Cz8kQJzr.mjs";
6
+ import { E as MODE_EXPO, M as readMetroTunnel, O as clearManagedMetroTunnel, S as readAppJson, T as MODE_COMMAND, c as projectProblem, i as findProjectRoot$1, t as NO_PROJECT_REFUSAL, v as detectIsExpo, w as MODE_BARE, x as readAppConfigText } from "./project-DIo71tGq.mjs";
7
7
  import { a as workspaceLinkLine, o as workspaceLinks } from "./stim-desktop-DWGAfaud.mjs";
8
- import { _ as PORT_INSPECTION_REMEDY, a as listeningPidsAsync, c as pidExists, d as resolveProjectMetro, f as signalProcessTree, g as reserveMetroPort, h as isMetroRunning, m as createPortProbe, u as processCwds, v as PortInspectionError } from "./metro-TIQ1Wft-.mjs";
8
+ import { _ as PORT_INSPECTION_REMEDY, a as listeningPidsAsync, c as pidExists, d as resolveProjectMetro, f as signalProcessTree, g as reserveMetroPort, h as isMetroRunning, m as createPortProbe, u as processCwds, v as PortInspectionError } from "./metro-Cj6W4qOO.mjs";
9
9
  import { a as levelRank } from "./ndjson-CrjIsGzw.mjs";
10
- import { Hn as exitAfterFlush, V as stopOwnedMetroForReset, Wn as runProcessOperation, ar as remoteCliInvocation, er as readProjectConfig, k as budgetGate } from "./device-capacity-DWUOvY13.mjs";
11
- import { C as stopTunnel, D as withManagedTunnelLock, S as startTunnelSequence, T as withManagedRemoteWorktreeLock, w as terminateChild, x as resolveSupervisorTarget } from "./workspaces-DCzDzydB.mjs";
12
- import { i as restoreLightenedDependencies } from "./lightened-Cdfmo8MO.mjs";
10
+ import { Gn as exitAfterFlush, V as stopOwnedMetroForReset, cr as remoteCliInvocation, k as budgetGate, qn as runProcessOperation, rr as readProjectConfig } from "./device-capacity-D_IlxZRL.mjs";
11
+ import { C as startTunnelSequence, E as withManagedRemoteWorktreeLock, O as withManagedTunnelLock, T as terminateChild, w as stopTunnel, x as resolveSupervisorTarget } from "./workspaces-BgAYIccE.mjs";
12
+ import { i as restoreLightenedDependencies } from "./lightened-KHWHmzGs.mjs";
13
13
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
14
14
  import { n as windowsLauncherArgs } from "./detached-entry-VqFeEE9W.mjs";
15
15
  import { appendFileSync, closeSync, mkdirSync, openSync, readFileSync } from "node:fs";
@@ -1,5 +1,5 @@
1
1
  import { T as process_identity_exports } from "./exec-L37dbiIb.mjs";
2
- import { E as workspaceDir, k as workspaceLogsDir$1, o as updateWorkspaceState, r as readWorkspaceState$1 } from "./workspace-state-DOPXG2Gp.mjs";
2
+ import { E as workspaceDir, k as workspaceLogsDir$1, o as updateWorkspaceState, r as readWorkspaceState$1 } from "./workspace-state-CHEN_xzy.mjs";
3
3
  import { existsSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { readMacosRecord } from "@stim-cli/core/state";
@@ -1,7 +1,7 @@
1
1
  import { D as ownership_claim_exports, T as process_identity_exports, f as WorkspaceProcessCleanupError, t as getExecutor } from "./exec-L37dbiIb.mjs";
2
- import { E as workspaceDir, d as writeWorkspaceState, k as workspaceLogsDir$1, o as updateWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey } from "./workspace-state-DOPXG2Gp.mjs";
2
+ import { E as workspaceDir, d as writeWorkspaceState, k as workspaceLogsDir$1, o as updateWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey } from "./workspace-state-CHEN_xzy.mjs";
3
3
  import { t as runOperationFile } from "./operation-exec-DNynwpqO.mjs";
4
- import { c as pidExists } from "./metro-TIQ1Wft-.mjs";
4
+ import { c as pidExists } from "./metro-Cj6W4qOO.mjs";
5
5
  import { readFileSync, readlinkSync, rmSync } from "node:fs";
6
6
  import { hostname } from "node:os";
7
7
  import { join } from "node:path";
@@ -1,7 +1,7 @@
1
- import { o as formatLongDuration } from "./command-output-ByEmIwur.mjs";
1
+ import { o as formatLongDuration } from "./command-output-DsjhOzJ3.mjs";
2
2
  import { it as formatBytes } from "./config-CNmN-ndb.mjs";
3
- import { i as findProjectRoot$1 } from "./project-BCtQz48d.mjs";
4
- import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-D0582GHy.mjs";
3
+ import { i as findProjectRoot$1 } from "./project-DIo71tGq.mjs";
4
+ import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-CuROXefb.mjs";
5
5
  import { t as readProjectStats } from "./stats-report-Ci6TAfFm.mjs";
6
6
  import { archivedUsage, readArchives } from "@stim-cli/core/state";
7
7
  import chalk from "chalk";
@@ -1,2 +1,2 @@
1
- import { n as runStatusWatch, r as statusCommand, t as readVolumes } from "./status-Bcdy5eHt.mjs";
1
+ import { n as runStatusWatch, r as statusCommand, t as readVolumes } from "./status-DEZjHP4q.mjs";
2
2
  export { statusCommand as default, readVolumes, runStatusWatch };
@@ -1,34 +1,35 @@
1
1
  import { T as process_identity_exports, t as getExecutor } from "./exec-L37dbiIb.mjs";
2
- import { O as workspaceLogErrorIndex, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-DOPXG2Gp.mjs";
3
- import { a as formatElapsed, i as formatDuration, r as clockTime, u as plural } from "./command-output-ByEmIwur.mjs";
2
+ import { O as workspaceLogErrorIndex, k as workspaceLogsDir$1, r as readWorkspaceState$1 } from "./workspace-state-CHEN_xzy.mjs";
3
+ import { a as formatElapsed, i as formatDuration, r as clockTime, u as plural } from "./command-output-DsjhOzJ3.mjs";
4
4
  import { at as isAbsentPath, d as getConfigDir, ft as deviceSlotKey, gt as projectDeviceSlots, it as formatBytes, lt as volumeRootFor, mt as parseDeviceSlotKey, ot as isOnMountedVolume, p as getPlatformDeviceLimits, st as listMountedVolumes, u as getConcurrencyLimits, v as loadConfig$1 } from "./config-CNmN-ndb.mjs";
5
5
  import { s as gitAsync } from "./operation-exec-DNynwpqO.mjs";
6
- import { Bt as repoRoot, Ct as gitCommonDirOnDisk, Ot as linkedWorktreesOnDisk, Q as resolveSettings, lt as workspaceHiddenSetting, xt as gitCommonDir } from "./settings-Ag4pbs0z.mjs";
7
- import { I as readWorkspaceLaunches, M as readMetroTunnel, P as readRemoteSession, S as readAppJson, a as findServerWorkspace, l as projectShortcut, u as detectPlatforms, v as detectIsExpo, y as detectTutorial } from "./project-BCtQz48d.mjs";
8
- import { H as ownedAvdDeviceProfile, K as ownedAvdSerialResolver, N as listAdbDevices, P as listAdbDevicesAsync, bt as parkedMaxSetting, mt as POOL_SETTING_REMEDY, xt as readParked } from "./android-CGctfYpv.mjs";
9
- import { c as pidExists, d as resolveProjectMetro, h as isMetroRunning, i as listeningPids, l as processCwd, o as listeningPidsByPort, u as processCwds } from "./metro-TIQ1Wft-.mjs";
6
+ import { Bt as repoRoot, Ct as gitCommonDirOnDisk, Ot as linkedWorktreesOnDisk, Q as resolveSettings, lt as workspaceHiddenSetting, xt as gitCommonDir } from "./settings-Cz8kQJzr.mjs";
7
+ import { I as readWorkspaceLaunches, M as readMetroTunnel, P as readRemoteSession, S as readAppJson, a as findServerWorkspace, l as projectShortcut, u as detectPlatforms, v as detectIsExpo, y as detectTutorial } from "./project-DIo71tGq.mjs";
8
+ import { o as hostedAgentLine } from "./hosted-logs-BpQSRDRU.mjs";
9
+ import { H as ownedAvdDeviceProfile, K as ownedAvdSerialResolver, N as listAdbDevices, P as listAdbDevicesAsync, bt as parkedMaxSetting, mt as POOL_SETTING_REMEDY, xt as readParked } from "./android-27_JgJ1T.mjs";
10
+ import { c as pidExists, d as resolveProjectMetro, h as isMetroRunning, i as listeningPids, l as processCwd, o as listeningPidsByPort, u as processCwds } from "./metro-Cj6W4qOO.mjs";
10
11
  import { o as parseNdjsonLine } from "./ndjson-CrjIsGzw.mjs";
11
- import { Dr as readFootprints, Er as attributeMachineUsage, P as machineNumber, U as describeMetroLastStop, c as deviceSlotUsages, kn as hasMetroReverse, q as metroLastStop } from "./device-capacity-DWUOvY13.mjs";
12
- import { a as readWebPage, o as readWebRecord, u as webFacts } from "./state-CfP-ccP8.mjs";
13
- import { A as poolLine, C as diskLine, D as loadLine, E as gitSummaryText, F as tightVolumes, I as unprovisionedWorktrees, L as withWebFacts, M as remoteDeviceState, N as slotUsageLines, O as metroReverseTargets, P as statusActivity, S as deviceLeaseStates, _ as addReverseMissingIssue, b as capacityLoad, g as activityLabel, j as remoteDeviceLine, k as parseDfFree, r as readEasSessionLedger$1, v as applyMachineMemory, w as environmentState, x as deviceLeaseLines, y as capacity } from "./eas-session-ledger-TE1miVz5.mjs";
14
- import { Ct as buildSlotUsage, G as buildStatusLine, J as parseActiveBuild, K as bundlingActivity, U as activeBuildState, V as ACTIVE_BUILD_KEY, W as buildReport, at as readStats$1, lt as statsProjectKey$1, x as resolveSupervisorTarget } from "./workspaces-DCzDzydB.mjs";
15
- import { a as createDeviceProcessTables, b as leaseIsExpired, h as tailLines, m as readWebActivity, r as createActivityReader, w as parseWorkspaceLeases, x as listLeaseFiles } from "./activity-CdpXXSq2.mjs";
16
- import { b as parseSimctlList, f as listAllIosSimsAsync } from "./ios-BveW7qK1.mjs";
17
- import { m as probeHostedSession } from "./hosted-client-BLwuXEZS.mjs";
18
- import "./hosted-macos-BnCYAv1y.mjs";
19
- import { i as readSupervisorState } from "./stop-CkmBkNyg.mjs";
20
- import { l as applyStatusMeasures, n as workspacePhase, s as mergeState, u as createStatusMeasurer } from "./warm-progress-CJQ8tk5O.mjs";
21
- import { r as workspaceRecordingEnabled } from "./recordings-BcOzqFD1.mjs";
12
+ import { Ar as readFootprints, Mn as hasMetroReverse, P as machineNumber, U as describeMetroLastStop, c as deviceSlotUsages, kr as attributeMachineUsage, q as metroLastStop } from "./device-capacity-D_IlxZRL.mjs";
13
+ import { a as readWebPage, o as readWebRecord, u as webFacts } from "./state-C2vELPyr.mjs";
14
+ import { A as poolLine, C as diskLine, D as loadLine, E as gitSummaryText, F as tightVolumes, I as unprovisionedWorktrees, L as withWebFacts, M as remoteDeviceState, N as slotUsageLines, O as metroReverseTargets, P as statusActivity, S as deviceLeaseStates, _ as addReverseMissingIssue, b as capacityLoad, g as activityLabel, j as remoteDeviceLine, k as parseDfFree, r as readEasSessionLedger$1, v as applyMachineMemory, w as environmentState, x as deviceLeaseLines, y as capacity } from "./eas-session-ledger-BDpSdFDM.mjs";
15
+ import { G as buildReport, H as ACTIVE_BUILD_KEY, K as buildStatusLine, W as activeBuildState, Y as parseActiveBuild, ot as readStats$1, q as bundlingActivity, ut as statsProjectKey$1, wt as buildSlotUsage, x as resolveSupervisorTarget } from "./workspaces-BgAYIccE.mjs";
16
+ import { a as createDeviceProcessTables, b as leaseIsExpired, h as tailLines, m as readWebActivity, r as createActivityReader, w as parseWorkspaceLeases, x as listLeaseFiles } from "./activity-CANftndU.mjs";
17
+ import { b as parseSimctlList, f as listAllIosSimsAsync } from "./ios-DQEzde6f.mjs";
18
+ import { m as probeHostedSession } from "./hosted-client-B_h_bTlz.mjs";
19
+ import "./hosted-macos-GK4O1s7x.mjs";
20
+ import { i as readSupervisorState } from "./stop-BPrTEOaz.mjs";
21
+ import { l as applyStatusMeasures, n as workspacePhase, s as mergeState, u as createStatusMeasurer } from "./warm-progress-D3a0KviW.mjs";
22
+ import { r as workspaceRecordingEnabled } from "./recordings-Byu5SzlI.mjs";
22
23
  import { n as maintenanceLines, r as maintenanceStatus } from "./status-C2PdxK6q.mjs";
23
- import { d as readIosDevices, s as isReachable } from "./ios-device-ByrDWSpC.mjs";
24
+ import { d as readIosDevices, s as isReachable } from "./ios-device-BLm1BZB4.mjs";
24
25
  import { t as triggerMaintenance } from "./trigger-G_gbfIVB.mjs";
25
- import { a as createRefreshScheduler, c as watchStatusSources, n as WATCH_LIGHT_INTERVAL_MS, o as watchChangeKey, r as WATCH_MACHINE_INTERVAL_MS, s as watchPayload, t as WATCH_FALLBACK_MS } from "./status-watch-DY0EZcmg.mjs";
26
+ import { a as createRefreshScheduler, c as watchStatusSources, n as WATCH_LIGHT_INTERVAL_MS, o as watchChangeKey, r as WATCH_MACHINE_INTERVAL_MS, s as watchPayload, t as WATCH_FALLBACK_MS } from "./status-watch-Cs18eFkQ.mjs";
26
27
  import { t as watchStdoutReader } from "./stdout-reader-C8yjre1x.mjs";
27
- import { createHash, randomUUID } from "node:crypto";
28
+ import { randomUUID } from "node:crypto";
28
29
  import { mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
29
30
  import { join, posix, resolve } from "node:path";
30
31
  import { quotedPath, rotatedLogPath } from "@stim-cli/core";
31
- import { DEVICE_RECLAIM_REASON, ERROR_SOURCES, archiveRoot, archivedUsage, bundleMarkerPlatform, countErrorEntries, gitMergeCacheDir, hostedAndroidPlacements, hostedAndroidRecords, hostedAndroidStatus, hostedIosPlacements, hostedIosRecords, hostedIosStatus, linkReplacedArchives, loadPerCore, logFiles, macosAppState, maxLoadPerCore, parseHostedAndroidPlacement, parseHostedIosPlacement, queryLogs, readArchives, readBuildDetail, readBuildHistory, readDeviceIdleShutdowns, readDevicePlacement, readIdleStop, readLastBuilds, readMacosRecord, recordMatches, sortByTs, unreadableHostedAndroid, unreadableHostedIos, withDerivedFacts, withGitChip, withStateReadCache } from "@stim-cli/core/state";
32
+ import { DEVICE_RECLAIM_REASON, ERROR_SOURCES, archiveRoot, archivedUsage, bundleMarkerPlatform, countErrorEntries, gitMergeCacheDir, gitMergeCacheFile, hostedAndroidPlacements, hostedAndroidRecords, hostedAndroidStatus, hostedIosPlacements, hostedIosRecords, hostedIosStatus, linkReplacedArchives, loadPerCore, logFiles, macosAppState, maxLoadPerCore, parseHostedAndroidPlacement, parseHostedIosPlacement, queryLogs, readArchives, readBuildDetail, readBuildHistory, readDeviceIdleShutdowns, readDevicePlacement, readIdleStop, readLastBuilds, readMacosRecord, recordMatches, sortByTs, unreadableHostedAndroid, unreadableHostedIos, withDerivedFacts, withGitChip, withStateReadCache } from "@stim-cli/core/state";
32
33
  import { basename as basename$1, dirname as dirname$1, join as join$1 } from "path";
33
34
  import chalk from "chalk";
34
35
  import { closeSync as closeSync$1, existsSync as existsSync$1, fstatSync as fstatSync$1, openSync as openSync$1, readFileSync as readFileSync$1, readSync as readSync$1, renameSync as renameSync$1, rmSync as rmSync$1, statSync as statSync$1, writeFileSync as writeFileSync$1 } from "fs";
@@ -362,12 +363,9 @@ async function defaultBranchOf(repository) {
362
363
  sha
363
364
  };
364
365
  }
365
- function mergeCacheFile(path) {
366
- return join(gitMergeCacheDir(), `${createHash("sha256").update(path).digest("hex").slice(0, 32)}.json`);
367
- }
368
366
  function readMergeCache(path) {
369
367
  try {
370
- const entry = JSON.parse(readFileSync(mergeCacheFile(path), "utf-8"));
368
+ const entry = JSON.parse(readFileSync(gitMergeCacheFile(path), "utf-8"));
371
369
  if (entry.path !== path || typeof entry.head !== "string" || typeof entry.target !== "string") return null;
372
370
  return {
373
371
  path,
@@ -380,7 +378,7 @@ function readMergeCache(path) {
380
378
  }
381
379
  }
382
380
  function writeMergeCache(entry) {
383
- const file = mergeCacheFile(entry.path);
381
+ const file = gitMergeCacheFile(entry.path);
384
382
  const temporary = `${file}.${randomUUID()}.tmp`;
385
383
  try {
386
384
  mkdirSync(gitMergeCacheDir(), { recursive: true });
@@ -1416,7 +1414,7 @@ function iosStatusLines(record, slotLabel) {
1416
1414
  const booted = ios.state === "Booted" ? chalk.green("booted") : chalk.dim(ios.state.toLowerCase());
1417
1415
  const owned = ios.owned ? chalk.dim(" (owned)") : "";
1418
1416
  out.push(` ios${slotLabel}: ${chalk.cyan(iosStatusName(ios))} ${booted}${owned}${activitySuffix(ios.activity)}${appSuffix(ios.app)}${idleShutdownSuffix(ios.idleShutdown)}`);
1419
- if (!ios.udid && ios.host && "command" in ios.host.agent) out.push(chalk.dim(` agent: ${ios.host.agent.command}`));
1417
+ if (!ios.udid && ios.host) out.push(chalk.dim(` agent: ${hostedAgentLine(ios.host.agent, ios.host.machine)}`));
1420
1418
  }
1421
1419
  return out;
1422
1420
  }
@@ -1434,7 +1432,7 @@ function androidStatusLines(record, slotLabel) {
1434
1432
  out.push(` android${slotLabel}: ${chalk.cyan(`${host.device?.name ?? "Android emulator"} on ${host.machine}${host.selected === "auto" && host.reason ? ` (auto: ${host.reason})` : ""}`)} ${host.state ?? "unverified"}`);
1435
1433
  }
1436
1434
  }
1437
- if (record?.host && "command" in record.host.agent) out.push(chalk.dim(` agent: ${record.host.agent.command}`));
1435
+ if (record?.host) out.push(chalk.dim(` agent: ${hostedAgentLine(record.host.agent, record.host.machine)}`));
1438
1436
  return out;
1439
1437
  }
1440
1438
  function formatGb(mb) {
@@ -1554,7 +1552,7 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
1554
1552
  const build = state.macos.build;
1555
1553
  const placement = build.buildMachine === void 0 ? "" : `; build placement ${build.buildMachine}, built on ${build.builtOn ?? "none"}`;
1556
1554
  out.push(` macOS ${state.macos.product}: ${state.macos.state}${where}; build ${build.state}${placement}`);
1557
- if (host && "command" in host.agent) out.push(chalk.dim(` agent: ${host.agent.command}`));
1555
+ if (host) out.push(chalk.dim(` agent: ${hostedAgentLine(host.agent, host.machine)}`));
1558
1556
  }
1559
1557
  if (state.web) {
1560
1558
  const browser = state.web.running ? chalk.green(`running (pid ${state.web.pid}, DevTools ${state.web.cdpEndpoint})`) : chalk.dim("not running");
@@ -1,8 +1,8 @@
1
1
  import { t as getExecutor } from "./exec-L37dbiIb.mjs";
2
- import { d as androidToolPath } from "./android-CGctfYpv.mjs";
3
- import { c as pidExists } from "./metro-TIQ1Wft-.mjs";
4
- import { n as easMachineStateRoot } from "./eas-session-ledger-TE1miVz5.mjs";
5
- import { b as parseSimctlList } from "./ios-BveW7qK1.mjs";
2
+ import { d as androidToolPath } from "./android-27_JgJ1T.mjs";
3
+ import { c as pidExists } from "./metro-Cj6W4qOO.mjs";
4
+ import { n as easMachineStateRoot } from "./eas-session-ledger-BDpSdFDM.mjs";
5
+ import { b as parseSimctlList } from "./ios-DQEzde6f.mjs";
6
6
  import { existsSync, readdirSync, statSync, watch } from "node:fs";
7
7
  import { basename, dirname, join } from "node:path";
8
8
  //#region src/status-watch.ts
@@ -1,4 +1,4 @@
1
- import { n as runStatusWatch } from "./status-Bcdy5eHt.mjs";
1
+ import { n as runStatusWatch } from "./status-DEZjHP4q.mjs";
2
2
  import { parentPort, workerData } from "node:worker_threads";
3
3
  //#region src/status-worker.ts
4
4
  const STOP_EXIT_MS = 500;
@@ -1,3 +1,3 @@
1
- import { x as resolveSupervisorTarget } from "./workspaces-DCzDzydB.mjs";
2
- import { a as resolveCollectorTargets, c as stopWorkspaceNow, i as readSupervisorState, n as clearSupervisorState, o as runStop, r as readCollectorState, s as stopCommand, t as clearCollectorState } from "./stop-CkmBkNyg.mjs";
1
+ import { x as resolveSupervisorTarget } from "./workspaces-BgAYIccE.mjs";
2
+ import { a as resolveCollectorTargets, c as stopWorkspaceNow, i as readSupervisorState, n as clearSupervisorState, o as runStop, r as readCollectorState, s as stopCommand, t as clearCollectorState } from "./stop-BPrTEOaz.mjs";
3
3
  export { clearCollectorState, clearSupervisorState, stopCommand as default, readCollectorState, readSupervisorState, resolveCollectorTargets, resolveSupervisorTarget, runStop, stopWorkspaceNow };
@@ -1,19 +1,19 @@
1
1
  import { D as ownership_claim_exports, E as debugLog, T as process_identity_exports, f as WorkspaceProcessCleanupError, p as withWorkspaceProcessLock } from "./exec-L37dbiIb.mjs";
2
- import { E as workspaceDir, c as withWorkspaceStateLock, d as writeWorkspaceState, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1, s as updateWorkspaceStateAsync } from "./workspace-state-DOPXG2Gp.mjs";
3
- import { f as refuseNoProject, l as phaseLine, p as releasedLeaseFact, u as plural } from "./command-output-ByEmIwur.mjs";
2
+ import { E as workspaceDir, c as withWorkspaceStateLock, d as writeWorkspaceState, l as withWorkspaceStateLockAsync, n as clearWorkspaceStateKeys, r as readWorkspaceState$1, s as updateWorkspaceStateAsync } from "./workspace-state-CHEN_xzy.mjs";
3
+ import { f as refuseNoProject, l as phaseLine, p as releasedLeaseFact, u as plural } from "./command-output-DsjhOzJ3.mjs";
4
4
  import { A as withConfigLockAsync$1, O as upsertProject, gt as projectDeviceSlots, ht as parseDeviceSlotOption, m as getProject, mt as parseDeviceSlotKey, o as clearSupervisor, pt as deviceSlotPlatforms, vt as validateDeviceSlot } from "./config-CNmN-ndb.mjs";
5
- import { A as clearWorkspaceLaunches, M as readMetroTunnel, O as clearManagedMetroTunnel, P as readRemoteSession, T as MODE_COMMAND, j as clearWorkspaceSupervisor, k as clearRemoteSession, n as findCommandWorkspace } from "./project-BCtQz48d.mjs";
6
- import { t as macosAppPresent } from "./state-DsrFh3yv.mjs";
7
- import { nt as removeOwnedEmulatorMetroReverses } from "./android-CGctfYpv.mjs";
8
- import { a as listeningPidsAsync, c as pidExists, d as resolveProjectMetro, h as isMetroRunning, p as signalProcessTreeAsync, r as killMetroTreeAsync, u as processCwds } from "./metro-TIQ1Wft-.mjs";
9
- import { J as requestDevServerStop, K as logVanishedSupervisor, X as withdrawDevServerStopRequest, Yt as endRecordedSession, tr as resolveEasCliBin } from "./device-capacity-DWUOvY13.mjs";
10
- import { C as stopTunnel, ht as teardownOwnedIosSim, mt as teardownOwnedBrowser, pt as teardownOwnedAvd, x as resolveSupervisorTarget } from "./workspaces-DCzDzydB.mjs";
11
- import { ct as NATIVE_RUN_WAIT_MS, dt as decideStopAction, ft as describeNativeRunHolder, ht as requestNativeRunCancel, mt as nativeRunWaitNotice, pt as nativeRunHolder, st as NATIVE_RUN_LOCK, ut as clearNativeRunCancel } from "./toolchain-BeD7tbBW.mjs";
12
- import { O as releaseWorkspaceLeasesAsync, y as fileLeaseIo } from "./activity-CdpXXSq2.mjs";
13
- import { i as stopHostedAndroid } from "./hosted-android-D8JbIzgC.mjs";
14
- import { a as stopHostedIos, n as removePhoneReverses } from "./phone-reverses-CHtco460.mjs";
15
- import { r as stopMacosApp } from "./stop-CbxsTKyZ.mjs";
16
- import { n as verifyCollectorOwnership } from "./ownership-CQTg6v1d.mjs";
5
+ import { A as clearWorkspaceLaunches, M as readMetroTunnel, O as clearManagedMetroTunnel, P as readRemoteSession, T as MODE_COMMAND, j as clearWorkspaceSupervisor, k as clearRemoteSession, n as findCommandWorkspace } from "./project-DIo71tGq.mjs";
6
+ import { t as macosAppPresent } from "./state-45P8Kd6Z.mjs";
7
+ import { nt as removeOwnedEmulatorMetroReverses } from "./android-27_JgJ1T.mjs";
8
+ import { a as listeningPidsAsync, c as pidExists, d as resolveProjectMetro, h as isMetroRunning, p as signalProcessTreeAsync, r as killMetroTreeAsync, u as processCwds } from "./metro-Cj6W4qOO.mjs";
9
+ import { J as requestDevServerStop, K as logVanishedSupervisor, Qt as endRecordedSession, X as withdrawDevServerStopRequest, ir as resolveEasCliBin } from "./device-capacity-D_IlxZRL.mjs";
10
+ import { gt as teardownOwnedIosSim, ht as teardownOwnedBrowser, mt as teardownOwnedAvd, w as stopTunnel, x as resolveSupervisorTarget } from "./workspaces-BgAYIccE.mjs";
11
+ import { at as NATIVE_RUN_WAIT_MS, ct as decideStopAction, dt as nativeRunWaitNotice, ft as requestNativeRunCancel, it as NATIVE_RUN_LOCK, lt as describeNativeRunHolder, st as clearNativeRunCancel, ut as nativeRunHolder } from "./toolchain-CZvtCZ-m.mjs";
12
+ import { O as releaseWorkspaceLeasesAsync, y as fileLeaseIo } from "./activity-CANftndU.mjs";
13
+ import { i as stopHostedAndroid } from "./hosted-android-gwLspaz6.mjs";
14
+ import { a as stopHostedIos, n as removePhoneReverses } from "./phone-reverses-vRveZKSG.mjs";
15
+ import { r as stopMacosApp } from "./stop-DrxHVVX9.mjs";
16
+ import { n as verifyCollectorOwnership } from "./ownership-BLgOimfp.mjs";
17
17
  import { hostedAndroidDeviceName, hostedAndroidRecords, hostedIosRecords, hostedNativeRecords, isJsonObject, parseHostedNativePlacement } from "@stim-cli/core/state";
18
18
  import chalk from "chalk";
19
19
  //#region src/commands/stop.ts