stim 1.28.0 → 1.30.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 (155) hide show
  1. package/dist/{acquire-artifact-CKByBnTD.mjs → acquire-artifact-CrZ4rEbI.mjs} +1 -1
  2. package/dist/{act-8iswyfRa.mjs → act-BaKjDWGw.mjs} +479 -29
  3. package/dist/{activity-DRMg4_mD.mjs → activity-BTaUf0tc.mjs} +6 -5
  4. package/dist/{agent-device-usage-output-tE90fDdo.mjs → agent-device-usage-output-DYBpO17K.mjs} +4 -4
  5. package/dist/{android-YWCbmkVK.mjs → android-BCYLwmH6.mjs} +5 -5
  6. package/dist/{android-D577ApKG.mjs → android-BEQUDpOg.mjs} +1 -1
  7. package/dist/{android-CHmSU4B4.mjs → android-BWqdDK6R.mjs} +44 -42
  8. package/dist/{android-CsPs-7Mg.mjs → android-DdKG6lyD.mjs} +44 -35
  9. package/dist/{android-cas-_aDifWW0.mjs → android-cas-BH6K12__.mjs} +4 -4
  10. package/dist/{android-project-DUGMbq28.d.mts → android-project-CCEQyYJK.d.mts} +6 -2
  11. package/dist/api.d.mts +7 -4
  12. package/dist/api.mjs +27 -27
  13. package/dist/{apk-signed-tail-CQbwM0qO.mjs → apk-signed-tail-B8kw4a8K.mjs} +2 -2
  14. package/dist/{artifact-DYtHjxsn.mjs → artifact-DTHXcmQ3.mjs} +12 -12
  15. package/dist/{artifact-bFkfD3vf.mjs → artifact-M6W2l-xh.mjs} +12 -12
  16. package/dist/{auto-placement-BVqs8AJi.mjs → auto-placement-CZaWDmcY.mjs} +10 -10
  17. package/dist/{browser-web-BUaLcafY.mjs → browser-web-JQ7lFej3.mjs} +12 -12
  18. package/dist/{build-cQURy_KW.mjs → build-C2ZWoCmg.mjs} +23 -23
  19. package/dist/{build-cache-CZULpXVl.mjs → build-cache-DlC3owap.mjs} +4 -4
  20. package/dist/{build-plan-CxoYfxsc.mjs → build-plan-J3iRR3gI.mjs} +6 -6
  21. package/dist/{cache-manifest-DEjqGGat.mjs → cache-manifest-evF_zJ9U.mjs} +1 -1
  22. package/dist/cache-manifest.mjs +1 -1
  23. package/dist/{ccache-Bm_A1xX9.mjs → ccache-B8gY50-h.mjs} +18 -18
  24. package/dist/{cli-CpbaLDa7.mjs → cli-xRPXJPtA.mjs} +19 -19
  25. package/dist/cli.mjs +1 -1
  26. package/dist/{client-YxCer6ab.mjs → client-DrHykA24.mjs} +5 -5
  27. package/dist/collector-run.mjs +5 -5
  28. package/dist/{command-output-C8R1KIvi.mjs → command-output-BBW8eWPL.mjs} +1 -1
  29. package/dist/{config-Cn94Jc0g.mjs → config-AbUjIBOQ.mjs} +121 -19
  30. package/dist/{dependencies-DKeMzwXY.mjs → dependencies-vUh9mp5z.mjs} +39 -38
  31. package/dist/{dependency-state-CojA2o0t.mjs → dependency-state-CPKAKCZ8.mjs} +1 -1
  32. package/dist/{dev-client-D-BW5uiq.mjs → dev-client-CASgAOu7.mjs} +2 -2
  33. package/dist/device-ChnO7bR9.mjs +761 -0
  34. package/dist/device-CsIdRXfm.mjs +175 -0
  35. package/dist/{device-CgXfbcz5.mjs → device-android-CcdQqQWg.mjs} +28 -195
  36. package/dist/{device-capacity-Cd8lMSn3.mjs → device-capacity-C5C_jOQd.mjs} +11 -11
  37. package/dist/device-host-worker.mjs +44 -35
  38. package/dist/{device-ios-Cc9ulihb.mjs → device-ios-DbmtPIiw.mjs} +28 -18
  39. package/dist/{device-lease-run-Mtzp4THX.mjs → device-lease-run-Do6zYA7y.mjs} +4 -4
  40. package/dist/{device-pool-eRz6DtCg.mjs → device-pool-CpoYiCGO.mjs} +3 -3
  41. package/dist/{device-eeK95Lir.mjs → device-provision-B5Ms94qY.mjs} +11 -302
  42. package/dist/{doctor-xf7ht-5n.mjs → doctor-CJSB5q-s.mjs} +20 -20
  43. package/dist/{doctor-Bz_ouYAW.mjs → doctor-CLE4AZEI.mjs} +20 -15
  44. package/dist/{doctor-C2QyhejJ.mjs → doctor-CpfbYh3Q.mjs} +1 -1
  45. package/dist/doctor-fingerprint.mjs +1 -1
  46. package/dist/{doctor-watchman-BTW82PDC.mjs → doctor-watchman-D1IyMle9.mjs} +4 -4
  47. package/dist/{eas-build-Dm6q68QY.mjs → eas-build-DIDOHw2P.mjs} +2 -2
  48. package/dist/{eas-fallback-DajNpxf-.mjs → eas-fallback-DVS9oBSc.mjs} +4 -4
  49. package/dist/{eas-session-ledger-CBFo_Uo1.mjs → eas-session-ledger-CW3l-inB.mjs} +5 -5
  50. package/dist/{error-diagnostics-D1QfyJzQ.mjs → error-diagnostics-XJ9eWdtq.mjs} +8 -8
  51. package/dist/{gc-PLFwb0k4.mjs → gc-BVIcxCxE.mjs} +2 -2
  52. package/dist/{gc-DM5oMm-J.mjs → gc-Co7PE36D.mjs} +80 -18
  53. package/dist/{guide-C4I46XAk.mjs → guide-DkepBgHT.mjs} +235 -34
  54. package/dist/{hosted-android-DlaKLbW0.mjs → hosted-android-Du7NxufJ.mjs} +3 -3
  55. package/dist/{hosted-client-DDRm9hPJ.mjs → hosted-client-Cect92SZ.mjs} +3 -3
  56. package/dist/{hosted-logs-bSebOKbz.mjs → hosted-logs-Opcjv1Lr.mjs} +17 -8
  57. package/dist/{hosted-logs-sync-B0c53W_c.mjs → hosted-logs-sync-wsI7N1Hv.mjs} +7 -11
  58. package/dist/{hosted-macos-B7-8Pv4H.mjs → hosted-macos-BP9Kucat.mjs} +5 -5
  59. package/dist/{hosted-native-CDe33CSr.mjs → hosted-native-DmdLSmvu.mjs} +9 -8
  60. package/dist/{idle-shutdown-CQ0QwU9J.mjs → idle-shutdown-BcMN_cLm.mjs} +7 -7
  61. package/dist/{ios-B1HvafEG.mjs → ios-BFkBHuRT.mjs} +8 -8
  62. package/dist/{ios-tg4tp3q1.mjs → ios-CG0IsLtt.mjs} +29 -29
  63. package/dist/{ios-B1DYuOjh.mjs → ios-CXnoVO_z.mjs} +4 -4
  64. package/dist/{ios-device-B4elVFKi.mjs → ios-device-ClSfuu-_.mjs} +1 -1
  65. package/dist/{ios-project-CR4mZ7CH.mjs → ios-project-BM9TbTE7.mjs} +7 -7
  66. package/dist/{ios-state-BPHqMDdZ.mjs → ios-state-Ce_dystM.mjs} +1 -1
  67. package/dist/{js-swap-CVpSW1fn.mjs → js-swap-9Rx-5Nqz.mjs} +4 -4
  68. package/dist/{launch-DoySmhjz.mjs → launch-DvJV1Mx4.mjs} +19 -19
  69. package/dist/{lightened-DFAJgfIk.mjs → lightened-23pqe7LS.mjs} +4 -4
  70. package/dist/{logs-BGsW7iPe.mjs → logs-DJgZlf2K.mjs} +9 -8
  71. package/dist/{logs-DI5ILkYB.mjs → logs-Pkeh3wZk.mjs} +7 -6
  72. package/dist/{macos-Bo9st9Di.mjs → macos-DPvPQadc.mjs} +20 -20
  73. package/dist/{macos-C12RMJQF.mjs → macos-Du07NsOB.mjs} +1 -1
  74. package/dist/macos-run.mjs +1 -1
  75. package/dist/maintenance-run.mjs +13 -9
  76. package/dist/{metro-BnhXV2Mj.mjs → metro-BMQHczcf.mjs} +2 -2
  77. package/dist/{metro-request-DXyKjVDF.mjs → metro-request-BtF7ox53.mjs} +1 -1
  78. package/dist/{named-ports-Phoi2POD.mjs → named-ports-DcktE2Pw.mjs} +2 -2
  79. package/dist/{native-android-vxgtLD7w.mjs → native-android-CBOM1_gB.mjs} +16 -16
  80. package/dist/{native-gradle-artifact-inputs-BN96IVw8.mjs → native-gradle-artifact-inputs-D_iAfPuS.mjs} +3 -3
  81. package/dist/{native-runtime-DG4Rodzj.mjs → native-runtime-D4cTwU0Z.mjs} +6 -6
  82. package/dist/{native-xcode-inputs-BKarCoKg.mjs → native-xcode-inputs-BF-ogSnG.mjs} +2 -2
  83. package/dist/{native-xcode-ios-8A-efGa5.mjs → native-xcode-ios-DwJBfMP6.mjs} +15 -15
  84. package/dist/{ndjson-Dy2W4vRa.mjs → ndjson-CrjIsGzw.mjs} +2 -2
  85. package/dist/offload-worker.d.mts +1 -1
  86. package/dist/offload-worker.mjs +22 -22
  87. package/dist/{ownership-DJCq48IJ.mjs → ownership-Dtz9G5Gl.mjs} +2 -2
  88. package/dist/{phone-reverses-BzTa8g1F.mjs → phone-reverses-CvhhkGMH.mjs} +4 -4
  89. package/dist/{placement-log-Cvhta5ib.mjs → placement-log-CRR_TE1r.mjs} +1 -1
  90. package/dist/{plan-placement-WkZdccuN.mjs → plan-placement-CdLc-pTb.mjs} +6 -6
  91. package/dist/{ports-UV4mJgyC.mjs → ports-g4N_cfyg.mjs} +3 -3
  92. package/dist/{prebuild-k8d_tqOq.mjs → prebuild-DBJMhwSS.mjs} +9 -9
  93. package/dist/{project-Sui52ywT.mjs → project-DPQjnpcI.mjs} +15 -15
  94. package/dist/{react-native-android-DANlGGQf.mjs → react-native-android-idMWOwkX.mjs} +24 -24
  95. package/dist/{react-native-build-jUHnIfZ9.mjs → react-native-build-BSoh4HkH.mjs} +7 -7
  96. package/dist/{react-native-doctor-DCWRjS7K.mjs → react-native-doctor-CYibY8-4.mjs} +9 -8
  97. package/dist/{react-native-ios-BwMsFMXi.mjs → react-native-ios-13KIIOOy.mjs} +16 -15
  98. package/dist/{recordings-iy0mkm7b.mjs → recordings-CHMaF73C.mjs} +1 -1
  99. package/dist/{reload-Bj7QyuDy.mjs → reload-B9DZOjcV.mjs} +1 -1
  100. package/dist/{reload-c_uEyc_X.mjs → reload-BUQI3dSu.mjs} +14 -14
  101. package/dist/{remote-DFlpAqdV.mjs → remote-C-RGHhAP.mjs} +8 -8
  102. package/dist/{result-BIcXREyC.mjs → result-W4HCum4A.mjs} +16 -16
  103. package/dist/{run-y2HwyNvg.mjs → run-BQAmrohh.mjs} +2 -2
  104. package/dist/{selection-CXgM_VK_.mjs → selection-PCMT97XD.mjs} +105 -62
  105. package/dist/{server-bare-2N4vSRZG.mjs → server-bare-CEQdB_F4.mjs} +37 -1
  106. package/dist/{server-command-qneHPcRI.mjs → server-command-oqi3TDy7.mjs} +5 -5
  107. package/dist/server-expo-BUFAq2In.mjs +2 -0
  108. package/dist/{server-expo-Ccm9zB0o.mjs → server-expo-C1K07shx.mjs} +8 -5
  109. package/dist/{settings-Cfd_Q6ys.mjs → settings-CKlMOmhj.mjs} +2 -2
  110. package/dist/{settings-CY5JZlNN.mjs → settings-D776ygML.mjs} +1 -1
  111. package/dist/{settings-Djl-mpjX.mjs → settings-D9LtQaUw.mjs} +2 -1
  112. package/dist/{settings-payload-DwQiEMCn.mjs → settings-payload-CE-NZ6Lq.mjs} +4 -4
  113. package/dist/{settings-write-CJpjkeAd.mjs → settings-write-D7Xwa_-M.mjs} +5 -5
  114. package/dist/settings.schema.json +58 -9
  115. package/dist/{simslim-DCQwzoPy.mjs → simslim-CbpHERcv.mjs} +1 -1
  116. package/dist/{slot-launch-BpmanOnk.mjs → slot-launch-CeIK1iUI.mjs} +6 -6
  117. package/dist/{stage-CmugrSG5.mjs → stage-Blqe6bWb.mjs} +1 -1
  118. package/dist/{start-DYLk6GXn.mjs → start-B7J5a9nS.mjs} +11 -11
  119. package/dist/{start-CHH3zgIU.mjs → start-CvP2pJjc.mjs} +1 -1
  120. package/dist/{state-BXC1Lfxw.mjs → state-C2AUjjhg.mjs} +1 -1
  121. package/dist/{state-B2QJbDwz.mjs → state-D5ZxwCGJ.mjs} +2 -2
  122. package/dist/{stats-DxKqhcGp.mjs → stats-Uo7l8OAk.mjs} +4 -4
  123. package/dist/{status-7ULDEJ1e.mjs → status-CK7ZoEhV.mjs} +2 -2
  124. package/dist/{status-D_Ljc89p.mjs → status-CqJI1TgG.mjs} +1 -1
  125. package/dist/{status-BHCkOZga.mjs → status-_rWXFSO7.mjs} +24 -24
  126. package/dist/{status-watch-BmsPqYSU.mjs → status-watch-CnSyXUmj.mjs} +4 -4
  127. package/dist/status-worker.mjs +1 -1
  128. package/dist/{stim-desktop-CbWo21kb.mjs → stim-desktop-CYXLFpFS.mjs} +1 -1
  129. package/dist/{stop-b2pouxAO.mjs → stop-Bogo9oO2.mjs} +2 -2
  130. package/dist/{stop-DQvE-P76.mjs → stop-CMVfaA-6.mjs} +4 -4
  131. package/dist/{stop-D-dGE9gh.mjs → stop-CnF9ixYe.mjs} +20 -19
  132. package/dist/supervisor-run.d.mts +1 -0
  133. package/dist/supervisor-run.mjs +23 -19
  134. package/dist/{support-04IhBUTT.mjs → support-BGqpYMV8.mjs} +15 -11
  135. package/dist/{support-BtlJKjyQ.mjs → support-DUevTPur.mjs} +9 -9
  136. package/dist/{swiftpm-artifact-inputs-Cj2UpmPN.mjs → swiftpm-artifact-inputs-BcJk6-3u.mjs} +1 -1
  137. package/dist/{swiftpm-macos-BhF2stxY.mjs → swiftpm-macos-DBrmoocG.mjs} +8 -8
  138. package/dist/toolchain-Cw9VVHOY.mjs +2 -0
  139. package/dist/{toolchain-mLA_km-b.mjs → toolchain-DLdoyxIt.mjs} +19 -11
  140. package/dist/{trigger-DMou-X7j.mjs → trigger-CfnOfpDd.mjs} +1 -1
  141. package/dist/trigger-DBZ-GBrl.mjs +2 -0
  142. package/dist/{warm-progress-B0Vpuvpl.mjs → warm-progress-DQ2wQZKp.mjs} +3 -3
  143. package/dist/web-CI_qCRPw.mjs +2 -0
  144. package/dist/{web-BYmK0TjL.mjs → web-g9U7L1sR.mjs} +8 -8
  145. package/dist/web-run.mjs +5 -5
  146. package/dist/{workspace-state-kIZrdlSg.mjs → workspace-state-DGwkPXwq.mjs} +2 -2
  147. package/dist/{workspaces-CmOcceDN.mjs → workspaces-7_RWoi6c.mjs} +11 -11
  148. package/dist/{worktree-nliAoHxB.mjs → worktree-DEet9H3p.mjs} +1 -1
  149. package/dist/{worktree-2dk5edza.mjs → worktree-qKJ3x07S.mjs} +25 -25
  150. package/package.json +7 -7
  151. package/shim/bundle-response.cjs +37 -0
  152. package/dist/server-expo-WulkyAwT.mjs +0 -2
  153. package/dist/toolchain-qktiV8xc.mjs +0 -2
  154. package/dist/trigger-qp2ji5wE.mjs +0 -2
  155. package/dist/web-CrVLVQZY.mjs +0 -2
@@ -1,20 +1,14 @@
1
1
  import { b as operationState, t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { G as projectDeviceSlots, V as deviceSlotKey, W as parseDeviceSlotOption, _ as loadConfig$1, p as getProject } from "./config-Cn94Jc0g.mjs";
2
+ import { _ as loadConfig$1 } from "./config-AbUjIBOQ.mjs";
3
3
  import { t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
- import { r as clockTime } from "./command-output-C8R1KIvi.mjs";
5
- import { X as resolveProjectSettings, Y as resolveIosProjectDir, an as makeTemporaryDirectory, it as settingValueAt, on as removeTemporaryEntry } from "./settings-CY5JZlNN.mjs";
6
- import { f as projectRegistry, g as selectNativeXcodeProject, i as findProjectRoot$1, p as NativeXcodeError, t as NO_PROJECT_REFUSAL } from "./project-Sui52ywT.mjs";
7
- import { A as listAdbDevices, O as getAvdNameForSerialAsync, R as memoizeEmulatorProbe, Y as physicalDeviceModel, Z as probeEmulatorSerial, c as androidPoolNoCandidatesRefusal, rt as resolvePhysicalDevice, s as androidPoolCandidates } from "./android-CsPs-7Mg.mjs";
8
- import { En as runProcessOperation } from "./ccache-Bm_A1xX9.mjs";
9
- import { H as resolveScheme, K as xcodebuildArgs } from "./toolchain-mLA_km-b.mjs";
10
- import { C as parseLeaseDuration, D as releaseWorkspaceLeases, j as takeLease, y as fileLeaseIo } from "./activity-DRMg4_mD.mjs";
11
- import { a as discoverXcodeProject } from "./react-native-build-jUHnIfZ9.mjs";
12
- import { l as parseDeviceWait, p as waitForDevice } from "./device-lease-run-Mtzp4THX.mjs";
13
- import { m as resolveConfiguration, y as resolveSchemeSelection } from "./support-BtlJKjyQ.mjs";
4
+ import { X as resolveProjectSettings, Y as resolveIosProjectDir, an as makeTemporaryDirectory, it as settingValueAt, on as removeTemporaryEntry } from "./settings-D776ygML.mjs";
5
+ import { f as projectRegistry, g as selectNativeXcodeProject, i as findProjectRoot$1, p as NativeXcodeError, t as NO_PROJECT_REFUSAL } from "./project-DPQjnpcI.mjs";
6
+ import { U as resolveScheme, q as xcodebuildArgs } from "./toolchain-DLdoyxIt.mjs";
7
+ import { a as discoverXcodeProject } from "./react-native-build-BSoh4HkH.mjs";
8
+ import { m as resolveConfiguration, y as resolveSchemeSelection } from "./support-DUevTPur.mjs";
14
9
  import { n as findSigningIdentities, o as parsePlist, s as parseProvisioningProfilePlist, t as decodeProvisioningProfile } from "./ios-signing-BJzvDPfU.mjs";
15
- import { t as selectFromPool } from "./device-pool-eRz6DtCg.mjs";
16
- import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, l as listIosDevices, o as iosPoolNoCandidatesRefusal } from "./ios-device-B4elVFKi.mjs";
17
- import { i as nativeXcodePackages, t as nativeXcodeHasPackages } from "./native-xcode-inputs-BKarCoKg.mjs";
10
+ import { f as resolveIosPhysicalDevice, l as listIosDevices } from "./ios-device-ClSfuu-_.mjs";
11
+ import { i as nativeXcodePackages, t as nativeXcodeHasPackages } from "./native-xcode-inputs-BF-ogSnG.mjs";
18
12
  import { existsSync, readdirSync, realpathSync, statSync } from "node:fs";
19
13
  import { homedir } from "node:os";
20
14
  import { join } from "node:path";
@@ -552,7 +546,7 @@ async function confirmInTerminal(question, open = openTerminal) {
552
546
  input.close();
553
547
  }
554
548
  }
555
- const DEFAULT_DEPS$1 = {
549
+ const DEFAULT_DEPS = {
556
550
  findProjectRoot: findProjectRoot$1,
557
551
  resolveSettings: (root) => resolveProjectSettings(root).settings,
558
552
  machineConfig: loadConfig$1,
@@ -577,7 +571,7 @@ const DEFAULT_DEPS$1 = {
577
571
  const UNCONFIRMED_REMEDY = "Run it in a terminal and answer y, or pass --yes once the owner of the Apple Developer account has agreed to the changes listed. Agents never pass --yes without the user explicitly asking for this step.";
578
572
  async function runProvision(platformArg, udidArg, opts = {}, overrides = {}) {
579
573
  const d = {
580
- ...DEFAULT_DEPS$1,
574
+ ...DEFAULT_DEPS,
581
575
  ...overrides
582
576
  };
583
577
  const json = Boolean(opts.json);
@@ -780,289 +774,4 @@ async function runProvision(platformArg, udidArg, opts = {}, overrides = {}) {
780
774
  return result;
781
775
  }
782
776
  //#endregion
783
- //#region src/commands/device.ts
784
- const DEFAULT_FOR = "5m";
785
- const DEFAULT_DEPS = {
786
- findProjectRoot: findProjectRoot$1,
787
- getProject,
788
- avdNameOf: getAvdNameForSerialAsync,
789
- listIosDevices,
790
- listAdbDevices,
791
- physicalDeviceModel,
792
- probeEmulatorSerial,
793
- takeLease,
794
- releaseLeases: releaseWorkspaceLeases,
795
- waitForDevice,
796
- selectFromPool,
797
- io: fileLeaseIo,
798
- now: () => Date.now(),
799
- sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
800
- out: (line) => console.log(line),
801
- note: (line) => console.error(line)
802
- };
803
- function grantLine(facts, durationText) {
804
- return `locked ${facts.deviceName ? `${facts.deviceName} (${facts.id})` : facts.id} for ${facts.holder} until ${clockTime(facts.expiresAt)} (${durationText}). Renew: stim device lock ${facts.platform}${facts.slot ? ` --slot ${facts.slot}` : ""} --for ${durationText}. Release: stim device unlock${facts.slot ? ` --slot ${facts.slot}` : ""}.`;
805
- }
806
- function releasedLine(lease) {
807
- return `unlocked ${lease.deviceName ? `${lease.deviceName} (${lease.id})` : lease.id} -- the ${lease.platform} lease ran until ${clockTime(lease.expiresAt)}.`;
808
- }
809
- function readPlatform(value) {
810
- return value === "ios" || value === "android" ? value : null;
811
- }
812
- async function resolveDevice(platform, requested, d) {
813
- if (platform === "ios") {
814
- const resolved = resolveIosPhysicalDevice(requested, await d.listIosDevices());
815
- if (!resolved.udid) return {
816
- code: "STIM_NO_DEVICE",
817
- message: resolved.error,
818
- remedy: resolved.remedy ?? null
819
- };
820
- return {
821
- id: resolved.udid,
822
- deviceName: resolved.name ?? resolved.udid
823
- };
824
- }
825
- const resolved = resolvePhysicalDevice(requested, d.listAdbDevices(), d.probeEmulatorSerial);
826
- if (!resolved.serial) return {
827
- code: "STIM_NO_DEVICE",
828
- message: resolved.error,
829
- remedy: resolved.remedy ?? null
830
- };
831
- return {
832
- id: resolved.serial,
833
- deviceName: d.physicalDeviceModel(resolved.serial) ?? resolved.serial
834
- };
835
- }
836
- async function findOwnedVirtualDevice(project, platform, id, avdNameOf) {
837
- let running;
838
- for (const { slot, platforms } of projectDeviceSlots(project)) {
839
- if (platform === "ios") {
840
- const sim = platforms.ios;
841
- if (sim?.owned && sim.deviceUdid && sim.deviceUdid.toLowerCase() === id.toLowerCase()) return {
842
- id: sim.deviceUdid,
843
- deviceName: sim.deviceName ?? null,
844
- slot
845
- };
846
- continue;
847
- }
848
- const emulator = platforms.android;
849
- if (!emulator?.owned || !emulator.avdName || !/^emulator-\d+$/.test(id)) continue;
850
- running ??= { name: await avdNameOf(id) };
851
- if (running.name === emulator.avdName) return {
852
- id,
853
- deviceName: emulator.deviceName ?? emulator.avdName,
854
- slot
855
- };
856
- }
857
- return null;
858
- }
859
- function isFailure(value) {
860
- return "code" in value;
861
- }
862
- async function poolDevice(platform, idLabel, waitSeconds, deadline, root, d, slot) {
863
- const isEmulator = memoizeEmulatorProbe(d.probeEmulatorSerial);
864
- const pooled = await d.selectFromPool({
865
- ...slot ? { slot } : {},
866
- root,
867
- platform,
868
- idLabel,
869
- list: async () => platform === "ios" ? iosPoolCandidates(await d.listIosDevices()).map((entry) => ({
870
- id: entry.udid,
871
- name: entry.name,
872
- fallback: isWirelessIosDevice(entry)
873
- })) : androidPoolCandidates(d.listAdbDevices(), isEmulator).map((entry) => ({ id: entry.serial })),
874
- noCandidates: async () => {
875
- const resolved = platform === "ios" ? iosPoolNoCandidatesRefusal(await d.listIosDevices()) : androidPoolNoCandidatesRefusal(d.listAdbDevices(), isEmulator);
876
- return {
877
- message: resolved.error,
878
- remedy: resolved.remedy
879
- };
880
- },
881
- waitSeconds,
882
- deadline,
883
- now: d.now,
884
- sleep: d.sleep,
885
- warn: (line) => d.note(chalk.yellow(line)),
886
- io: d.io
887
- });
888
- if (pooled.status === "refused") return {
889
- code: pooled.refusal.code,
890
- message: pooled.refusal.message,
891
- remedy: pooled.refusal.remedy,
892
- ...pooled.refusal.lease === null ? {} : { lease: pooled.refusal.lease }
893
- };
894
- const name = pooled.candidate.name ?? (platform === "ios" ? pooled.candidate.id : d.physicalDeviceModel(pooled.candidate.id));
895
- return {
896
- id: pooled.candidate.id,
897
- deviceName: name ?? pooled.candidate.id
898
- };
899
- }
900
- async function runLock(platformArg, idArg, opts = {}, overrides = {}) {
901
- const d = {
902
- ...DEFAULT_DEPS,
903
- ...overrides
904
- };
905
- const json = Boolean(opts.json);
906
- const report = (failure) => {
907
- d.note(chalk.red(`${failure.code}: ${failure.message}`));
908
- if (failure.remedy) d.note(chalk.dim(failure.remedy));
909
- if (json) d.out(JSON.stringify({
910
- code: failure.code,
911
- message: failure.message,
912
- remedy: failure.remedy,
913
- ...failure.lease === void 0 ? {} : { lease: failure.lease }
914
- }));
915
- return failure;
916
- };
917
- const platform = readPlatform(platformArg);
918
- if (!platform) return report({
919
- code: "STIM_BAD_ARG",
920
- message: `\`stim device lock\` takes ios or android, not ${JSON.stringify(platformArg)}.`,
921
- remedy: "Run `stim device lock ios` or `stim device lock android`."
922
- });
923
- const root = d.findProjectRoot(process.cwd());
924
- if (!root) return report(NO_PROJECT_REFUSAL);
925
- const durationText = String(opts.for ?? DEFAULT_FOR).trim();
926
- const duration = parseLeaseDuration(durationText);
927
- if ("error" in duration) return report({
928
- code: "STIM_BAD_ARG",
929
- message: duration.error,
930
- remedy: "Pass a whole number of seconds or minutes from 10s to 30m, e.g. --for 90s or --for 10m."
931
- });
932
- const wait = parseDeviceWait(opts.wait);
933
- if ("error" in wait) return report({
934
- code: "STIM_BAD_ARG",
935
- message: wait.error,
936
- remedy: "Pass a whole number of seconds, e.g. --wait 90. `--wait 0` refuses a leased device at once."
937
- });
938
- const idLabel = platform === "ios" ? "udid" : "serial";
939
- const deadline = d.now() + wait.seconds * 1e3;
940
- const lastLine = { at: null };
941
- const owned = idArg ? await findOwnedVirtualDevice(d.getProject(root), platform, idArg, d.avdNameOf) : null;
942
- if (owned && opts.slot && opts.slot !== owned.slot) return report({
943
- code: "STIM_BAD_ARG",
944
- message: `${owned.id} is this workspace's ${platform} device in slot ${owned.slot}, not ${opts.slot}.`,
945
- remedy: `Run \`stim device lock ${platform} ${owned.id}\` without --slot, or with --slot ${owned.slot}.`
946
- });
947
- const held = owned ? d.io.readHolder(root)[deviceSlotKey(platform, owned.slot)] : void 0;
948
- if (owned && held && held.id !== owned.id) return report({
949
- code: "STIM_DEVICE_BUSY",
950
- message: `This workspace already leases ${held.id} for ${platform} in slot ${owned.slot}, and a workspace holds one lease per platform and slot.`,
951
- remedy: `Release it with \`stim device unlock ${platform}${owned.slot === "default" ? "" : ` --slot ${owned.slot}`}\` once nothing depends on it, then lock ${owned.id}.`
952
- });
953
- const slot = owned ? owned.slot === "default" ? void 0 : owned.slot : opts.slot;
954
- const device = owned ? owned : idArg ? await resolveDevice(platform, idArg, d) : await poolDevice(platform, idLabel, wait.seconds, deadline, root, d, opts.slot);
955
- if (isFailure(device)) return report(device);
956
- for (;;) {
957
- const outcome = await d.waitForDevice({
958
- ...slot ? { slot } : {},
959
- root,
960
- platform,
961
- id: device.id,
962
- idLabel,
963
- waitSeconds: wait.seconds,
964
- now: d.now,
965
- sleep: d.sleep,
966
- warn: (line) => d.note(chalk.yellow(line)),
967
- io: d.io,
968
- deadline,
969
- lastLine
970
- });
971
- if (outcome.status === "refused") return report({
972
- ...outcome.refusal,
973
- lease: outcome.refusal.lease
974
- });
975
- const taken = d.takeLease({
976
- ...slot ? { slot } : {},
977
- root,
978
- platform,
979
- id: device.id,
980
- deviceName: device.deviceName,
981
- kind: "declared",
982
- durationMs: duration.ms
983
- }, d.io);
984
- if (taken.status === "unreadable") return report({
985
- code: "STIM_DEVICE_BUSY",
986
- message: `The lease file at ${taken.path} does not parse, so Stim cannot tell who holds that device.`,
987
- remedy: `Read ${taken.path} and, once you know no run depends on it, delete it. \`stim gc\` reports it on every run.`,
988
- lease: {
989
- platform: null,
990
- id: null,
991
- deviceName: null,
992
- holder: null,
993
- expiresAt: null
994
- }
995
- });
996
- if (taken.status === "held") continue;
997
- const facts = {
998
- ...taken.lease.slot ? { slot: taken.lease.slot } : {},
999
- platform,
1000
- id: taken.lease.id,
1001
- deviceName: taken.lease.deviceName,
1002
- holder: taken.lease.holder,
1003
- kind: "declared",
1004
- grantedAt: taken.lease.grantedAt,
1005
- expiresAt: taken.lease.expiresAt,
1006
- leaseSeconds: Math.round(duration.ms / 1e3)
1007
- };
1008
- if (json) d.out(JSON.stringify(facts));
1009
- else d.out(chalk.green(grantLine(facts, durationText)));
1010
- return facts;
1011
- }
1012
- }
1013
- async function runUnlock(platformArg, opts = {}, overrides = {}) {
1014
- const d = {
1015
- ...DEFAULT_DEPS,
1016
- ...overrides
1017
- };
1018
- const json = Boolean(opts.json);
1019
- const report = (failure) => {
1020
- d.note(chalk.red(`${failure.code}: ${failure.message}`));
1021
- if (failure.remedy) d.note(chalk.dim(failure.remedy));
1022
- if (json) d.out(JSON.stringify({
1023
- code: failure.code,
1024
- message: failure.message,
1025
- remedy: failure.remedy
1026
- }));
1027
- return failure;
1028
- };
1029
- const platform = platformArg === void 0 ? null : readPlatform(platformArg);
1030
- if (platformArg !== void 0 && !platform) return report({
1031
- code: "STIM_BAD_ARG",
1032
- message: `\`stim device unlock\` takes ios or android, not ${JSON.stringify(platformArg)}.`,
1033
- remedy: "Run `stim device unlock` for every lease this workspace holds, or name one platform."
1034
- });
1035
- const root = d.findProjectRoot(process.cwd());
1036
- if (!root) return report(NO_PROJECT_REFUSAL);
1037
- const released = d.releaseLeases(root, {
1038
- platform,
1039
- ...opts.slot ? { slot: opts.slot } : {}
1040
- }, d.io);
1041
- if (released.length === 0) d.note(chalk.dim(`No ${platform ? `${platform} ` : ""}device lease to release for ${root}. \`stim status\` lists every lease on this machine.`));
1042
- if (json) d.out(JSON.stringify(released.map((lease) => ({
1043
- ...lease,
1044
- holder: root
1045
- }))));
1046
- else for (const lease of released) d.out(chalk.green(releasedLine(lease)));
1047
- return released;
1048
- }
1049
- function registerDevice(program, deps = {}) {
1050
- const device = program.command("device").description("Lease a connected physical device to this workspace, give it back, or provision iOS signing for it");
1051
- device.command("lock").argument("<platform>", "ios or android").argument("[id]", "the UDID or serial to lease, a connected device or this workspace's own simulator or emulator; without one, the first free connected device is used").description("Lease a connected physical device, or this workspace's own simulator or emulator, to this workspace for a declared time, so another workspace's `--device` run waits and agents see the device as driven. Nothing but this command and a `--device` run moves the expiry.").option("--for <duration>", `How long to hold it: a whole number of seconds or minutes from 10s to 30m (default ${DEFAULT_FOR})`).option("--wait <seconds>", "How long to wait for a device another workspace holds, before refusing with STIM_DEVICE_BUSY (default 60, 0 refuses at once)").option("--slot <name>", "Use this workspace device slot", parseDeviceSlotOption).option("--json", "print the lease as JSON on stdout").action(async (platform, id, opts) => {
1052
- if ("code" in await runLock(platform, id, opts, deps)) process.exit(1);
1053
- });
1054
- device.command("unlock").argument("[platform]", "ios or android; without one, every lease this workspace holds is released").description("Release the device lease or leases this workspace holds. Releasing nothing is not an error.").option("--slot <name>", "Use this workspace device slot", parseDeviceSlotOption).option("--json", "print the released leases as JSON on stdout").action(async (platform, opts) => {
1055
- const result = await runUnlock(platform, opts, deps);
1056
- if (!Array.isArray(result)) process.exit(1);
1057
- });
1058
- device.command("provision").argument("<platform>", "ios").argument("[udid]", "the connected iPhone or iPad to provision for; required when more than one is connected").description("Register a connected iPhone with the project's Apple Developer team and create or refresh its iOS App Development profile, through xcodebuild -allowProvisioningUpdates. It lists the account changes and asks first; no build ever does this.").option("--scheme <name>", "Xcode scheme whose signed targets to provision (default: ios.scheme, then detected)").option("--configuration <name>", "build configuration to provision (default: ios.configuration, then Debug)").option("--yes", "confirm the listed Apple Developer account changes without a prompt").option("--json", "print the plan and result, or the refusal, as JSON on stdout").action(async (platform, udid, opts) => {
1059
- const root = findProjectRoot$1(process.cwd()) ?? process.cwd();
1060
- const { value: result, interrupted } = await runProcessOperation(root, (operation) => runProvision(platform, udid, opts, { operation }));
1061
- if ("code" in result) process.exit(interrupted ?? 1);
1062
- });
1063
- }
1064
- function deviceCommand(program) {
1065
- registerDevice(program);
1066
- }
1067
- //#endregion
1068
- export { deviceCommand as default, grantLine, registerDevice, releasedLine, runLock, runUnlock };
777
+ export { runProvision as n, confirmInTerminal as t };
@@ -1,28 +1,28 @@
1
1
  import { C as reportSignal, T as trackReportResource, t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { T as workspaceDerivedData, r as readWorkspaceState$1, y as sharedBuildCache } from "./workspace-state-kIZrdlSg.mjs";
3
- import { _ as loadConfig$1, at as realIo, s as configCorruptRepair, u as getConcurrencyLimits } from "./config-Cn94Jc0g.mjs";
4
- import { d as quotedPath, u as plural } from "./command-output-C8R1KIvi.mjs";
2
+ import { T as workspaceDerivedData, r as readWorkspaceState$1, y as sharedBuildCache } from "./workspace-state-DGwkPXwq.mjs";
3
+ import { _ as loadConfig$1, ot as realIo, s as configCorruptRepair, u as getConcurrencyLimits } from "./config-AbUjIBOQ.mjs";
4
+ import { d as quotedPath, u as plural } from "./command-output-BBW8eWPL.mjs";
5
5
  import { l as gitQuietAsync, o as git } from "./operation-exec-Dp4FuIGR.mjs";
6
- import { Bt as repoRoot, D as iosSimSlimProfileSetting, E as iosSimSlimDefaultSetting, G as remoteIosSetting, Nt as locallyKnownUpstreamAsync, Q as resolveSettings, R as projectSettingsContext, St as gitCommonDirAsync, U as remoteAndroidSetting, V as readCommittedSettings, Vt as repoRootAsync, Wt as resolveSourceCheckoutAsync, Y as resolveIosProjectDir, a as SETTING_SHAPE_REMEDY, an as makeTemporaryDirectory, at as settingsLayers, cn as temporaryRoot, ct as webSettings, i as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, in as filesystemDevice, it as settingValueAt, jt as listWorktreesAsync, k as mergeSettingsLayers, m as defaultAndroidLayout, q as resolveAndroidLayout, r as PATH_SETTINGS, rt as settingShapeErrors, st as unknownSettingKeys, tt as settingOrigin, yt as dirtyFingerprintFiles } from "./settings-CY5JZlNN.mjs";
7
- import { C as resolvePackageJson, _ as appProjectProblem, b as isPackageResolvable, v as detectIsExpo } from "./project-Sui52ywT.mjs";
8
- import { ft as POOL_SETTING_REMEDY, k as hostSystemImageArch, o as androidHome, vt as parkedMaxSetting } from "./android-CsPs-7Mg.mjs";
9
- import { An as checkEasAuth$1, Fn as providerFromConfig, Gn as easCliSupport, Kn as easCliUpgradeRemedy, Ln as resolveEasCliBin, Pn as ownerFromConfig, Wn as MIN_EAS_CLI_SIMULATOR_VERSION, a as projectCmakeLauncher, i as ccacheInstallCommand, jt as readInstalledEasCliVersionAsync } from "./ccache-Bm_A1xX9.mjs";
10
- import { wt as listBuildSlots } from "./workspaces-CmOcceDN.mjs";
11
- import { Y as podInstallCommand } from "./toolchain-mLA_km-b.mjs";
12
- import { N as listBuildLocks } from "./activity-DRMg4_mD.mjs";
13
- import { m as fingerprintProject, o as diffFingerprintSources } from "./build-cache-CZULpXVl.mjs";
14
- import { F as hostMemoryPressureAdvice, z as readHostMemoryPressureAsync } from "./ios-B1DYuOjh.mjs";
6
+ import { Bt as repoRoot, D as iosSimSlimProfileSetting, E as iosSimSlimDefaultSetting, G as remoteIosSetting, Nt as locallyKnownUpstreamAsync, Q as resolveSettings, R as projectSettingsContext, St as gitCommonDirAsync, U as remoteAndroidSetting, V as readCommittedSettings, Vt as repoRootAsync, Wt as resolveSourceCheckoutAsync, Y as resolveIosProjectDir, a as SETTING_SHAPE_REMEDY, an as makeTemporaryDirectory, at as settingsLayers, cn as temporaryRoot, ct as webSettings, i as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, in as filesystemDevice, it as settingValueAt, jt as listWorktreesAsync, k as mergeSettingsLayers, m as defaultAndroidLayout, q as resolveAndroidLayout, r as PATH_SETTINGS, rt as settingShapeErrors, st as unknownSettingKeys, tt as settingOrigin, yt as dirtyFingerprintFiles } from "./settings-D776ygML.mjs";
7
+ import { C as resolvePackageJson, _ as appProjectProblem, b as isPackageResolvable, v as detectIsExpo } from "./project-DPQjnpcI.mjs";
8
+ import { A as hostSystemImageArch, ft as POOL_SETTING_REMEDY, o as androidHome, vt as parkedMaxSetting } from "./android-DdKG6lyD.mjs";
9
+ import { An as checkEasAuth$1, Fn as providerFromConfig, Gn as easCliSupport, Kn as easCliUpgradeRemedy, Ln as resolveEasCliBin, Pn as ownerFromConfig, Wn as MIN_EAS_CLI_SIMULATOR_VERSION, a as projectCmakeLauncher, i as ccacheInstallCommand, jt as readInstalledEasCliVersionAsync } from "./ccache-B8gY50-h.mjs";
10
+ import { wt as listBuildSlots } from "./workspaces-7_RWoi6c.mjs";
11
+ import { X as podInstallCommand } from "./toolchain-DLdoyxIt.mjs";
12
+ import { N as listBuildLocks } from "./activity-BTaUf0tc.mjs";
13
+ import { m as fingerprintProject, o as diffFingerprintSources } from "./build-cache-DlC3owap.mjs";
14
+ import { F as hostMemoryPressureAdvice, z as readHostMemoryPressureAsync } from "./ios-CXnoVO_z.mjs";
15
15
  import { p as resolveOptimizations, u as compilerCacheFallbackMessage } from "./errors-DHm_U5gv.mjs";
16
- import { n as hasInstalledDependencies, r as installedNpmTreeIsValidAsync, t as dependencyState } from "./dependency-state-CojA2o0t.mjs";
17
- import { g as androidPathRoomRemedy, i as ccacheEnabled, l as androidSdkRefusal, m as androidPathRoomMessage, p as androidPathRoom, t as apkOutputsDir } from "./react-native-build-jUHnIfZ9.mjs";
18
- import { a as envSettingRefusal, i as configSettingRefusal } from "./settings-payload-DwQiEMCn.mjs";
19
- import { a as countLiveOwnedDevicesAsync, i as countLiveOwnedDevices } from "./device-capacity-Cd8lMSn3.mjs";
16
+ import { n as hasInstalledDependencies, r as installedNpmTreeIsValidAsync, t as dependencyState } from "./dependency-state-CPKAKCZ8.mjs";
17
+ import { g as androidPathRoomRemedy, i as ccacheEnabled, l as androidSdkRefusal, m as androidPathRoomMessage, p as androidPathRoom, t as apkOutputsDir } from "./react-native-build-BSoh4HkH.mjs";
18
+ import { a as envSettingRefusal, i as configSettingRefusal } from "./settings-payload-CE-NZ6Lq.mjs";
19
+ import { a as countLiveOwnedDevicesAsync, i as countLiveOwnedDevices } from "./device-capacity-C5C_jOQd.mjs";
20
20
  import { t as readDoctorFingerprint } from "./doctor-fingerprint-o7ZI9YLn.mjs";
21
21
  import { i as probeSigningIdentities } from "./ios-signing-BJzvDPfU.mjs";
22
22
  import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-DyDWurWG.mjs";
23
- import { n as simslimIsOnPath } from "./simslim-DCQwzoPy.mjs";
24
- import { t as MIN_EAS_CLI_BUILD_DOWNLOAD_VERSION } from "./eas-build-Dm6q68QY.mjs";
25
- import { r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-_aDifWW0.mjs";
23
+ import { n as simslimIsOnPath } from "./simslim-CbpHERcv.mjs";
24
+ import { t as MIN_EAS_CLI_BUILD_DOWNLOAD_VERSION } from "./eas-build-DIDOHw2P.mjs";
25
+ import { r as resolveAndroidCompilerCache, t as readAndroidCasToolchain } from "./android-cas-BH6K12__.mjs";
26
26
  import { existsSync, lstatSync, readFileSync, readdirSync, realpathSync, rmSync } from "node:fs";
27
27
  import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
28
28
  import { LAST_BUILD_KEYS, REPLACED_SETTINGS, isJsonObject, readBuildHistory, readJsonObject, readStats, replacementAdvice, settingDefinition } from "@stim-cli/core/state";
@@ -759,7 +759,7 @@ function checkSimSlim({ configured = false, slimByDefault = false, profileError
759
759
  }
760
760
  function checkIosHost(platform, host) {
761
761
  if (platform !== "ios" || host === "darwin") return null;
762
- return finding("note", `iOS runs through EAS on this ${host} host`, "Xcode, CocoaPods and simctl exist only on macOS, so `stim ios` cannot build or boot a simulator here. `stim ios --remote eas --eas-profile <simulator profile>` downloads a finished EAS development build and runs it on an EAS Simulator session driven through agent-device; Metro stays on this machine behind a tunnel.", "Install eas-cli and agent-device, then run `stim start --remote` and `stim ios --remote eas --eas-profile <profile>`. Read `stim guide metro` for the remote device backends.");
762
+ return finding("note", `iOS runs on a remote Mac or through EAS on this ${host} host`, "Xcode, CocoaPods and simctl exist only on macOS, so `stim ios` cannot build or boot a simulator here. `stim ios --remote <mac> --remote-build <mac>` builds the app on a Mac approved for builds and hosted simulators, with that Mac's Xcode and CocoaPods, and runs it on a simulator there; Metro stays on this machine. `stim ios --remote eas --eas-profile <simulator profile>` downloads a finished EAS development build and runs it on an EAS Simulator session driven through agent-device.", "Add a Mac with `stim doctor --fix` and run `stim ios --remote <mac> --remote-build <mac>`, or install eas-cli and agent-device and run `stim start --remote` and `stim ios --remote eas --eas-profile <profile>`. Read `stim guide settings` for remote machines and `stim guide metro` for the remote device backends.");
763
763
  }
764
764
  function checkXcodeEnvLineEndings(projectRoot, platform, host) {
765
765
  if (platform === "android" || host !== "win32") return null;
@@ -1,17 +1,18 @@
1
- import { Q as doctorIo, _ as loadConfig$1, p as getProject } from "./config-Cn94Jc0g.mjs";
2
- import { f as refuseNoProject, l as phaseLine } from "./command-output-C8R1KIvi.mjs";
3
- import { Bt as repoRoot, z as projectSettingsContextAsync } from "./settings-CY5JZlNN.mjs";
4
- import { f as projectRegistry, t as NO_PROJECT_REFUSAL } from "./project-Sui52ywT.mjs";
5
- import { Qn as inspectWatchmanMemory, f as inspectBudget, l as budgetLine, nr as memorySweepIsScoped } from "./ccache-Bm_A1xX9.mjs";
6
- import { c as inspectStimVersions, s as compareStimVersions } from "./eas-session-ledger-CBFo_Uo1.mjs";
7
- import { I as detectXcodeMajorAsync } from "./toolchain-mLA_km-b.mjs";
8
- import { H as memoryCulpritFindings, U as readMemoryCulpritsAsync, f as listAllIosSimsAsync, h as listIosRuntimesAsync, l as iosRuntimeMatches, x as pickDefaultIosCreation } from "./ios-B1DYuOjh.mjs";
9
- import { s as offloadCheck } from "./client-YxCer6ab.mjs";
10
- import { g as configuredMachines, p as inspectBuildMachines, v as inspectDeviceHostMachines } from "./selection-CXgM_VK_.mjs";
11
- import { r as maintenanceStatus, t as maintenanceLine } from "./status-7ULDEJ1e.mjs";
12
- import { a as writeIgnoreDirs, c as recordDoctorRun, i as watchedCheckouts, n as inspectNestedWorktrees, r as nestedWorktreeFinding } from "./doctor-watchman-BTW82PDC.mjs";
13
- import { c as checkWorktreeStorageLayout, l as readMachineSettings, o as runDoctor } from "./doctor-xf7ht-5n.mjs";
14
- import { h as resolveDeviceType, v as resolveRuntime } from "./support-BtlJKjyQ.mjs";
1
+ import { Q as doctorIo, _ as loadConfig$1, p as getProject, tt as keyConfirmer } from "./config-AbUjIBOQ.mjs";
2
+ import { f as refuseNoProject, l as phaseLine } from "./command-output-BBW8eWPL.mjs";
3
+ import { Bt as repoRoot, z as projectSettingsContextAsync } from "./settings-D776ygML.mjs";
4
+ import { f as projectRegistry, t as NO_PROJECT_REFUSAL } from "./project-DPQjnpcI.mjs";
5
+ import { Qn as inspectWatchmanMemory, f as inspectBudget, l as budgetLine, nr as memorySweepIsScoped } from "./ccache-B8gY50-h.mjs";
6
+ import { c as inspectStimVersions, s as compareStimVersions } from "./eas-session-ledger-CW3l-inB.mjs";
7
+ import { L as detectXcodeMajorAsync } from "./toolchain-DLdoyxIt.mjs";
8
+ import { H as memoryCulpritFindings, U as readMemoryCulpritsAsync, f as listAllIosSimsAsync, h as listIosRuntimesAsync, l as iosRuntimeMatches, x as pickDefaultIosCreation } from "./ios-CXnoVO_z.mjs";
9
+ import { s as offloadCheck } from "./client-DrHykA24.mjs";
10
+ import { g as configuredMachines, p as inspectBuildMachines, v as inspectDeviceHostMachines } from "./selection-PCMT97XD.mjs";
11
+ import { r as maintenanceStatus, t as maintenanceLine } from "./status-CK7ZoEhV.mjs";
12
+ import { a as writeIgnoreDirs, c as recordDoctorRun, i as watchedCheckouts, n as inspectNestedWorktrees, r as nestedWorktreeFinding } from "./doctor-watchman-D1IyMle9.mjs";
13
+ import { c as checkWorktreeStorageLayout, l as readMachineSettings, o as runDoctor } from "./doctor-CJSB5q-s.mjs";
14
+ import { h as resolveDeviceType, v as resolveRuntime } from "./support-DUevTPur.mjs";
15
+ import { t as confirmInTerminal } from "./device-provision-B5Ms94qY.mjs";
15
16
  import { isJsonObject, maintenanceNdjsonFile, readHostedAppMetadata, readHostedSessions } from "@stim-cli/core/state";
16
17
  import { dirname, join, sep } from "path";
17
18
  import chalk from "chalk";
@@ -483,11 +484,14 @@ async function assembleDoctorReport(root, opts, version, prepared, inspectVersio
483
484
  findings.push(...budget.findings);
484
485
  const watchmanMemory = withoutUnhandledRejection(inspectWatchmanMemory(env, operation));
485
486
  const tickets = /* @__PURE__ */ new Map();
487
+ const interactive = !operation && opts.fix === true && !opts.json && process.stdin.isTTY === true && process.stderr.isTTY === true;
488
+ const confirmKey = keyConfirmer(interactive ? confirmInTerminal : null);
486
489
  const deviceHosts = withoutUnhandledRejection(inspectDeviceHostMachines({
487
490
  fix: opts.fix === true,
488
491
  version,
489
492
  tickets,
490
- operation
493
+ operation,
494
+ confirmKey
491
495
  }, io));
492
496
  const nestedWorktrees = await inspectNestedWorktrees(root);
493
497
  const watched = withoutUnhandledRejection(watchedCheckouts(nestedWorktrees.map((entry) => entry.checkout)));
@@ -500,6 +504,7 @@ async function assembleDoctorReport(root, opts, version, prepared, inspectVersio
500
504
  version,
501
505
  tickets,
502
506
  operation,
507
+ confirmKey,
503
508
  check: targetInspectors.length ? offloadCheck(root, async () => (await Promise.all(targetInspectors.map((inspect) => inspect()))).flat()) : null
504
509
  }, io));
505
510
  const watchman = await watchmanMemory;
@@ -1,2 +1,2 @@
1
- import { a as readDoctorReport, i as parseDoctorPlatform, n as doctorCommand, o as shadowedStimFinding, r as doctorSuccessLines, s as toolchainReport, t as applySandboxFix } from "./doctor-Bz_ouYAW.mjs";
1
+ import { a as readDoctorReport, i as parseDoctorPlatform, n as doctorCommand, o as shadowedStimFinding, r as doctorSuccessLines, s as toolchainReport, t as applySandboxFix } from "./doctor-CLE4AZEI.mjs";
2
2
  export { applySandboxFix, doctorCommand as default, doctorSuccessLines, parseDoctorPlatform, readDoctorReport, shadowedStimFinding, toolchainReport };
@@ -1,4 +1,4 @@
1
- import { m as fingerprintProject } from "./build-cache-CZULpXVl.mjs";
1
+ import { m as fingerprintProject } from "./build-cache-DlC3owap.mjs";
2
2
  import * as fingerprint from "@expo/fingerprint";
3
3
  //#region bin/doctor-fingerprint.ts
4
4
  let input = "";
@@ -1,8 +1,8 @@
1
- import { E as upsertProject, O as withConfigLockAsync$1, d as getConfigDir, p as getProject } from "./config-Cn94Jc0g.mjs";
1
+ import { E as upsertProject, O as withConfigLockAsync$1, d as getConfigDir, p as getProject } from "./config-AbUjIBOQ.mjs";
2
2
  import { l as gitQuietAsync } from "./operation-exec-Dp4FuIGR.mjs";
3
- import { Vt as repoRootAsync, jt as listWorktreesAsync } from "./settings-CY5JZlNN.mjs";
4
- import { f as projectRegistry } from "./project-Sui52ywT.mjs";
5
- import { d as parseWatchRoots, m as runWatchman, s as compareStimVersions } from "./eas-session-ledger-CBFo_Uo1.mjs";
3
+ import { Vt as repoRootAsync, jt as listWorktreesAsync } from "./settings-D776ygML.mjs";
4
+ import { f as projectRegistry } from "./project-DPQjnpcI.mjs";
5
+ import { d as parseWatchRoots, m as runWatchman, s as compareStimVersions } from "./eas-session-ledger-CW3l-inB.mjs";
6
6
  import { mkdirSync, readFileSync, realpathSync, renameSync, rmSync, unlinkSync, writeFileSync } from "node:fs";
7
7
  import { dirname, isAbsolute, join, relative, sep } from "node:path";
8
8
  import { isJsonObject } from "@stim-cli/core/state";
@@ -1,7 +1,7 @@
1
1
  import { D as ownership_claim_exports, c as throwIfCancelled, t as getExecutor } from "./exec-aULwtNly.mjs";
2
2
  import { a as killOnAbort, r as childEnvironment } from "./operation-exec-Dp4FuIGR.mjs";
3
- import { Gn as easCliSupport, Kn as easCliUpgradeRemedy, Ln as resolveEasCliBin, Vn as remoteCliInvocation } from "./ccache-Bm_A1xX9.mjs";
4
- import { M as acquireBuildLock, P as releaseBuildLock } from "./activity-DRMg4_mD.mjs";
3
+ import { Gn as easCliSupport, Kn as easCliUpgradeRemedy, Ln as resolveEasCliBin, Vn as remoteCliInvocation } from "./ccache-B8gY50-h.mjs";
4
+ import { M as acquireBuildLock, P as releaseBuildLock } from "./activity-BTaUf0tc.mjs";
5
5
  import { createHash } from "node:crypto";
6
6
  import { existsSync, realpathSync, statSync } from "node:fs";
7
7
  //#region src/engine/eas-build.ts
@@ -1,9 +1,9 @@
1
1
  import { c as throwIfCancelled, t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { p as getProject } from "./config-Cn94Jc0g.mjs";
2
+ import { p as getProject } from "./config-AbUjIBOQ.mjs";
3
3
  import { r as childEnvironment } from "./operation-exec-Dp4FuIGR.mjs";
4
- import { dt as detectProviders, ft as planMetroReach } from "./settings-CY5JZlNN.mjs";
5
- import { M as readMetroTunnel, P as readRemoteSession } from "./project-Sui52ywT.mjs";
6
- import { Gn as easCliSupport, Hn as remoteCommand, Ln as resolveEasCliBin, Mn as isEasAuthFailureText, Un as MIN_EAS_CLI_DEVICE_VERSION, Wn as MIN_EAS_CLI_SIMULATOR_VERSION, jt as readInstalledEasCliVersionAsync } from "./ccache-Bm_A1xX9.mjs";
4
+ import { dt as detectProviders, ft as planMetroReach } from "./settings-D776ygML.mjs";
5
+ import { M as readMetroTunnel, P as readRemoteSession } from "./project-DPQjnpcI.mjs";
6
+ import { Gn as easCliSupport, Hn as remoteCommand, Ln as resolveEasCliBin, Mn as isEasAuthFailureText, Un as MIN_EAS_CLI_DEVICE_VERSION, Wn as MIN_EAS_CLI_SIMULATOR_VERSION, jt as readInstalledEasCliVersionAsync } from "./ccache-B8gY50-h.mjs";
7
7
  //#region src/engine/eas-fallback.ts
8
8
  const AVAILABILITY_TIMEOUT_MS = 3e4;
9
9
  function unusable(code, reason) {
@@ -1,9 +1,9 @@
1
1
  import { C as reportSignal, t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { M as withDirLock$1, N as withDirLockAsync$1, w as workspaceAgentDeviceDir } from "./workspace-state-kIZrdlSg.mjs";
3
- import { G as projectDeviceSlots, V as deviceSlotKey } from "./config-Cn94Jc0g.mjs";
4
- import { a as formatElapsed, o as formatLongDuration, r as clockTime, u as plural } from "./command-output-C8R1KIvi.mjs";
5
- import { n as isInsideProject } from "./metro-BnhXV2Mj.mjs";
6
- import { r as cdpEndpoint } from "./state-B2QJbDwz.mjs";
2
+ import { M as withDirLock$1, N as withDirLockAsync$1, w as workspaceAgentDeviceDir } from "./workspace-state-DGwkPXwq.mjs";
3
+ import { G as projectDeviceSlots, V as deviceSlotKey } from "./config-AbUjIBOQ.mjs";
4
+ import { a as formatElapsed, o as formatLongDuration, r as clockTime, u as plural } from "./command-output-BBW8eWPL.mjs";
5
+ import { n as isInsideProject } from "./metro-BMQHczcf.mjs";
6
+ import { r as cdpEndpoint } from "./state-D5ZxwCGJ.mjs";
7
7
  import { accessSync, constants, existsSync, mkdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
8
8
  import { delimiter, dirname, join, resolve } from "node:path";
9
9
  import { workspaceId } from "@stim-cli/core";
@@ -1,12 +1,12 @@
1
1
  import { t as getExecutor } from "./exec-aULwtNly.mjs";
2
- import { r as readWorkspaceState$1 } from "./workspace-state-kIZrdlSg.mjs";
3
- import { H as deviceSlotPlatforms, V as deviceSlotKey, p as getProject } from "./config-Cn94Jc0g.mjs";
4
- import { v as launchErrorPreview } from "./command-output-C8R1KIvi.mjs";
5
- import { I as readWorkspaceLaunches } from "./project-Sui52ywT.mjs";
6
- import { o as androidHome, u as androidToolCwd } from "./android-CsPs-7Mg.mjs";
7
- import { d as resolveProjectMetro } from "./metro-BnhXV2Mj.mjs";
8
- import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-D577ApKG.mjs";
9
- import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-DRMg4_mD.mjs";
2
+ import { r as readWorkspaceState$1 } from "./workspace-state-DGwkPXwq.mjs";
3
+ import { H as deviceSlotPlatforms, V as deviceSlotKey, p as getProject } from "./config-AbUjIBOQ.mjs";
4
+ import { v as launchErrorPreview } from "./command-output-BBW8eWPL.mjs";
5
+ import { I as readWorkspaceLaunches } from "./project-DPQjnpcI.mjs";
6
+ import { o as androidHome, u as androidToolCwd } from "./android-DdKG6lyD.mjs";
7
+ import { d as resolveProjectMetro } from "./metro-BMQHczcf.mjs";
8
+ import { i as parseLogcatLine, n as androidLogGroups, r as isAndroidCrashText } from "./android-BEQUDpOg.mjs";
9
+ import { S as parseLease, v as deviceLeasePath, y as fileLeaseIo } from "./activity-BTaUf0tc.mjs";
10
10
  import { r as deviceConsoleLevel } from "./ios-device-CiBA-er9.mjs";
11
11
  import { createHash, randomUUID } from "node:crypto";
12
12
  import { existsSync, readFileSync, renameSync } from "node:fs";
@@ -1,3 +1,3 @@
1
- import { _t as findStaleDeviceRecords, ft as describeParkedSims, gt as findOrphanedDevices, pt as describeUnverifiableDevices, q as selectCaches, ut as deleteParkedSims, vt as findStaleProjectDevices } from "./ccache-Bm_A1xX9.mjs";
2
- import { a as runGc, i as readGcReport, n as executeGc, o as withGcMaintenanceClaim, r as gcCommand, s as formatGcReport, t as collectGcReport } from "./gc-DM5oMm-J.mjs";
1
+ import { _t as findStaleDeviceRecords, ft as describeParkedSims, gt as findOrphanedDevices, pt as describeUnverifiableDevices, q as selectCaches, ut as deleteParkedSims, vt as findStaleProjectDevices } from "./ccache-B8gY50-h.mjs";
2
+ import { a as runGc, i as readGcReport, n as executeGc, o as withGcMaintenanceClaim, r as gcCommand, s as formatGcReport, t as collectGcReport } from "./gc-Co7PE36D.mjs";
3
3
  export { collectGcReport, gcCommand as default, deleteParkedSims, describeParkedSims, describeUnverifiableDevices, executeGc, findOrphanedDevices, findStaleDeviceRecords, findStaleProjectDevices, formatGcReport, readGcReport, runGc, selectCaches, withGcMaintenanceClaim };