stim 1.19.0 → 1.20.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 (172) hide show
  1. package/README.md +20 -3
  2. package/dist/{activity-BSw0x84R.mjs → activity-BrGh9EAI.mjs} +3 -3
  3. package/dist/{agent-device-usage-output-Bjxu_VmX.mjs → agent-device-usage-output-DVyv_hWj.mjs} +7 -7
  4. package/dist/android-0vv-OruW.mjs +6 -0
  5. package/dist/android-Brx6EKvJ.mjs +1258 -0
  6. package/dist/{android-BdQC6zs1.mjs → android-BsYNR81W.mjs} +103 -45
  7. package/dist/{android-DE5g_5gv.mjs → android-CK3fpEyZ.mjs} +2 -2
  8. package/dist/{android-cas-C87geAg-.mjs → android-cas-DCAuXryb.mjs} +9 -5
  9. package/dist/android-cas-compiler.mjs +1 -1
  10. package/dist/api-run.mjs +159 -8
  11. package/dist/{api-DIf_s86s.mjs → api-zuX3ynYN.mjs} +5 -1
  12. package/dist/api.d.mts +98 -4
  13. package/dist/api.mjs +1 -1
  14. package/dist/{app-install-CFI4ptUL.mjs → app-install-0LgaQRT7.mjs} +9 -8
  15. package/dist/artifact-CnC0mfov.mjs +807 -0
  16. package/dist/artifact-DClXJNWx.mjs +772 -0
  17. package/dist/artifact-lifecycle-DzPpBYvK.mjs +30 -0
  18. package/dist/{browser-web-CDhqQxhv.mjs → browser-web-CzBmhmgs.mjs} +19 -19
  19. package/dist/{budget-Dz-kyXLv.mjs → budget-BONq9vXY.mjs} +3101 -3062
  20. package/dist/build-BixRI6sB.mjs +462 -0
  21. package/dist/{build-facts-B87vo-Im.d.mts → build-facts-DcLv2HSd.d.mts} +1 -32
  22. package/dist/build-plan-CP0tckNU.mjs +553 -0
  23. package/dist/{cache-manifest-DiwKSyv9.mjs → cache-manifest-qA3dT2x2.mjs} +1 -1
  24. package/dist/cache-manifest.mjs +1 -1
  25. package/dist/{manifest-CX0d1IkZ.mjs → ccache-CjHQ5F8g.mjs} +13 -19
  26. package/dist/{chrome-BTUOo8p2.mjs → chrome-Dp2lMLBe.mjs} +1 -1
  27. package/dist/{cli-C9Zvgbdc.mjs → cli-B2R8wH1F.mjs} +20 -20
  28. package/dist/cli.mjs +1 -1
  29. package/dist/{client-CuUo8Nvg.mjs → client-BLy1Pw2V.mjs} +89 -307
  30. package/dist/collector-run.d.mts +4 -0
  31. package/dist/collector-run.mjs +7 -7
  32. package/dist/{command-output-Bt8ygHE7.mjs → command-output-BjPN99ZB.mjs} +2 -2
  33. package/dist/{config-DC5jEtd1.mjs → config-D0LhTY3S.mjs} +8 -12
  34. package/dist/{created-devices-D0s26Hx5.mjs → created-devices-HU_DAb_Q.mjs} +7 -6
  35. package/dist/{dependency-state-DKaS1OM9.mjs → dependency-state-B2m8eqsS.mjs} +2 -2
  36. package/dist/{detached-entry-pB_IPfV4.mjs → detached-entry-BXq4fIl-.mjs} +1 -1
  37. package/dist/{dev-client-CDY_zAmD.mjs → dev-client-ClATaJoH.mjs} +2 -2
  38. package/dist/{device-BHw0WlHl.mjs → device-B7lsC0K1.mjs} +8 -8
  39. package/dist/device-DVCwAFlX.mjs +727 -0
  40. package/dist/{device-capacity-BoN1jQkO.mjs → device-capacity-Ca_ke1LE.mjs} +13 -14
  41. package/dist/device-host-worker.mjs +38 -18
  42. package/dist/device-ios-CRUqPxKw.mjs +413 -0
  43. package/dist/{device-lease-Cu7PtQpZ.mjs → device-lease-DHOBXGgS.mjs} +135 -22
  44. package/dist/{device-lease-run-D38SnZtt.mjs → device-lease-run-CvDeHTkG.mjs} +4 -4
  45. package/dist/{device-pool-CP4rAsHx.mjs → device-pool-L2-5GxMy.mjs} +3 -3
  46. package/dist/{device-remote-B5GiUifk.mjs → device-remote-Bmg42063.mjs} +17 -68
  47. package/dist/doctor-C2MSuMMg.mjs +515 -0
  48. package/dist/{doctor-PRJH94v6.mjs → doctor-DPAqhVCK.mjs} +333 -744
  49. package/dist/{doctor-watchman-wZhyTdp4.mjs → doctor-watchman-CB4NnVZm.mjs} +13 -12
  50. package/dist/{simslim-D9LkJxIO.mjs → eas-build-Dw_ec2Km.mjs} +6 -152
  51. package/dist/{stim-installations-DbmUjsLv.mjs → eas-session-ledger-DZlC-Fq3.mjs} +57 -4
  52. package/dist/{error-diagnostics--v5HGOU0.mjs → error-diagnostics-Du7I_GuY.mjs} +17 -12
  53. package/dist/errors-DzkMYh8Q.mjs +205 -0
  54. package/dist/{exec-i8GDPwq9.mjs → exec-B81Qodjn.mjs} +40 -10
  55. package/dist/{gc-CyHMcKcn.mjs → gc-PWp34zGb.mjs} +21 -20
  56. package/dist/{device-ios-B2ruohE-.mjs → gradle-C2OEKCCI.mjs} +21 -650
  57. package/dist/{guide-dRaQJJk9.mjs → guide-Dai9lphv.mjs} +504 -117
  58. package/dist/{hosted-android-Bs7fytj7.mjs → hosted-android-DQ-Agsd8.mjs} +5 -5
  59. package/dist/{hosted-client-C5G4h_OJ.mjs → hosted-client-Io01s5By.mjs} +9 -3
  60. package/dist/{hosted-ios-Bik035eL.mjs → hosted-ios-DIxFnYp-.mjs} +3 -3
  61. package/dist/{hosted-logs-CI9Az9a4.mjs → hosted-logs-DP-ABU_M.mjs} +8 -8
  62. package/dist/{hosted-macos-DABm3ScO.mjs → hosted-macos-Aziw9T_9.mjs} +7 -6
  63. package/dist/{hosted-native-DbV2aUVw.mjs → hosted-native-BdAQi21M.mjs} +17 -14
  64. package/dist/{idle-shutdown-DYiMBn34.mjs → idle-shutdown-DdMqoSUB.mjs} +7 -7
  65. package/dist/{ios-DYUr9LGc.mjs → ios-BZ9dg2Fr.mjs} +8 -7
  66. package/dist/{ios-BWbHFZVz.mjs → ios-CXLIUxXJ.mjs} +180 -24
  67. package/dist/ios-CZuv6gRv.mjs +1112 -0
  68. package/dist/{ios-DCrkgXEM.mjs → ios-VGvNdsv2.mjs} +1 -1
  69. package/dist/{ios-device-CrW8aMb5.mjs → ios-device-B1B14xND.mjs} +1 -1
  70. package/dist/{ios-device-CJ_ZOGky.mjs → ios-device-BreZOpM0.mjs} +3 -3
  71. package/dist/ios-project-B9drt_aY.mjs +197 -0
  72. package/dist/{ios-state-By0XuLTQ.mjs → ios-state-CjrL2qv-.mjs} +1 -1
  73. package/dist/js-swap-C8icNYIY.mjs +432 -0
  74. package/dist/launch-DxH0THLP.mjs +745 -0
  75. package/dist/{react-native-ios-CSpIxexZ.mjs → launch-YrbqaIFj.mjs} +59 -612
  76. package/dist/{launch-verify-DCveSE6d.mjs → launch-verify-BzRdbuO1.mjs} +26 -7
  77. package/dist/{logs-Bao1HOMy.mjs → logs-DHaRNfg7.mjs} +11 -11
  78. package/dist/macos-C0iljhsN.mjs +2 -0
  79. package/dist/{macos-ciyBdTY5.mjs → macos-V_3Ui7g4.mjs} +42 -50
  80. package/dist/macos-run.mjs +1 -1
  81. package/dist/maintenance-run.mjs +13 -10
  82. package/dist/{metro-DI2AjPF_.mjs → metro-D_j9sN-B.mjs} +18 -5
  83. package/dist/{metro-gateway-BxpJLIwh.mjs → metro-gateway-BBJldOdi.mjs} +2 -2
  84. package/dist/miss-reason-BPAzZS0r.mjs +238 -0
  85. package/dist/{named-ports-B4iWH4E-.mjs → named-ports-C2lvoPsb.mjs} +3 -3
  86. package/dist/native-android-lHzaew7r.mjs +226 -0
  87. package/dist/native-gradle-inputs-BQnIdAlL.mjs +356 -0
  88. package/dist/{native-runtime-BGxsbfny.mjs → native-runtime-BRmWL7ru.mjs} +9 -8
  89. package/dist/native-xcode-inputs-eutS19jU.mjs +307 -0
  90. package/dist/native-xcode-ios-DP3cHLwu.mjs +434 -0
  91. package/dist/{ndjson-LGZAMsqa.mjs → ndjson-GOnbyvso.mjs} +6 -6
  92. package/dist/offload-worker.d.mts +41 -7
  93. package/dist/offload-worker.mjs +409 -74
  94. package/dist/{ownership-EB0ySdGK.mjs → ownership-DXzMMSx6.mjs} +2 -2
  95. package/dist/{placement-log-Dxe34rJm.mjs → placement-log-reFbjqEr.mjs} +1 -1
  96. package/dist/plan-BDk2AeY_.mjs +260 -0
  97. package/dist/plan-placement-D_YYlE6N.mjs +73 -0
  98. package/dist/{ports-ByPc0_97.mjs → ports-jzvAJXXL.mjs} +3 -3
  99. package/dist/{prebuild-BKJ3wJI1.mjs → prebuild-Bw44QxVh.mjs} +4 -4
  100. package/dist/{preview-BbSottmO.mjs → preview-BaBJ72Al.mjs} +50 -32
  101. package/dist/project-B8_duAzW.mjs +1067 -0
  102. package/dist/project-plan-BPwbLwQu.mjs +10 -0
  103. package/dist/{pull-request-IHNdMnG8.mjs → pull-request-vOhLNmIb.mjs} +1 -1
  104. package/dist/pull-requests.mjs +1 -1
  105. package/dist/react-native-android-chm1DMlA.mjs +921 -0
  106. package/dist/react-native-build-oAw6gQeW.mjs +239 -0
  107. package/dist/react-native-doctor-DYXoh-6I.mjs +78 -0
  108. package/dist/react-native-ios-SCTK_CT5.mjs +595 -0
  109. package/dist/{recordings-Bv8McZN4.mjs → recordings-Bk-VivUV.mjs} +1 -1
  110. package/dist/{reload-rAPdqeRR.mjs → reload-D34GkY78.mjs} +17 -13
  111. package/dist/remote-BU9UyhCJ.mjs +192 -0
  112. package/dist/{remote-cache-N3hAEaAL.mjs → remote-cache-Bsts6f6Y.mjs} +5 -5
  113. package/dist/result-BDoRk1k3.mjs +186 -0
  114. package/dist/{run-lAkle1-c.mjs → run-qvff78hv.mjs} +3 -3
  115. package/dist/{server-bare-CkIjnegq.mjs → server-bare-dWjAarki.mjs} +5 -5
  116. package/dist/server-command-7XIKlWtO.mjs +69 -0
  117. package/dist/{server-expo-n3tUi3Em.mjs → server-expo-CsYu2aKL.mjs} +107 -82
  118. package/dist/server-expo-DV43vep4.mjs +2 -0
  119. package/dist/{settings-CxgngUZk.mjs → settings-Bbztm4oV.mjs} +179 -129
  120. package/dist/{settings-2am7TSxp.mjs → settings-CT3E71-i.mjs} +6 -6
  121. package/dist/{state-lKh8shBp.d.mts → settings-vk3mJGSm.d.mts} +4 -2
  122. package/dist/settings.schema.json +84 -0
  123. package/dist/simslim-ChMfe8rg.mjs +149 -0
  124. package/dist/{slot-launch-HV_KtPIw.mjs → slot-launch-B9hn96wd.mjs} +6 -6
  125. package/dist/{stage-BgaZJVZY.mjs → stage-BNKKdDNc.mjs} +6 -3
  126. package/dist/start-CbQCSnXQ.mjs +2 -0
  127. package/dist/{start-DtxthMfI.mjs → start-CdvcTaXr.mjs} +97 -68
  128. package/dist/{state-Tp4uImDS.mjs → state-Boo0IMJq.mjs} +1 -1
  129. package/dist/{state-D2KtnALG.mjs → state-DI84A-uu.mjs} +29 -10
  130. package/dist/{stats-8EJ5ivFT.mjs → stats-BIIDrjA8.mjs} +5 -5
  131. package/dist/{status-BEeL6IKz.mjs → status-BDGHwkCs.mjs} +3 -1
  132. package/dist/{status-BOyp0CUl.mjs → status-DARMkc9q.mjs} +81 -293
  133. package/dist/status-watch-DvmI3SmN.mjs +296 -0
  134. package/dist/{stim-desktop-C65jk_q2.mjs → stim-desktop-8GQX2OV8.mjs} +1 -1
  135. package/dist/{stop-DRipAg-e.mjs → stop-CCZS-C9m.mjs} +2 -2
  136. package/dist/{stop-D0UIpZuh.mjs → stop-WQPQHLuy.mjs} +5 -5
  137. package/dist/{stop-zDlknFoz.mjs → stop-iNemHsJC.mjs} +21 -20
  138. package/dist/supervisor-run.d.mts +7 -2
  139. package/dist/supervisor-run.mjs +32 -20
  140. package/dist/{support-DsNaFg6D.mjs → support-CnE_SIjt.mjs} +17 -7
  141. package/dist/{support-CNqYkV0y.mjs → support-DCco5fut.mjs} +61 -8
  142. package/dist/{swiftpm-macos-aJzPAj1t.mjs → swiftpm-macos-afeNUExW.mjs} +5 -5
  143. package/dist/tailnet-CoJUb2tB.mjs +265 -0
  144. package/dist/toolchain-BIupIro1.mjs +2 -0
  145. package/dist/{toolchain-C3xSoyUl.mjs → toolchain-DqyDXs30.mjs} +206 -53
  146. package/dist/{trigger-CAhmG-4s.mjs → trigger-C0MWBi8O.mjs} +2 -2
  147. package/dist/trigger-SHLOWJ4O.mjs +2 -0
  148. package/dist/{warm-progress-pFLB2e6P.mjs → warm-progress-C3ASD6z5.mjs} +6 -6
  149. package/dist/{watchman-BL1IdOtq.mjs → watchman-CQl51YZu.mjs} +6 -6
  150. package/dist/{web-DbbrPUn0.mjs → web-B3eldHFH.mjs} +9 -13
  151. package/dist/web-BLXpOe6b.mjs +2 -0
  152. package/dist/web-run.mjs +10 -10
  153. package/dist/{workspace-state-CR9X86xJ.mjs → workspace-state-CSIFuuDa.mjs} +33 -33
  154. package/dist/{workspaces-Djb2gfi9.mjs → workspaces-D2xSHBDY.mjs} +1260 -1258
  155. package/dist/{worktree-BL4M1rhB.mjs → worktree-BxDqaTev.mjs} +84 -48
  156. package/dist/worktree-q7_OZNY0.mjs +2 -0
  157. package/package.json +8 -6
  158. package/shim/native-android.gradle +101 -0
  159. package/dist/android-BXc6BmEi.mjs +0 -3732
  160. package/dist/android-BvV1gGdN.mjs +0 -4
  161. package/dist/ios-ITYno9rO.mjs +0 -2241
  162. package/dist/macos-nIOATJmR.mjs +0 -2
  163. package/dist/metro-store-BAHFcJm6.mjs +0 -106
  164. package/dist/miss-reason-CjQCOKqq.mjs +0 -1743
  165. package/dist/plan-placement-BVY59qa8.mjs +0 -290
  166. package/dist/project-B5eQ1USs.mjs +0 -612
  167. package/dist/react-native-ios-BMh2i25I.mjs +0 -2
  168. package/dist/server-expo-DGsdUGX2.mjs +0 -2
  169. package/dist/start-D8NbxNBb.mjs +0 -2
  170. package/dist/trigger-CoalsMTV.mjs +0 -2
  171. package/dist/web-DFpFeZu5.mjs +0 -2
  172. package/dist/worktree-DV-A0LNL.mjs +0 -2
@@ -1,8 +1,8 @@
1
- import { D as withConfigLock$1, O as writeConfigSetting, _ as loadConfig$1, f as getConfigPath$1, h as getRepoSettings, m as getProjectSettings } from "./config-DC5jEtd1.mjs";
2
- import { n as findCommandWorkspace, t as NO_PROJECT_REFUSAL } from "./project-B5eQ1USs.mjs";
3
- import { W as unknownSettingKeys, j as readCommittedSettings, mt as repoRoot, nt as gitCommonDir } from "./settings-CxgngUZk.mjs";
4
- import { n as settingDefault, r as stimDesktopInstalled } from "./stim-desktop-C65jk_q2.mjs";
5
- import { n as recordingLayers, t as deleteTurnedOffRecordings } from "./recordings-Bv8McZN4.mjs";
1
+ import { D as withConfigLock$1, O as writeConfigSetting, _ as loadConfig$1, f as getConfigPath$1, h as getRepoSettings, m as getProjectSettings } from "./config-D0LhTY3S.mjs";
2
+ import { Et as repoRoot, R as readCommittedSettings, mt as gitCommonDir, nt as unknownSettingKeys } from "./settings-Bbztm4oV.mjs";
3
+ import { n as findCommandWorkspace, t as NO_PROJECT_REFUSAL } from "./project-B8_duAzW.mjs";
4
+ import { n as settingDefault, r as stimDesktopInstalled } from "./stim-desktop-8GQX2OV8.mjs";
5
+ import { n as recordingLayers, t as deleteTurnedOffRecordings } from "./recordings-Bk-VivUV.mjs";
6
6
  import { existsSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
7
7
  import { join } from "node:path";
8
8
  import { SETTINGS, SETTING_SCOPES, coerceSettingText, isJsonObject, isSensitiveReference, settingDefinition, settingValueError } from "@stim-cli/core/state";
@@ -348,7 +348,7 @@ function registerSettings(program, io = CONSOLE, env = process.env) {
348
348
  const setting = requireSetting(key);
349
349
  const scope = readScope(opts.scope, setting);
350
350
  const value = parseSettingValue(setting, raw);
351
- if (setting.sensitive && scope === "committed" && !isSensitiveReference(value)) throw new Refusal("STIM_BAD_ARG", `${key} is sensitive, so a committed .stim.json takes only an env: or file: reference, never the secret.`, `Set the secret with --scope workspace or --scope repo, or commit a reference such as env:MY_KEYSTORE_PASSWORD.`);
351
+ if (setting.sensitive && scope === "committed" && !isSensitiveReference(value)) throw new Refusal("STIM_BAD_ARG", `${key} is sensitive, so a committed .stim.json takes only an env: or file: reference, never the secret.`, `Set the secret with --scope workspace or --scope repo, which store it in ${getConfigPath$1()}, readable only by you, or commit a reference such as env:MY_KEYSTORE_PASSWORD.`);
352
352
  const context = readContext(env, io.note);
353
353
  const file = requireLayer(context, scope, setting);
354
354
  const recording = setting.key === "recording.enabled" ? recordingLayers() : null;
@@ -1,4 +1,6 @@
1
- import "@stim-cli/core/state";
1
+ import "./ndjson-Du3j0AQ9.mjs";
2
+ import { SettingsObject, WebViewport } from "@stim-cli/core/state";
3
+ import "@stim-cli/cache";
2
4
  import { ProcessRecord } from "@stim-cli/core/process-identity";
3
5
  //#region src/supervisor/state.d.ts
4
6
  declare const MODE_BARE = "bare-inproc";
@@ -8,4 +10,4 @@ declare function clearExpoMetroTunnel(root: string): void;
8
10
  declare function writePidFile(root: string, pid: number): string;
9
11
  declare function readPidFile(root: string): number | null;
10
12
  //#endregion
11
- export { readPidFile as a, clearWorkspaceSupervisor as i, MODE_EXPO as n, writePidFile as o, clearExpoMetroTunnel as r, MODE_BARE as t };
13
+ export { clearWorkspaceSupervisor as a, clearExpoMetroTunnel as i, MODE_BARE as n, readPidFile as o, MODE_EXPO as r, writePidFile as s, SettingsObject as t };
@@ -274,6 +274,18 @@
274
274
  ]
275
275
  }
276
276
  },
277
+ "scheme": {
278
+ "description": "Shared Xcode scheme to build when the workspace has several",
279
+ "type": "string",
280
+ "x-stim": {
281
+ "key": "ios.scheme",
282
+ "kind": "string",
283
+ "scopes": [
284
+ "workspace",
285
+ "committed"
286
+ ]
287
+ }
288
+ },
277
289
  "remote": {
278
290
  "description": "Default iOS remote target: eas, proxy, or an approved Mac in remote.machines; auto places on an approved Mac when this Mac is full or busy; local runs here, overriding a lower layer",
279
291
  "type": "string",
@@ -289,6 +301,20 @@
289
301
  ]
290
302
  }
291
303
  },
304
+ "projectPath": {
305
+ "description": "Directory under the app that holds a bare React Native app's Xcode project and Podfile",
306
+ "type": "string",
307
+ "default": "ios",
308
+ "x-stim": {
309
+ "key": "ios.projectPath",
310
+ "kind": "path",
311
+ "scopes": [
312
+ "workspace",
313
+ "committed"
314
+ ],
315
+ "relative": true
316
+ }
317
+ },
292
318
  "simslimProfile": {
293
319
  "description": "SimSlim JSON profile under the app",
294
320
  "type": "string",
@@ -367,6 +393,7 @@
367
393
  "deviceProfile": {
368
394
  "description": "avdmanager hardware profile id for new owned AVDs",
369
395
  "type": "string",
396
+ "pattern": "^[A-Za-z0-9 ._()-]*$",
370
397
  "default": "pixel_6",
371
398
  "x-stim": {
372
399
  "key": "android.deviceProfile",
@@ -422,6 +449,34 @@
422
449
  ]
423
450
  }
424
451
  },
452
+ "gradleRoot": {
453
+ "description": "Directory relative to the app holding gradlew and settings.gradle; may be outside the app but not the repository",
454
+ "type": "string",
455
+ "default": "android",
456
+ "x-stim": {
457
+ "key": "android.gradleRoot",
458
+ "kind": "path",
459
+ "scopes": [
460
+ "workspace",
461
+ "committed"
462
+ ],
463
+ "relative": true
464
+ }
465
+ },
466
+ "module": {
467
+ "description": "The app's Gradle project path, such as :app",
468
+ "type": "string",
469
+ "pattern": "^(:(?!\\.\\.?(?::|$))[A-Za-z0-9._-]+)+$",
470
+ "default": ":app",
471
+ "x-stim": {
472
+ "key": "android.module",
473
+ "kind": "string",
474
+ "scopes": [
475
+ "workspace",
476
+ "committed"
477
+ ]
478
+ }
479
+ },
425
480
  "variant": {
426
481
  "description": "Gradle build variant",
427
482
  "type": "string",
@@ -435,6 +490,19 @@
435
490
  ]
436
491
  }
437
492
  },
493
+ "offloadInputs": {
494
+ "description": "Native Gradle source sufficiency, exact ignored inputs and generated output directories for build workers",
495
+ "type": "object",
496
+ "x-stim": {
497
+ "key": "android.offloadInputs",
498
+ "kind": "object",
499
+ "scopes": [
500
+ "workspace",
501
+ "repo",
502
+ "committed"
503
+ ]
504
+ }
505
+ },
438
506
  "keystore": {
439
507
  "description": "Keystore a re-packed release APK is signed with",
440
508
  "type": "string",
@@ -506,6 +574,21 @@
506
574
  ]
507
575
  }
508
576
  },
577
+ "command": {
578
+ "description": "Command that starts this project's dev server, as an argv array run from the app directory; {port} is replaced with the reserved Metro port",
579
+ "type": "array",
580
+ "items": {
581
+ "type": "string"
582
+ },
583
+ "x-stim": {
584
+ "key": "metro.command",
585
+ "kind": "strings",
586
+ "scopes": [
587
+ "workspace",
588
+ "committed"
589
+ ]
590
+ }
591
+ },
509
592
  "ngrokUrl": {
510
593
  "description": "Stable ngrok URL for the managed tunnel",
511
594
  "type": "string",
@@ -1197,6 +1280,7 @@
1197
1280
  "deviceProfile": {
1198
1281
  "description": "avdmanager hardware profile id for new owned AVDs",
1199
1282
  "type": "string",
1283
+ "pattern": "^[A-Za-z0-9 ._()-]*$",
1200
1284
  "default": "pixel_6",
1201
1285
  "x-stim": {
1202
1286
  "key": "android.deviceProfile",
@@ -0,0 +1,149 @@
1
+ import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
2
+ import { t as getExecutor } from "./exec-B81Qodjn.mjs";
3
+ import { d as getConfigDir } from "./config-D0LhTY3S.mjs";
4
+ import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
5
+ import { join } from "node:path";
6
+ //#region src/engine/simslim.ts
7
+ async function reconcileSimSlim({ udid, profile, previouslyManaged = false, out = () => {}, spawn, timeoutMs = 72e4, cleanupMs = 1e4 }) {
8
+ if (!profile && !previouslyManaged) return {
9
+ managed: false,
10
+ profile: null
11
+ };
12
+ const action = profile ? "on" : "off";
13
+ const args = profile ? [
14
+ "on",
15
+ udid,
16
+ "--profile",
17
+ profile
18
+ ] : ["off", udid];
19
+ const lines = [];
20
+ const onLine = (raw) => {
21
+ const line = stripAnsi(raw).trim();
22
+ if (!line) return;
23
+ lines.push(line);
24
+ if (lines.length > 20) lines.shift();
25
+ out(`SimSlim: ${line}`);
26
+ };
27
+ const stdout = createLineReader(onLine);
28
+ const stderr = createLineReader(onLine);
29
+ const root = join(getConfigDir(), "simslim-locks", `${encodeURIComponent(udid.toLowerCase())}.lock`);
30
+ const label = `SimSlim for ${udid}`;
31
+ const attempt = (0, ownership_claim_exports.tryAcquireClaim)({
32
+ root,
33
+ mode: "exclusive",
34
+ label
35
+ });
36
+ if (attempt.pending) (0, ownership_claim_exports.releaseClaim)(attempt.pending);
37
+ const claim = attempt.acquired;
38
+ if (!claim) throw new ownership_claim_exports.ClaimRefusedError({
39
+ root,
40
+ claimPath: attempt.held?.path ?? root,
41
+ label,
42
+ reason: "another SimSlim operation is still using this simulator"
43
+ });
44
+ let child;
45
+ let result;
46
+ let identity;
47
+ let cancellation;
48
+ const stopGroup = () => {
49
+ if (child?.pid !== void 0 && identity && (0, process_identity_exports.inspectProcessIdentity)(identity) === "same") try {
50
+ process.kill(-child.pid, "SIGKILL");
51
+ } catch {}
52
+ };
53
+ const cancel = (signal) => {
54
+ cancellation ??= signal;
55
+ stopGroup();
56
+ };
57
+ const onInterrupt = () => cancel("SIGINT");
58
+ const onTerminate = () => cancel("SIGTERM");
59
+ const groupAlive = () => child?.pid !== void 0 && (0, ownership_claim_exports.processGroupAlive)(child.pid);
60
+ const settled = () => result !== void 0 && !groupAlive();
61
+ const waitUntil = async (deadline, cancellable = false) => {
62
+ while (!settled() && Date.now() < deadline) {
63
+ if (cancellable && cancellation) break;
64
+ await new Promise((resolve) => setTimeout(resolve, Math.min(50, deadline - Date.now())));
65
+ }
66
+ return settled();
67
+ };
68
+ process.on("SIGINT", onInterrupt);
69
+ process.on("SIGTERM", onTerminate);
70
+ process.on("exit", stopGroup);
71
+ try {
72
+ (0, ownership_claim_exports.markClaimChildPending)(claim);
73
+ try {
74
+ child = (spawn ?? ((cmd, childArgs, opts) => getExecutor().spawn(cmd, childArgs, opts)))("simslim", args, {
75
+ stdio: [
76
+ "ignore",
77
+ "pipe",
78
+ "pipe"
79
+ ],
80
+ detached: true
81
+ });
82
+ } catch (error) {
83
+ throw simslimLaunchError(error);
84
+ }
85
+ child.stdout?.on("data", (chunk) => stdout.push(chunk));
86
+ child.stderr?.on("data", (chunk) => stderr.push(chunk));
87
+ waitForChild(child).then((value) => {
88
+ result = value;
89
+ });
90
+ if (child.pid !== void 0) {
91
+ const captured = (0, process_identity_exports.captureProcessIdentity)(child.pid);
92
+ if (captured.ok) {
93
+ identity = {
94
+ pid: child.pid,
95
+ processToken: captured.token
96
+ };
97
+ try {
98
+ (0, ownership_claim_exports.setClaimChild)(claim, identity);
99
+ } catch {}
100
+ }
101
+ }
102
+ const completed = await waitUntil(Date.now() + timeoutMs, true);
103
+ if (cancellation || !completed) {
104
+ stopGroup();
105
+ const stopped = await waitUntil(Date.now() + cleanupMs);
106
+ const detail = lines.length ? ` ${lines.join(" | ")}` : "";
107
+ const recovery = stopped ? "Its process group has stopped. Retry stim ios to reconcile the retained simulator settings." : `Its process group could not be confirmed stopped. The claim remains at ${claim.path}. Inspect the SimSlim process group ${child.pid ?? "unknown"} before retrying. Only when nothing is using it, remove the claim: ${(0, ownership_claim_exports.claimRemoveCommand)(claim.path)}`;
108
+ const message = `SimSlim ${action} ${cancellation ? `interrupted by ${cancellation}` : `exceeded ${Math.round(timeoutMs / 1e3)}s`}. ${recovery}${detail}`;
109
+ if (cancellation) out(message);
110
+ throw Object.assign(new Error(message), { code: cancellation ? "EINTR" : "ETIMEDOUT" });
111
+ }
112
+ } finally {
113
+ if (!child || settled()) (0, ownership_claim_exports.releaseClaim)(claim);
114
+ else {
115
+ child.stdout?.destroy?.();
116
+ child.stderr?.destroy?.();
117
+ child.unref();
118
+ }
119
+ process.off("SIGINT", onInterrupt);
120
+ process.off("SIGTERM", onTerminate);
121
+ process.off("exit", stopGroup);
122
+ if (cancellation) process.exit(cancellation === "SIGINT" ? 130 : 143);
123
+ }
124
+ stdout.flush();
125
+ stderr.flush();
126
+ if (result?.error) throw simslimLaunchError(result.error);
127
+ if (result?.code !== 0) {
128
+ const detail = lines.length ? ` ${lines.join(" | ")}` : "";
129
+ throw new Error(`SimSlim ${action} failed with exit code ${result?.code ?? "unknown"}.${detail}`);
130
+ }
131
+ return {
132
+ managed: Boolean(profile),
133
+ profile: profile ?? null
134
+ };
135
+ }
136
+ function simslimLaunchError(error) {
137
+ const cause = error;
138
+ if (cause?.code === "ENOENT") return new Error("SimSlim is configured but the `simslim` command is not installed. Run `brew install mobai-app/tap/simslim`.", { cause });
139
+ return new Error(`Could not start SimSlim: ${String(cause?.message || cause)}`, { cause });
140
+ }
141
+ function simslimIsOnPath() {
142
+ try {
143
+ return Boolean(getExecutor().findExecutable("simslim"));
144
+ } catch {
145
+ return false;
146
+ }
147
+ }
148
+ //#endregion
149
+ export { simslimIsOnPath as n, reconcileSimSlim as t };
@@ -1,9 +1,9 @@
1
- import { B as parseDeviceSlotKey, H as projectDeviceSlots, p as getProject } from "./config-DC5jEtd1.mjs";
2
- import { r as readWorkspaceState$1 } from "./workspace-state-CR9X86xJ.mjs";
3
- import { n as fileLeaseIo } from "./device-lease-Cu7PtQpZ.mjs";
4
- import { E as getAvdNameForSerial, O as listAdbDevices } from "./android-BdQC6zs1.mjs";
5
- import { d as listAllIosSims } from "./ios-BWbHFZVz.mjs";
6
- import { f as deviceShellArg } from "./app-install-CFI4ptUL.mjs";
1
+ import { B as parseDeviceSlotKey, H as projectDeviceSlots, p as getProject } from "./config-D0LhTY3S.mjs";
2
+ import { n as fileLeaseIo } from "./device-lease-DHOBXGgS.mjs";
3
+ import { r as readWorkspaceState$1 } from "./workspace-state-CSIFuuDa.mjs";
4
+ import { E as getAvdNameForSerial, O as listAdbDevices } from "./android-BsYNR81W.mjs";
5
+ import { d as listAllIosSims } from "./ios-CXLIUxXJ.mjs";
6
+ import { f as deviceShellArg } from "./app-install-0LgaQRT7.mjs";
7
7
  import { hostedNativeRecords } from "@stim-cli/core/state";
8
8
  //#region src/engine/slot-launch.ts
9
9
  function launchSlotScope(root, slot = "default") {
@@ -1,15 +1,18 @@
1
- import { t as getExecutor } from "./exec-i8GDPwq9.mjs";
2
- import { cpSync, existsSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync } from "node:fs";
1
+ import { t as getExecutor } from "./exec-B81Qodjn.mjs";
2
+ import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, realpathSync, rmSync, statSync } from "node:fs";
3
3
  import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
4
4
  import { validMacosResourceDestination } from "@stim-cli/core";
5
5
  //#region src/macos/stage.ts
6
6
  function validateInfoPlist(root, product, infoPlist) {
7
+ const source = resolve(root, infoPlist);
8
+ const inside = relative(realpathSync(root), realpathSync(source));
9
+ if (!lstatSync(source).isFile() || inside === ".." || inside.startsWith(`..${sep}`) || isAbsolute(inside)) throw new Error("macos.infoPlist must be a regular file inside the project, not a symbolic link. See stim guide macos.");
7
10
  const plist = JSON.parse(getExecutor().runFile("plutil", [
8
11
  "-convert",
9
12
  "json",
10
13
  "-o",
11
14
  "-",
12
- realpathSync(resolve(root, infoPlist))
15
+ source
13
16
  ]));
14
17
  if (typeof plist.CFBundleIdentifier !== "string" || plist.CFBundleExecutable !== product) throw new Error("macos.infoPlist must name a CFBundleIdentifier and the selected product as CFBundleExecutable.");
15
18
  if (plist.CFBundleURLTypes || plist.SUFeedURL) throw new Error("Use a development Info.plist without shared URL schemes or an update feed.");
@@ -0,0 +1,2 @@
1
+ import { a as registerStart, c as startDevServer, d as supervisorSignalable, f as tailLines, i as readLogTail, l as startFacts, n as liveSupervisor, o as resolveWorkspaceMetroPort, p as wantsExpoOwnTunnel, r as parseWait, s as startCommand, t as failureEvidence, u as supervisorEntry } from "./start-CdvcTaXr.mjs";
2
+ export { startCommand as default, failureEvidence, liveSupervisor, parseWait, readLogTail, registerStart, resolveWorkspaceMetroPort, startDevServer, startFacts, supervisorEntry, supervisorSignalable, tailLines, wantsExpoOwnTunnel };