stim 1.17.1 → 1.17.2

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 (41) hide show
  1. package/dist/{android-B6rDWrTm.mjs → android-B9yaNKwa.mjs} +9 -9
  2. package/dist/{budget-CUDz870h.mjs → budget-DfcgFdQB.mjs} +3 -3
  3. package/dist/{build-plan-BJSXzsCL.mjs → build-plan-BDsSi09V.mjs} +5 -5
  4. package/dist/{cli-BLQqDGlX.mjs → cli-CYXb29oE.mjs} +13 -13
  5. package/dist/cli.mjs +1 -1
  6. package/dist/{client-CxNotugx.mjs → client-SvBdgObD.mjs} +46 -18
  7. package/dist/{deps-CVxlsRFn.mjs → deps-iKw0eD4P.mjs} +1 -1
  8. package/dist/device-host-worker.mjs +1 -1
  9. package/dist/{doctor-BF_435OC.mjs → doctor-CFv1fCrF.mjs} +5 -5
  10. package/dist/{gc-BsWKa_-d.mjs → gc-DEmkg3Xh.mjs} +3 -3
  11. package/dist/{gradle-bsBRy6i9.mjs → gradle-dJpre3Yn.mjs} +1 -1
  12. package/dist/{guide-DC3n6-NH.mjs → guide-CSmhMTf8.mjs} +24 -19
  13. package/dist/{hosted-android-DgU31wY3.mjs → hosted-android-E1Heoqnv.mjs} +3 -3
  14. package/dist/{hosted-client-CdSoH-G6.mjs → hosted-client-Bp4knSwu.mjs} +1 -1
  15. package/dist/{hosted-ios-BTaVj4Jb.mjs → hosted-ios-BnbeYOUD.mjs} +1 -1
  16. package/dist/{hosted-logs-SxfBvSvc.mjs → hosted-logs-OcgIBvCT.mjs} +2 -2
  17. package/dist/{hosted-macos-CT9E3meL.mjs → hosted-macos-DcxKjtfH.mjs} +2 -2
  18. package/dist/{hosted-native-CZLOrMrN.mjs → hosted-native-1Ebbig4w.mjs} +3 -3
  19. package/dist/{ios-C7JuT1bI.mjs → ios-BJ4XUSe1.mjs} +10 -10
  20. package/dist/{logs-DNxKcok9.mjs → logs-BAaS7gS2.mjs} +3 -3
  21. package/dist/{macos-BEs8cwKx.mjs → macos-BIRQS90f.mjs} +5 -5
  22. package/dist/maintenance-run.mjs +2 -2
  23. package/dist/{metro-gateway-CHqK0p-a.mjs → metro-gateway-C-ijGI2F.mjs} +1 -1
  24. package/dist/{native-runtime-YhaSxP4v.mjs → native-runtime-BEK171xQ.mjs} +1 -1
  25. package/dist/offload-worker.mjs +4 -4
  26. package/dist/{preview-C_JjkEy4.mjs → preview-B-g9d7kV.mjs} +1 -1
  27. package/dist/{reload-byOjE3P4.mjs → reload-DcRxj3qG.mjs} +2 -2
  28. package/dist/settings.schema.json +2 -2
  29. package/dist/{start-BEP-XmEA.mjs → start-AlfCPRVU.mjs} +1 -1
  30. package/dist/{start-BHIersSm.mjs → start-DUz3mYdb.mjs} +1 -1
  31. package/dist/{status-CqeWbIWW.mjs → status-BA2pehwf.mjs} +5 -5
  32. package/dist/{stop-D03prQnW.mjs → stop-BIiM49EY.mjs} +1 -1
  33. package/dist/{stop-Cj01je8D.mjs → stop-DQIasgKp.mjs} +3 -3
  34. package/dist/{stop-DOxwkH4j.mjs → stop-zF1y04f2.mjs} +1 -1
  35. package/dist/supervisor-run.mjs +2 -2
  36. package/dist/{support-BE-tbOP9.mjs → support-CsJNVfOc.mjs} +1 -1
  37. package/dist/{toolchain-CdrxgUeA.mjs → toolchain-DNyR3NPq.mjs} +9 -5
  38. package/dist/{web-DddUdJzr.mjs → web-Dl0KSRHf.mjs} +2 -2
  39. package/dist/{worktree-AK_m-d_m.mjs → worktree-Be_7NLKy.mjs} +6 -6
  40. package/dist/{worktree-CsAjSmEo.mjs → worktree-j3IcFAI5.mjs} +1 -1
  41. package/package.json +5 -5
@@ -7,7 +7,7 @@ import { B as settingsLayers, C as metroWarmupUrlSetting, F as settingFile, G as
7
7
  import { d as projectShortcut, n as appProjectProblem, r as detectIsExpo, s as findProjectRoot$1, t as NO_PROJECT_REFUSAL } from "./project-D47Rh0ly.mjs";
8
8
  import { l as resolveProjectMetro, o as pidExists, u as signalProcessTree } from "./metro-g8NqiJp-.mjs";
9
9
  import { c as writeWorkspaceState, g as workspaceAgentDeviceDir, i as recordWorkspaceUse, l as emulatorLogFile, r as readWorkspaceState$1, v as workspaceDir, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
10
- import { t as budgetGate } from "./budget-CUDz870h.mjs";
10
+ import { t as budgetGate } from "./budget-DfcgFdQB.mjs";
11
11
  import { A as providerDownloadPath, B as captureAssetManifest, D as fingerprintProject, E as fingerprintDiffRecord, F as storedAssetManifest, H as readAssetManifest, L as untrackedMissLine, M as refingerprintAfterMutation, N as resolveBuild, O as inputsChangedDuringBuild, P as storeBuild, R as untrackedNativeFiles, S as configInputsChanged, T as filesystemBuildCapability, V as compareAssetManifests, _ as waitForBuild, b as buildCacheKey, g as releaseBuildLock, j as providerUploadOutcome, k as prepareProviderDownloadDir, m as acquireBuildLock, v as waitForSharedBuild, x as changedDuringBuildLine, z as assetDiffReason } from "./device-lease-DpoS36_u.mjs";
12
12
  import { r as releaseBuildSlot, t as acquireBuildSlot } from "./build-slots-41v_d2x9.mjs";
13
13
  import { m as writeWorkspaceLaunch, n as MODE_EXPO, t as MODE_BARE } from "./state-BKa8wNN5.mjs";
@@ -16,29 +16,29 @@ import { a as workspaceLinks, i as workspaceLinkLine } from "./stim-desktop-Cnz8
16
16
  import { m as teardownOwnedAvd } from "./ownership-BMLqyBgJ.mjs";
17
17
  import { _ as statsProjectKey$1, c as recordFinishedBuild, d as createRunRecorder, f as readRunEstimates, g as recordRunStats, l as startBuildProgress, m as recordCapacityRefusal, n as NO_BUILD_PROGRESS, u as tapBuildLog } from "./build-progress-D0WkjCPd.mjs";
18
18
  import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
19
- import { E as ccacheActivityLine, T as CCACHE_UNAVAILABLE, b as tailLines, k as resolveCcache, n as androidToolchain, t as androidRequirements, u as HEARTBEAT_INTERVAL_MS, w as CCACHE_NOT_RUN, y as startBuildHeartbeat } from "./toolchain-CdrxgUeA.mjs";
19
+ import { E as ccacheActivityLine, T as CCACHE_UNAVAILABLE, b as tailLines, k as resolveCcache, n as androidToolchain, t as androidRequirements, u as HEARTBEAT_INTERVAL_MS, w as CCACHE_NOT_RUN, y as startBuildHeartbeat } from "./toolchain-DNyR3NPq.mjs";
20
20
  import { t as cleanLine } from "./server-expo-CHTyXD0G.mjs";
21
- import { a as offloadBuild, c as placementLoad, d as OffloadRefusal, f as namedBuildMachine, h as resolveBuildPlacement, i as closeOffload, l as remotePhaseText, n as buildPlacementCandidates, p as parseBuildMachineOption, r as chooseBuildMachine, s as offloadPlacement } from "./client-CxNotugx.mjs";
22
- import { r as hostedMetroSettings } from "./metro-gateway-CHqK0p-a.mjs";
21
+ import { a as offloadBuild, c as placementLoad, d as OffloadRefusal, f as namedBuildMachine, h as resolveBuildPlacement, i as closeOffload, l as remotePhaseText, n as buildPlacementCandidates, p as parseBuildMachineOption, r as chooseBuildMachine, s as offloadPlacement } from "./client-SvBdgObD.mjs";
22
+ import { r as hostedMetroSettings } from "./metro-gateway-C-ijGI2F.mjs";
23
23
  import { n as verifyCollectorOwnership, r as readCollectors } from "./ownership-DyRQru0q.mjs";
24
24
  import { n as DeviceAdmissionRefusal, r as checkDeviceCapacity, t as DEFAULT_DEVICE_SLOT_WAIT_MS } from "./device-capacity-ZC4XSZ4R.mjs";
25
25
  import { S as restartedAppNote, b as launchAndroidReleaseApp, c as androidDevClientUrl, g as installConflictKind, h as installAndroidApp, r as DEFAULT_METRO_PORT, s as androidAppProcess, t as ADB_INSTALL_TIMEOUT_MS, y as launchAndroidApp } from "./app-install-VPkI5WEg.mjs";
26
26
  import { C as resolveSystemImage, S as resolveDeviceProfile, T as systemImageRefusal, _ as isReleaseVariant, a as PLATFORM, b as pooledAndroidDevice, c as androidSystemImageSetting, d as apkPackage, f as deviceProfileRefusal, g as foldableImageRefusal, h as findAapt, i as NO_FINGERPRINT, l as androidVariantSetting, m as dumpApkManifest, n as LAUNCH_FAILED, o as androidBuildOptions, p as displayPath, r as NO_DEVICE, s as androidDevClientScheme, t as INSTALL_FAILED, u as apkDevClientFacts, v as noDeviceDiagnostic, w as resolveVariant, x as remoteAvdFlagRefusal, y as parseXmltree } from "./support-WvD__tSV.mjs";
27
27
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
28
28
  import { i as staleNativeDirRefusal, n as recordPrebuild, r as runPrebuild, t as planPrebuild } from "./prebuild-D7RUMkwN.mjs";
29
- import { c as formatDiagnostic, i as buildAndroid, o as productFlavorRefusal, s as readProductFlavors } from "./gradle-bsBRy6i9.mjs";
29
+ import { c as formatDiagnostic, i as buildAndroid, o as productFlavorRefusal, s as readProductFlavors } from "./gradle-dJpre3Yn.mjs";
30
30
  import { a as VERIFY_TIMEOUT_MS, d as verifyAndroidReleaseLaunch, f as verifyLaunch, i as RELEASE_VERIFY_WAIT_MS, l as unattributedLaunchLines, n as LAUNCH_FATAL, r as LAUNCH_UNVERIFIED, t as LAUNCH_BUNDLING, u as unverifiedLaunchLines } from "./launch-verify-lTnWZikR.mjs";
31
31
  import { a as acquireRunLease, c as lostRefusal, d as runLease, f as waitFlagConflict, l as parseDeviceWait, o as leaseExpiryText, s as lostLine, t as DEBUG_VERIFY_STEP_MS, u as releaseLeaseOnSignal } from "./device-lease-run-B8YltIH_.mjs";
32
32
  import { a as writeHostedAndroid, i as writeDevicePlacement, t as readHostedAndroid } from "./ios-state-8L3lgum6.mjs";
33
- import { _ as AvdRecoveryError, a as refusePlan, b as devicePlacementLine, c as skippedMissReason, d as refreshUpdatesManifestFile, g as AvdBootError, h as ensureOwnedDevice, i as printPlan, l as UPDATES_MANIFEST_NAME, m as ensureBooted, n as planFlagRefusal, o as explainBuildMiss, p as didSetUpDevice, r as planPayload, s as fingerprintErrorMissReason, t as planCachedBuild, u as detectEntryFile, v as warmMetro, y as automaticDevicePlacement } from "./build-plan-BJSXzsCL.mjs";
34
- import { n as prepareHostedAndroid, t as placeHostedAndroid } from "./hosted-android-DgU31wY3.mjs";
33
+ import { _ as AvdRecoveryError, a as refusePlan, b as devicePlacementLine, c as skippedMissReason, d as refreshUpdatesManifestFile, g as AvdBootError, h as ensureOwnedDevice, i as printPlan, l as UPDATES_MANIFEST_NAME, m as ensureBooted, n as planFlagRefusal, o as explainBuildMiss, p as didSetUpDevice, r as planPayload, s as fingerprintErrorMissReason, t as planCachedBuild, u as detectEntryFile, v as warmMetro, y as automaticDevicePlacement } from "./build-plan-BDsSi09V.mjs";
34
+ import { n as prepareHostedAndroid, t as placeHostedAndroid } from "./hosted-android-E1Heoqnv.mjs";
35
35
  import { n as nativeRunCommand, r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-DmjBmpQV.mjs";
36
36
  import { a as easAuthNote, c as loadProjectProvider, f as resolveEasCliBin, i as checkEasAuth, m as uploadRemote, n as UPLOAD_TIMEOUT_MS, o as exitAfterFlush, p as resolveRemote, r as cacheLevel, s as isEasAuthFailureText, t as RESOLVE_TIMEOUT_MS } from "./remote-cache-Ci4DQYYj.mjs";
37
37
  import { a as ensureMetroReachable, c as remoteAndroidDeps, n as binOnPath, o as ensureRemoteBootOwned, u as resolveRemoteContext, w as ownedSessionName } from "./device-remote-hFSkpfQu.mjs";
38
38
  import { d as runCancellationSignal, f as withNativeBuildRun, r as cancelledFailure, u as runCancellation } from "./native-run-D1Q56rAD.mjs";
39
39
  import { a as isEasBuildFailure, o as planEasDevelopmentBuild, s as resolveEasDevelopmentBuild } from "./simslim-BWNrc3M3.mjs";
40
- import { c as startDevServer, m as detectAppIds, p as detectAndroidPackage } from "./start-BHIersSm.mjs";
41
- import { i as launchOutcomeRecord, n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-YhaSxP4v.mjs";
40
+ import { c as startDevServer, m as detectAppIds, p as detectAndroidPackage } from "./start-DUz3mYdb.mjs";
41
+ import { i as launchOutcomeRecord, n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-BEK171xQ.mjs";
42
42
  import { t as selectFromPool } from "./device-pool-3o7s5lo4.mjs";
43
43
  import { a as printNativeCrashReport, r as captureNativeCrashes, t as errorDiagnostics } from "./error-diagnostics-C-NMnhrk.mjs";
44
44
  import { n as resolveAndroidCas, r as resolveAndroidCompilerCache } from "./android-cas-ZFpjJBL_.mjs";
@@ -2555,7 +2555,7 @@ function describeShortfall(budget, measure, short) {
2555
2555
  return [
2556
2556
  ...short.disk.map((v) => `${formatSpace(v.freeMb)} free on ${v.volume}, below the ${formatSpace(floor)} floor`),
2557
2557
  ...short.memory && measure.memory ? [`roughly ${formatSpace(measure.memory.committedMb)} of memory committed, over the ${formatSpace(budget.maxCommittedMemoryMb)} budget`] : [],
2558
- ...short.workspaces && measure.memory ? [`${measure.memory.liveWorkspaces} live workspaces, over the limit of ${budget.maxLiveWorkspaces}`] : []
2558
+ ...short.workspaces && measure.memory ? [`${measure.memory.liveWorkspaces} active workspaces, over the limit of ${budget.maxLiveWorkspaces}`] : []
2559
2559
  ];
2560
2560
  }
2561
2561
  async function enforceBudget({ root, note, dryRun = false, budget: resolved }, overrides = {}) {
@@ -2677,12 +2677,12 @@ function budgetFindings(budget, measure, short, plan) {
2677
2677
  }
2678
2678
  if (short.memory || short.workspaces) findings.push({
2679
2679
  level: "note",
2680
- title: "Live environments are over the memory budget",
2680
+ title: "Active environments are over the memory budget",
2681
2681
  detail: `${describeShortfall(budget, measure, {
2682
2682
  ...short,
2683
2683
  disk: []
2684
2684
  }).join("; ")}. The next ios, android or start shuts down idle owned devices and stops idle dev servers in other workspaces first.`,
2685
- fix: "Run `stim status` to see what is live, and `stim stop` in workspaces you own that you no longer need."
2685
+ fix: "Run `stim status` to see what is active, and `stim stop` in workspaces you own that you no longer need."
2686
2686
  });
2687
2687
  return findings;
2688
2688
  }
@@ -7,22 +7,22 @@ import { Tt as removeTemporaryEntry, a as androidAvdConfigSetting, at as gitComm
7
7
  import { u as ownedDeviceLabel } from "./project-D47Rh0ly.mjs";
8
8
  import { o as pidExists } from "./metro-g8NqiJp-.mjs";
9
9
  import { d as sharedBuildCache } from "./workspace-state-DqcCbpE7.mjs";
10
- import { o as peekBudget } from "./budget-CUDz870h.mjs";
10
+ import { o as peekBudget } from "./budget-DfcgFdQB.mjs";
11
11
  import { C as diffFingerprintSources, I as storedSources, w as entryDir, y as artifactIn } from "./device-lease-DpoS36_u.mjs";
12
12
  import { A as listAvds, B as ownedAvdSystemImage, E as getAvdNameForSerial, F as ownedAvdDeviceProfile, J as resolveOwnedAvdSerial, L as ownedAvdMatchesConfiguration, O as listAdbDevices, P as nextConsolePort, R as ownedAvdName, W as pickDefaultSystemImage, b as createOwnedAvd, f as assertOwnedAvdStopped, ft as parkedMaxSetting, g as avdPoolConfiguration, j as listInstalledSystemImages, n as OWNED_AVD_CONFIG_DEFAULTS, pt as readParked, st as adoptParked, t as DEFAULT_AVD_DEVICE_PROFILE, tt as waitForBoot, ut as isLegacyDeletionClaim, v as bootAndroidEmulator, y as configureNewOwnedAvd } from "./android-B_YNZy61.mjs";
13
13
  import { j as readHostMemoryPressure, u as listAllIosSims } from "./ios-DSfnPfse.mjs";
14
14
  import { _ as teardownParkedAvd, m as teardownOwnedAvd } from "./ownership-BMLqyBgJ.mjs";
15
15
  import { o as estimateBuild, p as readStats$1 } from "./build-progress-D0WkjCPd.mjs";
16
- import { b as tailLines, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-CdrxgUeA.mjs";
16
+ import { b as tailLines, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-DNyR3NPq.mjs";
17
17
  import { t as cleanLine } from "./server-expo-CHTyXD0G.mjs";
18
- import { f as namedBuildMachine, m as resolveBuildMachine, v as hostingMachines } from "./client-CxNotugx.mjs";
19
- import { a as call, o as connectHost } from "./hosted-client-CdSoH-G6.mjs";
18
+ import { f as namedBuildMachine, m as resolveBuildMachine, v as hostingMachines } from "./client-SvBdgObD.mjs";
19
+ import { a as call, o as connectHost } from "./hosted-client-Bp4knSwu.mjs";
20
20
  import { t as clearDeviceIdleShutdown } from "./idle-shutdown-IGyNV8Cr.mjs";
21
21
  import { i as countLiveOwnedDevices, n as DeviceAdmissionRefusal, p as withDeviceBootAdmission, s as peekDeviceSlots } from "./device-capacity-ZC4XSZ4R.mjs";
22
22
  import { i as staleNativeDirRefusal } from "./prebuild-D7RUMkwN.mjs";
23
23
  import { i as ensureOwnedIosDevice, r as ensureIosBooted } from "./device-ios-C2Um-XUR.mjs";
24
24
  import { r as readHostedNative, s as writeHostedNative } from "./ios-state-8L3lgum6.mjs";
25
- import { n as prepareHostedNative } from "./hosted-native-CZLOrMrN.mjs";
25
+ import { n as prepareHostedNative } from "./hosted-native-1Ebbig4w.mjs";
26
26
  import { a as easAuthNote } from "./remote-cache-Ci4DQYYj.mjs";
27
27
  import { t as reconcileSimSlim } from "./simslim-BWNrc3M3.mjs";
28
28
  import { randomUUID } from "node:crypto";
@@ -3,23 +3,23 @@ import { readFileSync } from "node:fs";
3
3
  import { Command } from "commander";
4
4
  //#region bin/cli.ts
5
5
  const commands = /* @__PURE__ */ new Map([
6
- ["doctor", () => import("./doctor-BF_435OC.mjs")],
7
- ["worktree", () => import("./worktree-CsAjSmEo.mjs")],
8
- ["start", () => import("./start-BEP-XmEA.mjs")],
6
+ ["doctor", () => import("./doctor-CFv1fCrF.mjs")],
7
+ ["worktree", () => import("./worktree-j3IcFAI5.mjs")],
8
+ ["start", () => import("./start-AlfCPRVU.mjs")],
9
9
  ["ports", () => import("./ports-4nYqxPWC.mjs")],
10
- ["stop", () => import("./stop-DOxwkH4j.mjs")],
11
- ["ios", () => import("./ios-C7JuT1bI.mjs")],
12
- ["android", () => import("./android-B6rDWrTm.mjs")],
13
- ["web", () => import("./web-DddUdJzr.mjs")],
14
- ["macos", () => import("./macos-BEs8cwKx.mjs")],
15
- ["reload", () => import("./reload-byOjE3P4.mjs")],
10
+ ["stop", () => import("./stop-zF1y04f2.mjs")],
11
+ ["ios", () => import("./ios-BJ4XUSe1.mjs")],
12
+ ["android", () => import("./android-B9yaNKwa.mjs")],
13
+ ["web", () => import("./web-Dl0KSRHf.mjs")],
14
+ ["macos", () => import("./macos-BIRQS90f.mjs")],
15
+ ["reload", () => import("./reload-DcRxj3qG.mjs")],
16
16
  ["device", () => import("./device-C8IOoJPv.mjs")],
17
- ["logs", () => import("./logs-DNxKcok9.mjs")],
17
+ ["logs", () => import("./logs-BAaS7gS2.mjs")],
18
18
  ["settings", () => import("./settings-SR9OmW9h.mjs")],
19
- ["status", () => import("./status-CqeWbIWW.mjs")],
19
+ ["status", () => import("./status-BA2pehwf.mjs")],
20
20
  ["stats", () => import("./stats-Bq4fJOdB.mjs")],
21
- ["gc", () => import("./gc-BsWKa_-d.mjs")],
22
- ["guide", () => import("./guide-DC3n6-NH.mjs")]
21
+ ["gc", () => import("./gc-DEmkg3Xh.mjs")],
22
+ ["guide", () => import("./guide-CSmhMTf8.mjs")]
23
23
  ]);
24
24
  const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
25
25
  const program = new Command();
package/dist/cli.mjs CHANGED
@@ -4,6 +4,6 @@ const encode = (version) => version.split(".", 3).reduce((sum, part) => sum * 1e
4
4
  if (encode(process.versions.node) < encode("22.12.0")) {
5
5
  process.stderr.write(`STIM_NODE_UNSUPPORTED: Stim needs Node 22.12.0 or later; this is Node ${process.versions.node} at ${process.execPath}. To run Stim where a project pins an older Node, see https://stim.appandflow.com/docs/requirements#older-node-pins\n`);
6
6
  process.exitCode = 1;
7
- } else import("./cli-BLQqDGlX.mjs");
7
+ } else import("./cli-CYXb29oE.mjs");
8
8
  //#endregion
9
9
  export {};
@@ -1,7 +1,7 @@
1
1
  import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
2
  import { _ as loadConfig$1, d as getConfigDir } from "./config-D0DbpZtM.mjs";
3
3
  import { w as withDirLock } from "./workspace-state-DqcCbpE7.mjs";
4
- import { T as CCACHE_UNAVAILABLE, a as toolchainMismatches, l as COMPILATION_CACHE_UNAVAILABLE, s as manifestDigest } from "./toolchain-CdrxgUeA.mjs";
4
+ import { T as CCACHE_UNAVAILABLE, a as toolchainMismatches, l as COMPILATION_CACHE_UNAVAILABLE, s as manifestDigest } from "./toolchain-DNyR3NPq.mjs";
5
5
  import { createHash } from "node:crypto";
6
6
  import { closeSync, existsSync, lstatSync, mkdirSync, openSync, readFileSync, readlinkSync, realpathSync, renameSync, rmSync, writeFileSync, writeSync } from "node:fs";
7
7
  import { basename, dirname, join, relative } from "node:path";
@@ -30,6 +30,28 @@ function readHostPermissions(value) {
30
30
  //#region src/offload/tailnet.ts
31
31
  const MAC_APP_TAILSCALE = "/Applications/Tailscale.app/Contents/MacOS/Tailscale";
32
32
  const HELLO_TIMEOUT_MS = 1e4;
33
+ function isLapsed(credential) {
34
+ return credential.state === "pending" && !!credential.expiresAt && Date.parse(credential.expiresAt) <= Date.now();
35
+ }
36
+ function markApproved(credential) {
37
+ const { expiresAt: _expiresAt, ...rest } = credential;
38
+ return {
39
+ ...rest,
40
+ state: "approved"
41
+ };
42
+ }
43
+ function pendingReport(credential) {
44
+ return {
45
+ state: "pending",
46
+ ...credential.expiresAt ? { expiresAt: credential.expiresAt } : {}
47
+ };
48
+ }
49
+ function lapsedLine(machine, credential) {
50
+ return `${machine} did not approve this Mac before the request lapsed at ${credential.expiresAt}.`;
51
+ }
52
+ function requestedLine(credential) {
53
+ return `Requested at ${credential.requestedAt}${credential.expiresAt ? `; the request lapses at ${credential.expiresAt}` : ""}.`;
54
+ }
33
55
  function tailscaleStatus() {
34
56
  for (const binary of ["tailscale", MAC_APP_TAILSCALE]) {
35
57
  const output = getExecutor().runFileQuiet(binary, ["status", "--json"], { timeoutMs: 5e3 });
@@ -161,6 +183,7 @@ async function request(machine, peer, port, deviceName, io) {
161
183
  deviceToken: reply.result.deviceToken,
162
184
  state: "pending",
163
185
  requestedAt: (/* @__PURE__ */ new Date()).toISOString(),
186
+ expiresAt: reply.result.approval.expiresAt,
164
187
  ...ticket ? { ticketHash: ticket.ticketHash } : {}
165
188
  };
166
189
  return {
@@ -169,7 +192,8 @@ async function request(machine, peer, port, deviceName, io) {
169
192
  dnsName: peer.dnsName,
170
193
  state: "pending",
171
194
  deviceId: credential.deviceId,
172
- requestedAt: credential.requestedAt
195
+ requestedAt: credential.requestedAt,
196
+ expiresAt: credential.expiresAt
173
197
  },
174
198
  finding: note$1(`Asked ${machine} for hosting access`, `The request lapses at ${reply.result.approval.expiresAt}.`, approval$1(machine, credential.deviceId)),
175
199
  credential
@@ -300,10 +324,7 @@ async function inspectDeviceHostMachines({ fix }, io = realIo, entries = configu
300
324
  const reply = await io.hello(endpoint(peer, parsed.port), { deviceToken: credential.deviceToken });
301
325
  if ("result" in reply && reply.result?.device?.id === credential.deviceId && Array.isArray(reply.result.capabilities) && reply.result.capabilities.includes("device-host")) {
302
326
  if (credential.state !== "approved") {
303
- credentials = credentials.map((each) => each.machine === machine ? {
304
- ...each,
305
- state: "approved"
306
- } : each);
327
+ credentials = credentials.map((each) => each.machine === machine ? markApproved(each) : each);
307
328
  store(credentials);
308
329
  }
309
330
  const host = readHostPermissions(reply.result.host);
@@ -326,17 +347,18 @@ async function inspectDeviceHostMachines({ fix }, io = realIo, entries = configu
326
347
  if (pending && !ask) {
327
348
  inspected.machines.push({
328
349
  ...known,
329
- state: "pending"
350
+ ...pendingReport(credential)
330
351
  });
331
- inspected.findings.push(note$1(`Remote Mac ${machine} has not approved this Mac for device hosting yet`, `Requested at ${credential.requestedAt}.`, approval$1(machine, credential.deviceId)));
352
+ inspected.findings.push(note$1(`Remote Mac ${machine} has not approved this Mac for device hosting yet`, requestedLine(credential), approval$1(machine, credential.deviceId)));
332
353
  continue;
333
354
  }
334
355
  if (!ask) {
356
+ const lapsed = revoked && isLapsed(credential);
335
357
  inspected.machines.push({
336
358
  ...known,
337
- state: revoked ? "revoked" : "unreachable"
359
+ state: lapsed ? "lapsed" : revoked ? "revoked" : "unreachable"
338
360
  });
339
- inspected.findings.push(note$1(`Remote Mac ${machine} ${revoked ? "no longer accepts this Mac for device hosting" : "did not confirm hosting access"}`, "The saved token and pinned node are preserved.", revoked ? "Run `stim doctor --fix` to ask again." : `Check stim-server and its tailnet serve route on ${machine}, then run doctor again.`));
361
+ inspected.findings.push(note$1(lapsed ? `Hosting request to ${machine} lapsed` : `Remote Mac ${machine} ${revoked ? "no longer accepts this Mac for device hosting" : "did not confirm hosting access"}`, lapsed ? `${lapsedLine(machine, credential)} The saved token and pinned node are preserved.` : "The saved token and pinned node are preserved.", revoked ? "Run `stim doctor --fix` to ask again." : `Check stim-server and its tailnet serve route on ${machine}, then run doctor again.`));
340
362
  continue;
341
363
  }
342
364
  }
@@ -471,6 +493,7 @@ async function requestAccess(entry, peer, port, deviceName, io) {
471
493
  deviceToken: reply.result.deviceToken,
472
494
  state: "pending",
473
495
  requestedAt: (/* @__PURE__ */ new Date()).toISOString(),
496
+ expiresAt: reply.result.approval.expiresAt,
474
497
  ...ticket ? { ticketHash: ticket.ticketHash } : {}
475
498
  };
476
499
  updateCredentials((credentials) => [...credentials.filter((each) => each.machine !== entry), credential]);
@@ -480,7 +503,8 @@ async function requestAccess(entry, peer, port, deviceName, io) {
480
503
  state: "pending",
481
504
  dnsName: peer.dnsName,
482
505
  deviceId: credential.deviceId,
483
- requestedAt: credential.requestedAt
506
+ requestedAt: credential.requestedAt,
507
+ expiresAt: credential.expiresAt
484
508
  },
485
509
  finding: note(`Asked ${entry} for build access`, `The request lapses at ${reply.result.approval.expiresAt}.`, approval(entry, credential.deviceId))
486
510
  };
@@ -538,10 +562,7 @@ async function inspectMachine(entry, status, deviceName, fix, io, check) {
538
562
  if ("result" in reply && reply.result.capabilities.includes("build")) {
539
563
  const permissions = readHostPermissions(reply.result.host);
540
564
  const host = permissions ? { host: permissions } : {};
541
- if (credential.state !== "approved") updateCredentials((credentials) => credentials.map((each) => each.machine === entry ? {
542
- ...each,
543
- state: "approved"
544
- } : each));
565
+ if (credential.state !== "approved") updateCredentials((credentials) => credentials.map((each) => each.machine === entry ? markApproved(each) : each));
545
566
  if (!check) return {
546
567
  report: {
547
568
  ...paired,
@@ -574,19 +595,26 @@ async function inspectMachine(entry, status, deviceName, fix, io, check) {
574
595
  return {
575
596
  report: {
576
597
  ...paired,
577
- state: "pending"
598
+ ...pendingReport(credential)
578
599
  },
579
- finding: note(`Remote Mac ${entry} has not approved this Mac for builds yet`, `Requested at ${credential.requestedAt}.`, approval(entry, credential.deviceId))
600
+ finding: note(`Remote Mac ${entry} has not approved this Mac for builds yet`, requestedLine(credential), approval(entry, credential.deviceId))
580
601
  };
581
602
  }
582
603
  if ("error" in reply && reply.error.code === "unauthorized") {
583
604
  if (fix) return requestAccess(entry, peer, parsed.port, deviceName, io);
605
+ if (isLapsed(credential)) return {
606
+ report: {
607
+ ...paired,
608
+ state: "lapsed"
609
+ },
610
+ finding: note(`Build request to ${entry} lapsed`, lapsedLine(entry, credential), "Run `stim doctor --fix` to ask again.")
611
+ };
584
612
  return {
585
613
  report: {
586
614
  ...paired,
587
615
  state: "revoked"
588
616
  },
589
- finding: note(`Remote Mac ${entry} no longer accepts this Mac for builds`, `${reply.error.message} It was revoked, or the request lapsed before approval.`, "Run `stim doctor --fix` to ask again.")
617
+ finding: note(`Remote Mac ${entry} no longer accepts this Mac for builds`, `${reply.error.message} It was revoked or denied.`, "Run `stim doctor --fix` to ask again.")
590
618
  };
591
619
  }
592
620
  const reason = "failed" in reply ? reply.failed : "error" in reply ? reply.error.message : "unexpected reply";
@@ -1,7 +1,7 @@
1
1
  import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
2
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
3
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-CdrxgUeA.mjs";
4
+ import { S as bundlerPin, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-DNyR3NPq.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";
@@ -13,7 +13,7 @@ import { n as parseLogcatLine, r as parsePidof, t as androidClockOffset } from "
13
13
  import { i as countLiveOwnedDevices } from "./device-capacity-ZC4XSZ4R.mjs";
14
14
  import { C as reverseMetroPorts, _ as installIosApp, b as launchAndroidReleaseApp, h as installAndroidApp, s as androidAppProcess, v as iosAppProcess, w as writeDebugHttpHost, x as launchIosApp, y as launchAndroidApp } from "./app-install-VPkI5WEg.mjs";
15
15
  import { h as findAapt } from "./support-WvD__tSV.mjs";
16
- import { n as stopMacosAppHeld } from "./stop-D03prQnW.mjs";
16
+ import { n as stopMacosAppHeld } from "./stop-BIiM49EY.mjs";
17
17
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
18
18
  import { createHash, randomUUID } from "node:crypto";
19
19
  import { chmodSync, closeSync, copyFileSync, createReadStream, existsSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statfsSync, symlinkSync, writeFileSync } from "node:fs";
@@ -4,17 +4,17 @@ import { d as quotedPath, f as refuseNoProject, l as phaseLine, u as plural } fr
4
4
  import { B as settingsLayers, Ct as filesystemDevice, Et as temporaryRoot, H as unknownSettingKeys, I as settingOrigin, M as remoteIosSetting, O as projectOptimizations, P as resolveSettings, R as settingShapeErrors, U as webSettings, Y as compilerCacheFallbackMessage, Z as resolveOptimizations, dt as listWorktrees, ft as locallyKnownUpstream, gt as repoRoot, i as SETTING_SHAPE_REMEDY, it as gitCommonDir, j as remoteAndroidSetting, n as PATH_SETTINGS, nt as dirtyFingerprintFiles, r as SETTINGS_WITH_RESOLVE_TIME_FALLBACK, v as iosSimSlimProfileSetting, vt as resolveSourceCheckout, wt as makeTemporaryDirectory, y as mergeSettingsLayers } from "./settings-Cfd-0r2d.mjs";
5
5
  import { l as isPackageResolvable, n as appProjectProblem, r as detectIsExpo, s as findProjectRoot$1 } from "./project-D47Rh0ly.mjs";
6
6
  import { _ as workspaceDerivedData, d as sharedBuildCache } from "./workspace-state-DqcCbpE7.mjs";
7
- import { V as inspectWatchmanMemory, i as inspectBudget, n as budgetLine } from "./budget-CUDz870h.mjs";
7
+ import { V as inspectWatchmanMemory, i as inspectBudget, n as budgetLine } from "./budget-DfcgFdQB.mjs";
8
8
  import { C as diffFingerprintSources, D as fingerprintProject, h as listBuildLocks } from "./device-lease-DpoS36_u.mjs";
9
9
  import { n as listBuildSlots } from "./build-slots-41v_d2x9.mjs";
10
10
  import { D as hostSystemImageArch, ft as parkedMaxSetting, o as androidHome, ot as POOL_SETTING_REMEDY } from "./android-B_YNZy61.mjs";
11
11
  import { A as hostMemoryPressureAdvice, c as iosRuntimeMatches, j as readHostMemoryPressure, p as listIosRuntimes, y as pickDefaultIosCreation } from "./ios-DSfnPfse.mjs";
12
- import { C as podInstallCommand, D as projectCmakeLauncher, S as bundlerPin, f as ccacheEnabled, i as macosToolchain, m as detectXcodeMajor, n as androidToolchain, r as iosToolchain, t as androidRequirements } from "./toolchain-CdrxgUeA.mjs";
13
- import { S as realIo, g as inspectBuildMachines, o as offloadCheck, u as simulatorRuntime, y as inspectDeviceHostMachines } from "./client-CxNotugx.mjs";
12
+ import { C as podInstallCommand, D as projectCmakeLauncher, S as bundlerPin, f as ccacheEnabled, i as macosToolchain, m as detectXcodeMajor, n as androidToolchain, r as iosToolchain, t as androidRequirements } from "./toolchain-DNyR3NPq.mjs";
13
+ import { S as realIo, g as inspectBuildMachines, o as offloadCheck, u as simulatorRuntime, y as inspectDeviceHostMachines } from "./client-SvBdgObD.mjs";
14
14
  import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-BrcVWQyD.mjs";
15
15
  import { i as countLiveOwnedDevices } from "./device-capacity-ZC4XSZ4R.mjs";
16
- import { d as androidPathRoomRemedy, l as androidPathRoom, n as apkOutputsDir, t as androidSdkRefusal, u as androidPathRoomMessage } from "./gradle-bsBRy6i9.mjs";
17
- import { g as resolveRuntime, m as resolveDeviceType } from "./support-BE-tbOP9.mjs";
16
+ import { d as androidPathRoomRemedy, l as androidPathRoom, n as apkOutputsDir, t as androidSdkRefusal, u as androidPathRoomMessage } from "./gradle-dJpre3Yn.mjs";
17
+ import { g as resolveRuntime, m as resolveDeviceType } from "./support-CsJNVfOc.mjs";
18
18
  import { f as resolveEasCliBin, i as checkEasAuth$1, l as ownerFromConfig, u as providerFromConfig } from "./remote-cache-Ci4DQYYj.mjs";
19
19
  import { _ as easCliSupport, g as MIN_EAS_CLI_SIMULATOR_VERSION, s as readInstalledEasCliVersion, v as easCliUpgradeRemedy } from "./device-remote-hFSkpfQu.mjs";
20
20
  import { n as inspectStimVersions, t as compareStimVersions } from "./stim-installations-QMEI32v1.mjs";
@@ -6,7 +6,7 @@ import { h as shortUdid, o as formatLongDuration, u as plural } from "./command-
6
6
  import { _t as resolveFullRef, bt as sourceCheckoutOf, ct as hasUncommittedWork, dt as listWorktrees, ot as hasPopulatedSubmodules, rt as dirtyPaths, xt as unpushedCommits } from "./settings-Cfd-0r2d.mjs";
7
7
  import { r as detectIsExpo, s as findProjectRoot$1 } from "./project-D47Rh0ly.mjs";
8
8
  import { C as workspaceStateFile, s as workspaceLastUsed, v as workspaceDir, w as withDirLock$1, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
9
- import { $ as sizeCaches, A as includesWorkspaceOutputs, B as collectMemoryReport, C as findStaleProjectDevices, D as includesArchives, E as emptyCaches, F as selectsBeyondCaches, G as memorySweepIsScoped, H as memoryCacheKind, I as trimCaches, J as scopedMemoryReport, K as memoryWorkPending, L as parseArchiveSelector, M as planCacheEmptying, N as previewScopedEmptying, O as includesParkedDevices, P as selectCaches, Q as discoverCaches, S as findStaleDeviceRecords, T as withAndroidAvdSizes, U as memoryLines, W as memoryScope, Y as phase, _ as describeParkedSims, a as machineNumber, b as eraseParkedDevices, d as collectDeviceLeases, f as collectParkedAvds, g as deleteProjectDevices, h as deleteParkedSims, j as isWorkspacesScope, k as includesRecordings, m as deleteParkedAvds, p as collectParkedSims, q as reclaimMemory, u as DEVICE_LIST_TIMEOUT_MS, v as describeUnverifiableDevices, w as unverifiedDeviceCommand, x as findOrphanedDevices, y as deviceSweepIsScoped } from "./budget-CUDz870h.mjs";
9
+ import { $ as sizeCaches, A as includesWorkspaceOutputs, B as collectMemoryReport, C as findStaleProjectDevices, D as includesArchives, E as emptyCaches, F as selectsBeyondCaches, G as memorySweepIsScoped, H as memoryCacheKind, I as trimCaches, J as scopedMemoryReport, K as memoryWorkPending, L as parseArchiveSelector, M as planCacheEmptying, N as previewScopedEmptying, O as includesParkedDevices, P as selectCaches, Q as discoverCaches, S as findStaleDeviceRecords, T as withAndroidAvdSizes, U as memoryLines, W as memoryScope, Y as phase, _ as describeParkedSims, a as machineNumber, b as eraseParkedDevices, d as collectDeviceLeases, f as collectParkedAvds, g as deleteProjectDevices, h as deleteParkedSims, j as isWorkspacesScope, k as includesRecordings, m as deleteParkedAvds, p as collectParkedSims, q as reclaimMemory, u as DEVICE_LIST_TIMEOUT_MS, v as describeUnverifiableDevices, w as unverifiedDeviceCommand, x as findOrphanedDevices, y as deviceSweepIsScoped } from "./budget-DfcgFdQB.mjs";
10
10
  import { a as takeGcResults, i as recordGcResult, n as withIdleWorkspace, o as canonicalPath, r as workspaceInUse } from "./in-use-CvGOUn-x.mjs";
11
11
  import { d as removeExpiredLease, h as listBuildLocks, i as listLeaseFiles, r as leaseIsExpired } from "./device-lease-DpoS36_u.mjs";
12
12
  import { n as listBuildSlots } from "./build-slots-41v_d2x9.mjs";
@@ -15,12 +15,12 @@ import { A as listAvds, H as parseAvdSystemImage, I as ownedAvdDirectory, M as l
15
15
  import { u as listAllIosSims } from "./ios-DSfnPfse.mjs";
16
16
  import { a as parseIdleDuration, o as shutDownIdleDevices, r as idleDeviceLines, t as collectIdleDevices } from "./idle-BXG__1BA.mjs";
17
17
  import { a as collectWorkspaceOutputs, c as listWorkspaceDirs, i as collectOrphanedWorkspaces, l as rootPresence, n as WORKSPACE_OUTPUT_DIRS, o as deleteOrphanedWorkspaces, r as clearWorkspaceOutputs, s as isInsideWorkspaces, t as REBUILD_COST, u as sizeText } from "./workspaces-Bcib97-6.mjs";
18
- import { n as previewMaintenance } from "./preview-C_JjkEy4.mjs";
18
+ import { n as previewMaintenance } from "./preview-B-g9d7kV.mjs";
19
19
  import { r as readCollectors } from "./ownership-DyRQru0q.mjs";
20
20
  import { f as resolveEasCliBin } from "./remote-cache-Ci4DQYYj.mjs";
21
21
  import { C as listOwnedSessionsArgs, D as verifyStoppedSession, E as stopSessionArgs, S as isDefinitiveMissingSessionError, T as parseSessionListPage, b as getSessionArgs, d as withRemoteSessionLock, f as withEasProjectLock, h as removeEasSessionClaim, m as readEasSessionLedger$1, p as easMachineStateRoot$1, x as inspectSessionForTeardown, y as findOrphanedOwnedSessions } from "./device-remote-hFSkpfQu.mjs";
22
22
  import { o as fetchDefaultBranch, s as mergeState } from "./warm-progress-DF4JRvYI.mjs";
23
- import { _ as deleteSelectedArchives, f as removeWorktreeTarget, g as reclaimProject, h as describeDereferenced, i as matchWorktreeEntry, n as excludePodChurn, o as reclaimKeys, r as excludeWatchmanCookies, v as sweepArchiveStaging } from "./worktree-AK_m-d_m.mjs";
23
+ import { _ as deleteSelectedArchives, f as removeWorktreeTarget, g as reclaimProject, h as describeDereferenced, i as matchWorktreeEntry, n as excludePodChurn, o as reclaimKeys, r as excludeWatchmanCookies, v as sweepArchiveStaging } from "./worktree-Be_7NLKy.mjs";
24
24
  import { i as getSwiftpmCacheUsage, n as swiftpmCacheLines, r as getAgentDeviceUsage, t as agentDeviceLines } from "./agent-device-usage-output-BK41vnzN.mjs";
25
25
  import { existsSync, lstatSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
26
26
  import { basename, dirname, join } from "node:path";
@@ -3,7 +3,7 @@ import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./proc
3
3
  import { l as phaseLine } from "./command-output-CDAIFD-8.mjs";
4
4
  import { a as spawnDeclared } from "./spawn-claims-D0XfSe8u.mjs";
5
5
  import { o as androidHome } from "./android-B_YNZy61.mjs";
6
- import { O as readCcacheActivity, T as CCACHE_UNAVAILABLE, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-CdrxgUeA.mjs";
6
+ import { O as readCcacheActivity, T as CCACHE_UNAVAILABLE, u as HEARTBEAT_INTERVAL_MS, y as startBuildHeartbeat } from "./toolchain-DNyR3NPq.mjs";
7
7
  import { createHash } from "node:crypto";
8
8
  import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
9
9
  import { dirname, isAbsolute, join, relative, sep } from "node:path";
@@ -910,9 +910,9 @@ leased until <time>" for each one.`,
910
910
  null when off; plan lists what the next start, ios or
911
911
  android would reclaim, in the \`reclaimed\` shape without
912
912
  freedMb, and is empty while under budget
913
- deviceHosts one { machine, state, dnsName?, deviceId?, requestedAt?, host? }
914
- per remote.machines entry. state is "approved", "pending",
915
- "not-asked", "revoked", "node-changed", "not-on-tailnet",
913
+ deviceHosts one { machine, state, dnsName?, deviceId?, requestedAt?, expiresAt?,
914
+ host? } per remote.machines entry. state is "approved",
915
+ "pending", "not-asked", "revoked", "lapsed", "node-changed", "not-on-tailnet",
916
916
  "tailscale-off", "unreachable", "invalid",
917
917
  "credentials-unavailable" or "busy". Tokens stay private.
918
918
  Only --fix asks for access or forgets removed names.
@@ -920,13 +920,17 @@ leased until <time>" for each one.`,
920
920
  build approval; see \`guide settings\`.
921
921
  host is { name, screenRecording, accessibility }, present
922
922
  only for approved machines whose worker reports it.
923
+ expiresAt is when a pending request lapses; "lapsed" is
924
+ a pending request whose expiry passed. --fix asks again.
923
925
  remoteMachines one { machine, state, dnsName?, deviceId?, requestedAt?,
924
- offloadable?, reasons?, problems?, capacity?, host? } per
926
+ expiresAt?, offloadable?, reasons?, problems?, capacity?, host? } per
925
927
  remote.machines entry, for its build approval; state is "approved", "pending", "not-asked",
926
- "revoked" (revoked, or the request lapsed), "node-changed",
928
+ "revoked" (revoked or denied), "lapsed" (the request lapsed
929
+ before approval), "node-changed",
927
930
  "not-on-tailnet", "tailscale-off", "unreachable" or
928
931
  "invalid". host has the same shape and presence rule as in
929
- deviceHosts. An approved machine also carries offloadable,
932
+ deviceHosts, as do expiresAt (a pending request's lapse
933
+ time) and "lapsed" (--fix asks again). An approved machine also carries offloadable,
930
934
  true when it would take this app's builds now (iOS
931
935
  simulator unless --platform android, Android emulator when
932
936
  --platform android or the app has android/ or uses Expo,
@@ -1374,8 +1378,8 @@ RULES
1374
1378
  "ready" its last warm succeeded and nothing has run there
1375
1379
  since: no start, ios, android, web or reload, for
1376
1380
  at most 2 hours
1377
- "live" live is true: Metro, a device, Chrome or a remote
1378
- session of it runs
1381
+ "live" the workspace is active (live is true): Metro, a
1382
+ device, Chrome or a remote session of it runs
1379
1383
  "idle" none of these
1380
1384
  phaseSince when the warm started ("warming") or finished ("ready"); null
1381
1385
  for "live" and "idle"
@@ -1403,8 +1407,8 @@ RULES
1403
1407
  The first kind that applies wins:
1404
1408
 
1405
1409
  kind "building" a build runs; platform names it
1406
- "warming" phase is "warming" and nothing is live
1407
- "ready" phase is "ready" and nothing is live
1410
+ "warming" phase is "warming" and nothing is active
1411
+ "ready" phase is "ready" and nothing is active
1408
1412
  "build-failed" the newest run of either platform failed;
1409
1413
  platform names it
1410
1414
  "running" live is true or a remote session runs
@@ -1884,7 +1888,7 @@ RULES
1884
1888
  under CoreSimulator/Devices, or the AVD's .avd folder
1885
1889
 
1886
1890
  \`status --watch\` runs one du at a time off its refresh path, and measures
1887
- a folder at most every 5 minutes while its environment is live and every
1891
+ a folder at most every 5 minutes while its environment is active and every
1888
1892
  hour otherwise. It caches each size under $STIM_HOME/disk-usage, which
1889
1893
  one-shot status only reads, so the fields appear once a watcher, such as
1890
1894
  stim-server or Stim Desktop, has measured.
@@ -2004,7 +2008,7 @@ RULES
2004
2008
  started it until that build exits, then as shared. Processes with no owner
2005
2009
  are left out. machine comes from one host ps, the one status reads for
2006
2010
  device activity, and one run of the footprint helper. It is null when no
2007
- simulator is booted, no workspace is live and no build runs: status then
2011
+ simulator is booted, no workspace is active and no build runs: status then
2008
2012
  runs neither. \`status --watch --json\` rereads both every 15 seconds while
2009
2013
  machine is not null, with no other subprocess.`
2010
2014
  },
@@ -4775,7 +4779,7 @@ STOP DURING A BUILD
4775
4779
 
4776
4780
  CAPACITY
4777
4781
  A booted iOS sim is roughly 1-2 GB of RAM, an Android emulator 2-3 GB. On a
4778
- 16 GB machine plan for 2-3 live environments. Nothing enforces this;
4782
+ 16 GB machine plan for 2-3 active environments. Nothing enforces this;
4779
4783
  \`stim status\` is how you check -- it reports every workspace on the
4780
4784
  machine, not just this one.
4781
4785
 
@@ -6204,7 +6208,7 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
6204
6208
  and the command to remove that exact claim.
6205
6209
  See \`guide errors STIM_AT_CAPACITY\`.
6206
6210
 
6207
- \`stim doctor\` prints one note echoing the caps and the current live count,
6211
+ \`stim doctor\` prints one note echoing the caps and the current active count,
6208
6212
  but ONLY when a cap is set. \`stim gc\` reports stale build slots the way it
6209
6213
  reports stale build locks, and \`gc --delete\` clears them. Set the caps
6210
6214
  with \`stim settings set concurrency.maxBuilds 2\`, by editing
@@ -6220,7 +6224,7 @@ OPT-IN CONCURRENCY LIMITS (UNLIMITED BY DEFAULT)
6220
6224
  $STIM_HOME. Default 20. Below it, Stim reclaims.
6221
6225
  budget.hardFloorDiskGb default 5. Still below it after reclaiming,
6222
6226
  the run refuses with STIM_LOW_DISK.
6223
- budget.maxCommittedMemoryGb the rough memory of live environments, the
6227
+ budget.maxCommittedMemoryGb the rough memory of active environments, the
6224
6228
  figure \`stim status\` prints (a booted
6225
6229
  simulator 1.5 GB, an emulator 2.5 GB, a dev
6226
6230
  server 0.7 GB). Default 60% of physical memory.
@@ -8422,9 +8426,9 @@ unless every chosen capability already has a matching approval. Desktop reuse
8422
8426
  requires an existing tailnet route. Ctrl-C or SIGTERM completes the journal,
8423
8427
  releases the setup claim and exits 1; a typed N also exits 1. Hosting grants
8424
8428
  include no read, control or build capability.
8425
- On a remote Mac that hosts, Stim Desktop > Settings > Phones > Hosted here lists the
8426
- simulators, emulators and apps approved Macs run there, below Device hosting
8427
- approvals. Stop asks for confirmation, ends the session and deletes or parks
8429
+ On a remote Mac that hosts, Stim Desktop > Settings > Remote Macs > Running here lists the
8430
+ simulators, emulators and apps approved Macs run there, below Macs using this
8431
+ Mac. Stop asks for confirmation, ends the session and deletes or parks
8428
8432
  its device on that Mac. Parked sessions remain listed without Stop. The list
8429
8433
  refreshes every five seconds and stays hidden when the local server does not
8430
8434
  support it.
@@ -8621,7 +8625,8 @@ login-shell environment would otherwise replace.
8621
8625
  \`stim-server service update --release <version>\` there moves the service to
8622
8626
  that exact stim-server release from the public npm registry once npm verifies
8623
8627
  its integrity and registry signatures; \`--from <dir>\` installs the packed
8624
- packages of a checkout instead. It waits for offloaded builds and hosted
8628
+ packages of a checkout instead, with the same signature check on each npm
8629
+ dependency but none for Stim's own packages. It waits for offloaded builds and hosted
8625
8630
  sessions to finish, restarts the job, and switches back when the new server
8626
8631
  exits or does not answer within 90 seconds; \`stim-server service rollback\` returns
8627
8632
  to the previous server. A client Mac approved for builds or device hosting
@@ -1,6 +1,6 @@
1
- import { a as call, o as connectHost } from "./hosted-client-CdSoH-G6.mjs";
2
- import { i as requestHostedMetro } from "./metro-gateway-CHqK0p-a.mjs";
3
- import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-CZLOrMrN.mjs";
1
+ import { a as call, o as connectHost } from "./hosted-client-Bp4knSwu.mjs";
2
+ import { i as requestHostedMetro } from "./metro-gateway-C-ijGI2F.mjs";
3
+ import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-1Ebbig4w.mjs";
4
4
  //#region src/device-host/hosted-android.ts
5
5
  async function prepareHostedAndroid(machine, selectors, recorded) {
6
6
  return await prepareHostedNative(machine, selectors, recorded, "android");
@@ -1,4 +1,4 @@
1
- import { _ as configuredMachines, t as BuildConnection, x as pinnedEndpoint$1 } from "./client-CxNotugx.mjs";
1
+ import { _ as configuredMachines, t as BuildConnection, x as pinnedEndpoint$1 } from "./client-SvBdgObD.mjs";
2
2
  import { createHash } from "node:crypto";
3
3
  import { lstatSync, readFileSync, readdirSync, readlinkSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-CZLOrMrN.mjs";
1
+ import { n as prepareHostedNative, r as stopHostedNative, t as placeHostedNative } from "./hosted-native-1Ebbig4w.mjs";
2
2
  //#region src/device-host/hosted-ios.ts
3
3
  async function prepareHostedIos(machine, selectors, recorded) {
4
4
  return await prepareHostedNative(machine, selectors, recorded, "ios");
@@ -4,8 +4,8 @@ import { l as phaseLine } from "./command-output-CDAIFD-8.mjs";
4
4
  import { v as workspaceDir, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
5
5
  import { t as macosDir } from "./state-DyaNTgfR.mjs";
6
6
  import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
7
- import { b as parseMachine$1 } from "./client-CxNotugx.mjs";
8
- import { a as call } from "./hosted-client-CdSoH-G6.mjs";
7
+ import { b as parseMachine$1 } from "./client-SvBdgObD.mjs";
8
+ import { a as call } from "./hosted-client-Bp4knSwu.mjs";
9
9
  import { mkdirSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
10
10
  import { dirname, join } from "node:path";
11
11
  import { LOG_ROTATE_BYTES, withDirLock } from "@stim-cli/core";
@@ -1,7 +1,7 @@
1
1
  import { l as phaseLine } from "./command-output-CDAIFD-8.mjs";
2
2
  import { t as macosDir } from "./state-DyaNTgfR.mjs";
3
- import { a as call, c as hostedSession, d as sha256, f as sleep, i as bundleManifest, m as upload, n as SESSION_TIMEOUT_MS, o as connectHost, p as unknownSession, r as attach, s as heldNoLonger, t as INSTALL_TIMEOUT_MS, u as settle } from "./hosted-client-CdSoH-G6.mjs";
4
- import { i as agentAccess, r as closeAgentConnection, t as pullHostedMacosLogs } from "./hosted-logs-SxfBvSvc.mjs";
3
+ import { a as call, c as hostedSession, d as sha256, f as sleep, i as bundleManifest, m as upload, n as SESSION_TIMEOUT_MS, o as connectHost, p as unknownSession, r as attach, s as heldNoLonger, t as INSTALL_TIMEOUT_MS, u as settle } from "./hosted-client-Bp4knSwu.mjs";
4
+ import { i as agentAccess, r as closeAgentConnection, t as pullHostedMacosLogs } from "./hosted-logs-OcgIBvCT.mjs";
5
5
  import { randomUUID } from "node:crypto";
6
6
  import { rmSync } from "node:fs";
7
7
  import { join } from "node:path";
@@ -1,7 +1,7 @@
1
1
  import { r as readWorkspaceState$1, v as workspaceDir } from "./workspace-state-DqcCbpE7.mjs";
2
- import { a as call, c as hostedSession, d as sha256, f as sleep, i as bundleManifest, m as upload, n as SESSION_TIMEOUT_MS, o as connectHost, p as unknownSession, r as attach, s as heldNoLonger, t as INSTALL_TIMEOUT_MS, u as settle } from "./hosted-client-CdSoH-G6.mjs";
3
- import { a as requireHostedMetro, i as requestHostedMetro, n as closeHostedMetro } from "./metro-gateway-CHqK0p-a.mjs";
4
- import { i as agentAccess, n as pullHostedNativeLogs, r as closeAgentConnection } from "./hosted-logs-SxfBvSvc.mjs";
2
+ import { a as call, c as hostedSession, d as sha256, f as sleep, i as bundleManifest, m as upload, n as SESSION_TIMEOUT_MS, o as connectHost, p as unknownSession, r as attach, s as heldNoLonger, t as INSTALL_TIMEOUT_MS, u as settle } from "./hosted-client-Bp4knSwu.mjs";
3
+ import { a as requireHostedMetro, i as requestHostedMetro, n as closeHostedMetro } from "./metro-gateway-C-ijGI2F.mjs";
4
+ import { i as agentAccess, n as pullHostedNativeLogs, r as closeAgentConnection } from "./hosted-logs-OcgIBvCT.mjs";
5
5
  import { s as writeHostedNative } from "./ios-state-8L3lgum6.mjs";
6
6
  import { randomUUID } from "node:crypto";
7
7
  import { readFileSync, rmSync } from "node:fs";
@@ -6,7 +6,7 @@ import { B as settingsLayers, C as metroWarmupUrlSetting, G as detectProviders,
6
6
  import { n as appProjectProblem, r as detectIsExpo, s as findProjectRoot$1, t as NO_PROJECT_REFUSAL } from "./project-D47Rh0ly.mjs";
7
7
  import { l as resolveProjectMetro, o as pidExists, u as signalProcessTree } from "./metro-g8NqiJp-.mjs";
8
8
  import { c as writeWorkspaceState, g as workspaceAgentDeviceDir, i as recordWorkspaceUse, r as readWorkspaceState$1, v as workspaceDir, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
9
- import { t as budgetGate } from "./budget-CUDz870h.mjs";
9
+ import { t as budgetGate } from "./budget-DfcgFdQB.mjs";
10
10
  import { A as providerDownloadPath, D as fingerprintProject, E as fingerprintDiffRecord, L as untrackedMissLine, M as refingerprintAfterMutation, N as resolveBuild, O as inputsChangedDuringBuild, P as storeBuild, R as untrackedNativeFiles, S as configInputsChanged, T as filesystemBuildCapability, _ as waitForBuild, b as buildCacheKey, g as releaseBuildLock, j as providerUploadOutcome, k as prepareProviderDownloadDir, m as acquireBuildLock, v as waitForSharedBuild, x as changedDuringBuildLine } from "./device-lease-DpoS36_u.mjs";
11
11
  import { r as releaseBuildSlot, t as acquireBuildSlot } from "./build-slots-41v_d2x9.mjs";
12
12
  import { m as writeWorkspaceLaunch, n as MODE_EXPO, t as MODE_BARE } from "./state-BKa8wNN5.mjs";
@@ -15,33 +15,33 @@ import { p as listIosRuntimes, r as clearIosAppData, u as listAllIosSims } from
15
15
  import { a as workspaceLinks, i as workspaceLinkLine } from "./stim-desktop-Cnz8CPnl.mjs";
16
16
  import { _ as statsProjectKey$1, c as recordFinishedBuild, d as createRunRecorder, f as readRunEstimates, g as recordRunStats, l as startBuildProgress, m as recordCapacityRefusal, n as NO_BUILD_PROGRESS, u as tapBuildLog } from "./build-progress-D0WkjCPd.mjs";
17
17
  import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
18
- import { S as bundlerPin, _ as readBundleId, c as COMPILATION_CACHE_NOT_RUN, d as buildIos, g as readBundleExecutable, h as discoverXcodeProject, p as compilationCacheActivityLine, r as iosToolchain, v as resolveScheme } from "./toolchain-CdrxgUeA.mjs";
19
- import { a as offloadBuild, c as placementLoad, d as OffloadRefusal, f as namedBuildMachine, h as resolveBuildPlacement, i as closeOffload, l as remotePhaseText, n as buildPlacementCandidates, p as parseBuildMachineOption, r as chooseBuildMachine, s as offloadPlacement, u as simulatorRuntime } from "./client-CxNotugx.mjs";
20
- import { r as hostedMetroSettings } from "./metro-gateway-CHqK0p-a.mjs";
18
+ import { S as bundlerPin, _ as readBundleId, c as COMPILATION_CACHE_NOT_RUN, d as buildIos, g as readBundleExecutable, h as discoverXcodeProject, p as compilationCacheActivityLine, r as iosToolchain, v as resolveScheme } from "./toolchain-DNyR3NPq.mjs";
19
+ import { a as offloadBuild, c as placementLoad, d as OffloadRefusal, f as namedBuildMachine, h as resolveBuildPlacement, i as closeOffload, l as remotePhaseText, n as buildPlacementCandidates, p as parseBuildMachineOption, r as chooseBuildMachine, s as offloadPlacement, u as simulatorRuntime } from "./client-SvBdgObD.mjs";
20
+ import { r as hostedMetroSettings } from "./metro-gateway-C-ijGI2F.mjs";
21
21
  import { n as verifyCollectorOwnership } from "./ownership-DyRQru0q.mjs";
22
22
  import { r as checkDeviceCapacity } from "./device-capacity-ZC4XSZ4R.mjs";
23
23
  import { D as schemesFromInfoPlist, S as restartedAppNote, T as pickDevClientScheme, _ as installIosApp, a as IOS_DEV_MENU_OFF_DEFAULTS_PLIST, d as devClientUrl, l as clearOtherUserApps, r as DEFAULT_METRO_PORT, v as iosAppProcess, x as launchIosApp } from "./app-install-VPkI5WEg.mjs";
24
24
  import { n as devClientTakesDevMenuParams, t as devClientScheme } from "./dev-client-B-XC4uRH.mjs";
25
25
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
26
- import { a as runPodInstall, n as podsAreStale, r as readPodState } from "./deps-CVxlsRFn.mjs";
26
+ import { a as runPodInstall, n as podsAreStale, r as readPodState } from "./deps-iKw0eD4P.mjs";
27
27
  import { i as staleNativeDirRefusal, n as recordPrebuild, r as runPrebuild, t as planPrebuild } from "./prebuild-D7RUMkwN.mjs";
28
28
  import { c as readMetroRecords, f as verifyLaunch, i as RELEASE_VERIFY_WAIT_MS, l as unattributedLaunchLines, n as LAUNCH_FATAL, o as isBundleProof, p as verifyReleaseLaunch, r as LAUNCH_UNVERIFIED, s as readCollectorRecords, t as LAUNCH_BUNDLING, u as unverifiedLaunchLines } from "./launch-verify-lTnWZikR.mjs";
29
29
  import { a as acquireRunLease, c as lostRefusal, d as runLease, f as waitFlagConflict, o as leaseExpiryText, s as lostLine, t as DEBUG_VERIFY_STEP_MS, u as releaseLeaseOnSignal } from "./device-lease-run-B8YltIH_.mjs";
30
30
  import { n as clearIosAdoptionPending } from "./device-ios-C2Um-XUR.mjs";
31
- import { _ as resolveSimulatorAppFlag, a as deviceModelRefusal, c as iosProviderRunOptions, d as podAction, f as printDiagnostics, g as resolveRuntime, h as resolveIosWait, i as deviceLabel, l as isReleaseConfiguration, m as resolveDeviceType, n as buildLogFile, o as deviceShortName, p as resolveConfiguration, r as createIosDeviceWaitRun, s as iosConfigurationSetting, t as appNameFromPath, u as ownedSimFailure, v as simulatorBuildArch, y as xcodeFailureReport } from "./support-BE-tbOP9.mjs";
31
+ import { _ as resolveSimulatorAppFlag, a as deviceModelRefusal, c as iosProviderRunOptions, d as podAction, f as printDiagnostics, g as resolveRuntime, h as resolveIosWait, i as deviceLabel, l as isReleaseConfiguration, m as resolveDeviceType, n as buildLogFile, o as deviceShortName, p as resolveConfiguration, r as createIosDeviceWaitRun, s as iosConfigurationSetting, t as appNameFromPath, u as ownedSimFailure, v as simulatorBuildArch, y as xcodeFailureReport } from "./support-CsJNVfOc.mjs";
32
32
  import { i as writeDevicePlacement, n as readHostedIos, o as writeHostedIos } from "./ios-state-8L3lgum6.mjs";
33
- import { a as refusePlan, b as devicePlacementLine, c as skippedMissReason, f as swapJsBundle, h as ensureOwnedDevice, i as printPlan, m as ensureBooted, n as planFlagRefusal, o as explainBuildMiss, p as didSetUpDevice, r as planPayload, s as fingerprintErrorMissReason, t as planCachedBuild, v as warmMetro, y as automaticDevicePlacement } from "./build-plan-BJSXzsCL.mjs";
33
+ import { a as refusePlan, b as devicePlacementLine, c as skippedMissReason, f as swapJsBundle, h as ensureOwnedDevice, i as printPlan, m as ensureBooted, n as planFlagRefusal, o as explainBuildMiss, p as didSetUpDevice, r as planPayload, s as fingerprintErrorMissReason, t as planCachedBuild, v as warmMetro, y as automaticDevicePlacement } from "./build-plan-BDsSi09V.mjs";
34
34
  import { n as nativeRunCommand, r as siblingPlatformSlots, t as launchSlotScope } from "./slot-launch-DmjBmpQV.mjs";
35
35
  import { a as easAuthNote, c as loadProjectProvider, f as resolveEasCliBin, i as checkEasAuth, m as uploadRemote, n as UPLOAD_TIMEOUT_MS, o as exitAfterFlush, p as resolveRemote, r as cacheLevel, s as isEasAuthFailureText, t as RESOLVE_TIMEOUT_MS } from "./remote-cache-Ci4DQYYj.mjs";
36
36
  import { O as readRemoteSimulatorArch, a as ensureMetroReachable, k as gateMetroOrigin, l as remoteIosDeps, n as binOnPath, o as ensureRemoteBootOwned, r as bundleEntryPoint, u as resolveRemoteContext, w as ownedSessionName } from "./device-remote-hFSkpfQu.mjs";
37
37
  import { d as runCancellationSignal, f as withNativeBuildRun, r as cancelledFailure, u as runCancellation } from "./native-run-D1Q56rAD.mjs";
38
38
  import { a as isEasBuildFailure, i as easDeviceBuildRemedy, o as planEasDevelopmentBuild, s as resolveEasDevelopmentBuild } from "./simslim-BWNrc3M3.mjs";
39
- import { c as startDevServer, h as detectBundleId } from "./start-BHIersSm.mjs";
40
- import { a as sleep, i as launchOutcomeRecord, n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-YhaSxP4v.mjs";
39
+ import { c as startDevServer, h as detectBundleId } from "./start-DUz3mYdb.mjs";
40
+ import { a as sleep, i as launchOutcomeRecord, n as ensureWorkspaceStorageSafely, r as isPhysicalDeviceRequest, t as ensureDevServer } from "./native-runtime-BEK171xQ.mjs";
41
41
  import { t as selectFromPool } from "./device-pool-3o7s5lo4.mjs";
42
42
  import { a as printNativeCrashReport, n as IOS_CRASH_REPORT_RETRY, o as simulatorConsolePaths, r as captureNativeCrashes, t as errorDiagnostics } from "./error-diagnostics-C-NMnhrk.mjs";
43
43
  import { a as iosPoolCandidates, c as isWirelessIosDevice, f as resolveIosPhysicalDevice, i as iosDeviceProcess, l as listIosDevices, n as installIosDeviceApp, o as iosPoolNoCandidatesRefusal, p as verifyIosDeviceReleaseLaunch, r as iosDeviceBounds, t as awaitIosDeviceLaunch, u as localNetworkPending } from "./ios-device-pAN4t54-.mjs";
44
- import { n as prepareHostedIos, t as placeHostedIos } from "./hosted-ios-BTaVj4Jb.mjs";
44
+ import { n as prepareHostedIos, t as placeHostedIos } from "./hosted-ios-BnbeYOUD.mjs";
45
45
  import { X509Certificate } from "node:crypto";
46
46
  import { existsSync, mkdirSync, mkdtempSync, openSync, rmSync, writeFileSync } from "node:fs";
47
47
  import { basename, join } from "node:path";
@@ -5,9 +5,9 @@ import { o as findCommandWorkspace } from "./project-D47Rh0ly.mjs";
5
5
  import { r as readWorkspaceState$1, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
6
6
  import { n as agentDeviceLiveness, u as readAgentDeviceRecords } from "./activity-IRvJY_ru.mjs";
7
7
  import { n as SOURCES, t as LEVELS } from "./ndjson-PclOIwVY.mjs";
8
- import { o as connectHost } from "./hosted-client-CdSoH-G6.mjs";
9
- import { n as pullHostedNativeLogs, t as pullHostedMacosLogs } from "./hosted-logs-SxfBvSvc.mjs";
10
- import "./hosted-macos-CT9E3meL.mjs";
8
+ import { o as connectHost } from "./hosted-client-Bp4knSwu.mjs";
9
+ import { n as pullHostedNativeLogs, t as pullHostedMacosLogs } from "./hosted-logs-OcgIBvCT.mjs";
10
+ import "./hosted-macos-DcxKjtfH.mjs";
11
11
  import { n as readHostedIos, t as readHostedAndroid } from "./ios-state-8L3lgum6.mjs";
12
12
  import { i as captureWorkspaceCrashes, t as errorDiagnostics } from "./error-diagnostics-C-NMnhrk.mjs";
13
13
  import { t as watchStdoutReader } from "./stdout-reader-C8yjre1x.mjs";
@@ -11,12 +11,12 @@ import { t as withWorkspaceProcessLock } from "./workspace-process-lock-2mNzOlaB
11
11
  import { c as recordFinishedBuild, l as startBuildProgress, n as NO_BUILD_PROGRESS, u as tapBuildLog } from "./build-progress-D0WkjCPd.mjs";
12
12
  import { a as requiredMacosRecord, n as macosLogFile, r as macosProcess, t as macosDir } from "./state-DyaNTgfR.mjs";
13
13
  import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
14
- import { i as macosToolchain } from "./toolchain-CdrxgUeA.mjs";
15
- import { a as offloadBuild, c as placementLoad, d as OffloadRefusal, f as namedBuildMachine, h as resolveBuildPlacement, i as closeOffload, l as remotePhaseText, n as buildPlacementCandidates, p as parseBuildMachineOption, r as chooseBuildMachine, s as offloadPlacement } from "./client-CxNotugx.mjs";
16
- import { o as connectHost } from "./hosted-client-CdSoH-G6.mjs";
14
+ import { i as macosToolchain } from "./toolchain-DNyR3NPq.mjs";
15
+ import { a as offloadBuild, c as placementLoad, d as OffloadRefusal, f as namedBuildMachine, h as resolveBuildPlacement, i as closeOffload, l as remotePhaseText, n as buildPlacementCandidates, p as parseBuildMachineOption, r as chooseBuildMachine, s as offloadPlacement } from "./client-SvBdgObD.mjs";
16
+ import { o as connectHost } from "./hosted-client-Bp4knSwu.mjs";
17
17
  import { t as logLines } from "./run-CkE9y0nc.mjs";
18
- import { t as placeHostedMacos } from "./hosted-macos-CT9E3meL.mjs";
19
- import { n as stopMacosAppHeld } from "./stop-D03prQnW.mjs";
18
+ import { t as placeHostedMacos } from "./hosted-macos-DcxKjtfH.mjs";
19
+ import { n as stopMacosAppHeld } from "./stop-BIiM49EY.mjs";
20
20
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
21
21
  import { n as stageBundle, r as validateInfoPlist, t as resolveBundleExtras } from "./stage-CzaiwFsI.mjs";
22
22
  import { f as withNativeBuildRun } from "./native-run-D1Q56rAD.mjs";
@@ -1,10 +1,10 @@
1
1
  import { j as formatBytes } from "./config-D0DbpZtM.mjs";
2
2
  import { t as relaunchWithLogFile } from "./detached-entry-CiTEgMR1.mjs";
3
- import { c as resolveBudget } from "./budget-CUDz870h.mjs";
3
+ import { c as resolveBudget } from "./budget-DfcgFdQB.mjs";
4
4
  import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
5
5
  import { t as resolveMaintenanceSettings } from "./settings-BBpMcDbD.mjs";
6
6
  import { r as due, t as capChildLog } from "./attempt-Bk2ouQVL.mjs";
7
- import { a as sizeScanDeferred, i as measureSizes, r as measurePressure, t as plannedMaintenance } from "./preview-C_JjkEy4.mjs";
7
+ import { a as sizeScanDeferred, i as measureSizes, r as measurePressure, t as plannedMaintenance } from "./preview-B-g9d7kV.mjs";
8
8
  import { appendFileSync, mkdirSync, renameSync, statSync, unlinkSync, writeFileSync } from "node:fs";
9
9
  import { basename, join, resolve } from "node:path";
10
10
  import { LOG_ROTATE_BYTES, rotatedLogPath, withDirLock } from "@stim-cli/core";
@@ -1,6 +1,6 @@
1
1
  import { t as process_identity_exports } from "./process-identity-BmRm1qV0.mjs";
2
2
  import { a as updateWorkspaceState, r as readWorkspaceState$1 } from "./workspace-state-DqcCbpE7.mjs";
3
- import { S as realIo } from "./client-CxNotugx.mjs";
3
+ import { S as realIo } from "./client-SvBdgObD.mjs";
4
4
  import { randomBytes, randomUUID } from "node:crypto";
5
5
  import { HOSTED_METRO_REQUESTS_KEY, findPeer, hostedMetroGateways, hostedMetroRequests, isJsonObject, parseMachine } from "@stim-cli/core/state";
6
6
  import { isIP } from "node:net";
@@ -3,7 +3,7 @@ import { x as metroPortSetting } from "./settings-Cfd-0r2d.mjs";
3
3
  import { l as resolveProjectMetro } from "./metro-g8NqiJp-.mjs";
4
4
  import { r as readWorkspaceState$1, u as ensureWorkspaceStorage } from "./workspace-state-DqcCbpE7.mjs";
5
5
  import { r as LAUNCH_UNVERIFIED, t as LAUNCH_BUNDLING } from "./launch-verify-lTnWZikR.mjs";
6
- import { c as startDevServer } from "./start-BHIersSm.mjs";
6
+ import { c as startDevServer } from "./start-DUz3mYdb.mjs";
7
7
  import { readIdleStop } from "@stim-cli/core/state";
8
8
  import chalk from "chalk";
9
9
  //#region src/commands/native-runtime.ts
@@ -1,13 +1,13 @@
1
1
  import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
2
  import { n as stripAnsi } from "./process-output-Fpl8PYi8.mjs";
3
3
  import { D as fingerprintProject, M as refingerprintAfterMutation } from "./device-lease-DpoS36_u.mjs";
4
- import { T as CCACHE_UNAVAILABLE, d as buildIos, k as resolveCcache, o as workerToolchain, s as manifestDigest } from "./toolchain-CdrxgUeA.mjs";
4
+ import { T as CCACHE_UNAVAILABLE, d as buildIos, k as resolveCcache, o as workerToolchain, s as manifestDigest } from "./toolchain-DNyR3NPq.mjs";
5
5
  import { t as logLines } from "./run-CkE9y0nc.mjs";
6
- import { a as runPodInstall, n as podsAreStale, r as readPodState } from "./deps-CVxlsRFn.mjs";
6
+ import { a as runPodInstall, n as podsAreStale, r as readPodState } from "./deps-iKw0eD4P.mjs";
7
7
  import { n as recordPrebuild, r as runPrebuild, t as planPrebuild } from "./prebuild-D7RUMkwN.mjs";
8
- import { a as gradlewPath, i as buildAndroid, r as assembleTaskFor } from "./gradle-bsBRy6i9.mjs";
8
+ import { a as gradlewPath, i as buildAndroid, r as assembleTaskFor } from "./gradle-dJpre3Yn.mjs";
9
9
  import { n as stageBundle, t as resolveBundleExtras } from "./stage-CzaiwFsI.mjs";
10
- import { d as podAction } from "./support-BE-tbOP9.mjs";
10
+ import { d as podAction } from "./support-CsJNVfOc.mjs";
11
11
  import { createHash } from "node:crypto";
12
12
  import { chmodSync, constants, copyFileSync, cpSync, createReadStream, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, symlinkSync, writeFileSync } from "node:fs";
13
13
  import { basename, dirname, join } from "node:path";
@@ -1,6 +1,6 @@
1
1
  import { P as measuredDirectorySize } from "./config-D0DbpZtM.mjs";
2
2
  import { s as findProjectRoot$1 } from "./project-D47Rh0ly.mjs";
3
- import { M as planCacheEmptying, Q as discoverCaches, c as resolveBudget, r as enforceBudget, s as readVolumeSpace } from "./budget-CUDz870h.mjs";
3
+ import { M as planCacheEmptying, Q as discoverCaches, c as resolveBudget, r as enforceBudget, s as readVolumeSpace } from "./budget-DfcgFdQB.mjs";
4
4
  import { o as canonicalPath } from "./in-use-CvGOUn-x.mjs";
5
5
  import { h as listBuildLocks } from "./device-lease-DpoS36_u.mjs";
6
6
  import { n as listBuildSlots } from "./build-slots-41v_d2x9.mjs";
@@ -7,10 +7,10 @@ import { o as readWebRecord, r as cdpEndpoint, u as webFacts } from "./state-PeQ
7
7
  import { f as readWorkspaceLaunches } from "./state-BKa8wNN5.mjs";
8
8
  import { J as resolveOwnedAvdSerial } from "./android-B_YNZy61.mjs";
9
9
  import { w as resolveOwnedIosSim } from "./ios-DSfnPfse.mjs";
10
- import { l as probeHostedSession } from "./hosted-client-CdSoH-G6.mjs";
10
+ import { l as probeHostedSession } from "./hosted-client-Bp4knSwu.mjs";
11
11
  import { p as ensureMetroReverse, s as androidAppProcess, v as iosAppProcess } from "./app-install-VPkI5WEg.mjs";
12
12
  import { r as readHostedNative } from "./ios-state-8L3lgum6.mjs";
13
- import { r as reopenHostedAndroidMetro } from "./hosted-android-DgU31wY3.mjs";
13
+ import { r as reopenHostedAndroidMetro } from "./hosted-android-E1Heoqnv.mjs";
14
14
  import { n as nativeRunCommand } from "./slot-launch-DmjBmpQV.mjs";
15
15
  import { n as sendToOwnedPage, t as liveWebRecord } from "./page-QF_Ke10s.mjs";
16
16
  import { hostedAndroidDeviceName, hostedNativeRecords } from "@stim-cli/core/state";
@@ -1496,7 +1496,7 @@
1496
1496
  }
1497
1497
  },
1498
1498
  "maxCommittedMemoryGb": {
1499
- "description": "Estimated memory, in GB, of live environments before idle ones are reclaimed; unset is 60% of RAM, 0 is off",
1499
+ "description": "Estimated memory, in GB, of active environments before idle ones are reclaimed; unset is 60% of RAM, 0 is off",
1500
1500
  "type": "number",
1501
1501
  "minimum": 0,
1502
1502
  "x-stim": {
@@ -1509,7 +1509,7 @@
1509
1509
  }
1510
1510
  },
1511
1511
  "maxLiveWorkspaces": {
1512
- "description": "Live workspaces before idle ones are reclaimed; unset or 0 means no limit",
1512
+ "description": "Active workspaces before idle ones are reclaimed; unset or 0 means no limit",
1513
1513
  "type": "integer",
1514
1514
  "minimum": 0,
1515
1515
  "x-stim": {
@@ -1,2 +1,2 @@
1
- import { a as registerStart, c as startDevServer, d as tailLines, f as wantsExpoOwnTunnel, i as readLogTail, l as startFacts, n as liveSupervisor, o as resolveWorkspaceMetroPort, r as parseWait, s as startCommand, t as failureEvidence, u as supervisorEntry } from "./start-BHIersSm.mjs";
1
+ import { a as registerStart, c as startDevServer, d as tailLines, f as wantsExpoOwnTunnel, i as readLogTail, l as startFacts, n as liveSupervisor, o as resolveWorkspaceMetroPort, r as parseWait, s as startCommand, t as failureEvidence, u as supervisorEntry } from "./start-DUz3mYdb.mjs";
2
2
  export { startCommand as default, failureEvidence, liveSupervisor, parseWait, readLogTail, registerStart, resolveWorkspaceMetroPort, startDevServer, startFacts, supervisorEntry, tailLines, wantsExpoOwnTunnel };
@@ -7,7 +7,7 @@ import { G as detectProviders, H as unknownSettingKeys, K as planMetroReach, M a
7
7
  import { f as readAppConfigText, n as appProjectProblem, p as readAppJson, r as detectIsExpo, s as findProjectRoot$1, t as NO_PROJECT_REFUSAL } from "./project-D47Rh0ly.mjs";
8
8
  import { l as resolveProjectMetro, o as pidExists, p as reserveMetroPort, u as signalProcessTree } from "./metro-g8NqiJp-.mjs";
9
9
  import { c as writeWorkspaceState, g as workspaceAgentDeviceDir, i as recordWorkspaceUse, m as supervisorLogFile, n as clearWorkspaceStateKeys, r as readWorkspaceState$1, u as ensureWorkspaceStorage, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
10
- import { l as stopOwnedMetroForReset, t as budgetGate } from "./budget-CUDz870h.mjs";
10
+ import { l as stopOwnedMetroForReset, t as budgetGate } from "./budget-DfcgFdQB.mjs";
11
11
  import { c as readMetroTunnel, i as clearManagedMetroTunnel } from "./state-BKa8wNN5.mjs";
12
12
  import { a as workspaceLinks, i as workspaceLinkLine } from "./stim-desktop-Cnz8CPnl.mjs";
13
13
  import { a as terminateChild, c as withManagedTunnelLock, i as stopTunnel, o as withManagedRemoteWorktreeLock, r as startTunnelSequence, t as resolveSupervisorTarget } from "./ownership-BMLqyBgJ.mjs";
@@ -8,7 +8,7 @@ import { a as listeningPidsByPort, c as processCwds, d as isMetroRunning, i as l
8
8
  import { b as workspaceLogErrorIndex, r as readWorkspaceState$1, x as workspaceLogsDir$1 } from "./workspace-state-DqcCbpE7.mjs";
9
9
  import { a as readWebPage, o as readWebRecord, u as webFacts } from "./state-PeQiJuIu.mjs";
10
10
  import { _ as statusActivity, a as capacity, b as withWebFacts, c as diskLine, d as gitSummaryText, f as metroReverseTargets, g as remoteDeviceState, h as remoteDeviceLine, i as applyMachineMemory, l as environmentState, m as poolLine, n as activityLabel, o as deviceLeaseLines, p as parseDfFree, r as addReverseMissingIssue, s as deviceLeaseStates, v as tightVolumes, y as unprovisionedWorktrees } from "./status-CzS4bPO9.mjs";
11
- import { X as attributeMachineUsage, Z as readFootprints, a as machineNumber } from "./budget-CUDz870h.mjs";
11
+ import { X as attributeMachineUsage, Z as readFootprints, a as machineNumber } from "./budget-DfcgFdQB.mjs";
12
12
  import { d as readWebActivity, f as tailLines, i as createDeviceProcessTables, r as createActivityReader } from "./activity-IRvJY_ru.mjs";
13
13
  import { i as listLeaseFiles, r as leaseIsExpired, s as parseWorkspaceLeases } from "./device-lease-DpoS36_u.mjs";
14
14
  import { c as readMetroTunnel, f as readWorkspaceLaunches, u as readRemoteSession } from "./state-BKa8wNN5.mjs";
@@ -18,9 +18,9 @@ import { t as resolveSupervisorTarget } from "./ownership-BMLqyBgJ.mjs";
18
18
  import { _ as statsProjectKey$1, a as buildStatusLine, i as buildReport, p as readStats$1, r as activeBuildState, s as parseActiveBuild, t as ACTIVE_BUILD_KEY } from "./build-progress-D0WkjCPd.mjs";
19
19
  import { a as parseNdjsonLine } from "./ndjson-PclOIwVY.mjs";
20
20
  import { n as describeMetroLastStop, o as metroLastStop } from "./stop-cause-rhmGfwvt.mjs";
21
- import { l as probeHostedSession } from "./hosted-client-CdSoH-G6.mjs";
21
+ import { l as probeHostedSession } from "./hosted-client-Bp4knSwu.mjs";
22
22
  import { m as hasMetroReverse } from "./app-install-VPkI5WEg.mjs";
23
- import "./hosted-macos-CT9E3meL.mjs";
23
+ import "./hosted-macos-DcxKjtfH.mjs";
24
24
  import { m as readEasSessionLedger$1, p as easMachineStateRoot$1 } from "./device-remote-hFSkpfQu.mjs";
25
25
  import { d as readIosDevices, s as isReachable } from "./ios-device-pAN4t54-.mjs";
26
26
  import { n as maintenanceLines, r as maintenanceStatus } from "./status-DlKvVJBE.mjs";
@@ -28,7 +28,7 @@ import { i as createStatusMeasurer, n as workspacePhase, r as applyStatusMeasure
28
28
  import { r as workspaceRecordingEnabled } from "./recordings-BNgsD1Tr.mjs";
29
29
  import { t as watchStdoutReader } from "./stdout-reader-C8yjre1x.mjs";
30
30
  import { t as triggerMaintenance } from "./trigger-Bemu8ytw.mjs";
31
- import { i as readSupervisorState } from "./stop-Cj01je8D.mjs";
31
+ import { i as readSupervisorState } from "./stop-DQIasgKp.mjs";
32
32
  import { createHash, randomUUID } from "node:crypto";
33
33
  import { mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, watch, writeFileSync } from "node:fs";
34
34
  import { join, posix, resolve } from "node:path";
@@ -1527,7 +1527,7 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
1527
1527
  out.push(chalk.dim(`\nWorktrees with no environment (${orphanWorktrees.length}):`));
1528
1528
  for (const w of orphanWorktrees) out.push(chalk.dim(` ${orphanWorktreeLine(w)}`));
1529
1529
  }
1530
- out.push(chalk.dim(machine?.memorySource === "footprint" ? `\n${cap.liveCount} live environment(s) use ${formatGb(cap.committedMb)} of ${formatGb(cap.totalMemoryMb)}.` : `\n${cap.liveCount} live environment(s), roughly ${formatGb(cap.committedMb)} of ${formatGb(cap.totalMemoryMb)} committed.`));
1530
+ out.push(chalk.dim(machine?.memorySource === "footprint" ? `\n${cap.liveCount} active environment(s) use ${formatGb(cap.committedMb)} of ${formatGb(cap.totalMemoryMb)}.` : `\n${cap.liveCount} active environment(s), roughly ${formatGb(cap.committedMb)} of ${formatGb(cap.totalMemoryMb)} committed.`));
1531
1531
  const volumes = readVolumes(cwdRoot || process.cwd());
1532
1532
  const line = diskLine(volumes);
1533
1533
  if (line) {
@@ -2,7 +2,7 @@ import { n as ownership_claim_exports, t as process_identity_exports } from "./p
2
2
  import { c as writeWorkspaceState, v as workspaceDir } from "./workspace-state-DqcCbpE7.mjs";
3
3
  import { t as withWorkspaceProcessLock } from "./workspace-process-lock-2mNzOlaB.mjs";
4
4
  import { a as requiredMacosRecord, i as macosRuntimeClaim } from "./state-DyaNTgfR.mjs";
5
- import { n as stopHostedMacos } from "./hosted-macos-CT9E3meL.mjs";
5
+ import { n as stopHostedMacos } from "./hosted-macos-DcxKjtfH.mjs";
6
6
  import { readMacosRecord } from "@stim-cli/core/state";
7
7
  //#region src/macos/stop.ts
8
8
  async function stopProcess(record) {
@@ -10,12 +10,12 @@ import { g as teardownOwnedIosSim, h as teardownOwnedBrowser, i as stopTunnel, m
10
10
  import { t as withWorkspaceProcessLock } from "./workspace-process-lock-2mNzOlaB.mjs";
11
11
  import { a as logVanishedSupervisor, l as withdrawDevServerStopRequest, s as requestDevServerStop } from "./stop-cause-rhmGfwvt.mjs";
12
12
  import { n as verifyCollectorOwnership } from "./ownership-DyRQru0q.mjs";
13
- import { t as stopMacosApp } from "./stop-D03prQnW.mjs";
14
- import { i as stopHostedAndroid } from "./hosted-android-DgU31wY3.mjs";
13
+ import { t as stopMacosApp } from "./stop-BIiM49EY.mjs";
14
+ import { i as stopHostedAndroid } from "./hosted-android-E1Heoqnv.mjs";
15
15
  import { f as resolveEasCliBin } from "./remote-cache-Ci4DQYYj.mjs";
16
16
  import { i as endRecordedSession } from "./device-remote-hFSkpfQu.mjs";
17
17
  import { a as decideStopAction, c as nativeRunWaitNotice, i as clearNativeRunCancel, l as requestNativeRunCancel, n as NATIVE_RUN_WAIT_MS, o as describeNativeRunHolder, s as nativeRunHolder, t as NATIVE_RUN_LOCK } from "./native-run-D1Q56rAD.mjs";
18
- import { r as stopHostedIos } from "./hosted-ios-BTaVj4Jb.mjs";
18
+ import { r as stopHostedIos } from "./hosted-ios-BnbeYOUD.mjs";
19
19
  import { hostedAndroidDeviceName, hostedAndroidRecords, hostedIosRecords, hostedNativeRecords, isJsonObject, parseHostedNativePlacement } from "@stim-cli/core/state";
20
20
  import chalk from "chalk";
21
21
  //#region src/commands/stop.ts
@@ -1,3 +1,3 @@
1
1
  import { t as resolveSupervisorTarget } from "./ownership-BMLqyBgJ.mjs";
2
- import { a as resolveCollectorTargets, c as stopWorkspaceNow, i as readSupervisorState, n as clearSupervisorState, o as runStop, r as readCollectorState, s as stopCommand, t as clearCollectorState } from "./stop-Cj01je8D.mjs";
2
+ import { a as resolveCollectorTargets, c as stopWorkspaceNow, i as readSupervisorState, n as clearSupervisorState, o as runStop, r as readCollectorState, s as stopCommand, t as clearCollectorState } from "./stop-DQIasgKp.mjs";
3
3
  export { clearCollectorState, clearSupervisorState, stopCommand as default, readCollectorState, readSupervisorState, resolveCollectorTargets, resolveSupervisorTarget, runStop, stopWorkspaceNow };
@@ -14,8 +14,8 @@ import { s as workspaceBuildInProgress } from "./idle-BXG__1BA.mjs";
14
14
  import { t as describeError } from "./errors-B6W7FkxQ.mjs";
15
15
  import { r as createNdjsonWriter } from "./ndjson-PclOIwVY.mjs";
16
16
  import { c as vanishedSupervisorMessage, i as devServerStopRecord, r as devServerStopLevel, t as describeDevServerStop } from "./stop-cause-rhmGfwvt.mjs";
17
- import { l as probeHostedSession } from "./hosted-client-CdSoH-G6.mjs";
18
- import { t as clearHostedMetro } from "./metro-gateway-CHqK0p-a.mjs";
17
+ import { l as probeHostedSession } from "./hosted-client-Bp4knSwu.mjs";
18
+ import { t as clearHostedMetro } from "./metro-gateway-C-ijGI2F.mjs";
19
19
  import { n as dueIdleDevices, r as shutDownIdleDevices } from "./idle-shutdown-IGyNV8Cr.mjs";
20
20
  import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
21
21
  import { dirname, isAbsolute, join, resolve, sep } from "node:path";
@@ -1,7 +1,7 @@
1
1
  import { h as shortUdid, l as phaseLine } from "./command-output-CDAIFD-8.mjs";
2
2
  import { x as workspaceLogsDir } from "./workspace-state-DqcCbpE7.mjs";
3
3
  import { k as parseIosSimulatorApp } from "./ios-DSfnPfse.mjs";
4
- import { x as describeDiagnostic } from "./toolchain-CdrxgUeA.mjs";
4
+ import { x as describeDiagnostic } from "./toolchain-DNyR3NPq.mjs";
5
5
  import { d as unknownIosDeviceTypeRefusal, f as unknownIosRuntimeRefusal, o as layerNote, t as DEFAULT_DEVICE_SLOT_WAIT_MS } from "./device-capacity-ZC4XSZ4R.mjs";
6
6
  import { l as parseDeviceWait } from "./device-lease-run-B8YltIH_.mjs";
7
7
  import { t as IosDeviceMismatchError } from "./device-ios-C2Um-XUR.mjs";
@@ -1241,6 +1241,10 @@ function androidMismatches(local, requires, worker) {
1241
1241
  });
1242
1242
  return out;
1243
1243
  }
1244
+ function versionMismatch(tool, there, here) {
1245
+ const side = (version) => version ? version.startsWith(tool) ? version : `${tool} ${version}` : `no ${tool}`;
1246
+ return `${side(there)} there, ${side(here)} here`;
1247
+ }
1244
1248
  /** Why a remote Mac cannot build like this Mac; empty when it can. */
1245
1249
  function toolchainMismatches(target, worker) {
1246
1250
  const { local } = target;
@@ -1258,22 +1262,22 @@ function toolchainMismatches(target, worker) {
1258
1262
  const macos = target.local;
1259
1263
  if (!macos.xcode || worker.xcode !== macos.xcode) out.push({
1260
1264
  code: "xcode",
1261
- reason: `Xcode ${worker.xcode} there, ${macos.xcode} here`
1265
+ reason: versionMismatch("Xcode", worker.xcode, macos.xcode)
1262
1266
  });
1263
1267
  if (!macos.macosSdk || worker.macosSdk !== macos.macosSdk) out.push({
1264
1268
  code: "macos-sdk",
1265
- reason: `macOS SDK ${worker.macosSdk} there, ${macos.macosSdk} here`
1269
+ reason: versionMismatch("macOS SDK", worker.macosSdk, macos.macosSdk)
1266
1270
  });
1267
1271
  return out;
1268
1272
  }
1269
1273
  const ios = target.local;
1270
1274
  if (!ios.xcode || worker.xcode !== ios.xcode) out.push({
1271
1275
  code: "xcode",
1272
- reason: `Xcode ${worker.xcode} there, ${ios.xcode} here`
1276
+ reason: versionMismatch("Xcode", worker.xcode, ios.xcode)
1273
1277
  });
1274
1278
  if (!ios.simulatorSdk || worker.simulatorSdk !== ios.simulatorSdk) out.push({
1275
1279
  code: "simulator-sdk",
1276
- reason: `simulator SDK ${worker.simulatorSdk} there, ${ios.simulatorSdk} here`
1280
+ reason: versionMismatch("simulator SDK", worker.simulatorSdk, ios.simulatorSdk)
1277
1281
  });
1278
1282
  if (target.cocoapodsPinned) {
1279
1283
  if (!worker.bundler) out.push({
@@ -1282,7 +1286,7 @@ function toolchainMismatches(target, worker) {
1282
1286
  });
1283
1287
  } else if (worker.cocoapods !== ios.cocoapods) out.push({
1284
1288
  code: "cocoapods",
1285
- reason: `CocoaPods ${worker.cocoapods} there, ${ios.cocoapods} here`
1289
+ reason: versionMismatch("CocoaPods", worker.cocoapods, ios.cocoapods)
1286
1290
  });
1287
1291
  if (target.runtime && !worker.runtimes.includes(target.runtime)) out.push({
1288
1292
  code: "runtime",
@@ -15,8 +15,8 @@ import { o as readNdjsonGenerations } from "./ndjson-PclOIwVY.mjs";
15
15
  import { a as findChrome, t as CHROME_INSTALL_REMEDY } from "./chrome-BrcVWQyD.mjs";
16
16
  import { t as spawnEntry } from "./spawn-entry-jw19m8Nl.mjs";
17
17
  import { c as readMetroRecords } from "./launch-verify-lTnWZikR.mjs";
18
- import { o as resolveWorkspaceMetroPort } from "./start-BHIersSm.mjs";
19
- import { a as sleep, n as ensureWorkspaceStorageSafely } from "./native-runtime-YhaSxP4v.mjs";
18
+ import { o as resolveWorkspaceMetroPort } from "./start-DUz3mYdb.mjs";
19
+ import { a as sleep, n as ensureWorkspaceStorageSafely } from "./native-runtime-BEK171xQ.mjs";
20
20
  import { n as sendToOwnedPage, t as liveWebRecord } from "./page-QF_Ke10s.mjs";
21
21
  import { randomUUID } from "node:crypto";
22
22
  import { mkdirSync, openSync } from "node:fs";
@@ -8,7 +8,7 @@ import { n as appProjectProblem, s as findProjectRoot$1 } from "./project-D47Rh0
8
8
  import { l as resolveProjectMetro, o as pidExists, r as killMetroTree, u as signalProcessTree } from "./metro-g8NqiJp-.mjs";
9
9
  import { g as workspaceAgentDeviceDir, i as recordWorkspaceUse, r as readWorkspaceState$1, v as workspaceDir } from "./workspace-state-DqcCbpE7.mjs";
10
10
  import { o as readWebRecord } from "./state-PeQiJuIu.mjs";
11
- import { a as machineNumber } from "./budget-CUDz870h.mjs";
11
+ import { a as machineNumber } from "./budget-DfcgFdQB.mjs";
12
12
  import { n as withIdleWorkspace, t as emptyWorkspaceDir } from "./in-use-CvGOUn-x.mjs";
13
13
  import { t as agentDeviceDaemon } from "./activity-IRvJY_ru.mjs";
14
14
  import { u as releaseWorkspaceLeases } from "./device-lease-DpoS36_u.mjs";
@@ -18,17 +18,17 @@ import { a as workspaceLinks, i as workspaceLinkLine } from "./stim-desktop-Cnz8
18
18
  import { g as teardownOwnedIosSim, h as teardownOwnedBrowser, i as stopTunnel, l as withManagedTunnelRemovalLock, m as teardownOwnedAvd, s as withManagedRemoteWorktreeRemovalLock, t as resolveSupervisorTarget } from "./ownership-BMLqyBgJ.mjs";
19
19
  import { t as clearNamedPorts } from "./named-ports-C8m8EQs2.mjs";
20
20
  import { l as withdrawDevServerStopRequest, s as requestDevServerStop } from "./stop-cause-rhmGfwvt.mjs";
21
- import { C as podInstallCommand, u as HEARTBEAT_INTERVAL_MS } from "./toolchain-CdrxgUeA.mjs";
21
+ import { C as podInstallCommand, u as HEARTBEAT_INTERVAL_MS } from "./toolchain-DNyR3NPq.mjs";
22
22
  import { n as verifyCollectorOwnership } from "./ownership-DyRQru0q.mjs";
23
- import { t as stopMacosApp } from "./stop-D03prQnW.mjs";
24
- import { a as runPodInstall, i as runCaptured, n as podsAreStale, r as readPodState, t as DEPS_ERROR } from "./deps-CVxlsRFn.mjs";
25
- import { i as stopHostedAndroid } from "./hosted-android-DgU31wY3.mjs";
23
+ import { t as stopMacosApp } from "./stop-BIiM49EY.mjs";
24
+ import { a as runPodInstall, i as runCaptured, n as podsAreStale, r as readPodState, t as DEPS_ERROR } from "./deps-iKw0eD4P.mjs";
25
+ import { i as stopHostedAndroid } from "./hosted-android-E1Heoqnv.mjs";
26
26
  import { f as resolveEasCliBin } from "./remote-cache-Ci4DQYYj.mjs";
27
27
  import { i as endRecordedSession } from "./device-remote-hFSkpfQu.mjs";
28
28
  import { n as hasInstalledDependencies, r as installedNpmTreeIsValid, t as dependencyState } from "./dependency-state-CLcBHH2M.mjs";
29
29
  import { a as forgetStatusMeasures, s as mergeState, t as startWarmProgress } from "./warm-progress-DF4JRvYI.mjs";
30
30
  import { r as workspaceRecordingEnabled } from "./recordings-BNgsD1Tr.mjs";
31
- import { r as stopHostedIos } from "./hosted-ios-BTaVj4Jb.mjs";
31
+ import { r as stopHostedIos } from "./hosted-ios-BnbeYOUD.mjs";
32
32
  import { createHash, randomUUID } from "node:crypto";
33
33
  import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, utimesSync, writeFileSync } from "node:fs";
34
34
  import { basename, dirname, join, relative } from "node:path";
@@ -1,2 +1,2 @@
1
- import { a as porcelainPath, c as registerWarm, d as removalRemedy, f as removeWorktreeTarget, i as matchWorktreeEntry, l as removalBlockers, m as worktreeCommand, n as excludePodChurn, o as reclaimKeys, p as warmedWorkspace, r as excludeWatchmanCookies, s as registerRemove, t as dependencyInstallCommand, u as removalPath } from "./worktree-AK_m-d_m.mjs";
1
+ import { a as porcelainPath, c as registerWarm, d as removalRemedy, f as removeWorktreeTarget, i as matchWorktreeEntry, l as removalBlockers, m as worktreeCommand, n as excludePodChurn, o as reclaimKeys, p as warmedWorkspace, r as excludeWatchmanCookies, s as registerRemove, t as dependencyInstallCommand, u as removalPath } from "./worktree-Be_7NLKy.mjs";
2
2
  export { worktreeCommand as default, dependencyInstallCommand, excludePodChurn, excludeWatchmanCookies, matchWorktreeEntry, porcelainPath, reclaimKeys, registerRemove, registerWarm, removalBlockers, removalPath, removalRemedy, removeWorktreeTarget, warmedWorkspace };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stim",
3
- "version": "1.17.1",
3
+ "version": "1.17.2",
4
4
  "description": "Stim: fast, isolated React Native environments for coding agents",
5
5
  "keywords": [
6
6
  "agent",
@@ -48,9 +48,9 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@expo/fingerprint": "^0.20.10",
51
- "@stim-cli/cache": "^1.17.1",
52
- "@stim-cli/core": "^1.17.1",
53
- "@stim-cli/metro": "^1.17.1",
51
+ "@stim-cli/cache": "^1.17.2",
52
+ "@stim-cli/core": "^1.17.2",
53
+ "@stim-cli/metro": "^1.17.2",
54
54
  "chalk": "^6.0.0",
55
55
  "commander": "^15.0.0",
56
56
  "cross-spawn": "^7.0.6",
@@ -58,7 +58,7 @@
58
58
  "ws": "^8.21.3"
59
59
  },
60
60
  "devDependencies": {
61
- "@stim-cli/expo-build-cache": "1.17.1",
61
+ "@stim-cli/expo-build-cache": "1.17.2",
62
62
  "@types/cross-spawn": "^6.0.6",
63
63
  "@types/which": "^3.0.4",
64
64
  "@types/ws": "^8.18.1",