stim 1.21.0 → 1.22.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 (184) hide show
  1. package/README.md +60 -7
  2. package/dist/{acquire-artifact-CD4lbiWE.mjs → acquire-artifact-Co2k4f7O.mjs} +21 -3
  3. package/dist/{act-DHAw2A2S.mjs → act-DsuqEkiM.mjs} +298 -164
  4. package/dist/{activity-BzVfHSrY.mjs → activity-CMLmzp7o.mjs} +33 -12
  5. package/dist/{agent-device-usage-output-zh1vhbLp.mjs → agent-device-usage-output-DUFaTMdd.mjs} +7 -7
  6. package/dist/{android-BLgbNqox.mjs → android-ByRMUoiJ.mjs} +66 -52
  7. package/dist/{android-DUYkNF4u.mjs → android-C7sVmyI9.mjs} +160 -59
  8. package/dist/{android-CV_GCELZ.mjs → android-DGkNqa_c.mjs} +5 -5
  9. package/dist/{android-BEJ8Jpl7.mjs → android-DR5lZ2Az.mjs} +2 -2
  10. package/dist/android-cas-compiler.mjs +1 -1
  11. package/dist/{android-cas-Ct5b1xCK.mjs → android-cas-ngferVq2.mjs} +3 -3
  12. package/dist/{client-B7QVOlCr.d.mts → android-project-DVWyCbWU.d.mts} +145 -7
  13. package/dist/api.d.mts +132 -118
  14. package/dist/api.mjs +239 -42
  15. package/dist/{artifact-B8T3S5gi.mjs → artifact-8EY8SAPw.mjs} +40 -35
  16. package/dist/{artifact-DAuZ-FNU.mjs → artifact-DJPy518Y.mjs} +69 -40
  17. package/dist/artifact-platform-CXcmX_j3.mjs +27 -0
  18. package/dist/{browser-web-QQzVjz3O.mjs → browser-web-Bcv99PBM.mjs} +187 -59
  19. package/dist/{budget-Bs6SxxzO.mjs → budget-Cvwn54qV.mjs} +830 -699
  20. package/dist/{build-CoPzQRNw.mjs → build-CabC3G23.mjs} +34 -27
  21. package/dist/{build-cache-DmyR9Zzc.mjs → build-cache-Dv7RN200.mjs} +4 -4
  22. package/dist/{build-plan-CaFskB7_.mjs → build-plan-DUC8Ka9y.mjs} +74 -14
  23. package/dist/{cache-manifest-DkkqguoK.mjs → cache-manifest-DSeQjt-Q.mjs} +1 -1
  24. package/dist/cache-manifest.mjs +1 -1
  25. package/dist/{ccache-BJRZ9pG3.mjs → ccache-Btwc36-I.mjs} +6 -6
  26. package/dist/{cdp-CWmIUMbw.mjs → cdp-3fwICjzi.mjs} +1 -1
  27. package/dist/{chrome-B6tfCta1.mjs → chrome-Bbw689-6.mjs} +1 -1
  28. package/dist/{cli-0DYf8QhQ.mjs → cli-CHZa9Lvk.mjs} +20 -20
  29. package/dist/cli.mjs +1 -1
  30. package/dist/{client-UXD70ZbM.mjs → client-OyRoEuSr.mjs} +218 -47
  31. package/dist/collector-run.d.mts +1 -1
  32. package/dist/collector-run.mjs +6 -6
  33. package/dist/{command-output-B1UrjZHL.mjs → command-output-gwpm28fu.mjs} +1 -1
  34. package/dist/{config-CYcBF478.mjs → config-DlrsduwG.mjs} +17 -11
  35. package/dist/{created-devices-CqeBlrEn.mjs → created-devices-x9rN6bhs.mjs} +13 -3
  36. package/dist/{dependency-state-BbKQW83h.mjs → dependency-state-1I9KZT1Y.mjs} +2 -2
  37. package/dist/{detached-entry-DFRyG1_o.mjs → detached-entry-BwNEtIrP.mjs} +1 -1
  38. package/dist/{dev-client-UOeESKm6.mjs → dev-client-BSDR5h3F.mjs} +2 -2
  39. package/dist/{device-ExJq8Ei7.mjs → device-B-L3Fbxy.mjs} +71 -14
  40. package/dist/{device-DCxH7_By.mjs → device-DklWZLqb.mjs} +16 -16
  41. package/dist/{device-capacity-CMlqEcvw.mjs → device-capacity-DK5_EwRS.mjs} +9 -10
  42. package/dist/device-host-worker.mjs +25 -32
  43. package/dist/{device-ios-DRUeKaFV.mjs → device-ios-DoB6KFCO.mjs} +39 -16
  44. package/dist/{device-lease-run-C8raGFoP.mjs → device-lease-run-xJPQ_QQG.mjs} +5 -5
  45. package/dist/{device-pool-DMRpVX9a.mjs → device-pool-BMkdsefq.mjs} +3 -3
  46. package/dist/{doctor-DTvaDOda.mjs → doctor-Bo7BXLux.mjs} +24 -37
  47. package/dist/{doctor-Dhqebm0q.mjs → doctor-D5_EzwfA.mjs} +19 -16
  48. package/dist/doctor-fingerprint-DZLoYFVb.mjs +16 -0
  49. package/dist/doctor-fingerprint.mjs +1 -1
  50. package/dist/{doctor-BLHCYxzi.mjs → doctor-thjWAV0z.mjs} +1 -1
  51. package/dist/{doctor-watchman-Cv1F10Kj.mjs → doctor-watchman-N2wDotwQ.mjs} +5 -5
  52. package/dist/{eas-build-BomfRnFT.mjs → eas-build-CwknaQYj.mjs} +4 -4
  53. package/dist/{eas-fallback-DJwZpy0c.mjs → eas-fallback-CSgAulr5.mjs} +27 -18
  54. package/dist/{eas-session-ledger-op6A54yi.mjs → eas-session-ledger-DlY_serQ.mjs} +8 -7
  55. package/dist/{error-diagnostics-Bf0rZvG9.mjs → error-diagnostics-DBWO2rxE.mjs} +10 -10
  56. package/dist/{exec-_UbtCQcG.mjs → exec-DEoAhcze.mjs} +155 -47
  57. package/dist/{exec-H20xSg2T.d.mts → exec-DnYc4HGH.d.mts} +17 -4
  58. package/dist/{gc-_-dCXdyL.mjs → gc-CXxN-4SE.mjs} +587 -313
  59. package/dist/gc-DnNDQyaP.mjs +3 -0
  60. package/dist/{guide-Yqwt2bd6.mjs → guide-Br0LEfKy.mjs} +239 -43
  61. package/dist/{hosted-android-Bw-honsd.mjs → hosted-android-B-9f-jkd.mjs} +6 -6
  62. package/dist/{hosted-client-DB_gBPfY.mjs → hosted-client-DZAPrcro.mjs} +4 -4
  63. package/dist/{hosted-ios-CUvOf4Vr.mjs → hosted-ios-CsCS21hn.mjs} +1 -1
  64. package/dist/{hosted-logs-DL_P5AdN.mjs → hosted-logs-FIRx9X2f.mjs} +5 -5
  65. package/dist/{hosted-macos-QI141yKk.mjs → hosted-macos-_awYSpfv.mjs} +21 -12
  66. package/dist/{hosted-native-Ksyjgzq-.mjs → hosted-native-BdzE668-.mjs} +27 -14
  67. package/dist/{idle-BVeRGroT.d.mts → idle-C4cZ757K.d.mts} +3 -3
  68. package/dist/{idle-shutdown-DaKmZi0z.mjs → idle-shutdown-DDg3SdvY.mjs} +7 -7
  69. package/dist/ios-CDvlmUs7.d.mts +24 -0
  70. package/dist/{ios-CQ68hG9s.mjs → ios-Ds1clbIt.mjs} +8 -8
  71. package/dist/{ios-device-CwFMehUS.mjs → ios-device--h_-8ENa.mjs} +3 -3
  72. package/dist/{ios-device-CXGP1bsD.mjs → ios-device-BXZ0c7Kb.mjs} +1 -1
  73. package/dist/{ios-CpByZy12.mjs → ios-hcBpnEGk.mjs} +81 -34
  74. package/dist/{ios-ubFsBzwq.mjs → ios-pm4nL6By.mjs} +59 -50
  75. package/dist/{ios-project-WuwwBdvW.mjs → ios-project-CZhKODF3.mjs} +5 -5
  76. package/dist/{ios-signing-DTTIChGs.mjs → ios-signing-BtAffm0A.mjs} +2 -2
  77. package/dist/{ios-state-DvFX-K_l.mjs → ios-state-Dtw5K2aI.mjs} +1 -1
  78. package/dist/{ios-qNJt4dFm.mjs → ios-xtlRHaeB.mjs} +1 -1
  79. package/dist/{js-swap-Cc1dttps.mjs → js-swap-Bwhh4S7V.mjs} +7 -29
  80. package/dist/{launch-Zq2mOSDy.mjs → launch-BjxemNpK.mjs} +40 -39
  81. package/dist/{launch-CD1yVc7U.mjs → launch-CCzXlc8r.mjs} +16 -16
  82. package/dist/{logs-BS00Anxf.mjs → logs-BfwwadsZ.mjs} +151 -24
  83. package/dist/{logs-CMm05HxN.mjs → logs-jTS_lHSo.mjs} +10 -17
  84. package/dist/{macos-B65--pPd.mjs → macos-DVlSSyUg.mjs} +1 -1
  85. package/dist/{macos-C-0qJ6zq.mjs → macos-NfV2D7dO.mjs} +143 -46
  86. package/dist/macos-run.mjs +1 -1
  87. package/dist/maintenance-run.mjs +8 -8
  88. package/dist/{metro-DEXpIhHC.mjs → metro-DiXtA3Ty.mjs} +59 -37
  89. package/dist/{metro-gateway-BMJNlj3E.mjs → metro-gateway-CKZqKqx7.mjs} +120 -22
  90. package/dist/{named-ports-BWTzt6mu.mjs → named-ports-DkEzOfzO.mjs} +40 -33
  91. package/dist/{native-android-JACyjTZs.mjs → native-android-CqgnOgsT.mjs} +43 -242
  92. package/dist/native-gradle-artifact-inputs-DHFnmrVf.mjs +270 -0
  93. package/dist/{native-gradle-inputs-Bep9JcSF.mjs → native-gradle-inputs-Dnh84Zbd.mjs} +3 -129
  94. package/dist/{native-run-DY_RLx3C.mjs → native-run-NwUuxbkg.mjs} +4 -5
  95. package/dist/{native-runtime-Dg1Q7tfF.mjs → native-runtime-B7KIafpM.mjs} +8 -7
  96. package/dist/native-source-Y0yLhFyQ.mjs +133 -0
  97. package/dist/{native-xcode-inputs-CB2iQeWq.mjs → native-xcode-inputs-D_VOfFL7.mjs} +2 -3
  98. package/dist/{native-xcode-ios-CXX39F7o.mjs → native-xcode-ios-BYDOHWLN.mjs} +27 -32
  99. package/dist/offload-worker.d.mts +65 -2
  100. package/dist/offload-worker.mjs +305 -73
  101. package/dist/operation-exec-BW0em61G.mjs +171 -0
  102. package/dist/{ownership-DEmM5vhh.mjs → ownership-C5fo5Edb.mjs} +3 -3
  103. package/dist/{page-CPaHeYqj.mjs → page-DBL2PiUU.mjs} +8 -4
  104. package/dist/{placement-log-BqGbTa61.mjs → placement-log-BnGgJRRZ.mjs} +1 -1
  105. package/dist/{plan-placement-Bwj-IjY1.mjs → plan-placement-DIsMtN-d.mjs} +12 -8
  106. package/dist/{ports-D-MmCTdv.mjs → ports-Cy1RkmuQ.mjs} +3 -3
  107. package/dist/{prebuild-uD_ipCxF.mjs → prebuild-D4JoEAEs.mjs} +49 -14
  108. package/dist/{project-BZNjmW_8.mjs → project-wM_XFTvE.mjs} +16 -16
  109. package/dist/{pull-request-Lfetn8Kr.mjs → pull-request-W1IuLXDt.mjs} +102 -20
  110. package/dist/{pull-request-zjCSAryH.d.mts → pull-request-eODyIqZF.d.mts} +6 -2
  111. package/dist/pull-requests.d.mts +2 -2
  112. package/dist/pull-requests.mjs +2 -2
  113. package/dist/{react-native-android-DuzH0cn3.mjs → react-native-android-6OZ7MSM7.mjs} +71 -48
  114. package/dist/{react-native-build-rhk4smwQ.mjs → react-native-build-Dvd8hC21.mjs} +8 -8
  115. package/dist/{react-native-doctor-CQpuIMso.mjs → react-native-doctor-DsoSF1Y9.mjs} +7 -7
  116. package/dist/{react-native-ios-Bhq1rJeV.mjs → react-native-ios-4u1Rn-GR.mjs} +40 -26
  117. package/dist/{recordings-DYteQSu4.mjs → recordings-CQmfzAh7.mjs} +1 -1
  118. package/dist/registration-BcRgF6Ox.mjs +51 -0
  119. package/dist/{reload-CmTRFJaX.mjs → reload-BzkYabB-.mjs} +16 -15
  120. package/dist/{reload-DzjSl5P_.mjs → reload-D7AVlb8N.mjs} +1 -1
  121. package/dist/{remote-ByYkXdGD.mjs → remote-DjGDmlTZ.mjs} +18 -15
  122. package/dist/{result-DNiS-tTP.mjs → result-D2Ykz_iD.mjs} +24 -23
  123. package/dist/{run-D23HmJMs.mjs → run-DidHghD1.mjs} +3 -2
  124. package/dist/{selection-CSl9i5qU.mjs → selection-DSMbWEX2.mjs} +6 -5
  125. package/dist/{server-bare-CxTrvDg8.mjs → server-bare-CafzuyFB.mjs} +2 -2
  126. package/dist/{server-command-CtzloH3v.mjs → server-command-C6QjeupS.mjs} +5 -5
  127. package/dist/{server-expo-DT_F_uVI.mjs → server-expo-CrjB29pq.mjs} +7 -5
  128. package/dist/server-expo-D58c9L0M.mjs +2 -0
  129. package/dist/{settings-CsJDEXgK.mjs → settings-C7O8A6ZI.mjs} +223 -243
  130. package/dist/{settings-T1gtc3bf.mjs → settings-DpR-1Wnn.mjs} +1 -1
  131. package/dist/{settings-write-HyVZ8eQ8.mjs → settings-write-CzD60rOD.mjs} +7 -6
  132. package/dist/settings.schema.json +13 -0
  133. package/dist/{simslim-Cgk17SXV.mjs → simslim-BNckWpXi.mjs} +2 -2
  134. package/dist/{slot-launch-DF8VfT64.mjs → slot-launch-CbfmNgM6.mjs} +6 -6
  135. package/dist/{stage-BIS0ydsV.mjs → stage-Bps5oius.mjs} +21 -4
  136. package/dist/{start-RChynRDp.mjs → start-Br-oxqMD.mjs} +1 -1
  137. package/dist/{start-7lpH7hmN.mjs → start-EojN4WFz.mjs} +622 -393
  138. package/dist/{state-C4ZtUisW.mjs → state--smjFSTL.mjs} +22 -7
  139. package/dist/{state-XMziexv2.mjs → state-08I3hw3_.mjs} +2 -2
  140. package/dist/{stats-53T7OTb9.mjs → stats-D3GerlFW.mjs} +5 -5
  141. package/dist/{stats-report-BFfMpWWF.mjs → stats-report-BzaPrRm6.mjs} +1 -1
  142. package/dist/{status-DqEUSSxs.mjs → status-BRROykC8.mjs} +2 -2
  143. package/dist/{status-CSi6tlRq.mjs → status-EvrK72L2.mjs} +1 -1
  144. package/dist/{status-BL7jVyAB.mjs → status-WBDajew2.mjs} +43 -29
  145. package/dist/{status-watch-GDCfqpTE.mjs → status-watch-Bg_u-pwR.mjs} +48 -16
  146. package/dist/status-worker.mjs +1 -1
  147. package/dist/{stim-desktop-C12we7lz.mjs → stim-desktop-D5OGpYZM.mjs} +2 -2
  148. package/dist/{stop-Bk_1qiV6.mjs → stop-DTZ9uTw3.mjs} +2 -2
  149. package/dist/{stop-D7h6jAXQ.mjs → stop-Dky10AEJ.mjs} +31 -22
  150. package/dist/{stop-CPzlM1L-.mjs → stop-Mv6W9FAk.mjs} +15 -16
  151. package/dist/supervisor-run.d.mts +3 -3
  152. package/dist/supervisor-run.mjs +28 -36
  153. package/dist/{support-Dlu37g6H.mjs → support-CNioewsd.mjs} +10 -10
  154. package/dist/{support-67vraa1Q.mjs → support-yUiOjnVY.mjs} +8 -8
  155. package/dist/swiftpm-artifact-inputs-DFcGsXDP.mjs +153 -0
  156. package/dist/swiftpm-macos-BIak-Rxv.mjs +532 -0
  157. package/dist/toolchain-BY8X8HXx.mjs +2 -0
  158. package/dist/{toolchain-Hp9sCpK4.mjs → toolchain-DpJMHq0n.mjs} +9 -6
  159. package/dist/{trigger-BAahxUPq.mjs → trigger-Cbyc41d_.mjs} +3 -3
  160. package/dist/trigger-yb_nFzPF.mjs +2 -0
  161. package/dist/{warm-progress-BHX5r0Ei.mjs → warm-progress-CA3TgT3-.mjs} +29 -16
  162. package/dist/web-CZ07gd77.mjs +2 -0
  163. package/dist/{web-CJmIj6AI.mjs → web-DKx6yoFA.mjs} +11 -10
  164. package/dist/web-run.mjs +11 -9
  165. package/dist/windows-report.mjs +1 -1
  166. package/dist/{workspace-state-Cjuigeeu.mjs → workspace-state-U08dEzhG.mjs} +3 -3
  167. package/dist/{workspaces-BccMFmGQ.mjs → workspaces-CpANmBlq.mjs} +594 -266
  168. package/dist/{worktree-DQ6Zi2Mv.mjs → worktree-CHecZ4Oq.mjs} +850 -551
  169. package/dist/worktree-ZqZVjD9K.mjs +2 -0
  170. package/dist/{xcode-Zlx3qjEs.mjs → xcode-BXn9-xYx.mjs} +5 -5
  171. package/package.json +7 -7
  172. package/shim/android-audio/Main.java +24 -0
  173. package/shim/android-audio/README.md +17 -0
  174. package/shim/android-audio.jar +0 -0
  175. package/dist/gc-C-WwL0yi.mjs +0 -3
  176. package/dist/git-C3iTsJaZ.mjs +0 -73
  177. package/dist/server-expo-C-90EhcG.mjs +0 -2
  178. package/dist/settings-DkdmlelE.d.mts +0 -15
  179. package/dist/swiftpm-macos-p8WZbxKU.mjs +0 -130
  180. package/dist/toolchain-DhKwp9iI.mjs +0 -2
  181. package/dist/trigger-Bf3uDcpv.mjs +0 -2
  182. package/dist/web-DknQETPs.mjs +0 -2
  183. package/dist/workspace-process-lock-1_1OoVW5.mjs +0 -57
  184. package/dist/worktree-CK2MpJW5.mjs +0 -2
@@ -0,0 +1,532 @@
1
+ import { d as spawnDeclared, t as getExecutor, y as trackReportResource } from "./exec-DEoAhcze.mjs";
2
+ import { i as sharedBuildCache } from "./paths-DQtTgsBf.mjs";
3
+ import { G as resolveCacheProviderConfig, L as projectSettingsContextAsync, Nt as repoRootAsync, tt as settingValueAt } from "./settings-C7O8A6ZI.mjs";
4
+ import { r as register } from "./cache-manifest-DSeQjt-Q.mjs";
5
+ import { d as runCancellationSignal } from "./native-run-NwUuxbkg.mjs";
6
+ import "./build-cache-Dv7RN200.mjs";
7
+ import { l as artifactCachePolicy, p as resolveOptimizations } from "./errors-ccaPc4ox.mjs";
8
+ import { l as macosToolchainAsync } from "./toolchain-DpJMHq0n.mjs";
9
+ import { r as nativeFileDigest } from "./native-source-Y0yLhFyQ.mjs";
10
+ import { a as validateInfoPlist, i as stageBundle, n as resolveBundleExtras, r as setBundleName, t as reidentifyBundle } from "./stage-Bps5oius.mjs";
11
+ import { t as validateMacosArtifactPlatform } from "./artifact-platform-CXcmX_j3.mjs";
12
+ import { t as logLines } from "./run-DidHghD1.mjs";
13
+ import { n as swiftpmArtifactInputs, r as swiftpmArtifactSnapshot, t as readSwiftpmArtifactToolchain } from "./swiftpm-artifact-inputs-DFcGsXDP.mjs";
14
+ import { createHash } from "node:crypto";
15
+ import { createReadStream, createWriteStream, existsSync, realpathSync } from "node:fs";
16
+ import { tmpdir } from "node:os";
17
+ import { dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
18
+ import { parseHostedAppManifest } from "@stim-cli/core/state";
19
+ import { cp, lstat, mkdir, mkdtemp, open, readdir, readlink, realpath, rm, symlink, writeFile } from "node:fs/promises";
20
+ import { buildResolveTimeoutMs, buildUploadTimeoutMs, createFilesystemFileCache, loadCacheProvider } from "@stim-cli/cache";
21
+ import { pipeline } from "node:stream/promises";
22
+ import { Readable } from "node:stream";
23
+ //#region src/macos/artifact-file.ts
24
+ const MAGIC = Buffer.from("STIMMAC1\n");
25
+ const MAX_HEADER_BYTES = 16777216;
26
+ const canonical = (path) => path.normalize("NFC").toLowerCase();
27
+ async function bundleFiles(bundle, signal) {
28
+ const files = [];
29
+ const directories = [];
30
+ const walk = async (path) => {
31
+ signal.throwIfAborted();
32
+ const absolute = join(bundle, path);
33
+ const info = await lstat(absolute);
34
+ if (info.isDirectory()) {
35
+ if (path) directories.push(path);
36
+ for (const entry of await readdir(absolute)) await walk(path ? `${path}/${entry}` : entry);
37
+ } else if (info.isFile()) files.push({
38
+ path,
39
+ kind: info.mode & 73 ? "exec" : "file",
40
+ ...await nativeFileDigest(absolute, signal)
41
+ });
42
+ else if (info.isSymbolicLink()) {
43
+ const bytes = Buffer.from(await readlink(absolute));
44
+ files.push({
45
+ path,
46
+ kind: "link",
47
+ size: bytes.length,
48
+ sha256: createHash("sha256").update(bytes).digest("hex")
49
+ });
50
+ } else throw new Error("The cached macOS bundle contains an unsupported file.");
51
+ };
52
+ await walk("");
53
+ const parsed = parseHostedAppManifest(files);
54
+ if (!parsed || directories.length > 2e4) throw new Error("The cached macOS bundle has an invalid file inventory.");
55
+ return {
56
+ files: parsed,
57
+ directories: directories.toSorted()
58
+ };
59
+ }
60
+ async function packMacosArtifact(bundle, key, output, signal) {
61
+ const { files, directories } = await bundleFiles(bundle, signal);
62
+ const metadata = Buffer.from(JSON.stringify({
63
+ key,
64
+ files,
65
+ directories
66
+ }));
67
+ if (metadata.length > MAX_HEADER_BYTES) throw new Error("The cached macOS bundle receipt is too large.");
68
+ const header = Buffer.alloc(MAGIC.length + 4);
69
+ MAGIC.copy(header);
70
+ header.writeUInt32BE(metadata.length, MAGIC.length);
71
+ const payload = async function* () {
72
+ yield header;
73
+ yield metadata;
74
+ for (const file of files) {
75
+ signal.throwIfAborted();
76
+ const hash = createHash("sha256");
77
+ let size = 0;
78
+ const path = join(bundle, file.path);
79
+ const input = file.kind === "link" ? [Buffer.from(await readlink(path))] : createReadStream(path, { signal });
80
+ for await (const bytes of input) {
81
+ hash.update(bytes);
82
+ size += bytes.length;
83
+ yield bytes;
84
+ }
85
+ if (size !== file.size || hash.digest("hex") !== file.sha256) throw new Error("The macOS bundle changed while its cache entry was packed.");
86
+ }
87
+ };
88
+ await pipeline(Readable.from(payload()), createWriteStream(output, {
89
+ flags: "wx",
90
+ mode: 384
91
+ }), { signal });
92
+ }
93
+ async function readExactly(file, size, position, signal) {
94
+ const bytes = Buffer.alloc(size);
95
+ let offset = 0;
96
+ while (offset < size) {
97
+ signal.throwIfAborted();
98
+ const read = await file.read(bytes, offset, size - offset, position + offset);
99
+ if (!read.bytesRead) throw new Error("The cached macOS entry is truncated.");
100
+ offset += read.bytesRead;
101
+ }
102
+ return bytes;
103
+ }
104
+ async function unpackMacosArtifact(source, key, bundle, signal) {
105
+ signal.throwIfAborted();
106
+ const file = await open(source, "r");
107
+ try {
108
+ const header = await readExactly(file, MAGIC.length + 4, 0, signal);
109
+ const size = header.readUInt32BE(MAGIC.length);
110
+ if (!header.subarray(0, MAGIC.length).equals(MAGIC) || size === 0 || size > MAX_HEADER_BYTES) throw new Error("The cached macOS entry has an unsupported header.");
111
+ const metadata = JSON.parse((await readExactly(file, size, header.length, signal)).toString("utf8"));
112
+ const files = parseHostedAppManifest(metadata?.files);
113
+ if (metadata?.key !== key || !files) throw new Error("The cached macOS entry has an invalid identity or inventory.");
114
+ const directories = metadata.directories;
115
+ if (!Array.isArray(directories) || directories.length > 2e4 || !directories.every((path) => typeof path === "string" && path.length > 0 && path.length <= 1024 && !/[\\\0\r\n]/.test(path) && path.split("/").every((part) => part && part !== "." && part !== ".."))) throw new Error("The cached macOS entry has invalid directories.");
116
+ const filePaths = new Set(files.map((entry) => canonical(entry.path)));
117
+ for (const path of directories) {
118
+ let ancestor = canonical(path);
119
+ while (ancestor !== ".") {
120
+ if (filePaths.has(ancestor)) throw new Error("A cached macOS directory overlaps a file or link.");
121
+ ancestor = posix.dirname(ancestor);
122
+ }
123
+ }
124
+ let position = header.length + size;
125
+ if ((await file.stat()).size !== position + files.reduce((sum, entry) => sum + entry.size, 0)) throw new Error("The cached macOS entry has an invalid payload length.");
126
+ await mkdir(bundle, { mode: 448 });
127
+ for (const path of directories) {
128
+ signal.throwIfAborted();
129
+ await mkdir(join(bundle, path), {
130
+ recursive: true,
131
+ mode: 493
132
+ });
133
+ }
134
+ const links = [];
135
+ for (const entry of files) {
136
+ signal.throwIfAborted();
137
+ const path = join(bundle, entry.path);
138
+ await mkdir(dirname(path), {
139
+ recursive: true,
140
+ mode: 448
141
+ });
142
+ if (entry.kind === "link") {
143
+ const bytes = await readExactly(file, entry.size, position, signal);
144
+ if (createHash("sha256").update(bytes).digest("hex") !== entry.sha256) throw new Error("A cached macOS link differs from its digest.");
145
+ const target = bytes.toString("utf8");
146
+ const destination = posix.normalize(posix.join(posix.dirname(entry.path), target));
147
+ if (!target || !Buffer.from(target).equals(bytes) || /[\\\0\r\n]/.test(target) || posix.isAbsolute(target) || destination === "." || destination === ".." || destination.startsWith("../") || entry.path.startsWith(`${destination}/`)) throw new Error("A cached macOS link leaves its bundle or forms an ancestor cycle.");
148
+ links.push({
149
+ path,
150
+ target
151
+ });
152
+ } else {
153
+ const hash = createHash("sha256");
154
+ if (entry.size === 0) await writeFile(path, "", {
155
+ flag: "wx",
156
+ mode: entry.kind === "exec" ? 493 : 420,
157
+ signal
158
+ });
159
+ else {
160
+ const bytes = async function* () {
161
+ for await (const chunk of file.createReadStream({
162
+ start: position,
163
+ end: position + entry.size - 1,
164
+ autoClose: false
165
+ })) {
166
+ signal.throwIfAborted();
167
+ hash.update(chunk);
168
+ yield chunk;
169
+ }
170
+ };
171
+ await pipeline(Readable.from(bytes()), createWriteStream(path, {
172
+ flags: "wx",
173
+ mode: entry.kind === "exec" ? 493 : 420
174
+ }), { signal });
175
+ }
176
+ if (hash.digest("hex") !== entry.sha256) throw new Error("A cached macOS file differs from its digest.");
177
+ }
178
+ position += entry.size;
179
+ }
180
+ for (const link of links) await symlink(link.target, link.path);
181
+ const root = await realpath(bundle);
182
+ for (const link of links) {
183
+ signal.throwIfAborted();
184
+ const path = relative(root, await realpath(link.path));
185
+ if (isAbsolute(path) || path === ".." || path.startsWith(`..${sep}`)) throw new Error("A cached macOS link leaves its bundle.");
186
+ }
187
+ } finally {
188
+ await file.close();
189
+ }
190
+ }
191
+ //#endregion
192
+ //#region src/macos/artifact-cache.ts
193
+ async function providerCall(call, timeoutMs, context, directory, signal) {
194
+ signal.throwIfAborted();
195
+ const controller = new AbortController();
196
+ const failure = Object.assign(/* @__PURE__ */ new Error(`SwiftPM cache provider cleanup did not finish within 35 seconds. Retained ${directory}.`), {
197
+ code: "STIM_CLAIM_UNAVAILABLE",
198
+ reportCleanup: true,
199
+ remedy: "Confirm that the provider has stopped using the retained directory before removing it and retrying."
200
+ });
201
+ const pending = Promise.resolve().then(() => {
202
+ controller.signal.throwIfAborted();
203
+ return call(controller.signal);
204
+ }).then((value) => ({ value }), (error) => ({ error }));
205
+ let close;
206
+ const closed = new Promise((settleClosed) => {
207
+ close = settleClosed;
208
+ });
209
+ let cleanup;
210
+ const finish = () => cleanup ??= (async () => {
211
+ let timer;
212
+ if (!await Promise.race([pending.then(() => true), new Promise((settleDrain) => {
213
+ timer = setTimeout(() => settleDrain(false), 35e3);
214
+ })]).finally(() => clearTimeout(timer))) throw failure;
215
+ const result = await pending;
216
+ if ("error" in result && result.error instanceof Error && "reportCleanup" in result.error) throw result.error;
217
+ })().finally(() => close());
218
+ let notifyAbort;
219
+ const aborted = new Promise((settleAbort) => {
220
+ notifyAbort = () => settleAbort({ aborted: true });
221
+ });
222
+ const childAborted = () => notifyAbort();
223
+ controller.signal.addEventListener("abort", childAborted, { once: true });
224
+ const abort = () => controller.abort(signal.reason);
225
+ signal.addEventListener("abort", abort, { once: true });
226
+ trackReportResource(context, closed, finish, signal, failure);
227
+ const deadline = setTimeout(() => controller.abort(), timeoutMs);
228
+ if (signal.aborted) abort();
229
+ const outcome = await Promise.race([pending, aborted]);
230
+ clearTimeout(deadline);
231
+ signal.removeEventListener("abort", abort);
232
+ controller.signal.removeEventListener("abort", childAborted);
233
+ await finish();
234
+ signal.throwIfAborted();
235
+ if ("aborted" in outcome) throw new Error("SwiftPM cache provider timed out.");
236
+ if ("error" in outcome) throw outcome.error;
237
+ return outcome.value;
238
+ }
239
+ const fileKey = (key) => `swiftpm/v1/${key}`;
240
+ async function contained(path, directory) {
241
+ const rel = relative(await realpath(directory), await realpath(path));
242
+ if (!rel || isAbsolute(rel) || rel === ".." || rel.startsWith(`..${sep}`) || !(await lstat(path)).isFile()) throw new Error("The shared SwiftPM cache file is outside its download directory or is not a regular file.");
243
+ }
244
+ function swiftpmArtifactCache(context, root, settings, recipe, build) {
245
+ const declaration = settingValueAt(settings, "macos.artifactInputs");
246
+ if (!declaration) return void 0;
247
+ const policy = artifactCachePolicy(resolveOptimizations(settings, context.env), true, false);
248
+ if (!policy.read) return void 0;
249
+ const activeSignal = () => runCancellationSignal(context) ?? context.signal;
250
+ const localRoot = sharedBuildCache();
251
+ const local = createFilesystemFileCache(join(localRoot, "macos"));
252
+ const storeLocal = async (key, sourcePath, signal) => {
253
+ register({
254
+ dir: localRoot,
255
+ registeredBy: root,
256
+ name: "Build cache",
257
+ prune: "entries",
258
+ entriesDepth: 2,
259
+ note: "completed native artifacts keyed on build inputs"
260
+ });
261
+ await local.store({
262
+ key: fileKey(key),
263
+ sourcePath,
264
+ overwrite: true,
265
+ signal
266
+ });
267
+ };
268
+ let provider;
269
+ const shared = () => provider ??= (async () => {
270
+ const signal = activeSignal();
271
+ if (!policy.remote) return null;
272
+ const settingsContext = await projectSettingsContextAsync(root, void 0, {
273
+ env: context.env,
274
+ signal,
275
+ declareFor: context
276
+ });
277
+ const loaded = await loadCacheProvider({
278
+ projectRoot: root,
279
+ config: resolveCacheProviderConfig(settingsContext),
280
+ env: context.env
281
+ });
282
+ if (loaded.unavailable) throw new Error(loaded.unavailable);
283
+ return loaded.provider?.files ?? null;
284
+ })();
285
+ const unpack = async (path, key, directory) => {
286
+ const signal = activeSignal();
287
+ const bundle = join(directory, "Cached.app");
288
+ await unpackMacosArtifact(path, key, bundle, signal);
289
+ await recipe.validateFetched(bundle, recipe.bundleId);
290
+ await validateMacosArtifactPlatform(context, bundle, recipe.product, signal);
291
+ return bundle;
292
+ };
293
+ const identity = async () => {
294
+ const signal = activeSignal();
295
+ return swiftpmArtifactSnapshot(root, declaration, build, await readSwiftpmArtifactToolchain(context, signal, root), context.env, signal);
296
+ };
297
+ return {
298
+ peer: () => policy.remote ? {
299
+ inputs: swiftpmArtifactInputs(declaration),
300
+ write: policy.write
301
+ } : null,
302
+ identity,
303
+ async has(key) {
304
+ const signal = activeSignal();
305
+ if (!await local.stat({
306
+ key: fileKey(key),
307
+ signal
308
+ })) return false;
309
+ const directory = await mkdtemp(join(tmpdir(), "stim-macos-cache-plan-"));
310
+ let retainDirectory = false;
311
+ try {
312
+ const source = await local.resolve({
313
+ key: fileKey(key),
314
+ destinationDir: directory,
315
+ signal
316
+ });
317
+ if (!source) return false;
318
+ await unpack(source, key, directory);
319
+ return true;
320
+ } catch (error) {
321
+ if (error instanceof Error && "reportCleanup" in error) {
322
+ retainDirectory = true;
323
+ throw error;
324
+ }
325
+ signal.throwIfAborted();
326
+ return false;
327
+ } finally {
328
+ if (!retainDirectory) await rm(directory, {
329
+ recursive: true,
330
+ force: true
331
+ });
332
+ }
333
+ },
334
+ async restore(key, directory) {
335
+ const signal = activeSignal();
336
+ await mkdir(directory, { recursive: true });
337
+ const cached = await local.resolve({
338
+ key: fileKey(key),
339
+ destinationDir: directory,
340
+ signal
341
+ });
342
+ if (cached) try {
343
+ return {
344
+ bundle: await unpack(cached, key, directory),
345
+ tier: "local"
346
+ };
347
+ } catch (error) {
348
+ if (error instanceof Error && "reportCleanup" in error) throw error;
349
+ signal.throwIfAborted();
350
+ await rm(join(directory, "Cached.app"), {
351
+ recursive: true,
352
+ force: true
353
+ });
354
+ }
355
+ const files = await shared();
356
+ if (!files) return null;
357
+ const result = await providerCall((childSignal) => files.resolve({
358
+ key: fileKey(key),
359
+ destinationDir: directory,
360
+ signal: childSignal
361
+ }), buildResolveTimeoutMs(context.env), context, directory, signal);
362
+ signal.throwIfAborted();
363
+ if (!result) return null;
364
+ await contained(result, directory);
365
+ const bundle = await unpack(result, key, directory);
366
+ await storeLocal(key, result, signal);
367
+ return {
368
+ bundle,
369
+ tier: "provider"
370
+ };
371
+ },
372
+ async store(key, bundle, directory) {
373
+ const signal = activeSignal();
374
+ const canonical = join(directory, "Canonical.app");
375
+ await cp(bundle, canonical, {
376
+ recursive: true,
377
+ verbatimSymlinks: true,
378
+ filter: () => {
379
+ signal.throwIfAborted();
380
+ return true;
381
+ }
382
+ });
383
+ await cp(resolve(root, build.infoPlist), join(canonical, "Contents", "Info.plist"));
384
+ await reidentifyBundle(context, canonical, recipe.bundleId);
385
+ await recipe.validateFetched(canonical, recipe.bundleId);
386
+ const sourcePath = join(directory, "artifact.cache");
387
+ await packMacosArtifact(canonical, key, sourcePath, signal);
388
+ if ((await identity()).key !== key) throw new Error("SwiftPM inputs changed while the cache entry was packed.");
389
+ await storeLocal(key, sourcePath, signal);
390
+ const files = await shared();
391
+ if (!files) return;
392
+ await providerCall((childSignal) => files.store({
393
+ key: fileKey(key),
394
+ sourcePath,
395
+ overwrite: true,
396
+ signal: childSignal
397
+ }), buildUploadTimeoutMs(context.env), context, directory, signal);
398
+ signal.throwIfAborted();
399
+ }
400
+ };
401
+ }
402
+ //#endregion
403
+ //#region src/integrations/swiftpm-macos.ts
404
+ function swiftpmMacosProject(root) {
405
+ return { async prepare(context, settings) {
406
+ const macos = settings.macos;
407
+ if (!macos?.product || !macos.infoPlist) throw Object.assign(/* @__PURE__ */ new Error("Set macos.product and macos.infoPlist explicitly in .stim.json. See stim guide macos."), { code: "STIM_BAD_ARG" });
408
+ const { product, infoPlist } = macos;
409
+ const { bundleId } = await validateInfoPlist(context, root, product, infoPlist);
410
+ const repository = realpathSync(await repoRootAsync(root, {
411
+ env: context.env,
412
+ signal: context.signal
413
+ }) ?? root);
414
+ const extras = resolveBundleExtras(root, repository, macos.resources, macos.assetCatalog);
415
+ const recipe = {
416
+ product,
417
+ arguments: macos.arguments ?? [],
418
+ bundleId,
419
+ async compile({ scratch, writer, note }) {
420
+ await tool(context, root, [
421
+ "build",
422
+ "-c",
423
+ "debug",
424
+ "--product",
425
+ product,
426
+ "--scratch-path",
427
+ scratch,
428
+ "--jobs",
429
+ "2"
430
+ ], writer, note);
431
+ return tool(context, root, [
432
+ "build",
433
+ "-c",
434
+ "debug",
435
+ "--scratch-path",
436
+ scratch,
437
+ "--show-bin-path"
438
+ ], writer, () => {}, true);
439
+ },
440
+ stage: (bin, bundle, id, displayName) => stageBundle(context, root, product, infoPlist, bin, bundle, id, extras, displayName),
441
+ async validateFetched(bundle, id, displayName) {
442
+ const executable = join(bundle, "Contents", "MacOS", product);
443
+ const plist = JSON.parse(await getExecutor().runFileAsync("plutil", [
444
+ "-convert",
445
+ "json",
446
+ "-o",
447
+ "-",
448
+ join(bundle, "Contents", "Info.plist")
449
+ ], {
450
+ timeoutMs: 1e4,
451
+ declareFor: context
452
+ }));
453
+ if (plist.CFBundleIdentifier !== id || plist.CFBundleExecutable !== product || !existsSync(executable)) throw new Error("The fetched macOS bundle does not match the requested identity and executable.");
454
+ for (const destination of [...Object.keys(extras.resources), ...extras.assetCatalog ? ["Assets.car"] : []]) if (!existsSync(join(bundle, "Contents", "Resources", destination))) throw new Error(`The fetched macOS bundle lacks declared resource ${destination}.`);
455
+ if (displayName !== void 0) {
456
+ await setBundleName(context, join(bundle, "Contents", "Info.plist"), displayName);
457
+ await getExecutor().runFileAsync("codesign", [
458
+ "--force",
459
+ "--sign",
460
+ "-",
461
+ bundle
462
+ ], {
463
+ timeoutMs: "unbounded",
464
+ declareFor: context
465
+ });
466
+ }
467
+ await getExecutor().runFileAsync("codesign", [
468
+ "--verify",
469
+ "--strict",
470
+ bundle
471
+ ], {
472
+ timeoutMs: "unbounded",
473
+ declareFor: context
474
+ });
475
+ },
476
+ offload: {
477
+ target: async () => ({
478
+ platform: "macos",
479
+ local: await macosToolchainAsync()
480
+ }),
481
+ request: (id) => ({
482
+ platform: "macos",
483
+ product,
484
+ infoPlist: relative(root, resolve(root, infoPlist)),
485
+ bundleId: id,
486
+ resources: Object.fromEntries(Object.entries(extras.resources).map(([destination, source]) => [destination, relative(repository, source)])),
487
+ assetCatalog: extras.assetCatalog ? relative(repository, extras.assetCatalog) : null
488
+ })
489
+ }
490
+ };
491
+ recipe.cache = swiftpmArtifactCache(context, root, settings, recipe, {
492
+ product,
493
+ infoPlist,
494
+ resources: Object.fromEntries(Object.entries(extras.resources).map(([destination, source]) => [destination, relative(root, source)])),
495
+ assetCatalog: extras.assetCatalog ? relative(root, extras.assetCatalog) : null
496
+ });
497
+ return recipe;
498
+ } };
499
+ }
500
+ async function tool(context, root, args, writer, note, capture = false) {
501
+ const child = spawnDeclared(context, () => getExecutor().spawn("swift", args, {
502
+ cwd: root,
503
+ detached: true,
504
+ stdio: [
505
+ "ignore",
506
+ "pipe",
507
+ "pipe"
508
+ ]
509
+ }));
510
+ let stdout = "";
511
+ child.stdout?.on("data", (chunk) => {
512
+ if (capture) stdout += chunk.toString("utf8");
513
+ });
514
+ const write = (msg) => {
515
+ writer.write({
516
+ src: "build",
517
+ platform: "macos",
518
+ level: "debug",
519
+ msg
520
+ });
521
+ note(msg);
522
+ };
523
+ if (child.stdout) logLines(child.stdout, write);
524
+ if (child.stderr) logLines(child.stderr, write);
525
+ await new Promise((done, reject) => {
526
+ child.once("error", reject);
527
+ child.once("close", (code) => code === 0 ? done() : reject(/* @__PURE__ */ new Error(`swift ${args[0]} failed (${code}). See stim logs --source build.`)));
528
+ });
529
+ return stdout.trim();
530
+ }
531
+ //#endregion
532
+ export { swiftpmMacosProject };
@@ -0,0 +1,2 @@
1
+ import { c as macosToolchain, l as macosToolchainAsync } from "./toolchain-DpJMHq0n.mjs";
2
+ export { macosToolchain, macosToolchainAsync };
@@ -1,8 +1,8 @@
1
- import { s as spawnDeclared, t as getExecutor } from "./exec-_UbtCQcG.mjs";
1
+ import { d as spawnDeclared, t as getExecutor } from "./exec-DEoAhcze.mjs";
2
2
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
3
- import { qt as killOnAbort } from "./settings-CsJDEXgK.mjs";
4
- import { o as androidHome } from "./android-DUYkNF4u.mjs";
5
- import { b as bundlerPin, h as startBuildHeartbeat, r as HEARTBEAT_INTERVAL_MS } from "./xcode-Zlx3qjEs.mjs";
3
+ import { a as killOnAbort } from "./operation-exec-BW0em61G.mjs";
4
+ import { o as androidHome } from "./android-C7sVmyI9.mjs";
5
+ import { b as bundlerPin, h as startBuildHeartbeat, r as HEARTBEAT_INTERVAL_MS } from "./xcode-BXn9-xYx.mjs";
6
6
  import { createRequire } from "node:module";
7
7
  import { existsSync, mkdtempSync, readFileSync, readdirSync, realpathSync, rmSync } from "node:fs";
8
8
  import { homedir, tmpdir } from "node:os";
@@ -727,7 +727,10 @@ function androidRequirements(projectRoot) {
727
727
  function iphoneRuntimes(listed) {
728
728
  const devices = listed?.devices;
729
729
  if (!devices || typeof devices !== "object") return [];
730
- return Object.entries(devices).filter(([, list]) => (Array.isArray(list) ? list : []).some((device) => device.isAvailable !== false && typeof device.name === "string" && device.name.startsWith("iPhone"))).map(([runtime]) => runtime).toSorted();
730
+ return Object.entries(devices).filter(([, list]) => (Array.isArray(list) ? list : []).some(availableIphone)).map(([runtime]) => runtime).toSorted();
731
+ }
732
+ function availableIphone(device) {
733
+ return device.isAvailable === true && typeof device.deviceTypeIdentifier === "string" && device.deviceTypeIdentifier.startsWith("com.apple.CoreSimulator.SimDeviceType.iPhone-");
731
734
  }
732
735
  function listDir(path) {
733
736
  try {
@@ -870,4 +873,4 @@ function toolchainMismatches(target, worker) {
870
873
  return out;
871
874
  }
872
875
  //#endregion
873
- export { runPodInstall as _, iphoneRuntimes as a, macosToolchainAsync as c, workerToolchain as d, DEPS_ERROR as f, runCaptured as g, readRubyVersion as h, iosToolchainAsync as i, parseAndroidRequirements as l, readPodState as m, androidToolchain as n, jdkMajor as o, podsAreStale as p, androidToolchainAsync as r, macosToolchain as s, androidRequirements as t, toolchainMismatches as u };
876
+ export { runCaptured as _, iosToolchainAsync as a, macosToolchain as c, toolchainMismatches as d, workerToolchain as f, readRubyVersion as g, readPodState as h, availableIphone as i, macosToolchainAsync as l, podsAreStale as m, androidToolchain as n, iphoneRuntimes as o, DEPS_ERROR as p, androidToolchainAsync as r, jdkMajor as s, androidRequirements as t, parseAndroidRequirements as u, runPodInstall as v };
@@ -1,11 +1,11 @@
1
- import { t as getExecutor } from "./exec-_UbtCQcG.mjs";
1
+ import { t as getExecutor } from "./exec-DEoAhcze.mjs";
2
2
  import { t as resolveMaintenanceSettings } from "./settings-Djl-mpjX.mjs";
3
3
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
4
- import { n as windowsLauncherArgs } from "./detached-entry-DFRyG1_o.mjs";
4
+ import { n as windowsLauncherArgs } from "./detached-entry-BwNEtIrP.mjs";
5
5
  import { n as stampAttempt, r as due, t as capChildLog } from "./attempt-DW-mQqM7.mjs";
6
+ import { readClaimSet } from "@stim-cli/core/ownership-claim";
6
7
  import { closeSync, openSync } from "node:fs";
7
8
  import { maintenanceChildLogFile, maintenanceRunClaims, readMaintenanceAttempt, readMaintenanceState } from "@stim-cli/core/state";
8
- import { readClaimSet } from "@stim-cli/core/ownership-claim";
9
9
  //#region src/maintenance/trigger.ts
10
10
  const WARNING_FRESH_MS = 6e5;
11
11
  function warnCriticalDisk() {
@@ -0,0 +1,2 @@
1
+ import { t as triggerMaintenance } from "./trigger-Cbyc41d_.mjs";
2
+ export { triggerMaintenance };