stim 1.14.0 → 1.16.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 (152) hide show
  1. package/README.md +2 -0
  2. package/dist/activity-BxwdD81S.mjs +609 -0
  3. package/dist/agent-device-usage-output-Dpih1Tfa.mjs +411 -0
  4. package/dist/{android-d6rGq1pA.mjs → android-B_NumVyQ.mjs} +169 -81
  5. package/dist/{android-LbPFRWVL.mjs → android-Ift4kVvt.mjs} +517 -413
  6. package/dist/android-cas-8U4DPqeR.mjs +167 -0
  7. package/dist/android-cas-compiler.mjs +2 -2
  8. package/dist/{android-XpvCrV7q.mjs → android-r2rBL8kV.mjs} +2 -2
  9. package/dist/{app-install-BpgSgkJj.mjs → app-install-CKWdbXIX.mjs} +128 -151
  10. package/dist/attempt-Bk2ouQVL.mjs +39 -0
  11. package/dist/budget-DjrURfQn.mjs +2700 -0
  12. package/dist/{build-plan-Dcr-3ie0.mjs → build-plan-DjeSb2Xl.mjs} +192 -653
  13. package/dist/build-slots-rUk77xqh.mjs +132 -0
  14. package/dist/{cache-manifest-C68QQ0ua.mjs → cache-manifest-DnUHBJaU.mjs} +2 -2
  15. package/dist/cache-manifest.mjs +1 -1
  16. package/dist/{chrome-BPCiC3ZX.mjs → chrome-BrcVWQyD.mjs} +1 -1
  17. package/dist/cli-BkYZ_6hy.mjs +51 -0
  18. package/dist/cli.mjs +6 -42
  19. package/dist/client-BTY686R6.mjs +1368 -0
  20. package/dist/collector-run.mjs +9 -195
  21. package/dist/{command-output-DVcpw6eE.mjs → command-output-DnJMdEY-.mjs} +1 -1
  22. package/dist/{config-lvc7d3C2.mjs → config-D0DbpZtM.mjs} +28 -29
  23. package/dist/{created-devices-CllH_8eb.mjs → created-devices-D5owjN4C.mjs} +2 -2
  24. package/dist/{dependency-state-DsT7aKeo.mjs → dependency-state-B6cMXZab.mjs} +2 -2
  25. package/dist/{deps-D9IcKqXS.mjs → deps-urbmfXig.mjs} +3 -3
  26. package/dist/{detached-entry-DJHoca49.mjs → detached-entry-CiTEgMR1.mjs} +1 -1
  27. package/dist/dev-client-CroAIjjj.mjs +43 -0
  28. package/dist/{device-CjuuAJjQ.mjs → device-DZQjF7H5.mjs} +8 -7
  29. package/dist/device-capacity-BHwxNBlu.mjs +136 -0
  30. package/dist/device-host-worker.d.mts +1 -0
  31. package/dist/device-host-worker.mjs +964 -0
  32. package/dist/device-ios-BadmeL2V.mjs +381 -0
  33. package/dist/{device-lease-5c3WrVRm.mjs → device-lease-D-hLqx1b.mjs} +43 -36
  34. package/dist/{device-pool-BiyDyPP-.mjs → device-lease-run-CqjShqWW.mjs} +6 -126
  35. package/dist/device-pool-CUaEWMMm.mjs +125 -0
  36. package/dist/{device-remote-D87zEzaq.mjs → device-remote-D5WVWqOq.mjs} +69 -163
  37. package/dist/{doctor-x9pnU9fq.mjs → doctor-Cimf-gGB.mjs} +241 -103
  38. package/dist/{error-diagnostics-C5HzcwCW.mjs → error-diagnostics-B9L4Ae0x.mjs} +15 -18
  39. package/dist/{exec-DK8KaVHK.mjs → exec-CaErVv7t.mjs} +5 -1
  40. package/dist/{gc-ko6mUAYD.mjs → gc-Bqy4bjEu.mjs} +599 -108
  41. package/dist/{android-cas-iZK3DOCr.mjs → gradle-BsO1MdsH.mjs} +8 -294
  42. package/dist/{guide-6R0VNFqI.mjs → guide-B_uyKTxW.mjs} +2511 -239
  43. package/dist/{guide-status-BZrFPIA_.mjs → guide-status-CjEZMAD4.mjs} +3 -3
  44. package/dist/hosted-client-a-WmqE2L.mjs +197 -0
  45. package/dist/hosted-ios-CIWelIqf.mjs +220 -0
  46. package/dist/hosted-logs-D5g041Q3.mjs +187 -0
  47. package/dist/hosted-macos-BSZyIb3y.mjs +135 -0
  48. package/dist/idle-DYVymG92.mjs +1099 -0
  49. package/dist/idle-shutdown-CTsDnAde.mjs +122 -0
  50. package/dist/in-use-DvBw0Kxo.mjs +130 -0
  51. package/dist/{ios-BwDPrnYQ.mjs → ios-BaInn3sW.mjs} +201 -10
  52. package/dist/ios-Cr1h5gnO.mjs +189 -0
  53. package/dist/{ios-P1f5nm2n.mjs → ios-aq3QoGI3.mjs} +1159 -633
  54. package/dist/{ios-device-BiOsSVzd.mjs → ios-device-Ee7sDXfp.mjs} +1 -1
  55. package/dist/{ios-device-DGglU3E_.mjs → ios-device-FfCN_C8p.mjs} +12 -7
  56. package/dist/ios-state-DS5UpYTH.mjs +48 -0
  57. package/dist/{launch-verify-Deg4tB3Z.mjs → launch-verify-2DBRizjo.mjs} +5 -5
  58. package/dist/logs-CHEVK8zD.mjs +371 -0
  59. package/dist/machines-BIBUdhpj.mjs +265 -0
  60. package/dist/macos-CSYEAFmF.mjs +473 -0
  61. package/dist/macos-run.d.mts +5 -0
  62. package/dist/macos-run.mjs +2 -0
  63. package/dist/maintenance-run.d.mts +4 -0
  64. package/dist/maintenance-run.mjs +254 -0
  65. package/dist/{metro-CcEo8Fl8.mjs → metro-BeK1ZPz1.mjs} +20 -120
  66. package/dist/metro-gateway-BJ-rxQAB.mjs +84 -0
  67. package/dist/{named-ports-Blg8IxOh.mjs → named-ports-Bk_YXEmE.mjs} +6 -59
  68. package/dist/native-run-NaBrRFtQ.mjs +147 -0
  69. package/dist/{native-runtime-DjBHRg5m.mjs → native-runtime-DBzRnEKS.mjs} +9 -5
  70. package/dist/{ndjson-CDY9IkVC.mjs → ndjson-PclOIwVY.mjs} +2 -2
  71. package/dist/offload-worker.d.mts +122 -0
  72. package/dist/offload-worker.mjs +606 -0
  73. package/dist/{ownership-DyYDF5ww.mjs → ownership-DiA16AsN.mjs} +3 -2
  74. package/dist/ownership-hCkPzGmr.mjs +571 -0
  75. package/dist/{page-BHUzTDFt.mjs → page-QF_Ke10s.mjs} +7 -2
  76. package/dist/{ports-BguS83ex.mjs → ports-R2k4Knz3.mjs} +3 -3
  77. package/dist/prebuild-D2fsca_Z.mjs +213 -0
  78. package/dist/preview-DhVbvPAZ.mjs +318 -0
  79. package/dist/process-identity-BmRm1qV0.mjs +12 -0
  80. package/dist/{project-CWlvEaeN.mjs → project-Du91Ilvc.mjs} +74 -19
  81. package/dist/pull-request-pxnDCQzn.mjs +322 -0
  82. package/dist/pull-requests.d.mts +120 -0
  83. package/dist/pull-requests.mjs +2 -0
  84. package/dist/recordings-BIXOzVnr.mjs +37 -0
  85. package/dist/{reload-BiniwsSZ.mjs → reload-rM9jV1fz.mjs} +109 -24
  86. package/dist/{remote-cache-CcR6o6lI.mjs → remote-cache-C8-V13XN.mjs} +5 -5
  87. package/dist/run-f4vI6EnK.mjs +119 -0
  88. package/dist/{server-bare-DGfgyJ5J.mjs → server-bare-CpPGmnmO.mjs} +33 -15
  89. package/dist/server-expo-CVqO2c35.mjs +2 -0
  90. package/dist/{server-expo-BVuwQ65v.mjs → server-expo-MC0rHlOC.mjs} +8 -12
  91. package/dist/settings-BBpMcDbD.mjs +25 -0
  92. package/dist/{settings-B-fsC-Om.mjs → settings-ZkDzkzvB.mjs} +22 -10
  93. package/dist/settings-oTSkkNrM.mjs +1439 -0
  94. package/dist/settings.schema.json +845 -97
  95. package/dist/{simslim-DrDN4WuV.mjs → simslim-B8-7AoTI.mjs} +8 -132
  96. package/dist/{slot-launch-D5t8EiMf.mjs → slot-launch-B8VrHxn1.mjs} +11 -8
  97. package/dist/{spawn-claims-Drw_o-Fb.mjs → spawn-claims-D0XfSe8u.mjs} +1 -1
  98. package/dist/spawn-entry-jw19m8Nl.mjs +17 -0
  99. package/dist/stage-CzaiwFsI.mjs +143 -0
  100. package/dist/start-CX8Ig-U2.mjs +2 -0
  101. package/dist/{start-s4RXp1wy.mjs → start-ClDfwXa4.mjs} +116 -65
  102. package/dist/state-3DwSQIBK.mjs +41 -0
  103. package/dist/state-B4PQFXMW.d.mts +12 -0
  104. package/dist/{state-Dk9RVXI7.mjs → state-C1jB7Q8q.mjs} +70 -8
  105. package/dist/{state-DHqvsbqC.mjs → state-DcW6vOd_.mjs} +7 -4
  106. package/dist/stats-CEZ_i5je.mjs +77 -0
  107. package/dist/{status-BgAuxESg.mjs → status-BuvBFeII.mjs} +118 -20
  108. package/dist/{status-BsPAnfOI.mjs → status-Cs7VLg9D.mjs} +542 -283
  109. package/dist/status-DlKvVJBE.mjs +49 -0
  110. package/dist/stdout-reader-C8yjre1x.mjs +23 -0
  111. package/dist/stim-desktop-Cnz8CPnl.mjs +63 -0
  112. package/dist/stim-footprint.swift +32 -0
  113. package/dist/{stim-installations-CINXy_su.mjs → stim-installations-QMEI32v1.mjs} +1 -1
  114. package/dist/stop-B0Yxtmiy.mjs +48 -0
  115. package/dist/{stop-BzreOWJp.mjs → stop-Bffozsac.mjs} +83 -16
  116. package/dist/{stop-BWIF_6BK.mjs → stop-Dt_dM16A.mjs} +2 -2
  117. package/dist/stop-cause-CidxIqup.mjs +97 -0
  118. package/dist/supervisor-run.d.mts +43 -11
  119. package/dist/supervisor-run.mjs +363 -24
  120. package/dist/support-CAP8qDUF.mjs +316 -0
  121. package/dist/support-D4aYJniO.mjs +201 -0
  122. package/dist/teardown-CL6vDs2Y.mjs +727 -0
  123. package/dist/{xcode-Cp5KvK9x.mjs → toolchain-DkUflduf.mjs} +364 -14
  124. package/dist/trigger-Bemu8ytw.mjs +65 -0
  125. package/dist/trigger-CXts6qt1.mjs +2 -0
  126. package/dist/warm-progress-CpGv3Wb6.mjs +732 -0
  127. package/dist/{web-BsQs1WlO.mjs → web-DWUaMp8P.mjs} +37 -21
  128. package/dist/web-run.mjs +310 -13
  129. package/dist/workspace-process-lock-BL7Q0HCO.mjs +57 -0
  130. package/dist/workspace-state-B8-aJ1_5.mjs +371 -0
  131. package/dist/workspaces-BV4pdHFz.mjs +306 -0
  132. package/dist/{worktree-UrQWXSeb.mjs → worktree-K-xj9Db0.mjs} +625 -256
  133. package/dist/worktree-jnG8Iph5.mjs +2 -0
  134. package/package.json +10 -5
  135. package/shim/bundle-response.cjs +28 -12
  136. package/dist/activity-CYVDcrt3.mjs +0 -356
  137. package/dist/budget-CGDkhvv_.mjs +0 -1745
  138. package/dist/build-progress-DxKpwnaS.mjs +0 -247
  139. package/dist/idle-DXtx3RbX.mjs +0 -191
  140. package/dist/in-use-DlqBDKqY.mjs +0 -249
  141. package/dist/logs-Civ4gbBH.mjs +0 -486
  142. package/dist/merge-state-ytFQCeh4.mjs +0 -262
  143. package/dist/server-expo-DIHDhvGg.mjs +0 -2
  144. package/dist/settings-D61iNOsB.mjs +0 -629
  145. package/dist/start-Cetfvy8l.mjs +0 -2
  146. package/dist/stats-CFpFGlJV.mjs +0 -62
  147. package/dist/stats-CX1Z8Tca.mjs +0 -368
  148. package/dist/stim-desktop-CXt8-Z3J.mjs +0 -40
  149. package/dist/stop-cause-hjGBOZTG.mjs +0 -1231
  150. package/dist/worktree-BVrHsYZG.mjs +0 -752
  151. package/dist/worktree-CHWWvm5v.mjs +0 -2
  152. package/dist/{metro-store-DzeWkfqW.mjs → metro-store-CDDZHtPl.mjs} +1 -1
@@ -1,202 +1,16 @@
1
- import { G as validateDeviceSlot, O as process_identity_exports, z as deviceSlotKey } from "./config-lvc7d3C2.mjs";
2
- import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
3
- import { r as createNdjsonWriter } from "./ndjson-CDY9IkVC.mjs";
4
- import { M as workspaceLogsDir } from "./metro-CcEo8Fl8.mjs";
1
+ import { R as deviceSlotKey, W as validateDeviceSlot } from "./config-D0DbpZtM.mjs";
2
+ import { t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
5
3
  import { t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
6
- import { a as startIosDeviceConsole, i as parseDeviceConsoleLine } from "./ios-device-BiOsSVzd.mjs";
7
- import { a as unregisterCollector, i as registerCollector, r as readCollectors, t as collectorProcessTitle } from "./ownership-DyYDF5ww.mjs";
8
- import { a as watchAppPid, i as waitForAppPid, n as parseLogcatLine, r as startAndroidLogcat, t as androidClockOffset } from "./android-XpvCrV7q.mjs";
4
+ import { x as workspaceLogsDir } from "./workspace-state-B8-aJ1_5.mjs";
5
+ import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
6
+ import { a as startIosDeviceConsole, i as parseDeviceConsoleLine } from "./ios-device-Ee7sDXfp.mjs";
7
+ import { n as parseLogStreamLine, r as startIosLogStream, t as appNameFromBundleId } from "./ios-Cr1h5gnO.mjs";
8
+ import { a as unregisterCollector, i as registerCollector, r as readCollectors, t as collectorProcessTitle } from "./ownership-DiA16AsN.mjs";
9
+ import { a as watchAppPid, i as waitForAppPid, n as parseLogcatLine, r as startAndroidLogcat, t as androidClockOffset } from "./android-r2rBL8kV.mjs";
9
10
  import { existsSync } from "node:fs";
10
- import { LOG_ROTATE_BYTES } from "@stim-cli/core";
11
11
  import { isAbsolute, join, resolve } from "node:path";
12
+ import { LOG_ROTATE_BYTES } from "@stim-cli/core";
12
13
  import { fileURLToPath } from "node:url";
13
- //#region src/collector/ios.ts
14
- const MESSAGE_TYPE_LEVEL = {
15
- Debug: "debug",
16
- Info: "info",
17
- Default: "info",
18
- Error: "error",
19
- Fault: "fatal"
20
- };
21
- function levelFromMessageType(messageType) {
22
- return MESSAGE_TYPE_LEVEL[messageType] ?? "info";
23
- }
24
- const NOISE_RULES = [
25
- {
26
- id: "network",
27
- subsystem: "com.apple.network"
28
- },
29
- {
30
- id: "network-default-subsystem",
31
- messagePrefix: [
32
- "nw_socket",
33
- "nw_connection",
34
- "nw_protocol",
35
- "nw_endpoint",
36
- "nw_path",
37
- "nw_resolver",
38
- "nw_flow",
39
- "nw_read_request",
40
- "nw_write_request",
41
- "tcp_input"
42
- ]
43
- },
44
- {
45
- id: "sectrust",
46
- subsystem: "com.apple.securityd"
47
- },
48
- {
49
- id: "sectrust-default-subsystem",
50
- messagePrefix: [
51
- "SecTrust",
52
- "SecOSStatus",
53
- "TrustResultType"
54
- ]
55
- },
56
- {
57
- id: "webkit",
58
- subsystem: "com.apple.WebKit"
59
- },
60
- {
61
- id: "webkit-default-subsystem",
62
- messagePrefix: [
63
- "WebPrivacy",
64
- "GPUProcessProxy",
65
- "WebProcessProxy"
66
- ]
67
- },
68
- {
69
- id: "audio-factory",
70
- messageIncludes: ["AddInstanceForFactory"]
71
- },
72
- {
73
- id: "coreui",
74
- subsystem: "com.apple.coreui"
75
- },
76
- {
77
- id: "coreui-default-subsystem",
78
- messagePrefix: [
79
- "CUICatalog:",
80
- "CoreUI:",
81
- "CoreThemeDefinition"
82
- ]
83
- },
84
- {
85
- id: "uiscene-deprecation",
86
- messageIncludes: [
87
- "UIScene lifecycle will soon be required",
88
- "`UIScene` lifecycle will soon be required",
89
- "must migrate to UIScene",
90
- "migrate to UIScene lifecycle"
91
- ]
92
- },
93
- {
94
- id: "react-native-focus-cache",
95
- exactSubsystem: "com.apple.UIKit",
96
- category: "UIFocus",
97
- messageEquals: "RCTScrollViewComponentView implements focusItemsInRect: - caching for linear focus movement is limited as long as this view is on screen."
98
- },
99
- {
100
- id: "cfnetwork-performance-diagnostic",
101
- exactSubsystem: "com.apple.runtime-issues",
102
- category: "CFNetwork Performance Diagnostic",
103
- level: "warn"
104
- }
105
- ];
106
- function ruleMatches(rule, { subsystem, category, message }) {
107
- if (rule.subsystem && subsystem !== rule.subsystem && !subsystem.startsWith(`${rule.subsystem}.`)) return false;
108
- if (rule.exactSubsystem && subsystem !== rule.exactSubsystem) return false;
109
- if (rule.category && category !== rule.category) return false;
110
- if (rule.messageEquals && message !== rule.messageEquals) return false;
111
- if (rule.messagePrefix && !rule.messagePrefix.some((p) => message.startsWith(p))) return false;
112
- if (rule.messageIncludes && !rule.messageIncludes.some((p) => message.includes(p))) return false;
113
- return true;
114
- }
115
- function matchingNoiseRule(event) {
116
- const subsystem = typeof event?.subsystem === "string" ? event.subsystem : "";
117
- const category = typeof event?.category === "string" ? event.category : "";
118
- const message = typeof event?.eventMessage === "string" ? event.eventMessage : "";
119
- return NOISE_RULES.find((rule) => ruleMatches(rule, {
120
- subsystem,
121
- category,
122
- message
123
- }));
124
- }
125
- function levelForEvent(event) {
126
- const level = levelFromMessageType(event?.messageType);
127
- if (level !== "error" && level !== "fatal") return level;
128
- const rule = matchingNoiseRule(event);
129
- return rule ? rule.level ?? "info" : level;
130
- }
131
- function procFromImagePath(path) {
132
- if (typeof path !== "string" || !path) return null;
133
- const parts = path.split("/");
134
- return parts[parts.length - 1] || null;
135
- }
136
- function tsFromEvent(event, now = Date.now) {
137
- const parsed = Date.parse(event?.timestamp);
138
- return Number.isFinite(parsed) ? parsed : now();
139
- }
140
- function recordFromLogEvent(event, { now = Date.now } = {}) {
141
- if (!event || typeof event !== "object") return null;
142
- const eventType = event.eventType;
143
- if (eventType && eventType !== "logEvent") return null;
144
- const msg = typeof event.eventMessage === "string" ? event.eventMessage : "";
145
- if (!msg.trim()) return null;
146
- const record = {
147
- ts: tsFromEvent(event, now),
148
- src: "device",
149
- level: levelForEvent(event),
150
- msg
151
- };
152
- const proc = procFromImagePath(event.processImagePath);
153
- if (proc) record.proc = proc;
154
- if (typeof event.subsystem === "string") record.subsystem = event.subsystem;
155
- if (typeof event.category === "string") record.category = event.category;
156
- return record;
157
- }
158
- function parseLogStreamLine(line, { now = Date.now } = {}) {
159
- if (typeof line !== "string") return null;
160
- const trimmed = line.trim();
161
- if (!trimmed || trimmed[0] !== "{") return null;
162
- let event;
163
- try {
164
- event = JSON.parse(trimmed);
165
- } catch {
166
- return null;
167
- }
168
- return recordFromLogEvent(event, { now });
169
- }
170
- function logStreamArgs(udid, appName, executableName) {
171
- return [
172
- "simctl",
173
- "spawn",
174
- udid,
175
- "log",
176
- "stream",
177
- "--style",
178
- "ndjson",
179
- "--predicate",
180
- `processImagePath ENDSWITH "/${appName}.app/${executableName && executableName.trim() !== "" ? executableName.trim() : appName}"`,
181
- "--level",
182
- "info"
183
- ];
184
- }
185
- function appNameFromBundleId(bundleId) {
186
- const parts = String(bundleId || "").split(".");
187
- return parts[parts.length - 1] || String(bundleId || "");
188
- }
189
- function startIosLogStream({ udid, appName, executableName = null, spawnFn = null }) {
190
- return (spawnFn || ((cmd, args, opts) => getExecutor().spawn(cmd, args, opts)))("xcrun", logStreamArgs(udid, appName, executableName), {
191
- stdio: [
192
- "ignore",
193
- "pipe",
194
- "pipe"
195
- ],
196
- detached: false
197
- });
198
- }
199
- //#endregion
200
14
  //#region src/collector/run.ts
201
15
  const PLATFORMS = ["ios", "android"];
202
16
  function parseArgs(argv) {
@@ -1,5 +1,5 @@
1
- import { t as NO_PROJECT_REFUSAL } from "./project-CWlvEaeN.mjs";
2
1
  import { n as stripAnsi } from "./process-output-Fpl8PYi8.mjs";
2
+ import { t as NO_PROJECT_REFUSAL } from "./project-Du91Ilvc.mjs";
3
3
  import { quotedPath } from "@stim-cli/core";
4
4
  import chalk from "chalk";
5
5
  //#region src/diagnostics/launch-error-preview.ts
@@ -1,11 +1,11 @@
1
- import { n as __exportAll, r as __reExport } from "./rolldown-runtime-BsOwBuO_.mjs";
2
- import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
3
- import { InvalidArgumentError } from "commander";
1
+ import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
+ import { n as ownership_claim_exports, t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
3
+ import { join } from "node:path";
4
4
  import { existsSync, lstatSync, mkdirSync, readdirSync, readlinkSync, renameSync, statSync, unlinkSync, writeFileSync } from "fs";
5
- import { dirname, isAbsolute, join, normalize, parse, sep } from "path";
5
+ import { dirname as dirname$1, isAbsolute as isAbsolute$1, join as join$1, normalize, parse as parse$1, sep as sep$1 } from "path";
6
6
  import { configDir } from "@stim-cli/core";
7
+ import { InvalidArgumentError } from "commander";
7
8
  import { allMetroPorts, configCorruptRepair, findEnclosingWorktreeRoot, getConcurrencyLimits, getConfigPath, getConfigPath as getConfigPath$1, getProject, getProjectSettings, getRepoSettings, isPathPrefix, loadConfig, loadConfig as loadConfig$1, withConfigLock, withConfigLock as withConfigLock$1 } from "@stim-cli/core/state";
8
- import { join as join$1 } from "node:path";
9
9
  //#region src/devices/device-slots.ts
10
10
  const DEFAULT_DEVICE_SLOT = "default";
11
11
  const DEVICE_SLOT_RULE = "A device slot must be 1-64 letters, digits, underscores or hyphens, starting with a letter or digit.";
@@ -108,23 +108,23 @@ const WINDOWS = process.platform === "win32";
108
108
  const DRIVE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
109
109
  function volumeRootFor(path) {
110
110
  const normalized = normalize(String(path));
111
- if (WINDOWS) return parse(normalized).root.replace(/^[a-z]:/, (drive) => drive.toUpperCase());
111
+ if (WINDOWS) return parse$1(normalized).root.replace(/^[a-z]:/, (drive) => drive.toUpperCase());
112
112
  const m = normalized.match(/^\/volumes\/([^/]+)/i);
113
113
  return m ? `/Volumes/${m[1]}` : "/";
114
114
  }
115
115
  function resolveWorkspaceRealish(workspacePath) {
116
116
  const raw = String(workspacePath);
117
- if (!isAbsolute(raw)) return null;
117
+ if (!isAbsolute$1(raw)) return null;
118
118
  let current = raw;
119
119
  const MAX_HOPS = 40;
120
120
  for (let hops = 0; hops < MAX_HOPS; hops++) {
121
121
  const normalized = normalize(current);
122
- const root = parse(normalized).root;
123
- const segments = normalized.slice(root.length).split(sep).filter(Boolean);
124
- let prefix = root.endsWith(sep) ? root.slice(0, -sep.length) : root;
122
+ const root = parse$1(normalized).root;
123
+ const segments = normalized.slice(root.length).split(sep$1).filter(Boolean);
124
+ let prefix = root.endsWith(sep$1) ? root.slice(0, -sep$1.length) : root;
125
125
  let followedSymlink = false;
126
126
  for (const segment of segments) {
127
- prefix += `${sep}${segment}`;
127
+ prefix += `${sep$1}${segment}`;
128
128
  let st;
129
129
  try {
130
130
  st = lstatSync(prefix);
@@ -139,7 +139,7 @@ function resolveWorkspaceRealish(workspacePath) {
139
139
  } catch {
140
140
  return null;
141
141
  }
142
- current = `${isAbsolute(target) ? target : normalize(join(dirname(prefix), target))}${normalized.slice(prefix.length)}`;
142
+ current = `${isAbsolute$1(target) ? target : normalize(join$1(dirname$1(prefix), target))}${normalized.slice(prefix.length)}`;
143
143
  followedSymlink = true;
144
144
  break;
145
145
  }
@@ -154,7 +154,7 @@ function isRealMount(entryDev, rootDev) {
154
154
  function listWindowsVolumeRoots(statFn) {
155
155
  const roots = [];
156
156
  for (const letter of DRIVE_LETTERS) {
157
- const root = `${letter}:${sep}`;
157
+ const root = `${letter}:${sep$1}`;
158
158
  try {
159
159
  statFn(root);
160
160
  } catch {
@@ -175,7 +175,7 @@ function listMountedVolumes({ statFn = statSync } = {}) {
175
175
  }
176
176
  try {
177
177
  for (const name of readdirSync("/Volumes")) {
178
- const path = join("/Volumes", name);
178
+ const path = join$1("/Volumes", name);
179
179
  let entryDev;
180
180
  try {
181
181
  entryDev = statFn(path).dev;
@@ -192,7 +192,7 @@ function resolveVolumeRoot(path) {
192
192
  return realish === null ? null : volumeRootFor(realish);
193
193
  }
194
194
  function uncShareIsReachable(volume, statFn) {
195
- if (!WINDOWS || !volume.startsWith(`${sep}${sep}`)) return false;
195
+ if (!WINDOWS || !volume.startsWith(`${sep$1}${sep$1}`)) return false;
196
196
  try {
197
197
  return statFn(volume).isDirectory();
198
198
  } catch {
@@ -225,14 +225,9 @@ function formatBytes(bytes) {
225
225
  return `${Math.round(bytes / 1024)}K`;
226
226
  }
227
227
  //#endregion
228
- //#region src/ownership-claim.ts
229
- var ownership_claim_exports = /* @__PURE__ */ __exportAll({});
230
- import * as import__stim_cli_core_ownership_claim from "@stim-cli/core/ownership-claim";
231
- __reExport(ownership_claim_exports, import__stim_cli_core_ownership_claim);
232
- //#endregion
233
228
  //#region src/devices/avd-claim.ts
234
229
  function acquireAvdClaim(avdName) {
235
- const root = join$1(configDir(), "avd-locks", `${encodeURIComponent(avdName.toLowerCase())}.lock`);
230
+ const root = join(configDir(), "avd-locks", `${encodeURIComponent(avdName.toLowerCase())}.lock`);
236
231
  const label = `AVD ${avdName}`;
237
232
  const attempt = (0, ownership_claim_exports.tryAcquireClaim)({
238
233
  root,
@@ -249,11 +244,6 @@ function acquireAvdClaim(avdName) {
249
244
  });
250
245
  }
251
246
  //#endregion
252
- //#region src/process-identity.ts
253
- var process_identity_exports = /* @__PURE__ */ __exportAll({});
254
- import * as import__stim_cli_core_process_identity from "@stim-cli/core/process-identity";
255
- __reExport(process_identity_exports, import__stim_cli_core_process_identity);
256
- //#endregion
257
247
  //#region src/workspace/config.ts
258
248
  function getConfigDir() {
259
249
  return configDir();
@@ -265,7 +255,7 @@ function refuseRelativeStimPaths(env = process.env) {
265
255
  "STIM_METRO_CACHE"
266
256
  ]) {
267
257
  const value = env[name];
268
- if (!value || isAbsolute(value)) continue;
258
+ if (!value || isAbsolute$1(value)) continue;
269
259
  const error = /* @__PURE__ */ new Error(`${name}=${value} is not an absolute path. Set it to an absolute path, or unset it to use the default.`);
270
260
  error.code = "STIM_RELATIVE_PATH";
271
261
  throw error;
@@ -310,7 +300,7 @@ function ensureConfig() {
310
300
  });
311
301
  }
312
302
  function requireAbsoluteProjectPath(projectPath) {
313
- if (isAbsolute(projectPath)) return;
303
+ if (isAbsolute$1(projectPath)) return;
314
304
  throw new Error(`Project key "${projectPath}" is not an absolute path. The registry is keyed by the realpath of a workspace root, so a relative key can never resolve.`);
315
305
  }
316
306
  function upsertProject(projectPath, fields) {
@@ -380,6 +370,15 @@ function releaseAndroidConsolePort(projectPath, consolePort, slot = "default") {
380
370
  return true;
381
371
  });
382
372
  }
373
+ function recordIosSchemeApprovals(projectPath, deviceUdid, schemeApprovals, slot = "default") {
374
+ withConfigLock(() => {
375
+ const cfg = loadConfig();
376
+ const ios = deviceSlotPlatforms(cfg?.projects?.[projectPath], slot)?.ios;
377
+ if (!cfg || !ios?.owned || ios.deviceUdid !== deviceUdid) return;
378
+ ios.schemeApprovals = schemeApprovals;
379
+ saveConfig(cfg);
380
+ });
381
+ }
383
382
  function clearAndroidBootPending(projectPath, avdName, slot = "default") {
384
383
  withConfigLock(() => {
385
384
  const cfg = loadConfig();
@@ -522,4 +521,4 @@ function allConsolePortsAndSerials({ isMounted = isOnMountedVolume } = {}) {
522
521
  return result;
523
522
  }
524
523
  //#endregion
525
- export { ownership_claim_exports as A, deviceSlotPlatforms as B, setDevice as C, writeConfigSetting as D, withConfigLock$1 as E, measuredDirectorySize as F, validateDeviceSlot as G, parseDeviceSlotOption as H, volumeRootFor as I, assignSlotDevice as L, formatBytes as M, isOnMountedVolume as N, process_identity_exports as O, listMountedVolumes as P, deviceSlotFileKey as R, saveConfig as S, upsertProject as T, projectDeviceSlots as U, parseDeviceSlotKey as V, removeSlotDevice as W, loadConfig$1 as _, clearDevice as a, releaseMetroPort as b, ensureConfig as c, getConfigDir as d, getConfigPath$1 as f, isPathPrefix as g, getRepoSettings as h, clearAndroidBootPending as i, directorySize as j, acquireAvdClaim as k, findEnclosingWorktreeRoot as l, getProjectSettings as m, allMetroPorts as n, clearSupervisor as o, getProject as p, claimMetroPort as r, configCorruptRepair as s, allConsolePortsAndSerials as t, getConcurrencyLimits as u, refuseRelativeStimPaths as v, setSupervisor as w, removeProject as x, releaseAndroidConsolePort as y, deviceSlotKey as z };
524
+ export { directorySize as A, parseDeviceSlotKey as B, saveConfig as C, withConfigLock$1 as D, upsertProject as E, volumeRootFor as F, projectDeviceSlots as H, assignSlotDevice as I, deviceSlotFileKey as L, isOnMountedVolume as M, listMountedVolumes as N, writeConfigSetting as O, measuredDirectorySize as P, deviceSlotKey as R, removeProject as S, setSupervisor as T, removeSlotDevice as U, parseDeviceSlotOption as V, validateDeviceSlot as W, loadConfig$1 as _, clearDevice as a, releaseAndroidConsolePort as b, ensureConfig as c, getConfigDir as d, getConfigPath$1 as f, isPathPrefix as g, getRepoSettings as h, clearAndroidBootPending as i, formatBytes as j, acquireAvdClaim as k, findEnclosingWorktreeRoot as l, getProjectSettings as m, allMetroPorts as n, clearSupervisor as o, getProject as p, claimMetroPort as r, configCorruptRepair as s, allConsolePortsAndSerials as t, getConcurrencyLimits as u, recordIosSchemeApprovals as v, setDevice as w, releaseMetroPort as x, refuseRelativeStimPaths as y, deviceSlotPlatforms as z };
@@ -1,5 +1,5 @@
1
- import { d as getConfigDir } from "./config-lvc7d3C2.mjs";
2
- import { F as withDirLock } from "./metro-CcEo8Fl8.mjs";
1
+ import { d as getConfigDir } from "./config-D0DbpZtM.mjs";
2
+ import { w as withDirLock } from "./workspace-state-B8-aJ1_5.mjs";
3
3
  import { mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
4
4
  import { createdDevicesFile, createdDevicesLock, readCreatedDevices, readCreatedDevices as readCreatedDevices$1 } from "@stim-cli/core/state";
5
5
  //#region src/devices/created-devices.ts
@@ -1,5 +1,5 @@
1
- import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
2
- import { y as repoRoot } from "./worktree-BVrHsYZG.mjs";
1
+ import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
+ import { gt as repoRoot } from "./settings-oTSkkNrM.mjs";
3
3
  import { existsSync } from "node:fs";
4
4
  import { dirname, join, relative } from "node:path";
5
5
  //#region src/dependency-state.ts
@@ -1,7 +1,7 @@
1
- import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
2
- import { a as spawnDeclared } from "./spawn-claims-Drw_o-Fb.mjs";
1
+ import { t as getExecutor } from "./exec-CaErVv7t.mjs";
3
2
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
- import { d as startBuildHeartbeat, m as bundlerPin, n as HEARTBEAT_INTERVAL_MS } from "./xcode-Cp5KvK9x.mjs";
3
+ import { a as spawnDeclared } from "./spawn-claims-D0XfSe8u.mjs";
4
+ import { S as bundlerPin, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-DkUflduf.mjs";
5
5
  import { existsSync, readFileSync } from "node:fs";
6
6
  import { delimiter, dirname, join, relative, resolve, sep } from "node:path";
7
7
  import { homedir } from "node:os";
@@ -1,4 +1,4 @@
1
- import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
1
+ import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
2
  import { openSync } from "node:fs";
3
3
  //#region src/detached-entry.ts
4
4
  const LOG_FILE_FLAG = "--log-file";
@@ -0,0 +1,43 @@
1
+ import { c as isPackageResolvable, p as resolvePackageJson } from "./project-Du91Ilvc.mjs";
2
+ import { C as pickDevClientScheme, w as readBundleSchemes } from "./app-install-CKWdbXIX.mjs";
3
+ import { dirname, join } from "node:path";
4
+ import { isJsonObject, readJsonObject } from "@stim-cli/core/state";
5
+ //#region src/commands/dev-client.ts
6
+ function devClientScheme(root, appPath = null, { exec = null } = {}) {
7
+ if (!hasDevClient(root)) return void 0;
8
+ const fromBundle = pickDevClientScheme(readBundleSchemes(appPath, { exec }));
9
+ if (fromBundle) return fromBundle;
10
+ const app = readJsonObject(join(root, "app.json"));
11
+ const expo = app?.expo;
12
+ const raw = (isJsonObject(expo) ? expo.scheme : void 0) ?? app?.scheme ?? null;
13
+ const scheme = Array.isArray(raw) ? raw.find((s) => typeof s === "string" && s.trim() !== "") : raw;
14
+ if (typeof scheme !== "string" || scheme.trim() === "") return void 0;
15
+ return scheme.trim();
16
+ }
17
+ function hasDevClient(root) {
18
+ const pkg = readJsonObject(join(root, "package.json"));
19
+ if ([pkg?.dependencies, pkg?.devDependencies].some((deps) => isJsonObject(deps) && "expo-dev-client" in deps)) return true;
20
+ return isPackageResolvable(root, "expo-dev-client");
21
+ }
22
+ /**
23
+ * Whether `version` of expo-dev-launcher reads the `disableFab=1` and `disableAutoLaunch=1` launch
24
+ * URL params (expo/expo#49651, first published in 58.0.0; no 58.0.0 prerelease carries it).
25
+ */
26
+ function devLauncherReadsDevMenuParams(version) {
27
+ const match = /^(\d+)\.(\d+)\.(\d+)(-.+)?$/.exec(version?.trim() ?? "");
28
+ if (!match) return false;
29
+ const [major, minor, patch] = match.slice(1, 4).map(Number);
30
+ if (major !== 58) return major > 58;
31
+ return minor > 0 || patch > 0 || match[4] === void 0;
32
+ }
33
+ function devClientTakesDevMenuParams(root) {
34
+ return devLauncherReadsDevMenuParams(installedDevLauncherVersion(root));
35
+ }
36
+ function installedDevLauncherVersion(root) {
37
+ const devClient = resolvePackageJson(root, "expo-dev-client");
38
+ const launcher = resolvePackageJson(devClient ? dirname(devClient) : root, "expo-dev-launcher");
39
+ const version = launcher ? readJsonObject(launcher)?.version : null;
40
+ return typeof version === "string" ? version : null;
41
+ }
42
+ //#endregion
43
+ export { devClientTakesDevMenuParams as n, devClientScheme as t };
@@ -1,10 +1,11 @@
1
- import { H as parseDeviceSlotOption, U as projectDeviceSlots, p as getProject, z as deviceSlotKey } from "./config-lvc7d3C2.mjs";
2
- import { a as findProjectRoot, t as NO_PROJECT_REFUSAL } from "./project-CWlvEaeN.mjs";
3
- import { r as clockTime } from "./command-output-DVcpw6eE.mjs";
4
- import { n as fileLeaseIo, o as parseLeaseDuration, p as takeLease, u as releaseWorkspaceLeases } from "./device-lease-5c3WrVRm.mjs";
5
- import { D as listAdbDevices, H as physicalDeviceModel, J as resolvePhysicalDevice, M as memoizeEmulatorProbe, T as getAvdNameForSerial, W as probeEmulatorSerial, o as androidPoolCandidates, s as androidPoolNoCandidatesRefusal } from "./android-d6rGq1pA.mjs";
6
- import { d as waitForDevice, s as parseDeviceWait, t as selectFromPool } from "./device-pool-BiyDyPP-.mjs";
7
- import { a as iosPoolCandidates, c as listIosDevices, o as iosPoolNoCandidatesRefusal, s as isWirelessIosDevice, u as resolveIosPhysicalDevice } from "./ios-device-DGglU3E_.mjs";
1
+ import { H as projectDeviceSlots, R as deviceSlotKey, V as parseDeviceSlotOption, p as getProject } from "./config-D0DbpZtM.mjs";
2
+ import { r as clockTime } from "./command-output-DnJMdEY-.mjs";
3
+ import { o as findProjectRoot, t as NO_PROJECT_REFUSAL } from "./project-Du91Ilvc.mjs";
4
+ import { n as fileLeaseIo, o as parseLeaseDuration, p as takeLease, u as releaseWorkspaceLeases } from "./device-lease-D-hLqx1b.mjs";
5
+ import { E as getAvdNameForSerial, G as probeEmulatorSerial, N as memoizeEmulatorProbe, O as listAdbDevices, U as physicalDeviceModel, Y as resolvePhysicalDevice, c as androidPoolNoCandidatesRefusal, s as androidPoolCandidates } from "./android-B_NumVyQ.mjs";
6
+ import { l as parseDeviceWait, p as waitForDevice } from "./device-lease-run-CqjShqWW.mjs";
7
+ import { t as selectFromPool } from "./device-pool-CUaEWMMm.mjs";
8
+ import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, l as listIosDevices, o as iosPoolNoCandidatesRefusal } from "./ios-device-FfCN_C8p.mjs";
8
9
  import chalk from "chalk";
9
10
  //#region src/commands/device.ts
10
11
  const DEFAULT_FOR = "5m";
@@ -0,0 +1,136 @@
1
+ import { H as projectDeviceSlots, _ as loadConfig, z as deviceSlotPlatforms } from "./config-D0DbpZtM.mjs";
2
+ import { O as listAdbDevices } from "./android-B_NumVyQ.mjs";
3
+ import { _ as parseRuntimeVersion, c as iosRuntimeMatches, u as listAllIosSims } from "./ios-BaInn3sW.mjs";
4
+ //#region src/engine/device-capacity.ts
5
+ function liveOwnedDeviceCount({ sims = [], adbEmulators = [], config = null } = {}) {
6
+ let count = 0;
7
+ for (const sim of sims) if (sim?.state === "Booted" && sim.name?.startsWith("stim-")) count++;
8
+ const livePorts = new Set(adbEmulators.map((e) => e.consolePort));
9
+ for (const proj of Object.values(config?.projects || {})) for (const { platforms } of projectDeviceSlots(proj)) {
10
+ const android = platforms.android;
11
+ if (android?.owned && android.avdName && typeof android.consolePort === "number" && livePorts.has(android.consolePort)) count++;
12
+ }
13
+ return count;
14
+ }
15
+ function workspaceHasLiveDevice({ platform, project, slot = "default", sims = [], adbEmulators = [] } = {}) {
16
+ if (!platform) return false;
17
+ const record = deviceSlotPlatforms(project, slot)?.[platform];
18
+ if (!record) return false;
19
+ if (platform === "ios") return sims.some((s) => s.udid === record.deviceUdid && s.state === "Booted");
20
+ return typeof record.consolePort === "number" && adbEmulators.some((e) => e.consolePort === record.consolePort);
21
+ }
22
+ function deviceCapacityRefusal({ platform, project, slot = "default", max, sims = [], adb = null, config = null } = {}) {
23
+ if (!max || max <= 0) return null;
24
+ const adbEmulators = adb?.emulators || [];
25
+ if (workspaceHasLiveDevice({
26
+ platform,
27
+ project,
28
+ slot,
29
+ sims,
30
+ adbEmulators
31
+ })) return null;
32
+ const count = liveOwnedDeviceCount({
33
+ sims,
34
+ adbEmulators,
35
+ config
36
+ });
37
+ if (count < max) return null;
38
+ return {
39
+ code: "STIM_AT_CAPACITY",
40
+ message: `${count} Stim device(s) are already booted and concurrency.maxDevices is ${max}, so booting another would exceed the cap.`,
41
+ remedy: "stop an environment (stim stop) or raise concurrency.maxDevices"
42
+ };
43
+ }
44
+ function checkDeviceCapacity({ platform, project, slot = "default", max, sims = listAllIosSims, adb = listAdbDevices, config = loadConfig } = {}) {
45
+ if (!max || max <= 0) return null;
46
+ let simList = [];
47
+ let adbRes = {
48
+ emulators: [],
49
+ physical: [],
50
+ unhealthy: []
51
+ };
52
+ try {
53
+ simList = typeof sims === "function" ? sims() || [] : sims || [];
54
+ } catch {}
55
+ try {
56
+ adbRes = typeof adb === "function" ? adb() || adbRes : adb || adbRes;
57
+ } catch {}
58
+ let cfg = null;
59
+ try {
60
+ cfg = typeof config === "function" ? config() : config ?? null;
61
+ } catch {}
62
+ return deviceCapacityRefusal({
63
+ platform,
64
+ project,
65
+ slot,
66
+ max,
67
+ sims: simList,
68
+ adb: adbRes,
69
+ config: cfg
70
+ });
71
+ }
72
+ function deviceTypeMismatch(recordedTypeId, requestedName, deviceTypes) {
73
+ if (!requestedName || !recordedTypeId) return null;
74
+ const wanted = (deviceTypes || []).find((d) => d.name === requestedName);
75
+ if (!wanted) return null;
76
+ if (wanted.identifier === recordedTypeId) return null;
77
+ const recorded = (deviceTypes || []).find((d) => d.identifier === recordedTypeId);
78
+ return `this project's sim is ${recorded ? recorded.name : recordedTypeId}, but --device-type asked for ${requestedName}`;
79
+ }
80
+ function runtimeMismatch(recordedRuntimeId, requested, runtimes) {
81
+ if (!requested || !recordedRuntimeId) return null;
82
+ const wanted = runtimes.find((r) => iosRuntimeMatches(r, requested));
83
+ if (!wanted || wanted.identifier === recordedRuntimeId) return null;
84
+ return `this project's sim runs iOS ${parseRuntimeVersion(recordedRuntimeId)}, but --runtime asked for ${requested}`;
85
+ }
86
+ function installedNames(names) {
87
+ const unique = [...new Set(names.filter((n) => typeof n === "string" && n !== ""))];
88
+ return unique.length > 0 ? unique.join(", ") : "none";
89
+ }
90
+ /** Appends which settings layer supplied an unresolved device selector, so the user knows where to fix it. */
91
+ function layerNote(refusal, key, flag, origin) {
92
+ if (flag !== void 0 && flag !== null) return refusal;
93
+ if (!origin) return refusal;
94
+ return {
95
+ message: `${refusal.message} ${key} is set at the ${origin} layer.`,
96
+ remedy: `${refusal.remedy} Fix it with \`stim settings set ${key} <value> --scope ${origin}\` or \`stim settings unset ${key} --scope ${origin}\`.`
97
+ };
98
+ }
99
+ function unknownIosRuntimeRefusal(requested, runtimes) {
100
+ if (!requested) return null;
101
+ if ((runtimes || []).some((r) => iosRuntimeMatches(r, requested))) return null;
102
+ return {
103
+ message: `No installed simulator runtime matches "${requested}". Installed runtimes: ${installedNames((runtimes || []).map((r) => r.version))}.`,
104
+ remedy: "Pass `--runtime` (or set ios.runtime) a version printed above (\"26.5\") or a runtime's full name (\"iOS 26.5\"); nothing else matches. Install more runtimes through Xcode."
105
+ };
106
+ }
107
+ function creatableIosDeviceTypeNames(runtimes, runtime) {
108
+ return (runtime ? (runtimes || []).filter((r) => iosRuntimeMatches(r, runtime)) : runtimes || []).flatMap((r) => (r.supportedDeviceTypes || []).map((d) => d.name));
109
+ }
110
+ function unknownIosDeviceTypeRefusal(requested, runtimes, runtime) {
111
+ if (!requested) return null;
112
+ const creatable = creatableIosDeviceTypeNames(runtimes, runtime);
113
+ if (creatable.includes(requested)) return null;
114
+ return {
115
+ message: `No device type named "${requested}" can be created on ${runtime ? `runtime ${runtime}` : "any installed simulator runtime"}. ${runtime ? `Device types runtime ${runtime} supports` : "Device types the installed runtimes support"}: ${installedNames(creatable)}.`,
116
+ remedy: "Pass `--device-type` (or set ios.deviceType) one of the names printed above, exactly as `xcrun simctl list devicetypes` spells it. `xcrun simctl list devicetypes` also lists watchOS, tvOS and visionOS models, which no iOS runtime can create. Install more models through Xcode."
117
+ };
118
+ }
119
+ function unknownAndroidSystemImageRefusal(requested, images) {
120
+ if (!requested) return null;
121
+ if ((images || []).some((i) => i.pkg === requested)) return null;
122
+ return {
123
+ message: `No installed Android system image is named "${requested}". Installed system images: ${installedNames((images || []).map((i) => i.pkg))}.`,
124
+ remedy: "Pass `--system-image` (or set android.systemImage) to one of the package ids printed above. Install more with `sdkmanager \"system-images;android-36;google_apis;arm64-v8a\"`."
125
+ };
126
+ }
127
+ function unknownAndroidDeviceProfileRefusal(requested, profiles) {
128
+ if (!requested) return null;
129
+ if (profiles.includes(requested)) return null;
130
+ return {
131
+ message: `No Android hardware profile is named "${requested}". Profiles avdmanager offers: ${installedNames(profiles)}.`,
132
+ remedy: "Pass `--device-profile` (or set android.deviceProfile) to one of the ids printed above, exactly as `avdmanager list device -c` spells it, e.g. \"pixel_fold\" or \"pixel_tablet\"."
133
+ };
134
+ }
135
+ //#endregion
136
+ export { runtimeMismatch as a, unknownIosDeviceTypeRefusal as c, liveOwnedDeviceCount as i, unknownIosRuntimeRefusal as l, deviceTypeMismatch as n, unknownAndroidDeviceProfileRefusal as o, layerNote as r, unknownAndroidSystemImageRefusal as s, checkDeviceCapacity as t };
@@ -0,0 +1 @@
1
+ export {}