stim 1.9.0 → 1.10.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 (83) hide show
  1. package/dist/{android-_y4Ohi5z.mjs → android-787HhP5w.mjs} +119 -29
  2. package/dist/{android-BPGizezh.mjs → android-DBkeHwpm.mjs} +168 -95
  3. package/dist/{android-DEgo4oCo.mjs → android-DPov-fv2.mjs} +2 -2
  4. package/dist/{android-cas-eiExNLf7.mjs → android-cas-CITmIeWY.mjs} +9 -8
  5. package/dist/android-cas-compiler.mjs +1 -1
  6. package/dist/{app-install-Uf3a83Tv.mjs → app-install-CrJ6t_bv.mjs} +2 -2
  7. package/dist/budget-BP4jZZL4.mjs +620 -0
  8. package/dist/build-progress-BXx-ZBe4.mjs +512 -0
  9. package/dist/{cache-manifest-Dg7OnMrp.mjs → cache-manifest-Pubfp8wV.mjs} +1 -1
  10. package/dist/cache-manifest.mjs +1 -1
  11. package/dist/cli.mjs +16 -16
  12. package/dist/collector-run.d.mts +5 -1
  13. package/dist/collector-run.mjs +7 -7
  14. package/dist/{command-output-gByVmIjy.mjs → command-output-D5z2_bcF.mjs} +1 -1
  15. package/dist/{config-Cp9lM3wX.mjs → config-BEq0Qw_a.mjs} +14 -131
  16. package/dist/{dependency-state-Bq5DcLGn.mjs → dependency-state-r9UesA9a.mjs} +2 -2
  17. package/dist/{deps-Cip5vUm1.mjs → deps-DP4eWqea.mjs} +3 -3
  18. package/dist/{detached-entry-KEu0_AXL.mjs → detached-entry-DJHoca49.mjs} +1 -1
  19. package/dist/{dev-client-HyqISM0h.mjs → dev-client-92U593KT.mjs} +137 -250
  20. package/dist/{device-D4U-xLty.mjs → device-DhTZe7L4.mjs} +7 -7
  21. package/dist/{build-lock-DPXPLgTc.mjs → device-lease-CbEaIk7b.mjs} +370 -12
  22. package/dist/{device-pool-CnTAz8X1.mjs → device-pool-Di8Q-9Ro.mjs} +4 -4
  23. package/dist/{device-remote-AQ5rQPqr.mjs → device-remote-Dy1jGj3U.mjs} +547 -468
  24. package/dist/{doctor-B_Ei3bZu.mjs → doctor-B-inAJmt.mjs} +58 -22
  25. package/dist/{error-diagnostics-Vfz83GCF.mjs → error-diagnostics-xxWKNO3-.mjs} +11 -12
  26. package/dist/{exec-jIAlgilk.mjs → exec-DK8KaVHK.mjs} +3 -2
  27. package/dist/{gc-Ckw8RQHi.mjs → gc-ChPFZMRC.mjs} +500 -1114
  28. package/dist/{guide-BiAbhs1J.mjs → guide-DwmaD_Wa.mjs} +882 -528
  29. package/dist/guide-status-CWvti2Lg.mjs +125 -0
  30. package/dist/idle-DpRLp5lj.mjs +157 -0
  31. package/dist/in-use-CjUluqIX.mjs +245 -0
  32. package/dist/{ios-BL2NFckr.mjs → ios-B2Fpqvlb.mjs} +25 -59
  33. package/dist/{ios-BzUJWk1K.mjs → ios-Dd-hYJBh.mjs} +130 -89
  34. package/dist/{ios-device-DPsSm0v_.mjs → ios-device-BiOsSVzd.mjs} +1 -1
  35. package/dist/{ios-device-D972i9wf.mjs → ios-device-CtRdEVjx.mjs} +3 -3
  36. package/dist/{launch-verify-Q_OtW1Rf.mjs → launch-verify-CQS_Kg-C.mjs} +5 -5
  37. package/dist/{logs-CI9NQSK7.mjs → logs-MARIy6m9.mjs} +9 -9
  38. package/dist/{metro-DrLHaMn2.mjs → metro-BWLOJ_Wr.mjs} +116 -10
  39. package/dist/{named-ports-CmLQSIRj.mjs → named-ports-DiTfSz6p.mjs} +4 -4
  40. package/dist/{ndjson-9uFNRwfe.mjs → ndjson-CDY9IkVC.mjs} +3 -56
  41. package/dist/{ndjson-DvHSsNU9.d.mts → ndjson-Du3j0AQ9.d.mts} +1 -0
  42. package/dist/{ownership-D15Op8vN.mjs → ownership-D2xbLVoz.mjs} +2 -3
  43. package/dist/ownership-DZjdx8Gq.mjs +1180 -0
  44. package/dist/{ports-BNKoWVWZ.mjs → ports-CLSSFOuz.mjs} +3 -3
  45. package/dist/{project-DS112DYB.mjs → project-BXZzOABt.mjs} +2 -2
  46. package/dist/{reload-ZNJUo1pl.mjs → reload-DoETJ3rl.mjs} +9 -10
  47. package/dist/{server-bare-DWkkcIxV.mjs → server-bare-DVbb7kXH.mjs} +1 -1
  48. package/dist/{server-expo-B_lctBR3.mjs → server-expo-BvOCeakp.mjs} +4 -4
  49. package/dist/server-expo-DBVTdult.mjs +2 -0
  50. package/dist/{settings-D030k0t4.mjs → settings-DOugPlPz.mjs} +16 -428
  51. package/dist/{settings-BKNh5rl4.mjs → settings-EWYNwe72.mjs} +16 -14
  52. package/dist/settings.schema.json +75 -0
  53. package/dist/{simslim-B_LsGLuJ.mjs → simslim-Ca3487H6.mjs} +182 -5
  54. package/dist/{slot-launch-DU9A-gYw.mjs → slot-launch-C5cg0fmk.mjs} +4 -4
  55. package/dist/{spawn-claims-Dn3C_N6w.mjs → spawn-claims-CUleC2cM.mjs} +1 -1
  56. package/dist/{start-DYkkKF0s.mjs → start-F9gv5dcC.mjs} +147 -98
  57. package/dist/start-VoFsPSes.mjs +2 -0
  58. package/dist/{state-NcJzMEBF.mjs → state-WGdIbi_d.mjs} +2 -2
  59. package/dist/{stats-DG9e66Rz.mjs → stats-BAgJaLA4.mjs} +1 -1
  60. package/dist/{stats-B63-JVAY.mjs → stats-DBYJ5bxL.mjs} +4 -4
  61. package/dist/{status-S6ehL4Ui.mjs → status-DLCD-o3s.mjs} +63 -231
  62. package/dist/status-Dr4fRkym.mjs +216 -0
  63. package/dist/{guide-status-BAMVU0ZA.mjs → stim-installations-CINXy_su.mjs} +3 -124
  64. package/dist/{stop-BO28HGqF.mjs → stop-Dj4pfmyv.mjs} +22 -18
  65. package/dist/{stop-T1R-cZRz.mjs → stop-ZvOeTmKb.mjs} +2 -2
  66. package/dist/supervisor-run.d.mts +11 -2
  67. package/dist/supervisor-run.mjs +185 -17
  68. package/dist/{workspace-process-lock-DWaiRD0e.mjs → workspace-process-lock-BXA96myD.mjs} +2 -2
  69. package/dist/workspaces-BTUyFfkv.mjs +1003 -0
  70. package/dist/{worktree-DKhSF0UX.mjs → worktree-4aZg2NnI.mjs} +1 -1
  71. package/dist/{worktree-LGB-UwgG.mjs → worktree-BMS7GeqB.mjs} +40 -122
  72. package/dist/{worktree-R_cUlE7s.mjs → worktree-BlizKDpZ.mjs} +143 -18
  73. package/dist/{xcode-BZqyxh3e.mjs → xcode-B2tBkf0m.mjs} +9 -158
  74. package/package.json +6 -5
  75. package/dist/build-progress-CVqkfPC6.mjs +0 -188
  76. package/dist/device-lease-Crs-HkJY.mjs +0 -366
  77. package/dist/logs-query-Cqma3WIu.mjs +0 -298
  78. package/dist/ownership-DCQPuWEc.mjs +0 -489
  79. package/dist/public-http-probe-CyMDrQ3c.mjs +0 -61
  80. package/dist/server-expo-CeILEu86.mjs +0 -2
  81. package/dist/sim-pool-KaIsp2Ft.mjs +0 -723
  82. package/dist/spawn-entry-nCE6m770.mjs +0 -14
  83. package/dist/workspace-state-DF2gCFhx.mjs +0 -169
@@ -1,32 +1,33 @@
1
- import { G as parseDeviceSlotOption, H as deviceSlotKey, J as validateDeviceSlot, V as deviceSlotFileKey, f as getProject, k as ownership_claim_exports, l as getConcurrencyLimits, w as upsertProject } from "./config-Cp9lM3wX.mjs";
2
- import { t as getExecutor } from "./exec-jIAlgilk.mjs";
3
- import { r as createNdjsonWriter } from "./ndjson-9uFNRwfe.mjs";
4
- import { _ as workspaceDir, b as workspaceLogsDir, c as writeWorkspaceState, i as recordWorkspaceUse, r as readWorkspaceState } from "./workspace-state-DF2gCFhx.mjs";
5
- import { E as removeTemporaryEntry, T as makeTemporaryDirectory, _ as repoRoot, s as gitCommonDir } from "./worktree-R_cUlE7s.mjs";
6
- import { a as detectIsExpo, i as detectBundleId, n as appProjectProblem, o as findProjectRoot, t as NO_PROJECT_REFUSAL } from "./project-DS112DYB.mjs";
7
- import { n as MODE_EXPO, p as writeWorkspaceLaunch, t as MODE_BARE } from "./state-NcJzMEBF.mjs";
8
- import { a as pidExists, c as resolveProjectMetro, l as signalProcessTree } from "./metro-DrLHaMn2.mjs";
9
- import { n as verifyCollectorOwnership } from "./ownership-D15Op8vN.mjs";
10
- import { D as remoteIosSetting, F as unknownSettingKeys, J as optimizationBuildProfile, K as artifactCachePolicy, L as REMOTE_DEVICE_BACKENDS, M as settingShapeErrors, O as resolveCacheProviderConfig, P as tunnelModeSetting, W as detectProviders, Y as resolveOptimizations, b as metroWarmupUrlSetting, d as iosLanHostSetting, f as iosLanHostSettingError, g as iosSigningIdentitySha1SettingError, h as iosSigningIdentitySha1Setting, i as SETTING_SHAPE_REMEDY, k as resolveSettings, m as iosSigningIdentitySettingError, p as iosSigningIdentitySetting, u as cacheProviderSettingError, w as publicUrlSetting } from "./settings-D030k0t4.mjs";
11
- import { _ as stepTimer, c as launchErrorReport, g as stepClock, h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash, n as appReadinessMessage, v as launchErrorPreview } from "./command-output-gByVmIjy.mjs";
12
- import { S as untrackedNativeFiles, _ as refingerprintAfterMutation, a as waitForBuild, c as describeFingerprintMiss, d as fingerprintDiffRecord, f as fingerprintDiffSuffix, g as providerUploadOutcome, h as providerDownloadPath, m as prepareProviderDownloadDir, o as waitForSharedBuild, p as fingerprintProject, r as releaseBuildLock, s as buildCacheKey, t as acquireBuildLock, u as filesystemBuildCapability, v as resolveBuild, x as untrackedMissLine, y as storeBuild } from "./build-lock-DPXPLgTc.mjs";
13
- import { S as uploadRemote, _ as loadProjectProvider, b as resolveEasCliBin, d as UPLOAD_TIMEOUT_MS, f as cacheLevel, g as isEasAuthFailureText, h as exitAfterFlush, m as easAuthNote, o as parkedMaxSetting, p as checkEasAuth, t as POOL_SETTING_REMEDY, u as RESOLVE_TIMEOUT_MS, x as resolveRemote } from "./sim-pool-KaIsp2Ft.mjs";
14
- import { C as isEasBuildFailure, S as easDeviceBuildRemedy, _ as noMetroMessage, a as swapJsBundle, b as sleep, c as ensureBooted, f as clearIosAdoptionPending, g as launchOutcomeRecord, h as isPhysicalDeviceRequest, l as ensureOwnedDevice, m as gateShouldRetry, n as pickDevClientScheme, o as needsPrebuild, p as ensureWorkspaceStorageSafely, r as schemesFromInfoPlist, s as runPrebuild, t as devClientScheme, v as noMetroRemedy, w as resolveEasDevelopmentBuild, x as warmMetro, y as resolveMetroWithRetry } from "./dev-client-HyqISM0h.mjs";
15
- import { t as withWorkspaceProcessLock } from "./workspace-process-lock-DWaiRD0e.mjs";
16
- import { n as NO_BUILD_PROGRESS, s as startBuildProgress } from "./build-progress-CVqkfPC6.mjs";
17
- import { c as readMetroRecords, d as verifyLaunch, f as verifyReleaseLaunch, i as RELEASE_VERIFY_WAIT_MS, l as unverifiedLaunchLines, n as LAUNCH_FATAL, o as isBundleProof, r as LAUNCH_UNVERIFIED, s as readCollectorRecords, t as LAUNCH_BUNDLING } from "./launch-verify-Q_OtW1Rf.mjs";
18
- import { c as clearOtherUserApps, h as iosAppProcess, m as installIosApp, r as DEFAULT_METRO_PORT, u as devClientUrl, v as launchIosApp } from "./app-install-Uf3a83Tv.mjs";
19
- import { O as parseIosSimulatorApp, p as listIosRuntimes } from "./ios-BL2NFckr.mjs";
20
- import { a as lostLine, c as releaseLeaseOnSignal, i as leaseExpiryText, l as runLease, n as DEBUG_VERIFY_STEP_MS, o as lostRefusal, r as acquireRunLease, s as parseDeviceWait, t as selectFromPool, u as waitFlagConflict } from "./device-pool-CnTAz8X1.mjs";
21
- import { a as compilationCacheActivityLine, c as readBundleExecutable, g as acquireBuildSlot, l as readBundleId, p as describeDiagnostic, r as buildIos, s as discoverXcodeProject, t as COMPILATION_CACHE_NOT_RUN, u as resolveScheme, v as releaseBuildSlot } from "./xcode-BZqyxh3e.mjs";
22
- import { a as statsProjectKey, i as recordRunStats, n as readRunEstimates, t as createRunRecorder } from "./stats-DG9e66Rz.mjs";
23
- import { c as unknownIosRuntimeRefusal, r as checkDeviceCapacity, s as unknownIosDeviceTypeRefusal } from "./simslim-B_LsGLuJ.mjs";
24
- import { a as ensureMetroReachable, b as ownedSessionName, c as remoteIosDeps, l as resolveRemoteContext, n as binOnPath, o as ensureRemoteBootOwned, r as bundleEntryPoint, w as gateMetroOrigin } from "./device-remote-AQ5rQPqr.mjs";
25
- import { n as nativeRunCommand, t as launchSlotScope } from "./slot-launch-DU9A-gYw.mjs";
26
- import { t as spawnEntry } from "./spawn-entry-nCE6m770.mjs";
27
- import { a as printNativeCrashReport, n as IOS_CRASH_REPORT_RETRY, o as simulatorConsolePaths, r as captureNativeCrashes, t as errorDiagnostics } from "./error-diagnostics-Vfz83GCF.mjs";
28
- import { a as iosPoolCandidates, c as listIosDevices, d as verifyIosDeviceReleaseLaunch, i as iosDeviceProcess, l as localNetworkPending, n as installIosDeviceApp, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds, s as isWirelessIosDevice, t as awaitIosDeviceLaunch, u as resolveIosPhysicalDevice } from "./ios-device-D972i9wf.mjs";
29
- import { a as runPodInstall, n as podsAreStale, r as readPodState } from "./deps-Cip5vUm1.mjs";
1
+ import { L as deviceSlotFileKey, R as deviceSlotKey, V as parseDeviceSlotOption, W as validateDeviceSlot, f as getProject, k as ownership_claim_exports, l as getConcurrencyLimits, w as upsertProject } from "./config-BEq0Qw_a.mjs";
2
+ import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
3
+ import { r as createNdjsonWriter } from "./ndjson-CDY9IkVC.mjs";
4
+ import { O as workspaceDir, c as signalProcessTree, h as recordWorkspaceUse, i as pidExists, j as workspaceLogsDir, m as readWorkspaceState, s as resolveProjectMetro, y as writeWorkspaceState } from "./metro-BWLOJ_Wr.mjs";
5
+ import { D as makeTemporaryDirectory, O as removeTemporaryEntry, s as gitCommonDir, y as repoRoot } from "./worktree-BlizKDpZ.mjs";
6
+ import { a as detectIsExpo, i as detectBundleId, n as appProjectProblem, o as findProjectRoot, t as NO_PROJECT_REFUSAL } from "./project-BXZzOABt.mjs";
7
+ import { n as MODE_EXPO, p as writeWorkspaceLaunch, t as MODE_BARE } from "./state-WGdIbi_d.mjs";
8
+ import { t as withWorkspaceProcessLock } from "./workspace-process-lock-BXA96myD.mjs";
9
+ import { _ as stepTimer, c as launchErrorReport, g as stepClock, h as shortUdid, i as formatDuration, l as phaseLine, m as shortHash, n as appReadinessMessage, v as launchErrorPreview } from "./command-output-D5z2_bcF.mjs";
10
+ import { A as resolveBuild, C as fingerprintDiffRecord, D as providerDownloadPath, E as prepareProviderDownloadDir, N as untrackedMissLine, O as providerUploadOutcome, P as untrackedNativeFiles, S as filesystemBuildCapability, T as fingerprintProject, _ as waitForBuild, b as describeFingerprintMiss, g as releaseBuildLock, j as storeBuild, k as refingerprintAfterMutation, m as acquireBuildLock, v as waitForSharedBuild, w as fingerprintDiffSuffix, y as buildCacheKey } from "./device-lease-CbEaIk7b.mjs";
11
+ import { n as NO_BUILD_PROGRESS, s as startBuildProgress } from "./build-progress-BXx-ZBe4.mjs";
12
+ import { A as resolveCacheProviderConfig, E as publicUrlSetting, I as tunnelModeSetting, L as unknownSettingKeys, P as settingShapeErrors, S as metroWarmupUrlSetting, U as optimizationBuildProfile, V as artifactCachePolicy, W as resolveOptimizations, _ as iosSigningIdentitySha1SettingError, a as SETTING_SHAPE_REMEDY, d as cacheProviderSettingError, f as iosLanHostSetting, g as iosSigningIdentitySha1Setting, h as iosSigningIdentitySettingError, j as resolveSettings, k as remoteIosSetting, m as iosSigningIdentitySetting, p as iosLanHostSettingError, r as REMOTE_DEVICE_BACKENDS, z as detectProviders } from "./settings-DOugPlPz.mjs";
13
+ import { h as POOL_SETTING_REMEDY, y as parkedMaxSetting } from "./ownership-DZjdx8Gq.mjs";
14
+ import { D as parseIosSimulatorApp, f as listIosRuntimes } from "./ios-B2Fpqvlb.mjs";
15
+ import { a as acquireBuildSlot, s as releaseBuildSlot } from "./in-use-CjUluqIX.mjs";
16
+ import { n as verifyCollectorOwnership } from "./ownership-D2xbLVoz.mjs";
17
+ import { A as UPLOAD_TIMEOUT_MS, B as resolveRemote, F as isEasAuthFailureText, I as loadProjectProvider, M as checkEasAuth, N as easAuthNote, O as gateMetroOrigin, P as exitAfterFlush, V as uploadRemote, a as ensureMetroReachable, j as cacheLevel, k as RESOLVE_TIMEOUT_MS, l as remoteIosDeps, n as binOnPath, o as ensureRemoteBootOwned, r as bundleEntryPoint, u as resolveRemoteContext, w as ownedSessionName, z as resolveEasCliBin } from "./device-remote-Dy1jGj3U.mjs";
18
+ import { c as clearOtherUserApps, h as iosAppProcess, m as installIosApp, r as DEFAULT_METRO_PORT, u as devClientUrl, v as launchIosApp } from "./app-install-CrJ6t_bv.mjs";
19
+ import { c as readMetroRecords, d as verifyLaunch, f as verifyReleaseLaunch, i as RELEASE_VERIFY_WAIT_MS, l as unverifiedLaunchLines, n as LAUNCH_FATAL, o as isBundleProof, r as LAUNCH_UNVERIFIED, s as readCollectorRecords, t as LAUNCH_BUNDLING } from "./launch-verify-CQS_Kg-C.mjs";
20
+ import { c as unknownIosRuntimeRefusal, d as isEasBuildFailure, f as resolveEasDevelopmentBuild, r as checkDeviceCapacity, s as unknownIosDeviceTypeRefusal, u as easDeviceBuildRemedy } from "./simslim-Ca3487H6.mjs";
21
+ import { a as lostLine, c as releaseLeaseOnSignal, i as leaseExpiryText, l as runLease, n as DEBUG_VERIFY_STEP_MS, o as lostRefusal, r as acquireRunLease, s as parseDeviceWait, t as selectFromPool, u as waitFlagConflict } from "./device-pool-Di8Q-9Ro.mjs";
22
+ import { _ as isPhysicalDeviceRequest, a as swapJsBundle, b as warmMetro, c as runPrebuild, d as ensureOwnedDevice, g as ensureWorkspaceStorageSafely, h as ensureDevServer, l as staleNativeDirRefusal, m as clearIosAdoptionPending, n as pickDevClientScheme, o as planPrebuild, r as schemesFromInfoPlist, s as recordPrebuild, t as devClientScheme, u as ensureBooted, v as launchOutcomeRecord, y as sleep } from "./dev-client-92U593KT.mjs";
23
+ import { t as budgetGate } from "./budget-BP4jZZL4.mjs";
24
+ import { f as spawnEntry, s as startDevServer } from "./start-F9gv5dcC.mjs";
25
+ import { a as statsProjectKey, i as recordRunStats, n as readRunEstimates, t as createRunRecorder } from "./stats-BAgJaLA4.mjs";
26
+ import { a as compilationCacheActivityLine, c as readBundleExecutable, l as readBundleId, p as describeDiagnostic, r as buildIos, s as discoverXcodeProject, t as COMPILATION_CACHE_NOT_RUN, u as resolveScheme } from "./xcode-B2tBkf0m.mjs";
27
+ import { n as nativeRunCommand, t as launchSlotScope } from "./slot-launch-C5cg0fmk.mjs";
28
+ import { a as printNativeCrashReport, n as IOS_CRASH_REPORT_RETRY, o as simulatorConsolePaths, r as captureNativeCrashes, t as errorDiagnostics } from "./error-diagnostics-xxWKNO3-.mjs";
29
+ import { a as iosPoolCandidates, c as listIosDevices, d as verifyIosDeviceReleaseLaunch, i as iosDeviceProcess, l as localNetworkPending, n as installIosDeviceApp, o as iosPoolNoCandidatesRefusal, r as iosDeviceBounds, s as isWirelessIosDevice, t as awaitIosDeviceLaunch, u as resolveIosPhysicalDevice } from "./ios-device-CtRdEVjx.mjs";
30
+ import { a as runPodInstall, n as podsAreStale, r as readPodState } from "./deps-DP4eWqea.mjs";
30
31
  import { existsSync, mkdirSync, mkdtempSync, openSync, rmSync, writeFileSync } from "node:fs";
31
32
  import { InvalidArgumentError } from "commander";
32
33
  import { basename, join } from "node:path";
@@ -250,7 +251,7 @@ function lastBuildRecord({ fingerprint = null, cacheKey = null, cacheHit = false
250
251
  if (errorCode) record.errorCode = errorCode;
251
252
  return record;
252
253
  }
253
- function iosFacts({ slot, udid, deviceName, deviceType = null, runtime = null, fingerprint, configuration = null, scheme = null, cacheKey, cacheHit, cacheSkipped = false, compilationCache = COMPILATION_CACHE_NOT_RUN, waitedForBuild = null, appPath, bundleId, installSkipped = false, metroPort, logsDir, durationMs, launched = true, webPreviewUrl = null, lease }) {
254
+ function iosFacts({ slot, udid, deviceName, deviceType = null, runtime = null, fingerprint, configuration = null, scheme = null, cacheKey, cacheHit, cacheSkipped = false, compilationCache = COMPILATION_CACHE_NOT_RUN, waitedForBuild = null, appPath, bundleId, installSkipped = false, metroPort, logsDir, durationMs, launched = true, webPreviewUrl = null, lease, devServer = null }) {
254
255
  return {
255
256
  platform: "ios",
256
257
  ...slot && slot !== "default" ? { slot } : {},
@@ -277,7 +278,8 @@ function iosFacts({ slot, udid, deviceName, deviceType = null, runtime = null, f
277
278
  logs: { dir: logsDir },
278
279
  durationMs,
279
280
  ...webPreviewUrl ? { webPreviewUrl } : {},
280
- ...lease === void 0 ? {} : { lease }
281
+ ...lease === void 0 ? {} : { lease },
282
+ ...devServer ? { devServer } : {}
281
283
  };
282
284
  }
283
285
  function writeLastBuild(root, record, { write = writeWorkspaceState } = {}) {
@@ -303,7 +305,7 @@ async function finishIosUpload(uploadPending, remote, phase, note) {
303
305
  }
304
306
  return false;
305
307
  }
306
- function reportIosResult({ slot, d, root, json, release, configuration, buildScheme = null, metroCheck, metroPort, logsDir, device, udid, appPath, bundleId, installSkipped, elapsed, startedAt, storeHash, storeKey, cacheHit, compilationCache, useBuildCache, waitedForBuild, launchState, launchWarning, providerName, closeWriter, webPreviewUrl, lease, recordRun }) {
308
+ function reportIosResult({ slot, d, root, json, release, configuration, buildScheme = null, metroCheck, metroPort, logsDir, device, udid, appPath, bundleId, installSkipped, elapsed, startedAt, storeHash, storeKey, cacheHit, compilationCache, useBuildCache, waitedForBuild, launchState, launchWarning, providerName, closeWriter, webPreviewUrl, lease, recordRun, reclaimed = [], devServer = null }) {
307
309
  const durationMs = elapsed();
308
310
  recordRun({
309
311
  failed: false,
@@ -345,15 +347,19 @@ function reportIosResult({ slot, d, root, json, release, configuration, buildSch
345
347
  durationMs,
346
348
  launched: launchState,
347
349
  webPreviewUrl,
348
- lease
350
+ lease,
351
+ devServer
349
352
  });
350
- if (json) console.log(JSON.stringify(facts));
353
+ if (json) console.log(JSON.stringify(reclaimed.length ? {
354
+ ...facts,
355
+ reclaimed
356
+ } : facts));
351
357
  else {
352
358
  const summary = `${launchWarning ? "WARNING" : "OK"}: ${bundleId} on ${deviceLabel(device, udid)}, ` + (release ? `${configuration} (embedded JS, no Metro)` : `Metro port ${metroPort}`) + ` (${cacheDescription(cacheHit, providerName)}, ${formatDuration(durationMs)})`;
353
359
  const outcome = launchWarning ? chalk.yellow(`${summary} -- ${launchWarning}`) : launchState === "unverified" ? chalk.yellow(`${summary} -- launch UNVERIFIED`) : launchState === "bundling" ? chalk.green(`${summary} -- bundle requested, still building`) : chalk.green(summary);
354
360
  const deviceName = device?.deviceName ?? device?.name ?? udid;
355
361
  const cacheResult = useBuildCache ? cacheDescription(cacheHit, providerName) : "bypassed; built";
356
- const metroResult = release ? `embedded (${configuration})` : !metroCheck ? `check skipped on port ${metroPort}` : launchState === "unverified" ? `state unverified on port ${metroPort}` : `running on port ${metroPort}`;
362
+ const metroResult = release ? `embedded (${configuration})` : !metroCheck ? `check skipped on port ${metroPort}` : launchState === "unverified" ? `state unverified on port ${metroPort}` : `running on port ${metroPort}${devServer ? ` (started: ${devServer.reason})` : ""}`;
357
363
  console.log([
358
364
  outcome,
359
365
  phaseLine("device", `${deviceName} (${udid})`),
@@ -762,9 +768,19 @@ async function acquireIosArtifact({ root, logFile, udid, remoteDestination, devi
762
768
  note(chalk.yellow(phaseLine("build", `could not take a build slot: ${e?.message || e}; building anyway`)));
763
769
  }
764
770
  const mutatingSteps = [];
765
- if (d.needsPrebuild(root, "ios", isExpo)) {
771
+ const prebuild = d.planPrebuild(root, "ios", {
772
+ isExpo,
773
+ fingerprint,
774
+ sources: fingerprintSources
775
+ });
776
+ if (prebuild === "refuse") fail({
777
+ ...staleNativeDirRefusal("ios"),
778
+ build: buildFailure
779
+ });
780
+ if (prebuild === "generate" || prebuild === "regenerate") {
766
781
  step("prebuild");
767
- const result = await d.runPrebuild(root, "ios", logWriter());
782
+ recordPrebuild(root, "ios", null);
783
+ const result = await d.runPrebuild(root, "ios", logWriter(), { clean: prebuild === "regenerate" });
768
784
  if (result?.failed) {
769
785
  phase("prebuild", "FAILED");
770
786
  fail({
@@ -775,9 +791,21 @@ async function acquireIosArtifact({ root, logFile, udid, remoteDestination, devi
775
791
  build: buildFailure
776
792
  });
777
793
  }
778
- phase("prebuild", `ios/ absent -> generated (${formatDuration(result?.durationMs ?? 0)})`);
794
+ phase("prebuild", `${prebuild === "generate" ? "ios/ absent -> generated" : "ios/ not generated from this fingerprint -> regenerated with --clean"} (${formatDuration(result?.durationMs ?? 0)})`);
779
795
  mutatingSteps.push("prebuild");
780
796
  }
797
+ if (isExpo && buildScheme !== void 0) {
798
+ const project = d.discoverXcodeProject(root);
799
+ if (project.error) fail({
800
+ ...project.error,
801
+ build: buildFailure
802
+ });
803
+ const schemeError = d.resolveScheme(project, { scheme: buildScheme }).error;
804
+ if (schemeError) fail({
805
+ ...schemeError,
806
+ build: buildFailure
807
+ });
808
+ }
781
809
  const podState = d.readPodState(root);
782
810
  const action = podAction(podState, d.podsAreStale(podState.lockText, podState.manifestText));
783
811
  if (action.install) {
@@ -806,6 +834,7 @@ async function acquireIosArtifact({ root, logFile, udid, remoteDestination, devi
806
834
  previousHash: fingerprint,
807
835
  fingerprint: d.fingerprintProject
808
836
  });
837
+ if (after && mutatingSteps.includes("prebuild")) recordPrebuild(root, "ios", after.hash);
809
838
  if (!after) {
810
839
  storeHash = null;
811
840
  storeKey = null;
@@ -1567,6 +1596,7 @@ const DEFAULT_DEPS = {
1567
1596
  getProject,
1568
1597
  upsertProject,
1569
1598
  checkDeviceCapacity,
1599
+ budgetGate,
1570
1600
  ensureOwnedDevice,
1571
1601
  listIosRuntimes,
1572
1602
  ensureBooted,
@@ -1576,7 +1606,7 @@ const DEFAULT_DEPS = {
1576
1606
  ensureRemoteBootOwned,
1577
1607
  detectProviders,
1578
1608
  resolveProjectMetro,
1579
- resolveMetroWithRetry,
1609
+ startDevServer,
1580
1610
  warmMetro,
1581
1611
  readWorkspaceState,
1582
1612
  pidExists,
@@ -1597,7 +1627,7 @@ const DEFAULT_DEPS = {
1597
1627
  resolveEasCliBin,
1598
1628
  resolveRemote,
1599
1629
  uploadRemote,
1600
- needsPrebuild,
1630
+ planPrebuild,
1601
1631
  runPrebuild,
1602
1632
  readPodState,
1603
1633
  podsAreStale,
@@ -1822,10 +1852,14 @@ function recordIosReloadTarget({ d, root, physical, remoteDevice, bundleId, udid
1822
1852
  note(chalk.yellow(phaseLine("state", `could not record iOS launch: ${error?.message || error}`)));
1823
1853
  }
1824
1854
  }
1825
- function simulatorLaunchFailureRemedy(remote, udid, bundleId, logFile) {
1826
- return `${remote ? "Run" : "If the simulator timed out, run `stim doctor --platform ios` and resolve any reported host memory pressure before retrying. Otherwise run"} \`xcrun simctl launch --terminate-running-process --console ${udid} ${bundleId}\` to see what the app reports, and check ${logFile}.`;
1855
+ function installFailureRemedy(remoteDevice) {
1856
+ return remoteDevice?.failureRemedy() ?? "Check that the simulator is booted and that the app was built for the simulator SDK.";
1857
+ }
1858
+ function launchFailureRemedy(remoteDevice, udid, bundleId, logFile) {
1859
+ if (remoteDevice) return remoteDevice.failureRemedy();
1860
+ return `If the simulator timed out, run \`stim doctor --platform ios\` and resolve any reported host memory pressure before retrying. Otherwise run \`xcrun simctl launch --terminate-running-process --console ${udid} ${bundleId}\` to see what the app reports, and check ${logFile}.`;
1827
1861
  }
1828
- async function finishIosRun({ artifact, d, root, slot, json, release, configuration, buildScheme, isExpo, metroCheck, metroPort, logsDir, logFile, device, udid, physical, wireless, lanAddress, lanOriginUrl, remoteDevice, bootPromise, bootDuration, fail, phase, note, logWriter, elapsed, startedAt, closeWriter, lease, releaseLease, recordRun, enterPhase }) {
1862
+ async function finishIosRun({ artifact, d, root, slot, json, release, configuration, buildScheme, isExpo, metroCheck, metroPort, logsDir, logFile, device, udid, physical, wireless, lanAddress, lanOriginUrl, remoteDevice, bootPromise, bootDuration, fail, phase, note, logWriter, elapsed, startedAt, closeWriter, lease, releaseLease, recordRun, reclaimed, devServer, enterPhase }) {
1829
1863
  const { path: appPath, bundleId: initialBundleId, failureFields: buildFailure, cache } = artifact;
1830
1864
  const { hit: cacheHit, providerName, readEnabled: useBuildCache, waitedForBuild, compilation: compilationCache } = cache;
1831
1865
  const storeHash = cache.identity?.fingerprint ?? null;
@@ -2020,7 +2054,7 @@ async function finishIosRun({ artifact, d, root, slot, json, release, configurat
2020
2054
  if (installed?.failed) return fail({
2021
2055
  code: installed.code || "STIM_INSTALL_FAILED",
2022
2056
  message: installed.reason,
2023
- remedy: "Check that the simulator is booted and that the app was built for the simulator SDK.",
2057
+ remedy: installFailureRemedy(remoteDevice),
2024
2058
  build: {
2025
2059
  ...buildFailure,
2026
2060
  appPath,
@@ -2081,7 +2115,7 @@ async function finishIosRun({ artifact, d, root, slot, json, release, configurat
2081
2115
  return fail({
2082
2116
  code: launched.code || "STIM_LAUNCH_FAILED",
2083
2117
  message: launched.reason,
2084
- remedy: simulatorLaunchFailureRemedy(Boolean(remoteDevice), udid, bundleId, logFile),
2118
+ remedy: launchFailureRemedy(remoteDevice, udid, bundleId, logFile),
2085
2119
  build: {
2086
2120
  ...buildFailure,
2087
2121
  appPath,
@@ -2194,7 +2228,9 @@ async function finishIosRun({ artifact, d, root, slot, json, release, configurat
2194
2228
  closeWriter,
2195
2229
  webPreviewUrl: remoteDevice?.webPreviewUrl() ?? null,
2196
2230
  lease: physical ? leaseFacts : void 0,
2197
- recordRun
2231
+ recordRun,
2232
+ reclaimed,
2233
+ devServer
2198
2234
  }),
2199
2235
  uploadsAbandoned
2200
2236
  };
@@ -2211,7 +2247,7 @@ function iosCommand(program) {
2211
2247
  registerIos(program);
2212
2248
  }
2213
2249
  function registerIos(program, deps = {}) {
2214
- program.command("ios").description("Build (or restore from the fingerprint cache), install and launch this workspace's app on its owned simulator, wired to the reserved Metro port. Requires a running dev server (`stim start`).").option("--eas-profile <name>", "Download a matching EAS development build; on a miss, print the build command without running it").option("--slot <name>", "Reusable device slot within this workspace (default: default)", parseDeviceSlotOption).option("--json", "Emit the facts as a single JSON line on stdout; every other line goes to stderr").option("--scheme <name>", "Shared Xcode app scheme to build; overrides automatic scheme selection, not the app URL scheme").option("--no-metro-check", "Skip the \"is this workspace's dev server running?\" gate and build anyway").option("--no-build-cache", "Build fresh, ignoring cached artifacts (local and the project's build-cache provider); the fresh build still replaces the cache entry").option("--configuration <name>", "Xcode configuration to build (e.g. Release). A non-Debug configuration embeds the JS bundle and skips Metro entirely. Overrides the ios.configuration setting. Default: Debug").option("--device-type <name>", "Simulator model to create this workspace's owned sim as, exactly as `xcrun simctl list devicetypes` names it (e.g. \"iPad Pro 13-inch (M5)\"). Overrides the ios.deviceType setting for this invocation. A model no installed runtime can create refuses with STIM_BAD_ARG and prints the models they do offer.").option("--runtime <version>", "Simulator runtime to create this workspace's owned sim on, as a version (\"18.5\") or a runtime's full name (\"iOS 18.5\"); nothing else matches. Overrides the ios.runtime setting for this invocation. An unknown version refuses with STIM_BAD_ARG and prints the installed runtimes.").option("--simulator-app <app>", "Open the owned simulator in xcode, siniulator, or stim-desktop for this run, overriding the machine iosSimulatorApp setting. Also opens an already running simulator; local simulators only.").option("--device [udid]", "Build the iphoneos slice for a connected iPhone, install it, and launch it, instead of using this workspace's owned simulator. The phone can be cabled or paired over Wi-Fi. With no UDID, the first cabled device this workspace can lease is used, waiting for one that is busy; a Wi-Fi device is used only when no cabled one is connected and ready. In Debug the app is wired to this workspace's Metro over the LAN. Stim never creates, boots, or deletes a physical device.").option("--remote <backend>", "Install and launch on a remote device with proxy or EAS. Builds are local unless --eas-profile selects an existing EAS build.", (value) => {
2250
+ program.command("ios").description("Build (or restore from the fingerprint cache), install and launch this workspace's app on its owned simulator, wired to the reserved Metro port. A Debug run starts the dev server when it is not running.").option("--eas-profile <name>", "Download a matching EAS development build; on a miss, print the build command without running it").option("--slot <name>", "Reusable device slot within this workspace (default: default)", parseDeviceSlotOption).option("--json", "Emit the facts as a single JSON line on stdout; every other line goes to stderr").option("--scheme <name>", "Shared Xcode app scheme to build; overrides automatic scheme selection, not the app URL scheme").option("--no-metro-check", "Skip the \"is this workspace's dev server running?\" check: do not start it, and build anyway").option("--no-build-cache", "Build fresh, ignoring cached artifacts (local and the project's build-cache provider); the fresh build still replaces the cache entry").option("--configuration <name>", "Xcode configuration to build (e.g. Release). A non-Debug configuration embeds the JS bundle and skips Metro entirely. Overrides the ios.configuration setting. Default: Debug").option("--device-type <name>", "Simulator model to create this workspace's owned sim as, exactly as `xcrun simctl list devicetypes` names it (e.g. \"iPad Pro 13-inch (M5)\"). Overrides the ios.deviceType setting for this invocation. A model no installed runtime can create refuses with STIM_BAD_ARG and prints the models they do offer.").option("--runtime <version>", "Simulator runtime to create this workspace's owned sim on, as a version (\"18.5\") or a runtime's full name (\"iOS 18.5\"); nothing else matches. Overrides the ios.runtime setting for this invocation. An unknown version refuses with STIM_BAD_ARG and prints the installed runtimes.").option("--simulator-app <app>", "Open the owned simulator in xcode, siniulator, or stim-desktop for this run, overriding the machine iosSimulatorApp setting. Also opens an already running simulator; local simulators only.").option("--device [udid]", "Build the iphoneos slice for a connected iPhone, install it, and launch it, instead of using this workspace's owned simulator. The phone can be cabled or paired over Wi-Fi. With no UDID, the first cabled device this workspace can lease is used, waiting for one that is busy; a Wi-Fi device is used only when no cabled one is connected and ready. In Debug the app is wired to this workspace's Metro over the LAN. Stim never creates, boots, or deletes a physical device.").option("--remote <backend>", "Install and launch on a remote device with proxy or EAS. Builds are local unless --eas-profile selects an existing EAS build.", (value) => {
2215
2251
  if (REMOTE_DEVICE_BACKENDS.includes(value)) return value;
2216
2252
  throw new InvalidArgumentError(`expected one of: ${REMOTE_DEVICE_BACKENDS.join(", ")}`);
2217
2253
  }).option("--wait <seconds>", "How long to wait for another workspace to release the phone it leases, before refusing with STIM_DEVICE_BUSY (default 60, 0 refuses at once). Only with --device.").option("--no-wait", "Install on a phone another workspace leases instead of waiting: this run takes no lease and, when both workspaces build the same app id, the install terminates the holder's running app. Only with --device.").action(async (opts) => {
@@ -2250,7 +2286,7 @@ function explicitSchemeRefusal(root, scheme, isExpo, d) {
2250
2286
  message: "--scheme must name a non-empty shared Xcode app scheme.",
2251
2287
  remedy: "Pass the exact scheme name shown by xcodebuild -list."
2252
2288
  };
2253
- if (d.needsPrebuild(root, "ios", isExpo)) return null;
2289
+ if (isExpo) return null;
2254
2290
  const project = d.discoverXcodeProject(root);
2255
2291
  if (project.error) return project.error;
2256
2292
  return d.resolveScheme(project, { scheme }).error ?? null;
@@ -2374,6 +2410,7 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2374
2410
  });
2375
2411
  const recordRun = stats.record;
2376
2412
  let compilationCache = COMPILATION_CACHE_NOT_RUN;
2413
+ let reclaimed = [];
2377
2414
  const fail = ({ code, message, remedy = null, lines = [], logPath = null, build = null, lease }) => {
2378
2415
  releaseLease();
2379
2416
  if (message) note(chalk.red(phaseLine("error", message)));
@@ -2397,7 +2434,8 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2397
2434
  message: message ?? null,
2398
2435
  remedy: remedy ?? null,
2399
2436
  ...compilationCache.status === "not-run" ? {} : { compilationCache },
2400
- ...lease === void 0 ? {} : { lease }
2437
+ ...lease === void 0 ? {} : { lease },
2438
+ ...reclaimed.length ? { reclaimed } : {}
2401
2439
  }));
2402
2440
  writer?.close?.();
2403
2441
  process.exitCode = 1;
@@ -2514,23 +2552,12 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2514
2552
  listRuntimes: d.listIosRuntimes
2515
2553
  });
2516
2554
  if (modelRefusal) return fail(modelRefusal);
2517
- const easBuild = await d.resolveEasDevelopmentBuild({
2555
+ const budget = await d.budgetGate({
2518
2556
  root,
2519
- platform: "ios",
2520
- profile: opts.easProfile,
2521
- note,
2522
- isExpo,
2523
- physical,
2524
- selectors: [opts.scheme, opts.configuration],
2525
- buildCache: opts.buildCache
2526
- });
2527
- if (isEasBuildFailure(easBuild)) return fail(easBuild);
2528
- const registerProject = () => d.upsertProject(root, {
2529
- bundleId: d.detectBundleId(root) ?? void 0,
2530
- isExpo
2557
+ note
2531
2558
  });
2532
- if (remoteBackend !== "eas") registerProject();
2533
- const proj = d.getProject(root);
2559
+ reclaimed = budget.reclaimed;
2560
+ if (budget.refusal) return fail(budget.refusal);
2534
2561
  let remoteDevice = null;
2535
2562
  if (remoteBackend) {
2536
2563
  const resolved = await d.resolveRemoteContext({
@@ -2553,6 +2580,23 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2553
2580
  launchIosApp: remoteDevice.launchIosApp
2554
2581
  };
2555
2582
  }
2583
+ const easBuild = await d.resolveEasDevelopmentBuild({
2584
+ root,
2585
+ platform: "ios",
2586
+ profile: opts.easProfile,
2587
+ note,
2588
+ isExpo,
2589
+ physical,
2590
+ selectors: [opts.scheme, opts.configuration],
2591
+ buildCache: opts.buildCache
2592
+ });
2593
+ if (isEasBuildFailure(easBuild)) return fail(easBuild);
2594
+ const registerProject = () => d.upsertProject(root, {
2595
+ bundleId: d.detectBundleId(root) ?? void 0,
2596
+ isExpo
2597
+ });
2598
+ if (remoteBackend !== "eas") registerProject();
2599
+ const proj = d.getProject(root);
2556
2600
  const limits = d.getConcurrencyLimits();
2557
2601
  let physicalDevice = null;
2558
2602
  let wireless = false;
@@ -2613,6 +2657,7 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2613
2657
  let metroPort = proj?.metroPort ?? null;
2614
2658
  let lanAddress = null;
2615
2659
  let lanOriginUrl = null;
2660
+ let devServer = null;
2616
2661
  if (!await resolveMetroPort()) return null;
2617
2662
  let device;
2618
2663
  if (physicalDevice) device = {
@@ -2655,34 +2700,28 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2655
2700
  metroPort = null;
2656
2701
  phase("metro", `skipped (${configuration}: the JS bundle is embedded, no dev server is used)`);
2657
2702
  } else if (metroCheck) {
2658
- if (!metroPort) {
2659
- fail({
2660
- code: "STIM_NO_METRO",
2661
- message: "No Metro port is reserved for this workspace, so there is no dev server to build against.",
2662
- remedy: "Run `stim start` first, or pass --no-metro-check."
2663
- });
2664
- return false;
2665
- }
2666
- const resolution = await d.resolveMetroWithRetry(d.resolveProjectMetro, metroPort, root, { onRetry: ({ delayMs }) => note(chalk.dim(phaseLine("metro", `port ${metroPort} did not verify yet; retrying in ${Math.round(delayMs / 1e3)}s (Metro may still be indexing)`))) });
2667
- if (!resolution?.metro) {
2668
- const supervisor = d.readWorkspaceState(root)?.supervisor ?? null;
2669
- const supervisorAlive = Boolean(supervisor?.pid && d.pidExists(supervisor.pid));
2703
+ const gate = await ensureDevServer({
2704
+ root,
2705
+ port: metroPort,
2706
+ settings,
2707
+ remote: Boolean(remoteDevice),
2708
+ note,
2709
+ resolve: d.resolveProjectMetro,
2710
+ start: d.startDevServer,
2711
+ readState: d.readWorkspaceState
2712
+ });
2713
+ reclaimed = [...reclaimed, ...gate.reclaimed];
2714
+ if (!gate.ok) {
2670
2715
  fail({
2671
- code: "STIM_NO_METRO",
2672
- message: noMetroMessage({
2673
- port: metroPort,
2674
- resolution,
2675
- supervisor,
2676
- supervisorAlive
2677
- }),
2678
- remedy: noMetroRemedy({
2679
- port: metroPort,
2680
- supervisor,
2681
- supervisorAlive
2682
- })
2716
+ code: gate.code,
2717
+ message: gate.message,
2718
+ remedy: gate.remedy,
2719
+ lines: gate.lines
2683
2720
  });
2684
2721
  return false;
2685
2722
  }
2723
+ metroPort = gate.port;
2724
+ devServer = gate.devServer;
2686
2725
  } else if (!metroPort) {
2687
2726
  metroPort = DEFAULT_METRO_PORT;
2688
2727
  note(chalk.yellow(`No Metro port is reserved for this workspace; wiring the app to ${metroPort}.`));
@@ -2889,6 +2928,8 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2889
2928
  lease: leaseHandle,
2890
2929
  releaseLease,
2891
2930
  recordRun,
2931
+ reclaimed,
2932
+ devServer,
2892
2933
  enterPhase: progress.step
2893
2934
  });
2894
2935
  } finally {
@@ -2905,4 +2946,4 @@ async function runIos(opts = {}, overrides = {}, progress = NO_BUILD_PROGRESS) {
2905
2946
  }
2906
2947
  }
2907
2948
  //#endregion
2908
- export { appNameFromPath, buildLogFile, cacheDescription, collectorEntry, iosCommand as default, devClientScheme, deviceLabel, ensureWorkspaceStorageSafely, formatDuration, gateShouldRetry, iosConfigurationSetting, iosFacts, isReleaseConfiguration, lastBuildRecord, noMetroMessage, phaseLine, pickDevClientScheme, podAction, registerIos, replaceCollector, resolveConfiguration, resolveDeviceType, resolveMetroWithRetry, resolveRuntime, schemesFromInfoPlist, shortHash, shortUdid, writeLastBuild };
2949
+ export { appNameFromPath, buildLogFile, cacheDescription, collectorEntry, iosCommand as default, devClientScheme, deviceLabel, ensureWorkspaceStorageSafely, formatDuration, iosConfigurationSetting, iosFacts, isReleaseConfiguration, lastBuildRecord, phaseLine, pickDevClientScheme, podAction, registerIos, replaceCollector, resolveConfiguration, resolveDeviceType, resolveRuntime, schemesFromInfoPlist, shortHash, shortUdid, writeLastBuild };
@@ -1,4 +1,4 @@
1
- import { t as getExecutor } from "./exec-jIAlgilk.mjs";
1
+ import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
2
2
  //#region src/collector/ios-device.ts
3
3
  const CONSOLE_ENV = { OS_ACTIVITY_DT_MODE: "enable" };
4
4
  const DEV_MENU_LAUNCH_ARGS = [
@@ -1,6 +1,6 @@
1
- import { t as getExecutor } from "./exec-jIAlgilk.mjs";
2
- import { n as TOOL_ERROR_PREFIX } from "./ios-device-DPsSm0v_.mjs";
3
- import { i as INSTALL_ERROR } from "./app-install-Uf3a83Tv.mjs";
1
+ import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
2
+ import { n as TOOL_ERROR_PREFIX } from "./ios-device-BiOsSVzd.mjs";
3
+ import { i as INSTALL_ERROR } from "./app-install-CrJ6t_bv.mjs";
4
4
  import { mkdtempSync, readFileSync, rmSync } from "node:fs";
5
5
  import { join } from "node:path";
6
6
  import { tmpdir } from "node:os";
@@ -1,8 +1,8 @@
1
- import { t as getExecutor } from "./exec-jIAlgilk.mjs";
2
- import { o as readNdjsonGenerations } from "./ndjson-9uFNRwfe.mjs";
3
- import { t as DEV_MENU_LAUNCH_ARGS } from "./ios-device-DPsSm0v_.mjs";
4
- import { s as isAppLaunchError } from "./command-output-gByVmIjy.mjs";
5
- import { d as deviceShellArg, n as ANDROID_DISABLE_AUTO_LAUNCH_EXTRA, o as androidAppProcess } from "./app-install-Uf3a83Tv.mjs";
1
+ import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
2
+ import { o as readNdjsonGenerations } from "./ndjson-CDY9IkVC.mjs";
3
+ import { s as isAppLaunchError } from "./command-output-D5z2_bcF.mjs";
4
+ import { t as DEV_MENU_LAUNCH_ARGS } from "./ios-device-BiOsSVzd.mjs";
5
+ import { d as deviceShellArg, n as ANDROID_DISABLE_AUTO_LAUNCH_EXTRA, o as androidAppProcess } from "./app-install-CrJ6t_bv.mjs";
6
6
  import { join } from "node:path";
7
7
  //#region src/engine/app-readiness.ts
8
8
  const APP_READINESS_TIMEOUT_MS = 3e4;
@@ -1,11 +1,11 @@
1
- import { G as parseDeviceSlotOption, g as loadConfig, h as isPathPrefix } from "./config-Cp9lM3wX.mjs";
2
- import { n as SOURCES, t as LEVELS } from "./ndjson-9uFNRwfe.mjs";
3
- import { b as workspaceLogsDir, r as readWorkspaceState } from "./workspace-state-DF2gCFhx.mjs";
4
- import { o as findProjectRoot } from "./project-DS112DYB.mjs";
5
- import { f as refuseNoProject, v as launchErrorPreview } from "./command-output-gByVmIjy.mjs";
6
- import { i as captureWorkspaceCrashes, t as errorDiagnostics } from "./error-diagnostics-Vfz83GCF.mjs";
7
- import { a as fileSizes, c as parseSince, i as compileGrep, l as queryLogs, o as followLogs, r as buildCriteria, s as logFiles, u as readLogRecords } from "./logs-query-Cqma3WIu.mjs";
1
+ import { V as parseDeviceSlotOption, g as loadConfig$1, h as isPathPrefix } from "./config-BEq0Qw_a.mjs";
2
+ import { n as SOURCES, t as LEVELS } from "./ndjson-CDY9IkVC.mjs";
3
+ import { j as workspaceLogsDir, m as readWorkspaceState$1 } from "./metro-BWLOJ_Wr.mjs";
4
+ import { o as findProjectRoot } from "./project-BXZzOABt.mjs";
5
+ import { f as refuseNoProject, v as launchErrorPreview } from "./command-output-D5z2_bcF.mjs";
6
+ import { i as captureWorkspaceCrashes, t as errorDiagnostics } from "./error-diagnostics-xxWKNO3-.mjs";
8
7
  import { realpathSync } from "node:fs";
8
+ import { buildCriteria, compileGrep, fileSizes, followLogs, logFiles, parseSince, queryLogs, readLogRecords } from "@stim-cli/core/state";
9
9
  import { relative, sep } from "node:path";
10
10
  import chalk from "chalk";
11
11
  //#region src/commands/logs.ts
@@ -70,7 +70,7 @@ function nearestRegisteredLogsProject(root, candidates) {
70
70
  })[0] ?? null;
71
71
  }
72
72
  function registeredDescendantWithLogs(root) {
73
- const candidates = Object.keys(loadConfig()?.projects ?? {}).flatMap((path) => {
73
+ const candidates = Object.keys(loadConfig$1()?.projects ?? {}).flatMap((path) => {
74
74
  try {
75
75
  const canonical = realpathSync(path);
76
76
  return logFiles(workspaceLogsDir(canonical)).length > 0 ? [canonical] : [];
@@ -157,7 +157,7 @@ function logsCommand(program) {
157
157
  ...query,
158
158
  records: timeline
159
159
  });
160
- const supervisorPort = readWorkspaceState(root)?.supervisor?.port;
160
+ const supervisorPort = readWorkspaceState$1(root)?.supervisor?.port;
161
161
  const records = opts.json ? rawRecords : await errorDiagnostics(rawRecords, {
162
162
  root,
163
163
  logsDir: dir,