stim 1.25.0 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +1 -1
  2. package/dist/{acquire-artifact-zA4S7RHE.mjs → acquire-artifact-BKN2Yuhg.mjs} +2 -2
  3. package/dist/{act-BbHS3oV8.mjs → act-ROviTF_t.mjs} +415 -118
  4. package/dist/{activity-BpjwrQXU.mjs → activity-Cd-ysFes.mjs} +6 -7
  5. package/dist/{agent-device-usage-output-Bnkerfod.mjs → agent-device-usage-output-C5nCKWp9.mjs} +5 -5
  6. package/dist/{android-CNZgRC-4.mjs → android--HBgpvpW.mjs} +5 -5
  7. package/dist/{android-BGwuK3Mc.mjs → android-Cd6w7_qw.mjs} +134 -57
  8. package/dist/{android-saBeB4lr.mjs → android-Deb9X3_Y.mjs} +37 -15
  9. package/dist/{android-Cjcj8MCw.mjs → android-DriNoAVy.mjs} +99 -47
  10. package/dist/{android-cas-BVqh2Zep.mjs → android-cas-D5e6ecUg.mjs} +4 -4
  11. package/dist/android-cas-compiler.mjs +1 -1
  12. package/dist/{android-project-CTYaETc0.d.mts → android-project-DUGMbq28.d.mts} +55 -1
  13. package/dist/api.d.mts +20 -7
  14. package/dist/api.mjs +42 -32
  15. package/dist/apk-signed-tail-BHQHx3Rm.mjs +142 -0
  16. package/dist/{artifact-Co8zixVx.mjs → artifact-0AGJYB9O.mjs} +28 -28
  17. package/dist/{artifact-DN8JNwqS.mjs → artifact-faemIZv5.mjs} +40 -30
  18. package/dist/{artifact-platform-CMRc0M_r.mjs → artifact-platform-BO2Uvk_A.mjs} +1 -1
  19. package/dist/{attempt-DW-mQqM7.mjs → attempt-ClyJlZPT.mjs} +4 -2
  20. package/dist/auto-placement-z-H5pJza.mjs +350 -0
  21. package/dist/{browser-web-CCgZsHmI.mjs → browser-web-slD8AvLp.mjs} +16 -17
  22. package/dist/{build-cache-CKCzxzxA.mjs → build-cache-gBJ-WKzA.mjs} +141 -37
  23. package/dist/{build-CAiw8Ezm.mjs → build-hS0QyFlQ.mjs} +38 -31
  24. package/dist/{build-plan-zCuHGlA8.mjs → build-plan-CBqYbzYM.mjs} +7 -6
  25. package/dist/{cache-manifest-BPXRONJz.mjs → cache-manifest-DEjqGGat.mjs} +1 -1
  26. package/dist/cache-manifest.mjs +1 -1
  27. package/dist/{budget-HyShrIpL.mjs → ccache-BWTze1Ls.mjs} +634 -1514
  28. package/dist/{cdp-BG3FJCCx.mjs → cdp-C3svvXiE.mjs} +1 -1
  29. package/dist/{chrome-BvV8ssI3.mjs → chrome-DyDWurWG.mjs} +1 -1
  30. package/dist/{cli-C4w607Pz.mjs → cli-ftXDLto1.mjs} +24 -23
  31. package/dist/cli.mjs +1 -1
  32. package/dist/{client-BQsmyp_-.mjs → client-xsdxrhWA.mjs} +77 -116
  33. package/dist/collector-run.d.mts +10 -9
  34. package/dist/collector-run.mjs +42 -27
  35. package/dist/{command-output-BBvS1H6v.mjs → command-output-Dj-WT4BP.mjs} +1 -1
  36. package/dist/{config-BZhXY15H.mjs → config-Cn94Jc0g.mjs} +343 -18
  37. package/dist/{launch-DscF1QfM.mjs → dependencies-BGokZ-Ng.mjs} +330 -279
  38. package/dist/{dependency-state-BwNCYG5Q.mjs → dependency-state-C3OtgG94.mjs} +14 -7
  39. package/dist/{detached-entry-KmieOKgN.mjs → detached-entry-BPlSaCwC.mjs} +1 -1
  40. package/dist/{dev-client-CHoXXZeg.mjs → dev-client-BMca82xo.mjs} +2 -2
  41. package/dist/{device-F5-4z9ef.mjs → device-BJm0irrq.mjs} +16 -16
  42. package/dist/{device-capacity-ZYaRALv5.mjs → device-capacity-6LP7QsaA.mjs} +103 -25
  43. package/dist/device-host-worker.mjs +19 -21
  44. package/dist/{device-ios-DkHBrmvH.mjs → device-ios-534c14fz.mjs} +288 -28
  45. package/dist/{device-lease-run-ogEeJ62K.mjs → device-lease-run-DwsGfjUN.mjs} +5 -5
  46. package/dist/{device-pool-BIg8MU8l.mjs → device-pool-BnQqvs6o.mjs} +3 -3
  47. package/dist/{device-B9FqTBYW.mjs → device-tM41-TUq.mjs} +25 -24
  48. package/dist/{doctor-A_Nr_fDe.mjs → doctor-Dbx1ZpD2.mjs} +1 -1
  49. package/dist/{doctor-k3P3PizH.mjs → doctor-DyqE9n1J.mjs} +28 -16
  50. package/dist/{doctor-Bm8TVpGn.mjs → doctor-F-3VUUyN.mjs} +128 -35
  51. package/dist/{doctor-fingerprint-zlujA1Gs.mjs → doctor-fingerprint-o7ZI9YLn.mjs} +9 -3
  52. package/dist/doctor-fingerprint.mjs +1 -1
  53. package/dist/{doctor-watchman-BovI1y3-.mjs → doctor-watchman-CxDbyrrt.mjs} +5 -5
  54. package/dist/{eas-build-CyDKNTBP.mjs → eas-build-CjNSWmjo.mjs} +4 -4
  55. package/dist/eas-fallback-9fqb46kW.mjs +87 -0
  56. package/dist/{eas-session-ledger-BMCA1gdO.mjs → eas-session-ledger-DrP4OuuM.mjs} +6 -6
  57. package/dist/{error-diagnostics-B1Mj_-7h.mjs → error-diagnostics-snej9k4j.mjs} +51 -25
  58. package/dist/{exec-VFRpu1iA.mjs → exec-aULwtNly.mjs} +57 -6
  59. package/dist/{gc-eaz403W6.mjs → gc-BRwAY3qT.mjs} +2 -2
  60. package/dist/{gc-B9jcnmIk.mjs → gc-CGZ1Yg88.mjs} +218 -72
  61. package/dist/{guide-DR0K0xW9.mjs → guide-_rfEh_zM.mjs} +839 -222
  62. package/dist/{hosted-android-Bvb2-ZxD.mjs → hosted-android-BMKzUNnY.mjs} +4 -4
  63. package/dist/{hosted-client-rsRqysJc.mjs → hosted-client-D7Pk_Oo1.mjs} +13 -9
  64. package/dist/{hosted-logs-CWKGYWNX.mjs → hosted-logs-B1gqQuva.mjs} +18 -12
  65. package/dist/hosted-logs-sync-Dg3qrZmV.mjs +195 -0
  66. package/dist/{hosted-macos-d0pv9Tth.mjs → hosted-macos-B9w4H8hc.mjs} +6 -6
  67. package/dist/{hosted-native-BxTizGU2.mjs → hosted-native-CdgaiuyP.mjs} +17 -17
  68. package/dist/{idle-shutdown-BIyfl0Zj.mjs → idle-shutdown-Cbvo5KEh.mjs} +21 -9
  69. package/dist/{ios-BRVM8b0P.mjs → ios-B5HlVMhQ.mjs} +138 -55
  70. package/dist/{ios-Dvt97HgQ.mjs → ios-Bk4mWbtS.mjs} +8 -8
  71. package/dist/{ios-ENC4sRPA.mjs → ios-CsRVik64.mjs} +7 -1
  72. package/dist/{ios-BQzvJlzw.mjs → ios-E26qSpkb.mjs} +94 -11
  73. package/dist/{ios-device-CKSvk0bu.mjs → ios-device-C_QkIf1Z.mjs} +3 -3
  74. package/dist/{ios-device-B6HK951C.mjs → ios-device-CiBA-er9.mjs} +1 -1
  75. package/dist/{ios-project-DCUDo06I.mjs → ios-project-D8Jcy_br.mjs} +22 -9
  76. package/dist/{ios-signing-4c_qXvQm.mjs → ios-signing-BJzvDPfU.mjs} +2 -2
  77. package/dist/{ios-state-CT9nV5SP.mjs → ios-state-BZ03NFgF.mjs} +1 -1
  78. package/dist/{js-swap-Z9HbC4cj.mjs → js-swap-Dg2a945i.mjs} +8 -7
  79. package/dist/{launch-D0lPvFFu.mjs → launch-CRyBeNsA.mjs} +53 -44
  80. package/dist/lightened-BCsdAGj_.mjs +171 -0
  81. package/dist/{logs-BsIRre8x.mjs → logs-CC_-ZzEE.mjs} +10 -174
  82. package/dist/{logs-Crs9y34Z.mjs → logs-aJQb-RDg.mjs} +112 -38
  83. package/dist/{macos-CcUlJPMu.mjs → macos-BGmTpnv9.mjs} +1 -1
  84. package/dist/{macos-D477nfzH.mjs → macos-DlCBhMw5.mjs} +73 -39
  85. package/dist/macos-run.mjs +1 -1
  86. package/dist/maintenance-run.mjs +30 -13
  87. package/dist/{metro-1pJgCX4U.mjs → metro-CvyD-xwe.mjs} +4 -4
  88. package/dist/{metro-gateway-Bp9gJQAN.mjs → metro-gateway-BnHdqMO_.mjs} +3 -4
  89. package/dist/{named-ports-BVbn8SvC.mjs → named-ports-BCyMWA6b.mjs} +3 -3
  90. package/dist/{native-android-BvMizJn1.mjs → native-android-DlpxCyOP.mjs} +17 -18
  91. package/dist/{native-gradle-artifact-inputs-BJscK4vN.mjs → native-gradle-artifact-inputs-C13qT7R_.mjs} +5 -5
  92. package/dist/{native-runtime-B9w_Qyz3.mjs → native-runtime-DqaIBO5w.mjs} +9 -9
  93. package/dist/{native-source-D-4Dh4JU.mjs → native-source-D1AzWiuP.mjs} +1 -1
  94. package/dist/{native-xcode-inputs-Cv4l-obn.mjs → native-xcode-inputs-B1W8SrxB.mjs} +3 -3
  95. package/dist/{native-xcode-ios-DGrg90hE.mjs → native-xcode-ios-QPP0Rm68.mjs} +17 -18
  96. package/dist/{ndjson-CgE_o3Dl.mjs → ndjson-Dy2W4vRa.mjs} +2 -2
  97. package/dist/offload-worker.d.mts +3 -1
  98. package/dist/offload-worker.mjs +34 -25
  99. package/dist/{operation-exec-CUZifp6Z.mjs → operation-exec-Dp4FuIGR.mjs} +1 -1
  100. package/dist/{ownership-jxxz-19m.mjs → ownership-Bx-0cku-.mjs} +3 -3
  101. package/dist/{page-CzEA_-5_.mjs → page-CQJlcj3x.mjs} +2 -2
  102. package/dist/{phone-reverses-CYb7RRAx.mjs → phone-reverses-C9yAaKEv.mjs} +18 -4
  103. package/dist/{placement-log-DjOXJRIH.mjs → placement-log-BXUbiZM6.mjs} +3 -3
  104. package/dist/{plan-placement-BqKgKHCi.mjs → plan-placement-UxnQjv5Z.mjs} +36 -10
  105. package/dist/{ports-DtS1Amb0.mjs → ports-uUrghqWN.mjs} +3 -3
  106. package/dist/prebuild-BDpToDgR.mjs +1246 -0
  107. package/dist/{project-BiC68mIp.mjs → project-DYj-HVx6.mjs} +17 -18
  108. package/dist/{pull-request-CbNlkFok.mjs → pull-request-BzLmzAIQ.mjs} +2 -2
  109. package/dist/pull-requests.mjs +1 -1
  110. package/dist/{react-native-android-DRYqoJc4.mjs → react-native-android-DDBccgJw.mjs} +56 -36
  111. package/dist/{react-native-build-CwZB-agu.mjs → react-native-build-DaK2IFyP.mjs} +9 -9
  112. package/dist/{react-native-doctor-BCrytK7h.mjs → react-native-doctor-B-Mw6DcR.mjs} +50 -9
  113. package/dist/{react-native-ios-Cr1buNFo.mjs → react-native-ios-DjYwUF9U.mjs} +45 -25
  114. package/dist/{recordings-BaoQ0t-J.mjs → recordings-C20iUZfp.mjs} +1 -1
  115. package/dist/{registration-CN6nlhcD.mjs → registration-BwCe64PH.mjs} +1 -1
  116. package/dist/{reload-Beftw2X3.mjs → reload-DJBeF_rC.mjs} +1 -1
  117. package/dist/{reload-FbSgMF8x.mjs → reload-fUdkH2_p.mjs} +16 -16
  118. package/dist/{remote-BuZj6AyU.mjs → remote-y6n99WMW.mjs} +22 -9
  119. package/dist/{result-CR2vk2cj.mjs → result-CTqBw2Te.mjs} +32 -21
  120. package/dist/{run-BtzE09Dl.mjs → run-DaCeNKRm.mjs} +3 -3
  121. package/dist/{selection-D5cxEl3t.mjs → selection-Bs8phwhN.mjs} +183 -62
  122. package/dist/{server-bare-CH9X0RLn.mjs → server-bare-BOh-iZEj.mjs} +2 -2
  123. package/dist/{server-command-CaBbDNU2.mjs → server-command-8CuA51Cv.mjs} +6 -6
  124. package/dist/{server-expo-Ck8EIidM.mjs → server-expo-ABQs2XFA.mjs} +4 -4
  125. package/dist/server-expo-Ba_Y21vB.mjs +2 -0
  126. package/dist/{settings-B5tCoq9N.mjs → settings-BDVI8Ivc.mjs} +331 -62
  127. package/dist/{settings-DzH9mGQZ.mjs → settings-CMHhQNwI.mjs} +24 -3
  128. package/dist/settings-payload-cm60Zhib.mjs +257 -0
  129. package/dist/settings-write-BdNRLlBn.mjs +185 -0
  130. package/dist/settings.schema.json +84 -39
  131. package/dist/{simslim-BjxszUAb.mjs → simslim-DCQwzoPy.mjs} +4 -3
  132. package/dist/{slot-launch-QeuJMlnJ.mjs → slot-launch-0l7RqSpr.mjs} +6 -6
  133. package/dist/{stage-D8xlRU2D.mjs → stage-F4cAfJGi.mjs} +2 -2
  134. package/dist/{start-C1JLjkNw.mjs → start-DcqnF9p8.mjs} +1 -1
  135. package/dist/{start-YMpNwLhh.mjs → start-DrPwER_2.mjs} +27 -23
  136. package/dist/{state-DMRNP7-4.mjs → state-BX1y5syV.mjs} +4 -5
  137. package/dist/{state-DPaM3u5K.mjs → state-CZxLyetD.mjs} +2 -3
  138. package/dist/{stats-CP7STzZw.mjs → stats-GxuCbles.mjs} +5 -5
  139. package/dist/{stats-report-n2U5plhk.mjs → stats-report-B86Cv7Uc.mjs} +1 -1
  140. package/dist/{status-Fect2w9R.mjs → status-7ULDEJ1e.mjs} +1 -1
  141. package/dist/{status-CRLiJ-O_.mjs → status-BfnK9pUd.mjs} +25 -26
  142. package/dist/{status-cNw6i0_t.mjs → status-Bj7ZYvvc.mjs} +1 -1
  143. package/dist/{status-watch-Bc2J4TZn.mjs → status-watch-BfabQn03.mjs} +5 -5
  144. package/dist/status-worker.mjs +1 -1
  145. package/dist/{stim-desktop-DS0mzR8U.mjs → stim-desktop-CbWo21kb.mjs} +2 -2
  146. package/dist/{stop-COP6PQqw.mjs → stop-CH79S3IZ.mjs} +5 -6
  147. package/dist/{stop-Db9Kh-UA.mjs → stop-D-EAr25B.mjs} +25 -22
  148. package/dist/{stop-Br7LKxBE.mjs → stop-x1Yu3He4.mjs} +2 -2
  149. package/dist/supervisor-run.d.mts +1 -0
  150. package/dist/supervisor-run.mjs +17 -18
  151. package/dist/{support-qKcbgmI5.mjs → support-Be0UeVZU.mjs} +10 -10
  152. package/dist/{support-Cxj9CmII.mjs → support-CNg_YsOk.mjs} +6 -6
  153. package/dist/{swiftpm-artifact-inputs-iY9fsmOc.mjs → swiftpm-artifact-inputs-uPqYvGBv.mjs} +4 -4
  154. package/dist/{swiftpm-macos-Bp_sn9P4.mjs → swiftpm-macos-Ch4YjY_A.mjs} +11 -12
  155. package/dist/toolchain-CbCG6C5Z.mjs +2413 -0
  156. package/dist/toolchain-JYAOquPg.mjs +2 -0
  157. package/dist/{trigger-CBMe2YLH.mjs → trigger-DMou-X7j.mjs} +3 -3
  158. package/dist/trigger-qp2ji5wE.mjs +2 -0
  159. package/dist/{warm-progress-BV3ZPmcY.mjs → warm-progress-C0RsbngN.mjs} +731 -728
  160. package/dist/{web-B4Yjyt1G.mjs → web-Cq_AQ4DK.mjs} +9 -10
  161. package/dist/web-Je6abcpz.mjs +2 -0
  162. package/dist/web-run.mjs +9 -9
  163. package/dist/windows-report.mjs +1 -1
  164. package/dist/{workspace-state-CPSp3mav.mjs → workspace-state-BjqdjnJR.mjs} +46 -8
  165. package/dist/{workspaces-C9w4aeXF.mjs → workspaces-DFbj07jp.mjs} +1801 -76
  166. package/dist/{worktree-CclFIe1Z.mjs → worktree-COAJ3-OD.mjs} +934 -511
  167. package/dist/{worktree-Ct9Gk3KL.mjs → worktree-JGUd_53L.mjs} +1 -1
  168. package/package.json +8 -8
  169. package/dist/ccache-h1FKhZeg.mjs +0 -143
  170. package/dist/created-devices-D2Aca-xu.mjs +0 -52
  171. package/dist/eas-fallback-gaZi-dJL.mjs +0 -381
  172. package/dist/hosted-ios-RtVcJH3u.mjs +0 -15
  173. package/dist/native-run-D5OJsGwA.mjs +0 -276
  174. package/dist/paths-DQtTgsBf.mjs +0 -42
  175. package/dist/prebuild-JUaqOLpc.mjs +0 -501
  176. package/dist/server-expo-C16Zf2k7.mjs +0 -2
  177. package/dist/settings-write-n0zwfohx.mjs +0 -360
  178. package/dist/toolchain-DB1aeqxO.mjs +0 -2
  179. package/dist/toolchain-VzLJzZ7O.mjs +0 -908
  180. package/dist/trigger-BLsHgAGR.mjs +0 -2
  181. package/dist/web-DS4UDWvf.mjs +0 -2
  182. package/dist/xcode-CiIIDnuD.mjs +0 -910
@@ -1,8 +1,7 @@
1
- import { S as process_identity_exports } from "./exec-VFRpu1iA.mjs";
2
- import { c as supervisorPidFile, g as workspaceStateFile$1 } from "./paths-DQtTgsBf.mjs";
3
- import { U as parseDeviceSlotKey, V as deviceSlotKey, _ as loadConfig$1, g as isPathPrefix, l as findEnclosingWorktreeRoot, p as getProject } from "./config-BZhXY15H.mjs";
4
- import { c as withWorkspaceStateLock, l as withWorkspaceStateLockAsync, o as updateWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey } from "./workspace-state-CPSp3mav.mjs";
5
- import { G as resolveAndroidLayout, Nt as repoRoot, nt as settingValueAt, ot as webSettings, q as resolveIosProjectDir } from "./settings-B5tCoq9N.mjs";
1
+ import { S as process_identity_exports } from "./exec-aULwtNly.mjs";
2
+ import { C as supervisorPidFile, c as withWorkspaceStateLock, j as workspaceStateFile$1, l as withWorkspaceStateLockAsync, o as updateWorkspaceState, r as readWorkspaceState$1, t as clearWorkspaceStateKey } from "./workspace-state-BjqdjnJR.mjs";
3
+ import { U as parseDeviceSlotKey, V as deviceSlotKey, _ as loadConfig$1, g as isPathPrefix$1, l as findEnclosingWorktreeRoot, p as getProject } from "./config-Cn94Jc0g.mjs";
4
+ import { It as repoRoot, Y as resolveIosProjectDir, ct as webSettings, it as settingValueAt, q as resolveAndroidLayout } from "./settings-BDVI8Ivc.mjs";
6
5
  import { existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, rmSync, statSync, writeFileSync } from "node:fs";
7
6
  import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
8
7
  import { projectRootDirectories } from "@stim-cli/core/state";
@@ -312,8 +311,8 @@ const nativeAndroidIntegration = {
312
311
  application: true,
313
312
  platforms: () => ["android"],
314
313
  validate: (operation) => operation === "android" ? null : void 0,
315
- android: async () => (await import("./native-android-BvMizJn1.mjs")).nativeAndroidProject(root),
316
- doctor: async () => (await import("./native-android-BvMizJn1.mjs")).nativeAndroidDoctor(root)
314
+ android: async () => (await import("./native-android-DlpxCyOP.mjs")).nativeAndroidProject(root),
315
+ doctor: async () => (await import("./native-android-DlpxCyOP.mjs")).nativeAndroidDoctor(root)
317
316
  };
318
317
  }
319
318
  };
@@ -741,8 +740,8 @@ const nativeXcodeProjectIntegration = {
741
740
  application: problem === null,
742
741
  platforms: () => problem ? [] : ["ios"],
743
742
  validate: (operation) => operation === "ios" ? problem : void 0,
744
- ios: async () => (await import("./native-xcode-ios-DGrg90hE.mjs")).nativeXcodeIosProject(root),
745
- doctor: async () => (await import("./native-xcode-ios-DGrg90hE.mjs")).nativeXcodeDoctor(root)
743
+ ios: async () => (await import("./native-xcode-ios-QPP0Rm68.mjs")).nativeXcodeIosProject(root),
744
+ doctor: async () => (await import("./native-xcode-ios-QPP0Rm68.mjs")).nativeXcodeDoctor(root)
746
745
  };
747
746
  }
748
747
  };
@@ -947,7 +946,7 @@ function createProjectRegistry(integrations) {
947
946
  //#region src/integrations/projects.ts
948
947
  const expo = {
949
948
  mode: MODE_EXPO,
950
- loadDevServer: async () => (await import("./server-expo-C16Zf2k7.mjs")).startExpoServer,
949
+ loadDevServer: async () => (await import("./server-expo-Ba_Y21vB.mjs")).startExpoServer,
951
950
  platforms(root) {
952
951
  const appJson = readAppJson(root);
953
952
  const config = appJson?.expo ?? appJson;
@@ -967,7 +966,7 @@ const expo = {
967
966
  };
968
967
  const reactNative = {
969
968
  mode: MODE_BARE,
970
- loadDevServer: async () => (await import("./server-bare-CH9X0RLn.mjs")).startBareServer,
969
+ loadDevServer: async () => (await import("./server-bare-BOh-iZEj.mjs")).startBareServer,
971
970
  platforms(root, { context, settings }) {
972
971
  if (!declaresAppDependency(readPackageJson(root))) return [];
973
972
  const platforms = [];
@@ -997,9 +996,9 @@ const projectRegistry = createProjectRegistry([
997
996
  ownedRoots: problem === null ? [join(root, "ios"), join(root, "android")] : [],
998
997
  platforms: (resolved) => nativeProjectIntegration(root).platforms(root, resolved),
999
998
  validate: (operation) => operation === "ios" || operation === "android" || operation === "dev-server" ? problem : void 0,
1000
- ios: async (settings) => (await import("./react-native-ios-Cr1buNFo.mjs")).reactNativeIosProject(root, settings),
1001
- android: async (resolved) => (await import("./react-native-android-DRYqoJc4.mjs")).reactNativeAndroidProject(root, resolved),
1002
- doctor: async () => (await import("./react-native-doctor-BCrytK7h.mjs")).reactNativeProjectDoctor(root)
999
+ ios: async (settings) => (await import("./react-native-ios-DjYwUF9U.mjs")).reactNativeIosProject(root, settings),
1000
+ android: async (resolved) => (await import("./react-native-android-DDBccgJw.mjs")).reactNativeAndroidProject(root, resolved),
1001
+ doctor: async () => (await import("./react-native-doctor-B-Mw6DcR.mjs")).reactNativeProjectDoctor(root)
1003
1002
  };
1004
1003
  }
1005
1004
  },
@@ -1013,9 +1012,9 @@ const projectRegistry = createProjectRegistry([
1013
1012
  application: true,
1014
1013
  platforms: ({ settings }) => settingValueAt(settings, "macos.product") && settingValueAt(settings, "macos.infoPlist") ? ["macos"] : [],
1015
1014
  validate: (operation) => operation === "macos" ? null : void 0,
1016
- macos: async () => (await import("./swiftpm-macos-Bp_sn9P4.mjs")).swiftpmMacosProject(root),
1015
+ macos: async () => (await import("./swiftpm-macos-Ch4YjY_A.mjs")).swiftpmMacosProject(root),
1017
1016
  doctor: async () => {
1018
- const { macosToolchain, macosToolchainAsync } = await import("./toolchain-DB1aeqxO.mjs");
1017
+ const { macosToolchain, macosToolchainAsync } = await import("./toolchain-JYAOquPg.mjs");
1019
1018
  return {
1020
1019
  inspect: () => [],
1021
1020
  offloadTargets: ({ options: { host = process.platform, platform, operation } }) => host === "darwin" && platform === void 0 ? async () => [{
@@ -1035,7 +1034,7 @@ const projectRegistry = createProjectRegistry([
1035
1034
  application: false,
1036
1035
  platforms: ({ settings }) => webSettings(settings).url !== null ? ["web"] : [],
1037
1036
  validate: (operation) => operation === "web" ? null : void 0,
1038
- web: async () => (await import("./browser-web-CCgZsHmI.mjs")).browserWebProject(root)
1037
+ web: async () => (await import("./browser-web-slD8AvLp.mjs")).browserWebProject(root)
1039
1038
  };
1040
1039
  }
1041
1040
  },
@@ -1105,7 +1104,7 @@ function startServerWorkspace(startDir, registry) {
1105
1104
  }
1106
1105
  function sameRepositoryApps(nearest, top, registry) {
1107
1106
  const worktree = expandedRealpath(top);
1108
- return Object.keys(loadConfig$1()?.projects ?? {}).filter((path) => path !== nearest && isPathPrefix(worktree, expandedRealpath(path)) && registry.isMobileProject(path));
1107
+ return Object.keys(loadConfig$1()?.projects ?? {}).filter((path) => path !== nearest && isPathPrefix$1(worktree, expandedRealpath(path)) && registry.isMobileProject(path));
1109
1108
  }
1110
1109
  function chooseServerWorkspace(nearest, top, candidates, owners) {
1111
1110
  const worktree = expandedRealpath(top);
@@ -1,5 +1,5 @@
1
- import { l as WorkspaceProcessCleanupError, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { c as gitQuiet, l as gitQuietAsync, r as childEnvironment, s as gitAsync, t as runOperationFile } from "./operation-exec-CUZifp6Z.mjs";
1
+ import { l as WorkspaceProcessCleanupError, t as getExecutor } from "./exec-aULwtNly.mjs";
2
+ import { c as gitQuiet, l as gitQuietAsync, r as childEnvironment, s as gitAsync, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
3
3
  //#region src/workspace/pull-request.ts
4
4
  const GH_TIMEOUT_MS = 2e4;
5
5
  const GH_ENV = {
@@ -1,2 +1,2 @@
1
- import { a as pullRequestLookup, c as selectPullRequest, i as parseRemoteRepo, l as worktreePullRequests, n as describePullRequest, o as pullRequestLookupAsync, r as endedPullRequest, s as pullRequestLookups, t as checkCounts } from "./pull-request-CbNlkFok.mjs";
1
+ import { a as pullRequestLookup, c as selectPullRequest, i as parseRemoteRepo, l as worktreePullRequests, n as describePullRequest, o as pullRequestLookupAsync, r as endedPullRequest, s as pullRequestLookups, t as checkCounts } from "./pull-request-BzLmzAIQ.mjs";
2
2
  export { checkCounts, describePullRequest, endedPullRequest, parseRemoteRepo, pullRequestLookup, pullRequestLookupAsync, pullRequestLookups, selectPullRequest, worktreePullRequests };
@@ -1,31 +1,30 @@
1
- import { C as reportSignal, _ as spawnDeclared, b as operationState, c as throwIfCancelled, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { H as deviceSlotPlatforms, p as getProject, q as validateDeviceSlot } from "./config-BZhXY15H.mjs";
1
+ import { C as reportSignal, _ as spawnDeclared, b as operationState, c as throwIfCancelled, t as getExecutor } from "./exec-aULwtNly.mjs";
2
+ import { r as readWorkspaceState } from "./workspace-state-BjqdjnJR.mjs";
3
+ import { H as deviceSlotPlatforms, p as getProject, q as validateDeviceSlot } from "./config-Cn94Jc0g.mjs";
3
4
  import { r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
- import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BBvS1H6v.mjs";
5
- import { a as killOnAbort, t as runOperationFile } from "./operation-exec-CUZifp6Z.mjs";
6
- import { r as readWorkspaceState } from "./workspace-state-CPSp3mav.mjs";
7
- import { G as resolveAndroidLayout, U as remoteEasFallbackSetting, Ut as makeTemporaryDirectory, V as realpathInside, Wt as removeTemporaryEntry, et as settingOriginScope, it as tunnelModeSetting, m as defaultAndroidLayout, rt as settingsLayers, z as publicUrlSetting } from "./settings-B5tCoq9N.mjs";
8
- import { v as detectIsExpo } from "./project-BiC68mIp.mjs";
9
- import { E as findBuildTool, F as listAvdsAsync, I as listInstalledSystemImages, K as ownedAvdSystemImage, V as ownedAvdDirectory, X as pickDefaultSystemImage, k as hostSystemImageArch, l as androidSystemImageAbi, r as androidBuildToolName } from "./android-Cjcj8MCw.mjs";
10
- import { $n as bundleInvocation, Kn as loadProjectProvider, Rn as processContext, Un as checkEasAuth, Z as statsProjectKey, Zn as resolveRemote } from "./budget-HyShrIpL.mjs";
11
- import { A as readAssetManifest, D as assetDiffReason, E as untrackedNativeFiles, O as captureAssetManifest, S as storedAssetManifest, T as untrackedMissLine, a as configInputsChanged, b as storeBuild, d as fingerprintProject, f as gitignoredFingerprintInputs, k as compareAssetManifests, l as filesystemBuildCapability, m as inputsChangedDuringBuild, n as buildCacheKey, r as changedDuringBuildLine, u as fingerprintDiffRecord, v as refingerprintAfterMutation, y as resolveBuild } from "./build-cache-CKCzxzxA.mjs";
12
- import { s as expoTelemetryEnv, t as cleanLine } from "./server-expo-Ck8EIidM.mjs";
13
- import { o as resolveCcache } from "./ccache-h1FKhZeg.mjs";
14
- import { _ as tailLines, h as startBuildHeartbeat, r as HEARTBEAT_INTERVAL_MS } from "./xcode-CiIIDnuD.mjs";
15
- import { r as androidToolchainAsync, t as androidRequirements } from "./toolchain-VzLJzZ7O.mjs";
16
- import { h as detectAppIds, m as detectAndroidPackage } from "./start-YMpNwLhh.mjs";
17
- import { c as readProductFlavors, h as androidPathRoomRefusal, n as buildAndroid, s as productFlavorRefusal } from "./react-native-build-CwZB-agu.mjs";
18
- import { t as readDoctorFingerprint } from "./doctor-fingerprint-zlujA1Gs.mjs";
19
- import { i as planEasDevelopmentBuild } from "./eas-build-CyDKNTBP.mjs";
20
- import { a as runPrebuild, c as fingerprintErrorMissReason, i as recordPrebuildAsync, n as planPrebuildAsync, o as staleNativeDirRefusal, s as explainBuildMiss, t as planPrebuild } from "./prebuild-JUaqOLpc.mjs";
21
- import { a as PLATFORM, c as androidGradleProject, g as dumpApkManifest, h as displayPath, i as NO_FINGERPRINT, l as androidJobLayout, o as androidBuildOptions, p as apkPackage, r as NO_DEVICE } from "./support-Cxj9CmII.mjs";
5
+ import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-Dj-WT4BP.mjs";
6
+ import { a as killOnAbort, t as runOperationFile } from "./operation-exec-Dp4FuIGR.mjs";
7
+ import { $t as makeTemporaryDirectory, B as publicUrlSetting, H as realpathInside, W as remoteEasFallbackSetting, at as settingsLayers, en as removeTemporaryEntry, m as defaultAndroidLayout, nt as settingOriginScope, ot as tunnelModeSetting, q as resolveAndroidLayout } from "./settings-BDVI8Ivc.mjs";
8
+ import { v as detectIsExpo } from "./project-DYj-HVx6.mjs";
9
+ import { E as findBuildTool, F as listAvdsAsync, I as listInstalledSystemImages, K as ownedAvdSystemImage, V as ownedAvdDirectory, X as pickDefaultSystemImage, k as hostSystemImageArch, l as androidSystemImageAbi, r as androidBuildToolName } from "./android-DriNoAVy.mjs";
10
+ import { An as checkEasAuth, Bn as bundleInvocation, Nn as loadProjectProvider, Rn as resolveRemote, Tn as processContext, s as resolveCcache } from "./ccache-BWTze1Ls.mjs";
11
+ import { ot as statsProjectKey } from "./workspaces-DFbj07jp.mjs";
12
+ import { G as tailLines, U as startBuildHeartbeat, j as HEARTBEAT_INTERVAL_MS, r as androidToolchainAsync, t as androidRequirements } from "./toolchain-CbCG6C5Z.mjs";
13
+ import { A as untrackedNativeFiles, C as resolveBuild, E as storedAssetManifest, M as captureAssetManifest, N as compareAssetManifests, P as readAssetManifest, S as refingerprintAfterMutation, _ as inputsChangedDuringBuild, a as configInputsChanged, d as filesystemBuildCapability, f as fingerprintDiffRecord, h as gitignoredFingerprintInputs, j as assetDiffReason, k as untrackedMissLine, m as fingerprintProject, n as buildCacheKey, r as changedDuringBuildLine, w as storeBuild } from "./build-cache-gBJ-WKzA.mjs";
14
+ import { s as expoTelemetryEnv, t as cleanLine } from "./server-expo-ABQs2XFA.mjs";
15
+ import { c as readProductFlavors, h as androidPathRoomRefusal, n as buildAndroid, s as productFlavorRefusal } from "./react-native-build-DaK2IFyP.mjs";
16
+ import { h as detectAppIds, m as detectAndroidPackage } from "./start-DrPwER_2.mjs";
17
+ import { t as readDoctorFingerprint } from "./doctor-fingerprint-o7ZI9YLn.mjs";
18
+ import { i as planEasDevelopmentBuild } from "./eas-build-CjNSWmjo.mjs";
19
+ import { a as runPrebuild, c as fingerprintErrorMissReason, d as memoizedFingerprint, i as recordPrebuildAsync, n as planPrebuildAsync, o as staleNativeDirRefusal, s as explainBuildMiss, t as planPrebuild } from "./prebuild-BDpToDgR.mjs";
20
+ import { a as PLATFORM, c as androidGradleProject, g as dumpApkManifest, h as displayPath, i as NO_FINGERPRINT, l as androidJobLayout, o as androidBuildOptions, p as apkPackage, r as NO_DEVICE } from "./support-CNg_YsOk.mjs";
22
21
  import { t as AndroidRecipeRefusal } from "./android-project-BCAAmMwz.mjs";
23
- import { u as resolveAndroidRunPlan } from "./result-CR2vk2cj.mjs";
24
- import { t as checkEasFallback } from "./eas-fallback-gaZi-dJL.mjs";
25
- import { n as androidProcessRuntime, t as androidMetroRuntime } from "./launch-D0lPvFFu.mjs";
26
- import { n as planFlagRefusal, r as planPayload, t as planCachedBuild } from "./build-plan-zCuHGlA8.mjs";
27
- import { n as detectEntryFile, r as refreshUpdatesManifestFile, t as UPDATES_MANIFEST_NAME } from "./js-swap-Z9HbC4cj.mjs";
28
- import { t as planHostedDevice } from "./plan-placement-BqKgKHCi.mjs";
22
+ import { u as resolveAndroidRunPlan } from "./result-CTqBw2Te.mjs";
23
+ import { n as androidProcessRuntime, t as androidMetroRuntime } from "./launch-CRyBeNsA.mjs";
24
+ import { t as checkEasFallback } from "./eas-fallback-9fqb46kW.mjs";
25
+ import { n as planFlagRefusal, r as planPayload, t as planCachedBuild } from "./build-plan-CBqYbzYM.mjs";
26
+ import { n as detectEntryFile, r as refreshUpdatesManifestFile, t as UPDATES_MANIFEST_NAME } from "./js-swap-Dg2a945i.mjs";
27
+ import { t as planHostedDevice } from "./plan-placement-UxnQjv5Z.mjs";
29
28
  import { constants, existsSync, mkdirSync, readFileSync, renameSync } from "node:fs";
30
29
  import { basename, dirname, isAbsolute, join, relative } from "node:path";
31
30
  import chalk from "chalk";
@@ -615,6 +614,7 @@ async function planReactNativeAndroid(root, opts, runtimeKind, { context: settin
615
614
  slot,
616
615
  platform: "android",
617
616
  machine: target.machine,
617
+ ...target.placement ? { placement: target.placement } : {},
618
618
  selectors: {
619
619
  ...target.systemImage ? { systemImage: target.systemImage } : {},
620
620
  ...target.deviceProfile ? { deviceProfile: target.deviceProfile } : {}
@@ -639,9 +639,14 @@ async function planReactNativeAndroid(root, opts, runtimeKind, { context: settin
639
639
  localOnlyFlags: typeof opts.systemImage === "string" ? ["--system-image"] : []
640
640
  }) } : {}
641
641
  });
642
+ if (hostedPlan.kind === "refused") return refuse({
643
+ code: hostedPlan.code,
644
+ message: hostedPlan.message,
645
+ remedy: hostedPlan.remedy
646
+ });
642
647
  if (hostedPlan.kind === "unknown") return refuse({
643
648
  code: "STIM_BAD_ARG",
644
- message: `android.remote is ${target.machine}, and its emulator ABI is unknown here: ${hostedPlan.reason}.`,
649
+ message: `android.remote is ${target.placement ?? target.machine}, and its emulator ABI is unknown here: ${hostedPlan.reason}.`,
645
650
  remedy: "Run `stim android` to build for the remote device, or unset android.remote to plan the owned emulator."
646
651
  });
647
652
  if (hostedPlan.kind === "local" && replacement.refusal) return refuse(replacement.refusal);
@@ -663,14 +668,19 @@ async function planReactNativeAndroid(root, opts, runtimeKind, { context: settin
663
668
  });
664
669
  let fingerprint;
665
670
  try {
666
- fingerprint = operation && reportSignal(operation) ? await readDoctorFingerprint(operation, {
667
- root,
668
- platform: PLATFORM,
669
- androidLayout: layout
670
- }) : await deps.fingerprint(root, {
671
+ fingerprint = (await memoizedFingerprint(root, {
671
672
  platform: PLATFORM,
672
673
  androidLayout: layout
673
- });
674
+ }, {
675
+ consult: build.cache.read,
676
+ operation: operation && reportSignal(operation) ? void 0 : operation,
677
+ record: false,
678
+ fingerprint: (projectRoot, fingerprintTarget) => operation && reportSignal(operation) ? readDoctorFingerprint(operation, {
679
+ root: projectRoot,
680
+ platform: PLATFORM,
681
+ androidLayout: layout
682
+ }) : deps.fingerprint(projectRoot, fingerprintTarget)
683
+ })).fingerprint;
674
684
  } catch (error) {
675
685
  operation?.signal.throwIfAborted();
676
686
  return refuse({
@@ -744,7 +754,7 @@ function reactNativeAndroidProject(root, { context, settings }, dependencies = {
744
754
  artifact: (artifactContext) => reactNativeAndroidArtifact(artifactContext, isExpo, layout, context, dependencies)
745
755
  };
746
756
  }
747
- function reactNativeAndroidArtifact({ operation, root, buildLog, writer, settings, buildPlan, target, phase, out, step, estimates }, isExpo, layout, context, { fingerprint = fingerprintProject, untracked = untrackedNativeFiles, resolveCached = resolveBuild, storeCached = storeBuild, storedAssets = storedAssetManifest, captureAssets = captureAssetManifest, loadProvider = loadProjectProvider, planPrebuildFor = planPrebuild, prebuild = runPrebuild, build = buildAndroid, ccacheFor = resolveCcache, swapApk = swapApkBundle, readState = readWorkspaceState }) {
757
+ function reactNativeAndroidArtifact({ operation, root, buildLog, writer, settings, buildPlan, target, phase, out, step, estimates }, isExpo, layout, context, { fingerprint = fingerprintProject, memoize = memoizedFingerprint, untracked = untrackedNativeFiles, resolveCached = resolveBuild, storeCached = storeBuild, storedAssets = storedAssetManifest, captureAssets = captureAssetManifest, loadProvider = loadProjectProvider, planPrebuildFor = planPrebuild, prebuild = runPrebuild, build = buildAndroid, ccacheFor = resolveCcache, swapApk = swapApkBundle, readState = readWorkspaceState }) {
748
758
  const { variant, release, profile, cas } = buildPlan;
749
759
  const runOptions = {
750
760
  ...variant ? { variant } : {},
@@ -758,6 +768,7 @@ function reactNativeAndroidArtifact({ operation, root, buildLog, writer, setting
758
768
  let initialSources = [];
759
769
  let prebuildRan = false;
760
770
  let editedConfig = [];
771
+ let fingerprintCheck = null;
761
772
  const identity = () => ({
762
773
  hash,
763
774
  key: buildCacheKey("android", hash, runOptions)
@@ -800,13 +811,22 @@ function reactNativeAndroidArtifact({ operation, root, buildLog, writer, setting
800
811
  return null;
801
812
  };
802
813
  return {
814
+ fingerprintCheck: () => fingerprintCheck,
803
815
  async identity() {
804
816
  let computed;
805
817
  try {
806
- computed = await fingerprint(root, {
818
+ const memo = await memoize(root, {
807
819
  platform: "android",
808
820
  androidLayout: layout
821
+ }, {
822
+ consult: buildPlan.cache.read,
823
+ record: true,
824
+ operation,
825
+ fingerprint
809
826
  });
827
+ computed = memo.fingerprint;
828
+ fingerprintCheck = memo.check;
829
+ if (memo.memoHit) phase("fingerprint", chalk.dim("matches a recorded fingerprint of this tree; confirming it in the background"));
810
830
  } catch (error) {
811
831
  const message = String(error?.message || error);
812
832
  throw new AndroidRecipeRefusal({
@@ -976,7 +996,7 @@ function reactNativeAndroidArtifact({ operation, root, buildLog, writer, setting
976
996
  target: async () => ({
977
997
  platform: "android",
978
998
  local: await androidToolchainAsync(operation?.env),
979
- requires: androidRequirements(root)
999
+ requires: androidRequirements(root, layout.gradleRoot)
980
1000
  }),
981
1001
  request: {
982
1002
  platform: "android",
@@ -1,14 +1,14 @@
1
- import { _ as spawnDeclared, t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { o as sharedCompilationCache } from "./paths-DQtTgsBf.mjs";
1
+ import { _ as spawnDeclared, t as getExecutor } from "./exec-aULwtNly.mjs";
2
+ import { x as sharedCompilationCache } from "./workspace-state-BjqdjnJR.mjs";
3
3
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
- import { l as phaseLine } from "./command-output-BBvS1H6v.mjs";
5
- import { a as killOnAbort } from "./operation-exec-CUZifp6Z.mjs";
6
- import { C as resolvePackageJson } from "./project-BiC68mIp.mjs";
7
- import { o as androidHome } from "./android-Cjcj8MCw.mjs";
8
- import { r as register } from "./cache-manifest-BPXRONJz.mjs";
4
+ import { l as phaseLine } from "./command-output-Dj-WT4BP.mjs";
5
+ import { a as killOnAbort } from "./operation-exec-Dp4FuIGR.mjs";
6
+ import { C as resolvePackageJson } from "./project-DYj-HVx6.mjs";
7
+ import { o as androidHome } from "./android-DriNoAVy.mjs";
8
+ import { n as CCACHE_UNAVAILABLE, o as readCcacheActivity } from "./ccache-BWTze1Ls.mjs";
9
+ import { r as register } from "./cache-manifest-DEjqGGat.mjs";
10
+ import { F as compilationCacheSettings, L as parseSwiftVersion, M as SWIFT_PREFIX_MAPPING_MIN_SWIFT, N as buildXcode, R as parseXcodeMajor, U as startBuildHeartbeat, W as swiftPrefixMappingSupported, j as HEARTBEAT_INTERVAL_MS, z as pickXcodeProject } from "./toolchain-CbCG6C5Z.mjs";
9
11
  import { p as resolveOptimizations } from "./errors-DHm_U5gv.mjs";
10
- import { a as readCcacheActivity, n as CCACHE_UNAVAILABLE } from "./ccache-h1FKhZeg.mjs";
11
- import { a as buildXcode, d as pickXcodeProject, g as swiftPrefixMappingSupported, h as startBuildHeartbeat, i as SWIFT_PREFIX_MAPPING_MIN_SWIFT, l as parseSwiftVersion, r as HEARTBEAT_INTERVAL_MS, s as compilationCacheSettings, u as parseXcodeMajor } from "./xcode-CiIIDnuD.mjs";
12
12
  import { createHash } from "node:crypto";
13
13
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
14
14
  import { dirname, isAbsolute, join, relative, sep } from "node:path";
@@ -1,13 +1,41 @@
1
- import { t as getExecutor } from "./exec-VFRpu1iA.mjs";
2
- import { l as phaseLine } from "./command-output-BBvS1H6v.mjs";
3
- import { G as resolveAndroidLayout, q as resolveIosProjectDir } from "./settings-B5tCoq9N.mjs";
4
- import { v as detectIsExpo } from "./project-BiC68mIp.mjs";
5
- import { b as bundlerPin } from "./xcode-CiIIDnuD.mjs";
6
- import { a as iosToolchainAsync, n as androidToolchain, r as androidToolchainAsync, t as androidRequirements } from "./toolchain-VzLJzZ7O.mjs";
7
- import { a as reactNativeDoctorFindings, i as mainCheckoutProjectRoot, n as detectFingerprintParity, r as detectLinkedLibraryGitMetadata, s as repairCxxLauncherState, t as checkMainCheckout } from "./doctor-Bm8TVpGn.mjs";
8
- import { existsSync, readdirSync } from "node:fs";
1
+ import { t as getExecutor } from "./exec-aULwtNly.mjs";
2
+ import { l as phaseLine } from "./command-output-Dj-WT4BP.mjs";
3
+ import { Y as resolveIosProjectDir, q as resolveAndroidLayout } from "./settings-BDVI8Ivc.mjs";
4
+ import { v as detectIsExpo } from "./project-DYj-HVx6.mjs";
5
+ import { J as bundlerPin, n as androidToolchain, r as androidToolchainAsync, s as iosToolchainAsync, t as androidRequirements } from "./toolchain-CbCG6C5Z.mjs";
6
+ import { a as reactNativeDoctorFindings, i as mainCheckoutProjectRoot, n as detectFingerprintParity, r as detectLinkedLibraryGitMetadata, s as repairCxxLauncherState, t as checkMainCheckout } from "./doctor-F-3VUUyN.mjs";
7
+ import { existsSync, readdirSync, statSync } from "node:fs";
9
8
  import { join, relative } from "node:path";
10
9
  //#region src/diagnostics/doctor-ios-architectures.ts
10
+ const INSPECTION_TTL_MS = 6e5;
11
+ const inspections = /* @__PURE__ */ new Map();
12
+ function inspectionInputs(iosRoot) {
13
+ let names;
14
+ try {
15
+ names = readdirSync(iosRoot).toSorted();
16
+ } catch {
17
+ names = [];
18
+ }
19
+ return JSON.stringify([
20
+ ...names.filter((name) => name.endsWith(".xcodeproj")).map((name) => join(iosRoot, name, "project.pbxproj")),
21
+ ...names.filter((name) => name.endsWith(".xcconfig")).map((name) => join(iosRoot, name)),
22
+ join(iosRoot, "Podfile"),
23
+ join(iosRoot, "Podfile.lock"),
24
+ join(iosRoot, "Pods", "Manifest.lock"),
25
+ join(iosRoot, "Pods", "Pods.xcodeproj", "project.pbxproj")
26
+ ].map((path) => {
27
+ try {
28
+ const stat = statSync(path);
29
+ return [
30
+ path,
31
+ stat.mtimeMs,
32
+ stat.size
33
+ ];
34
+ } catch {
35
+ return [path, null];
36
+ }
37
+ }));
38
+ }
11
39
  const COMPILED_PRODUCTS = /* @__PURE__ */ new Set([
12
40
  "com.apple.product-type.application",
13
41
  "com.apple.product-type.application.on-demand-install-capable",
@@ -80,6 +108,19 @@ function parseIosDebugArchitectures(output) {
80
108
  }
81
109
  async function inspectIosDebugArchitectures(projectRoot, iosProjectPath = "ios") {
82
110
  const iosRoot = join(projectRoot, iosProjectPath);
111
+ const key = `${projectRoot}\0${iosRoot}`;
112
+ const inputs = inspectionInputs(iosRoot);
113
+ const cached = inspections.get(key);
114
+ if (cached && cached.inputs === inputs && Date.now() - cached.at < INSPECTION_TTL_MS) return [...await cached.findings];
115
+ const findings = inspect(projectRoot, iosRoot);
116
+ inspections.set(key, {
117
+ inputs,
118
+ at: Date.now(),
119
+ findings
120
+ });
121
+ return [...await findings];
122
+ }
123
+ async function inspect(projectRoot, iosRoot) {
83
124
  if (!existsSync(iosRoot)) return [];
84
125
  const findings = [];
85
126
  const unknown = [];
@@ -192,7 +233,7 @@ function reactNativeProjectDoctor(root) {
192
233
  if (checksAndroid) targets.push({
193
234
  platform: "android",
194
235
  local: operation ? await androidToolchainAsync(operation.env) : androidToolchain(),
195
- requires: androidRequirements(root)
236
+ requires: androidRequirements(root, androidDir)
196
237
  });
197
238
  return targets;
198
239
  };
@@ -1,21 +1,20 @@
1
- import { C as reportSignal } from "./exec-VFRpu1iA.mjs";
2
- import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-BBvS1H6v.mjs";
3
- import { U as remoteEasFallbackSetting, W as remoteIosSetting, a as SETTING_SHAPE_REMEDY, it as tunnelModeSetting, p as cacheProviderSettingError, q as resolveIosProjectDir, tt as settingShapeErrors, z as publicUrlSetting } from "./settings-B5tCoq9N.mjs";
4
- import { Rn as processContext, Z as statsProjectKey } from "./budget-HyShrIpL.mjs";
5
- import { d as runCancellationSignal } from "./native-run-D5OJsGwA.mjs";
6
- import { T as untrackedMissLine, a as configInputsChanged, f as gitignoredFingerprintInputs, l as filesystemBuildCapability, m as inputsChangedDuringBuild, n as buildCacheKey, p as ignoredFingerprintPaths, r as changedDuringBuildLine, u as fingerprintDiffRecord, v as refingerprintAfterMutation, w as trackedFingerprintPaths } from "./build-cache-CKCzxzxA.mjs";
1
+ import { C as reportSignal } from "./exec-aULwtNly.mjs";
2
+ import { i as formatDuration, l as phaseLine, m as shortHash } from "./command-output-Dj-WT4BP.mjs";
3
+ import { B as publicUrlSetting, G as remoteIosSetting, W as remoteEasFallbackSetting, Y as resolveIosProjectDir, a as SETTING_SHAPE_REMEDY, ot as tunnelModeSetting, p as cacheProviderSettingError, rt as settingShapeErrors } from "./settings-BDVI8Ivc.mjs";
4
+ import { Tn as processContext } from "./ccache-BWTze1Ls.mjs";
5
+ import { ot as statsProjectKey } from "./workspaces-DFbj07jp.mjs";
6
+ import { J as bundlerPin, ot as runCancellationSignal, s as iosToolchainAsync } from "./toolchain-CbCG6C5Z.mjs";
7
+ import { O as trackedFingerprintPaths, S as refingerprintAfterMutation, _ as inputsChangedDuringBuild, a as configInputsChanged, d as filesystemBuildCapability, f as fingerprintDiffRecord, g as ignoredFingerprintPaths, h as gitignoredFingerprintInputs, k as untrackedMissLine, n as buildCacheKey, r as changedDuringBuildLine } from "./build-cache-gBJ-WKzA.mjs";
7
8
  import { d as optimizationBuildProfile, l as artifactCachePolicy, p as resolveOptimizations } from "./errors-DHm_U5gv.mjs";
8
- import { b as bundlerPin } from "./xcode-CiIIDnuD.mjs";
9
- import { a as iosToolchainAsync } from "./toolchain-VzLJzZ7O.mjs";
10
- import { a as deviceModelRefusal, c as iosProjectPathError, f as podAction, h as resolveDeviceType, l as iosProviderRunOptions, m as resolveConfiguration, u as isReleaseConfiguration, v as resolveRuntime, x as simulatorBuildArch, y as resolveSchemeSelection } from "./support-qKcbgmI5.mjs";
11
- import { t as readDoctorFingerprint } from "./doctor-fingerprint-zlujA1Gs.mjs";
12
- import { i as planEasDevelopmentBuild, n as easDeviceBuildRemedy } from "./eas-build-CyDKNTBP.mjs";
13
- import { c as fingerprintErrorMissReason, i as recordPrebuildAsync, o as staleNativeDirRefusal, s as explainBuildMiss } from "./prebuild-JUaqOLpc.mjs";
14
- import { r as planPayload, t as planCachedBuild } from "./build-plan-zCuHGlA8.mjs";
15
- import { t as IosRecipeRefusal } from "./ios-project-DCUDo06I.mjs";
16
- import { a as hostedIosSelectors } from "./remote-BuZj6AyU.mjs";
17
- import { c as copyAppAside, i as DEFAULT_DEPS, n as iosMetroRuntime, r as iosProcessRuntime, u as writeIpTxt } from "./launch-DscF1QfM.mjs";
18
- import { t as planHostedDevice } from "./plan-placement-BqKgKHCi.mjs";
9
+ import { a as deviceModelRefusal, c as iosProjectPathError, f as podAction, h as resolveDeviceType, l as iosProviderRunOptions, m as resolveConfiguration, u as isReleaseConfiguration, v as resolveRuntime, x as simulatorBuildArch, y as resolveSchemeSelection } from "./support-Be0UeVZU.mjs";
10
+ import { t as readDoctorFingerprint } from "./doctor-fingerprint-o7ZI9YLn.mjs";
11
+ import { i as planEasDevelopmentBuild, n as easDeviceBuildRemedy } from "./eas-build-CjNSWmjo.mjs";
12
+ import { c as fingerprintErrorMissReason, d as memoizedFingerprint, i as recordPrebuildAsync, o as staleNativeDirRefusal, s as explainBuildMiss } from "./prebuild-BDpToDgR.mjs";
13
+ import { r as planPayload, t as planCachedBuild } from "./build-plan-CBqYbzYM.mjs";
14
+ import { t as IosRecipeRefusal } from "./ios-project-D8Jcy_br.mjs";
15
+ import { a as hostedIosSelectors } from "./remote-y6n99WMW.mjs";
16
+ import { a as writeIpTxt, c as iosProcessRuntime, r as copyAppAside, s as iosMetroRuntime, t as DEFAULT_DEPS } from "./dependencies-BGokZ-Ng.mjs";
17
+ import { t as planHostedDevice } from "./plan-placement-UxnQjv5Z.mjs";
19
18
  import { rmSync } from "node:fs";
20
19
  import chalk from "chalk";
21
20
  //#region src/integrations/react-native-ios-plan.ts
@@ -122,14 +121,19 @@ async function planReactNativeIos(root, opts, d, schemeProblem, { context: setti
122
121
  const cachePolicy = artifactCachePolicy(optimizations, opts.buildCache !== false, isReleaseConfiguration(configuration));
123
122
  let fingerprint;
124
123
  try {
125
- fingerprint = operation && reportSignal(operation) ? await readDoctorFingerprint(operation, {
126
- root,
127
- platform: "ios",
128
- iosProjectPath: iosProject.relative
129
- }) : await d.fingerprintProject(root, {
124
+ fingerprint = (await memoizedFingerprint(root, {
130
125
  platform: "ios",
131
126
  iosProjectPath: iosProject.relative
132
- });
127
+ }, {
128
+ consult: cachePolicy.read,
129
+ operation: operation && reportSignal(operation) ? void 0 : operation,
130
+ record: false,
131
+ fingerprint: (projectRoot, fingerprintTarget) => operation && reportSignal(operation) ? readDoctorFingerprint(operation, {
132
+ root: projectRoot,
133
+ platform: "ios",
134
+ iosProjectPath: iosProject.relative
135
+ }) : d.fingerprintProject(projectRoot, fingerprintTarget)
136
+ })).fingerprint;
133
137
  } catch (error) {
134
138
  operation?.signal.throwIfAborted();
135
139
  note(chalk.dim(`Fingerprinting failed: ${error?.message || error}`));
@@ -154,6 +158,7 @@ async function planReactNativeIos(root, opts, d, schemeProblem, { context: setti
154
158
  slot,
155
159
  platform: "ios",
156
160
  machine: iosRemote.machine,
161
+ ...iosRemote.placement ? { placement: iosRemote.placement } : {},
157
162
  selectors: hostedIosSelectors(resolveDeviceType(opts.deviceType, settings), resolveRuntime(opts.runtime, settings)),
158
163
  sameKey: (choice) => keyArch("runtime" in choice ? choice.architecture : null) === arch,
159
164
  ...remoteEasFallbackSetting(settings) ? { eas: () => d.checkEasFallback({
@@ -170,9 +175,14 @@ async function planReactNativeIos(root, opts, d, schemeProblem, { context: setti
170
175
  localOnlyFlags: typeof opts.runtime === "string" ? ["--runtime"] : []
171
176
  }) } : {}
172
177
  });
178
+ if (planned.kind === "refused") return refuse({
179
+ code: planned.code,
180
+ message: planned.message,
181
+ remedy: planned.remedy
182
+ });
173
183
  if (planned.kind === "unknown") return refuse({
174
184
  code: "STIM_BAD_ARG",
175
- message: `ios.remote is ${iosRemote.machine}, and its simulator architecture is unknown here: ${planned.reason}.`,
185
+ message: `ios.remote is ${iosRemote.placement ?? iosRemote.machine}, and its simulator architecture is unknown here: ${planned.reason}.`,
176
186
  remedy: "Run `stim ios` to build for the remote device, or unset ios.remote to plan the owned simulator."
177
187
  });
178
188
  placement = planned.placement;
@@ -274,6 +284,7 @@ function reactNativeIosArtifact({ operation, root, logFile, configuration, build
274
284
  let storeHash = null;
275
285
  let storeSources = [];
276
286
  let mutatingSteps = [];
287
+ let fingerprintCheck = null;
277
288
  const identity = () => storeHash ? {
278
289
  hash: storeHash,
279
290
  key: buildCacheKey(PLATFORM, storeHash, keyOptions)
@@ -370,10 +381,18 @@ function reactNativeIosArtifact({ operation, root, logFile, configuration, build
370
381
  let computedFingerprint;
371
382
  let fingerprintError = "no hash";
372
383
  try {
373
- const computed = await d.fingerprintProject(root, {
384
+ const memo = await d.memoizedFingerprint(root, {
374
385
  platform: PLATFORM,
375
386
  iosProjectPath: iosProject.relative
387
+ }, {
388
+ consult: cachePolicy.read,
389
+ record: true,
390
+ operation,
391
+ fingerprint: d.fingerprintProject
376
392
  });
393
+ const computed = memo.fingerprint;
394
+ fingerprintCheck = memo.check;
395
+ if (memo.memoHit) phase("fingerprint", chalk.dim("matches a recorded fingerprint of this tree; confirming it in the background"));
377
396
  computedFingerprint = computed?.hash ?? null;
378
397
  fingerprintSources = computed?.sources ?? [];
379
398
  } catch (error) {
@@ -394,6 +413,7 @@ function reactNativeIosArtifact({ operation, root, logFile, configuration, build
394
413
  storeSources = fingerprintSources;
395
414
  return identity();
396
415
  },
416
+ fingerprintCheck: () => fingerprintCheck,
397
417
  cache: () => filesystemBuildCapability({
398
418
  context: operation,
399
419
  resolve: d.resolveBuild,
@@ -1,4 +1,4 @@
1
- import { bt as gitCommonDirOnDisk } from "./settings-B5tCoq9N.mjs";
1
+ import { St as gitCommonDirOnDisk } from "./settings-BDVI8Ivc.mjs";
2
2
  import { existsSync } from "node:fs";
3
3
  import { loadConfig, recordingEnabled, workspaceRecordingsDir } from "@stim-cli/core/state";
4
4
  import { rm } from "node:fs/promises";
@@ -1,4 +1,4 @@
1
- import { S as process_identity_exports } from "./exec-VFRpu1iA.mjs";
1
+ import { S as process_identity_exports } from "./exec-aULwtNly.mjs";
2
2
  import { readMacosRecord } from "@stim-cli/core/state";
3
3
  //#region src/macos/registration.ts
4
4
  function waitForMacosRegistration(root, launchId, child, deadline) {
@@ -1,2 +1,2 @@
1
- import { n as reloadCommand, r as runReload, t as registerReload } from "./reload-FbSgMF8x.mjs";
1
+ import { n as reloadCommand, r as runReload, t as registerReload } from "./reload-fUdkH2_p.mjs";
2
2
  export { reloadCommand as default, registerReload, runReload };
@@ -1,19 +1,19 @@
1
- import { c as throwIfCancelled, i as loadScaledBudgetMs, o as cancellableSleep, s as cancelledError } from "./exec-VFRpu1iA.mjs";
2
- import { H as deviceSlotPlatforms, U as parseDeviceSlotKey, p as getProject } from "./config-BZhXY15H.mjs";
3
- import { f as refuseNoProject, l as phaseLine } from "./command-output-BBvS1H6v.mjs";
4
- import { a as recordWorkspaceUseAsync, r as readWorkspaceState$1 } from "./workspace-state-CPSp3mav.mjs";
5
- import { Pt as repoRootAsync } from "./settings-B5tCoq9N.mjs";
6
- import { I as readWorkspaceLaunches, P as readRemoteSession, r as findCommandWorkspaceAsync } from "./project-BiC68mIp.mjs";
7
- import { nt as resolveOwnedAvdSerialAsync } from "./android-Cjcj8MCw.mjs";
8
- import { a as listeningPidsAsync, d as resolveProjectMetro, h as isMetroRunning, u as processCwds } from "./metro-1pJgCX4U.mjs";
9
- import { d as webFactsAsync, o as readWebRecord, r as cdpEndpoint } from "./state-DMRNP7-4.mjs";
10
- import { Tn as iosAppProcess, bn as ensureMetroReverse, mn as androidAppProcess } from "./budget-HyShrIpL.mjs";
11
- import { E as resolveOwnedIosSim, f as listAllIosSimsAsync } from "./ios-BQzvJlzw.mjs";
12
- import { f as probeHostedSession } from "./hosted-client-rsRqysJc.mjs";
13
- import { r as readHostedNative } from "./ios-state-CT9nV5SP.mjs";
14
- import { r as reopenHostedAndroidMetro } from "./hosted-android-Bvb2-ZxD.mjs";
15
- import { n as nativeRunCommand } from "./slot-launch-QeuJMlnJ.mjs";
16
- import { n as sendToOwnedPage, t as liveWebRecord } from "./page-CzEA_-5_.mjs";
1
+ import { c as throwIfCancelled, i as loadScaledBudgetMs, o as cancellableSleep, s as cancelledError } from "./exec-aULwtNly.mjs";
2
+ import { a as recordWorkspaceUseAsync, r as readWorkspaceState$1 } from "./workspace-state-BjqdjnJR.mjs";
3
+ import { H as deviceSlotPlatforms, U as parseDeviceSlotKey, p as getProject } from "./config-Cn94Jc0g.mjs";
4
+ import { f as refuseNoProject, l as phaseLine } from "./command-output-Dj-WT4BP.mjs";
5
+ import { Lt as repoRootAsync } from "./settings-BDVI8Ivc.mjs";
6
+ import { I as readWorkspaceLaunches, P as readRemoteSession, r as findCommandWorkspaceAsync } from "./project-DYj-HVx6.mjs";
7
+ import { nt as resolveOwnedAvdSerialAsync } from "./android-DriNoAVy.mjs";
8
+ import { a as listeningPidsAsync, d as resolveProjectMetro, h as isMetroRunning, u as processCwds } from "./metro-CvyD-xwe.mjs";
9
+ import { fn as iosAppProcess, sn as ensureMetroReverse, tn as androidAppProcess } from "./ccache-BWTze1Ls.mjs";
10
+ import { d as webFactsAsync, o as readWebRecord, r as cdpEndpoint } from "./state-BX1y5syV.mjs";
11
+ import { D as resolveOwnedIosSim, f as listAllIosSimsAsync } from "./ios-E26qSpkb.mjs";
12
+ import { f as probeHostedSession } from "./hosted-client-D7Pk_Oo1.mjs";
13
+ import { r as readHostedNative } from "./ios-state-BZ03NFgF.mjs";
14
+ import { r as reopenHostedAndroidMetro } from "./hosted-android-BMKzUNnY.mjs";
15
+ import { n as nativeRunCommand } from "./slot-launch-0l7RqSpr.mjs";
16
+ import { n as sendToOwnedPage, t as liveWebRecord } from "./page-CQJlcj3x.mjs";
17
17
  import { hostedAndroidDeviceName, hostedNativeRecords } from "@stim-cli/core/state";
18
18
  import { WebSocket } from "ws";
19
19
  import chalk from "chalk";