@stim-cli/core 1.38.0 → 1.40.0-next.20261103050129.gd5fe899

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.
package/dist/state.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import { S as tryAcquireClaim, _ as releaseClaim, f as isClaimRefusal, g as readClaimSet } from "./ownership-claim-DG2GMIoo.mjs";
2
2
  import { inspectProcessIdentity } from "./process-identity.mjs";
3
- import { $ as withDirLockAsync, C as workspaceName, J as readJsonFile, Q as withDirLock, T as workspaceStateDir, U as ambientContext, W as ambientEnv, X as readStateFile, Y as readJsonObject, Z as withStateReadCache, _ as rotatedLogPath, d as ensurePrivateDir, g as rotateLog, q as isJsonObject, t as LOG_ROTATE_BYTES, u as configDir } from "./core-Hohf5Wnt.mjs";
3
+ import { $ as withDirLock, E as workspaceStateDir, G as ambientEnv, J as isJsonObject, Q as withStateReadCache, W as ambientContext, X as readJsonObject, Y as readJsonFile, Z as readStateFile, _ as rotateLog, d as ensurePrivateDir, et as withDirLockAsync, t as LOG_ROTATE_BYTES, u as configDir, v as rotatedLogPath, w as workspaceName } from "./core-DdPq-c64.mjs";
4
4
  import { readOrCreateKeyFile } from "./noise-session.mjs";
5
5
  import { validHomeId } from "./workspace-link.mjs";
6
6
  import { a as workspaceSummary, i as statusViews, n as applyKeyedDelta, o as withDerivedFacts, r as SUMMARY_ARCHIVES, s as withGitChip, t as KeyedEntities } from "./keyed-delta-BBoOeR2J.mjs";
7
7
  import { appendFileSync, closeSync, existsSync, fstatSync, lstatSync, mkdirSync, openSync, readFileSync, readSync, readdirSync, realpathSync, statSync, watch, writeFileSync, writeSync } from "node:fs";
8
- import { availableParallelism, homedir, loadavg } from "node:os";
8
+ import { availableParallelism, homedir, loadavg, totalmem } from "node:os";
9
9
  import { basename, dirname, isAbsolute, join, posix, relative, resolve, sep, win32 } from "node:path";
10
10
  import { createHash, randomBytes } from "node:crypto";
11
11
  import { setImmediate as setImmediate$1 } from "node:timers/promises";
@@ -737,9 +737,6 @@ function maintenanceDir() {
737
737
  function maintenanceStateFile() {
738
738
  return join(maintenanceDir(), "state.json");
739
739
  }
740
- function maintenanceAttemptFile() {
741
- return join(maintenanceDir(), "attempt.json");
742
- }
743
740
  function maintenanceNdjsonFile() {
744
741
  return join(maintenanceDir(), "maintenance.ndjson");
745
742
  }
@@ -786,16 +783,38 @@ function clientIdentityKeyFile() {
786
783
  return join(configDir(), "client-identity.key");
787
784
  }
788
785
  /**
789
- * The local Unix socket. sun_path permits 103 UTF-8 bytes on macOS and 107 on Linux. Longer paths use
786
+ * A Unix socket at `path`. sun_path permits 103 UTF-8 bytes on macOS and 107 on Linux. Longer paths use
790
787
  * /tmp/stim-sockets-<uid>/<SHA-256 of the normalized absolute socket path>.sock.
791
788
  */
792
- function serverLocalSocket() {
793
- const path = join(configDir(), "server", "local.sock");
789
+ function localSocket(path) {
794
790
  const uid = process.getuid?.();
795
791
  const maximumPathBytes = process.platform === "linux" ? 107 : 103;
796
792
  if (uid === void 0 || Buffer.byteLength(path) <= maximumPathBytes) return path;
797
793
  return join("/tmp", `stim-sockets-${uid}`, `${createHash("sha256").update(path).digest("hex")}.sock`);
798
794
  }
795
+ /** stim-server's Unix socket for this machine's own user. */
796
+ function serverLocalSocket() {
797
+ return localSocket(join(configDir(), "server", "local.sock"));
798
+ }
799
+ /** The home daemon's directory: its claim, log, snapshot and, when the path fits, its socket. */
800
+ function daemonDir() {
801
+ return join(configDir(), "daemon");
802
+ }
803
+ /** The ownership claim the running home daemon holds for its lifetime. */
804
+ function daemonClaimRoot() {
805
+ return join(daemonDir(), "claim");
806
+ }
807
+ function daemonSocket() {
808
+ return localSocket(join(daemonDir(), "daemon.sock"));
809
+ }
810
+ /** The daemon's own log, rotated like workspace logs. */
811
+ function daemonNdjsonFile() {
812
+ return join(daemonDir(), "daemon.ndjson");
813
+ }
814
+ /** What the daemon's last tick measured and decided, written atomically each tick. */
815
+ function daemonSnapshotFile() {
816
+ return join(daemonDir(), "snapshot.json");
817
+ }
799
818
  function serverSetupDir() {
800
819
  return join(configDir(), "server", "setup");
801
820
  }
@@ -890,6 +909,30 @@ function getConcurrencyLimits({ env = ambientEnv() } = {}) {
890
909
  maxDevices: resolveLimit(env.STIM_MAX_DEVICES, c.maxDevices)
891
910
  };
892
911
  }
912
+ const GIB = 1024 ** 3;
913
+ /** The derived `concurrency.maxBuilds`: one native build per six cores, at least one. */
914
+ function derivedBuildCap(cores = availableParallelism()) {
915
+ return Math.max(1, Math.floor(cores / 6));
916
+ }
917
+ /** The derived `concurrency.maxDevices`: one booted simulator or emulator per 1.5 GB of RAM above 4 GB, at least two. */
918
+ function derivedDeviceCap(totalBytes = totalmem()) {
919
+ return Math.max(2, Math.floor((totalBytes - 4 * GIB) / (1.5 * GIB)));
920
+ }
921
+ /**
922
+ * The build and device caps admission enforces: `concurrency.maxBuilds` and `concurrency.maxDevices` when set above 0,
923
+ * else the derived caps. `derived` names the caps that were derived.
924
+ */
925
+ function admissionLimits({ env = ambientEnv(), cores, totalBytes } = {}) {
926
+ const set = getConcurrencyLimits({ env });
927
+ return {
928
+ maxBuilds: set.maxBuilds || derivedBuildCap(cores),
929
+ maxDevices: set.maxDevices || derivedDeviceCap(totalBytes),
930
+ derived: {
931
+ builds: set.maxBuilds === 0,
932
+ devices: set.maxDevices === 0
933
+ }
934
+ };
935
+ }
893
936
  function getPlatformDeviceLimits({ env = ambientEnv() } = {}) {
894
937
  const c = loadConfig()?.concurrency || {};
895
938
  return {
@@ -1270,7 +1313,8 @@ const REMOTE_DEVICE_BACKENDS = ["proxy", "eas"];
1270
1313
  const IOS_SIMULATOR_APPS = [
1271
1314
  "xcode",
1272
1315
  "siniulator",
1273
- "stim-desktop"
1316
+ "stim-desktop",
1317
+ "none"
1274
1318
  ];
1275
1319
  const ANDROID_EMULATOR_APPS = ["emulator", "stim-desktop"];
1276
1320
  const REPLACED_SETTINGS = { "remote.buildMode": {
@@ -1287,6 +1331,12 @@ function replacementAdvice(key, old) {
1287
1331
  command: value ? `stim settings set ${replaced.key} ${value}` : null
1288
1332
  };
1289
1333
  }
1334
+ const SHARE_DEFAULT_PORT = 7790;
1335
+ const SHARE_EXPOSURES = [
1336
+ "auto",
1337
+ "tailscale",
1338
+ "proxy"
1339
+ ];
1290
1340
  const WEB_VIEWPORTS = ["desktop", "phone"];
1291
1341
  const PROJECT = [
1292
1342
  "workspace",
@@ -1657,6 +1707,27 @@ const SETTINGS = [
1657
1707
  scopes: PROJECT,
1658
1708
  description: "Bundle URL `stim android` prefetches to warm Metro"
1659
1709
  },
1710
+ {
1711
+ key: "idle.minutes",
1712
+ type: {
1713
+ kind: "number",
1714
+ integer: true,
1715
+ minimum: 0
1716
+ },
1717
+ scopes: EVERY,
1718
+ default: 15,
1719
+ description: "Minutes without activity before a workspace goes idle: its dev server stops with its port kept, its owned simulators and emulators shut down, and its regenerable build outputs are deleted; stim revive resumes it. Unset, the smaller of metro.idleStopMinutes and devices.idleShutdownMinutes; 0 never"
1720
+ },
1721
+ {
1722
+ key: "idle.dormantDays",
1723
+ type: {
1724
+ kind: "number",
1725
+ minimum: 0
1726
+ },
1727
+ scopes: MACHINE,
1728
+ default: 3,
1729
+ description: "Days without activity before a workspace goes dormant: its owned simulators and emulators are deleted (the parked pool is untouched) and its logs are archived, while node_modules and Pods stay; any Stim command run in it leaves the stage. Fractions of a day are allowed; 0 never"
1730
+ },
1660
1731
  {
1661
1732
  key: "metro.idleStopMinutes",
1662
1733
  type: {
@@ -1665,8 +1736,8 @@ const SETTINGS = [
1665
1736
  minimum: 0
1666
1737
  },
1667
1738
  scopes: PROJECT,
1668
- default: 60,
1669
- description: "Minutes without a bundle request, client log or Stim command before the dev server stops; 0 never"
1739
+ default: 15,
1740
+ description: "Read as idle.minutes while idle.minutes is unset, when it is the smaller of the two; 0 never"
1670
1741
  },
1671
1742
  {
1672
1743
  key: "devices.idleShutdownMinutes",
@@ -1676,8 +1747,8 @@ const SETTINGS = [
1676
1747
  minimum: 0
1677
1748
  },
1678
1749
  scopes: EVERY,
1679
- default: 30,
1680
- description: "Minutes an owned simulator or emulator stays idle before the workspace supervisor, or automatic maintenance when no supervisor runs, shuts it down; 0 never"
1750
+ default: 15,
1751
+ description: "Read as idle.minutes while idle.minutes is unset, when it is the smaller of the two; 0 never"
1681
1752
  },
1682
1753
  {
1683
1754
  key: "devices.reclaimIdleMinutes",
@@ -1688,7 +1759,7 @@ const SETTINGS = [
1688
1759
  },
1689
1760
  scopes: EVERY,
1690
1761
  default: 10,
1691
- description: "Minutes an owned simulator or emulator stays idle before a waiting run reclaims its device slot; 0 never"
1762
+ description: "Not read: while a run waits for a device slot, the stim-daemon shuts down the longest-idle device of another workspace idle 2 minutes or more"
1692
1763
  },
1693
1764
  {
1694
1765
  key: "macos.product",
@@ -1890,7 +1961,7 @@ const SETTINGS = [
1890
1961
  scopes: MACHINE,
1891
1962
  default: "xcode",
1892
1963
  desktopDefault: "stim-desktop",
1893
- description: "App that displays an owned iOS simulator; stim-desktop by default when Stim Desktop is installed"
1964
+ description: "App that displays an owned iOS simulator, or none to open no viewer; stim-desktop by default when Stim Desktop is installed"
1894
1965
  },
1895
1966
  {
1896
1967
  key: "androidEmulatorApp",
@@ -1909,7 +1980,7 @@ const SETTINGS = [
1909
1980
  scopes: MACHINE,
1910
1981
  default: 0,
1911
1982
  env: "STIM_MAX_BUILDS",
1912
- description: "Concurrent native builds; 0 means no limit"
1983
+ description: "Concurrent native builds; 0 derives max(1, floor(CPU cores / 6))"
1913
1984
  },
1914
1985
  {
1915
1986
  key: "concurrency.maxDevices",
@@ -1917,7 +1988,7 @@ const SETTINGS = [
1917
1988
  scopes: MACHINE,
1918
1989
  default: 0,
1919
1990
  env: "STIM_MAX_DEVICES",
1920
- description: "Booted owned iOS simulators and Android emulators together, and, separately, hosted macOS apps; 0 means no limit"
1991
+ description: "Booted owned iOS simulators and Android emulators together; local and hosted macOS apps use separate pools; 0 derives max(2, floor((RAM - 4 GB) / 1.5 GB))"
1921
1992
  },
1922
1993
  {
1923
1994
  key: "concurrency.maxIosDevices",
@@ -1941,7 +2012,7 @@ const SETTINGS = [
1941
2012
  scopes: MACHINE,
1942
2013
  default: 0,
1943
2014
  env: "STIM_MAX_MACOS_APPS",
1944
- description: "Hosted macOS apps, also bounded by concurrency.maxDevices; 0 means no per-platform limit"
2015
+ description: "Local and hosted macOS apps in separate pools, also bounded by concurrency.maxDevices; 0 means no per-platform limit"
1945
2016
  },
1946
2017
  {
1947
2018
  key: "budget.minFreeDiskGb",
@@ -1949,8 +2020,7 @@ const SETTINGS = [
1949
2020
  scopes: MACHINE,
1950
2021
  default: 20,
1951
2022
  env: "STIM_BUDGET_MIN_FREE_DISK_GB",
1952
- scopedHomeValue: 0,
1953
- description: "Free disk, in GB, ios, android and start reclaim toward; 0 reclaims only below the hard floor"
2023
+ description: "Free disk, in GB, on a volume Stim writes to below which the pressure level is high and the stim-daemon reclaims; 0 turns the high disk level off"
1954
2024
  },
1955
2025
  {
1956
2026
  key: "budget.hardFloorDiskGb",
@@ -1958,8 +2028,15 @@ const SETTINGS = [
1958
2028
  scopes: MACHINE,
1959
2029
  default: 5,
1960
2030
  env: "STIM_BUDGET_HARD_FLOOR_DISK_GB",
1961
- scopedHomeValue: 0,
1962
- description: "Free disk, in GB, below which ios, android and start refuse with STIM_LOW_DISK; 0 never refuses"
2031
+ description: "Free disk, in GB, below which start, ios and android refuse with STIM_LOW_DISK after the stim-daemon's pressure ladder ran; 0 never refuses"
2032
+ },
2033
+ {
2034
+ key: "disk.criticalFreeGb",
2035
+ type: GIGABYTES,
2036
+ scopes: MACHINE,
2037
+ default: 6,
2038
+ env: "STIM_DISK_CRITICAL_FREE_GB",
2039
+ description: "Free disk, in GB, on a volume Stim writes to below which the pressure level is critical: the stim-daemon empties the Metro and compilation caches and deletes the devices of idle workspaces and their node_modules and Pods; 0 turns the critical disk level off"
1963
2040
  },
1964
2041
  {
1965
2042
  key: "budget.maxCommittedMemoryGb",
@@ -1967,7 +2044,7 @@ const SETTINGS = [
1967
2044
  scopes: MACHINE,
1968
2045
  env: "STIM_BUDGET_MAX_COMMITTED_MEMORY_GB",
1969
2046
  scopedHomeValue: 0,
1970
- description: "Estimated memory, in GB, of active environments before idle ones are reclaimed; unset is 60% of RAM, 0 is off"
2047
+ description: "Not read: the stim-daemon's pressure ladder replaced the per-command budget"
1971
2048
  },
1972
2049
  {
1973
2050
  key: "budget.maxLiveWorkspaces",
@@ -1975,7 +2052,7 @@ const SETTINGS = [
1975
2052
  scopes: MACHINE,
1976
2053
  env: "STIM_BUDGET_MAX_LIVE_WORKSPACES",
1977
2054
  scopedHomeValue: 0,
1978
- description: "Active workspaces before idle ones are reclaimed; unset or 0 means no limit"
2055
+ description: "Not read: the stim-daemon's pressure ladder replaced the per-command budget"
1979
2056
  },
1980
2057
  {
1981
2058
  key: "maintenance.mode",
@@ -2004,7 +2081,7 @@ const SETTINGS = [
2004
2081
  scopes: MACHINE,
2005
2082
  default: 1,
2006
2083
  env: "STIM_MAINTENANCE_PRESSURE_CHECK_MINUTES",
2007
- description: "Disk and memory check interval in minutes"
2084
+ description: "Not read: the stim-daemon measures disk and memory every tick"
2008
2085
  },
2009
2086
  {
2010
2087
  key: "maintenance.sizeCheckMinutes",
@@ -2073,7 +2150,7 @@ const SETTINGS = [
2073
2150
  scopes: MACHINE,
2074
2151
  default: "warning",
2075
2152
  env: "STIM_MAINTENANCE_MEMORY_PRESSURE_LEVEL",
2076
- description: "Lowest macOS memory pressure level considered; off disables memory pressure reporting"
2153
+ description: "off: automatic maintenance names no memory culprits and stim gc --cache gradle-daemons never stops a daemon for memory; otherwise the stim-daemon's memory level (warning for 10 minutes, or critical) decides"
2077
2154
  },
2078
2155
  {
2079
2156
  key: "maintenance.memoryWarningMinutes",
@@ -2085,7 +2162,7 @@ const SETTINGS = [
2085
2162
  scopes: MACHINE,
2086
2163
  default: 10,
2087
2164
  env: "STIM_MAINTENANCE_MEMORY_WARNING_MINUTES",
2088
- description: "Consecutive warning minutes before memory counts as pressure"
2165
+ description: "Not read: the stim-daemon's pressure level counts macOS memory pressure warning for 10 minutes"
2089
2166
  },
2090
2167
  {
2091
2168
  key: "maintenance.minAvailableMemoryGb",
@@ -2095,7 +2172,7 @@ const SETTINGS = [
2095
2172
  },
2096
2173
  scopes: MACHINE,
2097
2174
  env: "STIM_MAINTENANCE_MIN_AVAILABLE_MEMORY_GB",
2098
- description: "Available-memory threshold in GiB; unset is 10% of RAM"
2175
+ description: "Not read: the stim-daemon's pressure level is high while available memory is under 10% of RAM"
2099
2176
  },
2100
2177
  {
2101
2178
  key: "maintenance.capTargetPercent",
@@ -2132,7 +2209,7 @@ const SETTINGS = [
2132
2209
  scopes: MACHINE,
2133
2210
  default: 5,
2134
2211
  env: "STIM_MAINTENANCE_IDLE_CHECK_MINUTES",
2135
- description: "Interval in minutes of the check that shuts down owned simulators and emulators idle for devices.idleShutdownMinutes, also with no dev server running, and stops workspaces idle for maintenance.idleStopHours"
2212
+ description: "Interval in minutes of the automatic maintenance check that stops a workspace with a device hosted on a remote Mac once it is idle for maintenance.idleStopHours; the stim-daemon decides idle for other workspaces every minute (idle.minutes)"
2136
2213
  },
2137
2214
  {
2138
2215
  key: "maintenance.idleStopHours",
@@ -2143,7 +2220,7 @@ const SETTINGS = [
2143
2220
  scopes: EVERY,
2144
2221
  default: 6,
2145
2222
  env: "STIM_MAINTENANCE_IDLE_STOP_HOURS",
2146
- description: "Hours with no native run, Metro bundle or HMR request, agent-device command, Stim command or live view of a local device before automatic maintenance and gc --delete stop a workspace's dev server and shut down its owned or hosted simulators and emulators, as stim stop does, and stim-server stops a hosted session whose client has been gone that long; device and app log lines do not count; 0 never"
2223
+ description: "Hours with no native run, Metro bundle or HMR request, agent-device command, Stim command, input forwarded to a device or use of its frontmost device window before gc --delete stops a workspace's dev server and shuts down its owned or hosted simulators and emulators, as stim stop does, automatic maintenance does the same for a workspace with a hosted device, and stim-server stops a hosted session whose client has been gone that long; device and app log lines do not count; 0 never"
2147
2224
  },
2148
2225
  {
2149
2226
  key: "maintenance.sweepHours",
@@ -2179,7 +2256,7 @@ const SETTINGS = [
2179
2256
  scopes: MACHINE,
2180
2257
  default: 3,
2181
2258
  env: "STIM_MAINTENANCE_DEVICE_IDLE_DAYS",
2182
- description: "Days a workspace stays idle before the age sweep deletes its owned simulators and emulators; 0 turns that off"
2259
+ description: "Not read: idle.dormantDays deletes the owned devices of a workspace without activity"
2183
2260
  },
2184
2261
  {
2185
2262
  key: "maintenance.protectRecentHours",
@@ -2199,7 +2276,7 @@ const SETTINGS = [
2199
2276
  scopes: MACHINE,
2200
2277
  default: 12,
2201
2278
  env: "STIM_MAINTENANCE_URGENT_FREE_DISK_GB",
2202
- description: "Free disk, in GB, below which automatic maintenance reports disk pressure level 2; 0 turns that threshold off"
2279
+ description: "Not read: budget.minFreeDiskGb and disk.criticalFreeGb set the stim-daemon's pressure levels"
2203
2280
  },
2204
2281
  {
2205
2282
  key: "maintenance.criticalFreeDiskGb",
@@ -2207,7 +2284,7 @@ const SETTINGS = [
2207
2284
  scopes: MACHINE,
2208
2285
  default: 6,
2209
2286
  env: "STIM_MAINTENANCE_CRITICAL_FREE_DISK_GB",
2210
- description: "Free disk, in GB, below which automatic maintenance enters disk pressure level 3, also at or below budget.hardFloorDiskGb; 0 leaves only the hard floor"
2287
+ description: "Not read: disk.criticalFreeGb sets the stim-daemon's critical pressure level"
2211
2288
  },
2212
2289
  {
2213
2290
  key: "maintenance.pressureProtectMinutes",
@@ -2219,7 +2296,7 @@ const SETTINGS = [
2219
2296
  scopes: MACHINE,
2220
2297
  default: 10,
2221
2298
  env: "STIM_MAINTENANCE_PRESSURE_PROTECT_MINUTES",
2222
- description: "Protection window, in minutes, that replaces maintenance.protectRecentHours at disk pressure levels 2 and 3, except for workspace build outputs and build directories, which level 2 keeps for 15 minutes after the last ios, android or macos run"
2299
+ description: "Not read: the stim-daemon's pressure ladder never touches a workspace with a blocker and takes the longest-idle first"
2223
2300
  },
2224
2301
  {
2225
2302
  key: "maintenance.gradleVersionIdleDays",
@@ -2231,7 +2308,7 @@ const SETTINGS = [
2231
2308
  scopes: MACHINE,
2232
2309
  default: 7,
2233
2310
  env: "STIM_MAINTENANCE_GRADLE_VERSION_IDLE_DAYS",
2234
- description: "At disk pressure level 3, stop idle Gradle and Kotlin daemons, then delete the Gradle version caches and wrapper distributions no registered project pins once their directories are unmodified this many days; 0 turns this off"
2311
+ description: "Days an unpinned Gradle version's caches and wrapper distribution stay unmodified before the stim-daemon deletes them, on its daily sweep or at once under disk pressure, after stopping the idle Gradle and Kotlin daemons that keep them; 0 turns this off"
2235
2312
  },
2236
2313
  {
2237
2314
  key: "maintenance.removeFinishedWorktrees",
@@ -2337,6 +2414,22 @@ const SETTINGS = [
2337
2414
  scopedHomeValue: 0,
2338
2415
  description: "Parked emulators kept for adoption; 0 turns parking off"
2339
2416
  },
2417
+ {
2418
+ key: "daemon.mode",
2419
+ type: {
2420
+ kind: "choice",
2421
+ choices: [
2422
+ "on",
2423
+ "report",
2424
+ "off"
2425
+ ]
2426
+ },
2427
+ scopes: MACHINE,
2428
+ default: "on",
2429
+ env: "STIM_DAEMON",
2430
+ ciValue: "off",
2431
+ description: "The per-home stim-daemon that start, ios, android, web, macos and revive start and that exits once nothing runs in the home and every workspace is dormant or removed. on: it decides idle, stopping idle workspaces and deleting their regenerable build outputs, and runs automatic maintenance. report: it logs what it would do and acts on nothing. off: no daemon; each dev server supervisor times its own idle stop, and doctor, start, ios and android run automatic maintenance in their own process. The daemon keeps the mode it started with, STIM_DAEMON included, unless the machine setting later turns stricter, and the CI and non-sensitive setting environment overrides of the command that started it for its whole life. Off in CI unless STIM_DAEMON is set. Windows has no daemon and works as off"
2432
+ },
2340
2433
  {
2341
2434
  key: "debug.logs",
2342
2435
  type: { kind: "boolean" },
@@ -2376,6 +2469,38 @@ const SETTINGS = [
2376
2469
  default: false,
2377
2470
  description: "Whether a machine approved for builds or device hosting here may update this machine's stim-server service to that machine's own stim-server build; releases from npm need no setting"
2378
2471
  },
2472
+ {
2473
+ key: "share.exposure",
2474
+ type: {
2475
+ kind: "choice",
2476
+ choices: SHARE_EXPOSURES
2477
+ },
2478
+ scopes: MACHINE,
2479
+ default: "auto",
2480
+ description: "How stim share is reached from the internet: tailscale through a Tailscale Funnel route, proxy through your own reverse proxy that forwards to a loopback port, auto tailscale when the tailscale command is installed and logged in, else proxy. proxy never runs tailscale serve or tailscale funnel"
2481
+ },
2482
+ {
2483
+ key: "share.publicUrl",
2484
+ type: {
2485
+ kind: "string",
2486
+ pattern: "^https://[^\\s/?#@]+(/[^\\s?#]*)?$",
2487
+ patternHelp: "an https origin, optionally with a path prefix, such as https://demo.example.com"
2488
+ },
2489
+ scopes: MACHINE,
2490
+ description: "The https address your reverse proxy serves shares under in proxy mode, optionally with a path prefix that the proxy leaves on the path, such as https://demo.example.com. Share links print under it and its origin is the only one the frame socket accepts. Without it proxy mode prints a loopback link and a warning"
2491
+ },
2492
+ {
2493
+ key: "share.port",
2494
+ type: {
2495
+ kind: "number",
2496
+ integer: true,
2497
+ minimum: 1024,
2498
+ maximum: 65535
2499
+ },
2500
+ scopes: MACHINE,
2501
+ default: SHARE_DEFAULT_PORT,
2502
+ description: "The loopback port the share listener binds in proxy mode, so your reverse proxy can name it. It is not used in tailscale mode, which picks a free port"
2503
+ },
2379
2504
  {
2380
2505
  key: "server.lanAddresses",
2381
2506
  type: { kind: "strings" },
@@ -2433,6 +2558,13 @@ const SETTINGS = [
2433
2558
  env: "STIM_REMOTE_BUILD",
2434
2559
  description: "Where iOS simulator Debug, Android emulator debug and macOS SwiftPM Debug builds run: local here; auto here while it has a free concurrency.maxBuilds slot and load under server.maxLoadPerCore, otherwise on a remote.machines entry; remote on a remote.machines entry in order, here only when none takes the build; remote-only the same but never here; a machine name exactly that machine without fallback. The ios, android and macos --remote-build flag overrides this setting and its environment override"
2435
2560
  },
2561
+ {
2562
+ key: "server.maxOffloadedBuilds",
2563
+ type: CAPACITY,
2564
+ scopes: MACHINE,
2565
+ default: 0,
2566
+ description: "Builds from other machines this machine runs at once, across every client; 0 means no limit. server.maxLoadPerCore, concurrency.maxBuilds and the free disk floor still apply"
2567
+ },
2436
2568
  {
2437
2569
  key: "server.maxLoadPerCore",
2438
2570
  type: {
@@ -2449,18 +2581,6 @@ const SETTINGS = [
2449
2581
  scopes: MACHINE,
2450
2582
  description: "Directory where stim-server keeps the checkouts, dependencies and build state of the machines that build here; default $STIM_HOME/build-worker"
2451
2583
  },
2452
- {
2453
- key: "server.gradleDaemonIdleMinutes",
2454
- type: {
2455
- kind: "number",
2456
- integer: true,
2457
- minimum: 0,
2458
- maximum: 35791
2459
- },
2460
- scopes: MACHINE,
2461
- default: 30,
2462
- description: "Minutes the Gradle daemon of an Android build another machine sent here stays warm after the build; 0 stops it when the build ends"
2463
- },
2464
2584
  {
2465
2585
  key: "caches.buildCache",
2466
2586
  type: ABSOLUTE_PATH,
@@ -2648,6 +2768,12 @@ function maxLoadPerCore() {
2648
2768
  if (typeof value === "number" && Number.isFinite(value) && value > 0) return value;
2649
2769
  return settingDefinition("server.maxLoadPerCore").default;
2650
2770
  }
2771
+ /** `server.maxOffloadedBuilds`: how many builds from other machines run here at once, 0 when unlimited. */
2772
+ function maxOffloadedBuilds() {
2773
+ const value = loadConfig()?.server?.maxOffloadedBuilds;
2774
+ if (typeof value === "number" && Number.isInteger(value) && value >= 0) return value;
2775
+ return Number(settingDefinition("server.maxOffloadedBuilds")?.default ?? 0);
2776
+ }
2651
2777
  function liveNativeBuilds() {
2652
2778
  const dir = join(configDir(), "workspaces");
2653
2779
  let names;
@@ -2693,7 +2819,7 @@ function machineCapacity() {
2693
2819
  return {
2694
2820
  ...loadPerCore(),
2695
2821
  builds: liveNativeBuilds() + liveOffloadedSlots(),
2696
- maxBuilds: getConcurrencyLimits().maxBuilds,
2822
+ maxBuilds: admissionLimits().maxBuilds,
2697
2823
  maxLoadPerCore: maxLoadPerCore()
2698
2824
  };
2699
2825
  }
@@ -4811,6 +4937,7 @@ function settingsJsonSchema() {
4811
4937
  //#region state/status.ts
4812
4938
  const BUILD_PHASES = [
4813
4939
  "prepare",
4940
+ "cleanup",
4814
4941
  "cache-lookup",
4815
4942
  "wait",
4816
4943
  "prebuild",
@@ -5163,7 +5290,36 @@ function readIdleStop(state) {
5163
5290
  idleMinutes: record.idleMinutes
5164
5291
  };
5165
5292
  }
5293
+ const IDLE_STAGE_KEY = "idleStage";
5294
+ function readIdleStage(state) {
5295
+ const record = state?.[IDLE_STAGE_KEY];
5296
+ if (!isJsonObject(record) || typeof record.at !== "string" || typeof record.idleMinutes !== "number") return null;
5297
+ return {
5298
+ at: record.at,
5299
+ idleMinutes: record.idleMinutes,
5300
+ freedBytes: typeof record.freedBytes === "number" ? record.freedBytes : 0
5301
+ };
5302
+ }
5303
+ const DORMANT_STAGE_KEY = "dormantStage";
5304
+ function readDormantStage(state) {
5305
+ const record = state?.[DORMANT_STAGE_KEY];
5306
+ if (!isJsonObject(record) || typeof record.at !== "string" || typeof record.dormantDays !== "number") return null;
5307
+ return {
5308
+ at: record.at,
5309
+ dormantDays: record.dormantDays,
5310
+ deletedDevices: Array.isArray(record.deletedDevices) ? record.deletedDevices.filter((entry) => typeof entry === "string") : [],
5311
+ archived: record.archived === true
5312
+ };
5313
+ }
5314
+ const INTERACTIONS_KEY = "interactions";
5315
+ /** When a person last used each device slot's focused Simulator or emulator window, by device slot key. */
5316
+ function readInteractions(state) {
5317
+ const records = state?.[INTERACTIONS_KEY];
5318
+ if (!isJsonObject(records)) return {};
5319
+ return Object.fromEntries(Object.entries(records).filter((entry) => typeof entry[1] === "string" && Number.isFinite(Date.parse(entry[1]))));
5320
+ }
5166
5321
  const DEVICE_RECLAIM_REASON = "reclaimed for a waiting run";
5322
+ const DEVICE_METRO_IDLE_STOP_REASON = "Metro's idle stop";
5167
5323
  const DEVICE_IDLE_SHUTDOWN_KEY = "deviceIdleShutdowns";
5168
5324
  /** The recorded idle shutdowns by device slot key (`ios`, `android`, `ios:<slot>`). */
5169
5325
  function readDeviceIdleShutdowns(state) {
@@ -5189,7 +5345,8 @@ function readDevServerStopRequest(state) {
5189
5345
  by: record.by,
5190
5346
  pid: record.pid,
5191
5347
  at: record.at,
5192
- ...typeof record.workspace === "string" ? { workspace: record.workspace } : {}
5348
+ ...typeof record.workspace === "string" ? { workspace: record.workspace } : {},
5349
+ ...typeof record.idleMinutes === "number" ? { idleMinutes: record.idleMinutes } : {}
5193
5350
  };
5194
5351
  }
5195
5352
  function readDevServerStop(state) {
@@ -5476,16 +5633,18 @@ function readWorkspaceAgent(state) {
5476
5633
  function parseViewedDevices(value) {
5477
5634
  if (!Array.isArray(value)) return [];
5478
5635
  return value.flatMap((entry) => {
5479
- const { platform, id } = entry ?? {};
5480
- return (platform === "ios" || platform === "android") && typeof id === "string" && id ? [{
5636
+ const { platform, id, lastInputAt } = entry ?? {};
5637
+ if (platform !== "ios" && platform !== "android" || typeof id !== "string" || !id) return [];
5638
+ return [{
5481
5639
  platform,
5482
- id
5483
- }] : [];
5640
+ id,
5641
+ ...typeof lastInputAt === "string" && Number.isFinite(Date.parse(lastInputAt)) ? { lastInputAt } : {}
5642
+ }];
5484
5643
  });
5485
5644
  }
5486
5645
  /**
5487
- * The devices a running stim-server streams frames of. A record whose server is not proven to be the same live
5488
- * process counts for nothing.
5646
+ * The devices a running stim-server streams frames of or forwarded input to. A record whose server is not proven to
5647
+ * be the same live process counts for nothing.
5489
5648
  */
5490
5649
  function readViewedDevices(dir = deviceViewersDir()) {
5491
5650
  let names;
@@ -5501,6 +5660,15 @@ function readViewedDevices(dir = deviceViewersDir()) {
5501
5660
  });
5502
5661
  }
5503
5662
  //#endregion
5663
+ //#region state/daemon.ts
5664
+ function isDaemonSnapshot(record) {
5665
+ return record?.version === 1 && typeof record.pid === "number" && typeof record.startedAt === "string" && typeof record.tickAt === "string" && typeof record.intervalMs === "number";
5666
+ }
5667
+ function readDaemonSnapshot(file = daemonSnapshotFile()) {
5668
+ const record = readJsonObject(file);
5669
+ return isDaemonSnapshot(record) ? record : null;
5670
+ }
5671
+ //#endregion
5504
5672
  //#region state/stats.ts
5505
5673
  const STATS_VERSION = 1;
5506
5674
  /** Where a compiling build ran: here, on a remote machine, or here after offloading it failed. */
@@ -5790,6 +5958,9 @@ function normalizeBucket(bucket) {
5790
5958
  coldRunMs: count(bucket.coldRunMs),
5791
5959
  hitRuns: count(bucket.hitRuns),
5792
5960
  hitRunMs: count(bucket.hitRunMs),
5961
+ ...count(bucket.coldCleanupMs) > 0 ? { coldCleanupMs: count(bucket.coldCleanupMs) } : {},
5962
+ ...count(bucket.hitCleanupMs) > 0 ? { hitCleanupMs: count(bucket.hitCleanupMs) } : {},
5963
+ ...count(bucket.offloadedCleanupMs) > 0 ? { offloadedCleanupMs: count(bucket.offloadedCleanupMs) } : {},
5793
5964
  timeSavedMs: count(bucket.timeSavedMs),
5794
5965
  firstRunAt: timestamp(bucket.firstRunAt),
5795
5966
  lastRunAt: timestamp(bucket.lastRunAt),
@@ -6413,7 +6584,7 @@ function hostedIosStatus(placement) {
6413
6584
  ...placement.reason ? { reason: placement.reason } : {},
6414
6585
  agent: placement.agent,
6415
6586
  device: placement.device ? {
6416
- name: placement.device.deviceType,
6587
+ name: placement.device.name,
6417
6588
  runtime: placement.device.runtime
6418
6589
  } : null
6419
6590
  };
@@ -6614,7 +6785,8 @@ const KINDS = [
6614
6785
  "would-delete-dependencies",
6615
6786
  "would-stop-gradle-daemons",
6616
6787
  "would-delete-gradle-version",
6617
- "would-delete-temp-leftovers"
6788
+ "would-delete-temp-leftovers",
6789
+ "would-delete-trash"
6618
6790
  ];
6619
6791
  /** Rejects missing, corrupt or unsupported payloads without throwing. */
6620
6792
  function parseMaintenanceState(value) {
@@ -6669,10 +6841,6 @@ function parseMaintenanceState(value) {
6669
6841
  function readMaintenanceState() {
6670
6842
  return parseMaintenanceState(readJsonObject(maintenanceStateFile()));
6671
6843
  }
6672
- function readMaintenanceAttempt() {
6673
- const value = readJsonObject(maintenanceAttemptFile())?.attemptedAt;
6674
- return finite(value) ? value : void 0;
6675
- }
6676
6844
  //#endregion
6677
6845
  //#region state/gc-log.ts
6678
6846
  const TRIGGERS = [
@@ -6939,4 +7107,4 @@ function isSetupJournalPrunable(journal, now) {
6939
7107
  return Date.parse(journal.expiresAt) + 36e5 < now;
6940
7108
  }
6941
7109
  //#endregion
6942
- export { ACTIVITY_RECENCY_BASES, AGENT_TOOLS, ANDROID_COMPILER_CACHE_CHOICES, ANDROID_EMULATOR_APPS, ANDROID_PCH_CHOICES, APP_PROCESS_STATES, BUILD_HISTORY_KEY, BUILD_HISTORY_LIMIT, BUILD_LEDGER_CAP, BUILD_PHASES, BUILD_RESULTS, CAPACITY_REFUSAL_LIMIT, CAPACITY_REFUSAL_MAX_AGE_MS, DEBUG_ENV, DEFAULT_SERVER_PORT, DEVICE_HOST_LIMITS, DEVICE_IDLE_SHUTDOWN_KEY, DEVICE_RECLAIM_REASON, DEV_SERVER_STOP_REQUEST_KEY, ENDED_AGENT_RETENTION_MS, ERROR_SOURCES, FINGERPRINT_MEMO_SCHEMA, HISTORY_LIMIT, HOSTED_AGENT_DRIVERS, HOSTED_APP_CHUNK_BYTES, HOSTED_LOGS_FIRST_BYTES, HOSTED_LOGS_PAGE_BYTES, HOSTED_MACOS_APP_SLOTS, HOSTED_METRO_LINKS_KEY, HOSTED_METRO_REQUESTS_KEY, HOSTED_PARKED_CANDIDATES, IDLE_STOP_KEY, IOS_SIMULATOR_APPS, KeyedEntities, LAST_BUILD_KEYS, LEVELS, MACHINE_CREDENTIALS_VERSION, MACHINE_OWNER_KINDS, MAINTENANCE_LOG_NAME, MEMORY_SOURCES, NATIVE_BUILD_STEPS, NATIVE_CRASH_LOG_PREFIX, PHYSICAL_DEVICE_CONNECTIONS, PLACEMENT_DECISIONS, PLACEMENT_WORDS, READY_PHASE_MS, RECORDING_CAP_BYTES, RECORDING_FOOTAGE_MS, RECORDING_PLATFORMS, REMOTE_DEVICE_BACKENDS, REPLACED_SETTINGS, RUN_ID_ENV, SETTINGS, SETTINGS_SCHEMA_FILE, SETTINGS_SCHEMA_URL, SETTING_GROUPS, SETTING_SCOPES, SOURCES, STATS_VERSION, STATUS_ISSUE_CODES, SUMMARY_ARCHIVES, TAILNET_MACHINE_PATTERN, TRACE_ENV, TUNNEL_MODES, TUTORIAL_VERSION, WARM_KEY, WEB_PAGE_STATES, WEB_VIEWPORTS, WORKSPACE_AGENT_KEY, WORKSPACE_PHASES, WORKSPACE_STAGE_KINDS, acceptsShape, advanceTail, agentDeviceStateDirs, agentDeviceStateDirsAsync, agentDeviceUsageFile, agentSessionOf, agentSessionsCacheFile, allMetroPorts, applyKeyedDelta, archiveDir, archiveEnabled, archiveLock, archiveRoot, archivedUsage, assertHostedDeviceLedger, attachExpoErrorContext, automaticMachineEnabled, budgetSweepFile, budgetSweepLock, buildCriteria, buildDiagnostics, buildLedgerDir, buildLedgerFile, buildLedgerLock, buildMachinesFile, buildMachinesLock, buildSlotPath, buildSlotsDir, buildWorkerRoot, bundleMarkerPlatform, cannotHost, capDrops, clientIdentity, clientIdentityKeyFile, closedSegmentName, coerceSettingText, compileGrep, configCorruptRepair, configLockPath, countErrorEntries, createAgentActionReader, createAsyncAgentActionReader, createDebugLog, createNdjsonTail, createdDevicesFile, createdDevicesLock, currentTailnet, debugLogDir, debugLoggingEnabled, decodeStats, deviceHostArea, deviceHostMachinesClaims, deviceHostMachinesFile, deviceHostMachinesLock, deviceHostRoot, deviceViewersDir, diskUsageCacheDir, diskUsageCacheFile, diskUsageFailureFile, diskUsageWalkClaims, easMachineStateRoot, easSessionLedgerFile, easSessionLedgerLock, emulatorLogFile, endedAgentSessionOf, endpoint, expectedShape, fileIdentity, fileSizes, findEnclosingWorktreeRoot, findPeer, findProjectRoot, fingerprintMemoDir, fingerprintMemoFile, fingerprintMemoLock, followLogs, footageDrops, gcLogDir, gcLogFile, getConcurrencyLimits, getConfigPath, getParkedMax, getPlatformDeviceLimits, getProject, getProjectSettings, getRepoSettings, gitMergeCacheDir, gitMergeCacheFile, hostedAgentDriverName, hostedAndroidDeviceName, hostedAndroidPlacements, hostedAndroidRecords, hostedAndroidStatus, hostedAppArea, hostedAppAttempt, hostedAppBlobs, hostedConsolePort, hostedDeviceId, hostedIdleStopHours, hostedIosPlacements, hostedIosRecords, hostedIosStatus, hostedMacosAppSlot, hostedMacosBundleId, hostedMacosLogsDir, hostedMemoryRefusal, hostedMetroLinks, hostedMetroRequests, hostedNativeLogsDir, hostedNativeRecords, hostedWorkerSettleMs, isBuildLedgerRecord, isExpoErrorContext, isGcLogRecord, isJournalExpired, isJsonObject, isLayeredSetting, isPathPrefix, isSensitiveReference, isSetupJournalPrunable, lastNativeUseFrom, lastUseFrom, levelRank, linkReplacedArchives, listRecordedDevices, listRecordedDevicesAsync, listSegments, listSegmentsAsync, listStatusCacheEntries, loadConfig, loadPerCore, loadState, localEndpoint, logFiles, machineCacheUsageFile, machineCapacity, machineEndpoint, macosAppState, maintenanceAttemptFile, maintenanceChildLogFile, maintenanceDir, maintenanceNdjsonFile, maintenanceRunClaims, maintenanceStateFile, markerWindow, maxLoadPerCore, mayRunHere, offloadSummary, openLogDir, openSegmentName, parseHostedAgentAccess, parseHostedAgentGrant, parseHostedAndroidDevice, parseHostedAndroidPlacement, parseHostedAppManifest, parseHostedAppOffer, parseHostedChoice, parseHostedDevice, parseHostedIosPlacement, parseHostedLocalDeviceCount, parseHostedLocalPlatformCounts, parseHostedLogsCursor, parseHostedMacosChoice, parseHostedMacosDevice, parseHostedMacosPlacement, parseHostedNativeOffer, parseHostedNativePlacement, parseHostedOfferRequest, parseHostedPlatformDevice, parseHostedRequest, parseMachine, parseMachineCredential, parseMacosRecord, parseMaintenanceState, parseMissReason, parseNdjsonLine, parseNdjsonText, parseSetupJournal, parseSince, parseTailnetIdentity, placementWord, planLogQuery, prefersRemote, projectRootDirectories, pullRequestCacheDir, pullRequestCacheFile, queryJsonLogs, queryLogs, readAgentDeviceUsage, readAgentDeviceUsageCache, readAgentSessionsCache, readArchive, readArchiveAsync, readArchiveState, readArchives, readArchivesAsync, readBuildDetail, readBuildHistory, readBuildLedger, readBuildMachines, readCreatedDevices, readDevServerStop, readDevServerStopRequest, readDeviceHostMachines, readDeviceIdleShutdowns, readDevicePlacement, readDiskUsage, readDiskUsageFailure, readEasSessionLedger, readEndedAgentSessions, readFingerprintMemo, readGcLog, readHomeIdentity, readHostedApp, readHostedAppMetadata, readHostedDevice, readHostedDeviceLedger, readHostedMacosApp, readHostedNativeLogsCheckpoint, readHostedSessions, readIdleStop, readJsonFile, readJsonObject, readLastBuilds, readLogRecords, readLogTimeline, readLogsSince, readMachineCacheUsage, readMacosRecord, readMaintenanceAttempt, readMaintenanceState, readNdjsonGenerations, readPullRequestCache, readRunEstimates, readSetupJournal, readStateFile, readStats, readStatsReport, readSwiftpmCacheUsage, readViewedDevices, readWarmRecord, readWorkspaceAgent, readWorkspaceState, recordMatches, recordedBytes, recordingDeviceName, recordingEnabled, redactArgv, redactCommandLine, rememberHostedAppBlobRename, replacementAdvice, requireAutomaticMachine, runId, sameTailnet, saturation, serverLocalSocket, serverSetupDir, settingDefinition, settingValueError, settingsJsonSchema, setupJournalFile, sharedCcache, sharedCompilationCache, sharedGradle, sharedPods, sortByTs, statsFile, statsProjectKey, statusViews, stimBuildDigest, supervisorLogFile, supervisorPidFile, swiftpmCacheUsageFile, tailRead, tailscaleEnv, trace, trashRoot, trimCapacityRefusals, trimCapacityWaits, trimSamples, tryAcquireBuildSlotClaim, unreadableHostedAndroid, unreadableHostedIos, unreadableHostedNative, validEasSessionClaim, validHostedAppArguments, validHostedAppBlob, validRunId, validateAutomaticPool, wholePhases, windowsShortDir, windowsShortDirKey, withConfigLock, withConfigLockAsync, withDerivedFacts, withGitChip, withStateReadCache, workspaceAgentDeviceDir, workspaceBuildDetailFile, workspaceDerivedData, workspaceEndedAgentsFile, workspaceEndedAgentsLock, workspaceGradleBuild, workspaceLastUsed, workspaceLightenedFile, workspaceLogErrorIndex, workspaceLogsDir, workspaceMetadataFile, workspaceRecordingsDir, workspaceStateFile, workspaceStateLock, workspaceSummary, worktreeArchiveRoot, wrongTailnet };
7110
+ export { ACTIVITY_RECENCY_BASES, AGENT_TOOLS, ANDROID_COMPILER_CACHE_CHOICES, ANDROID_EMULATOR_APPS, ANDROID_PCH_CHOICES, APP_PROCESS_STATES, BUILD_HISTORY_KEY, BUILD_HISTORY_LIMIT, BUILD_LEDGER_CAP, BUILD_PHASES, BUILD_RESULTS, CAPACITY_REFUSAL_LIMIT, CAPACITY_REFUSAL_MAX_AGE_MS, DEBUG_ENV, DEFAULT_SERVER_PORT, DEVICE_HOST_LIMITS, DEVICE_IDLE_SHUTDOWN_KEY, DEVICE_METRO_IDLE_STOP_REASON, DEVICE_RECLAIM_REASON, DEV_SERVER_STOP_REQUEST_KEY, DORMANT_STAGE_KEY, ENDED_AGENT_RETENTION_MS, ERROR_SOURCES, FINGERPRINT_MEMO_SCHEMA, HISTORY_LIMIT, HOSTED_AGENT_DRIVERS, HOSTED_APP_CHUNK_BYTES, HOSTED_LOGS_FIRST_BYTES, HOSTED_LOGS_PAGE_BYTES, HOSTED_MACOS_APP_SLOTS, HOSTED_METRO_LINKS_KEY, HOSTED_METRO_REQUESTS_KEY, HOSTED_PARKED_CANDIDATES, IDLE_STAGE_KEY, IDLE_STOP_KEY, INTERACTIONS_KEY, IOS_SIMULATOR_APPS, KeyedEntities, LAST_BUILD_KEYS, LEVELS, MACHINE_CREDENTIALS_VERSION, MACHINE_OWNER_KINDS, MAINTENANCE_LOG_NAME, MEMORY_SOURCES, NATIVE_BUILD_STEPS, NATIVE_CRASH_LOG_PREFIX, PHYSICAL_DEVICE_CONNECTIONS, PLACEMENT_DECISIONS, PLACEMENT_WORDS, READY_PHASE_MS, RECORDING_CAP_BYTES, RECORDING_FOOTAGE_MS, RECORDING_PLATFORMS, REMOTE_DEVICE_BACKENDS, REPLACED_SETTINGS, RUN_ID_ENV, SETTINGS, SETTINGS_SCHEMA_FILE, SETTINGS_SCHEMA_URL, SETTING_GROUPS, SETTING_SCOPES, SHARE_DEFAULT_PORT, SHARE_EXPOSURES, SOURCES, STATS_VERSION, STATUS_ISSUE_CODES, SUMMARY_ARCHIVES, TAILNET_MACHINE_PATTERN, TRACE_ENV, TUNNEL_MODES, TUTORIAL_VERSION, WARM_KEY, WEB_PAGE_STATES, WEB_VIEWPORTS, WORKSPACE_AGENT_KEY, WORKSPACE_PHASES, WORKSPACE_STAGE_KINDS, acceptsShape, admissionLimits, advanceTail, agentDeviceStateDirs, agentDeviceStateDirsAsync, agentDeviceUsageFile, agentSessionOf, agentSessionsCacheFile, allMetroPorts, applyKeyedDelta, archiveDir, archiveEnabled, archiveLock, archiveRoot, archivedUsage, assertHostedDeviceLedger, attachExpoErrorContext, automaticMachineEnabled, budgetSweepFile, budgetSweepLock, buildCriteria, buildDiagnostics, buildLedgerDir, buildLedgerFile, buildLedgerLock, buildMachinesFile, buildMachinesLock, buildSlotPath, buildSlotsDir, buildWorkerRoot, bundleMarkerPlatform, cannotHost, capDrops, clientIdentity, clientIdentityKeyFile, closedSegmentName, coerceSettingText, compileGrep, configCorruptRepair, configLockPath, countErrorEntries, createAgentActionReader, createAsyncAgentActionReader, createDebugLog, createNdjsonTail, createdDevicesFile, createdDevicesLock, currentTailnet, daemonClaimRoot, daemonDir, daemonNdjsonFile, daemonSnapshotFile, daemonSocket, debugLogDir, debugLoggingEnabled, decodeStats, derivedBuildCap, derivedDeviceCap, deviceHostArea, deviceHostMachinesClaims, deviceHostMachinesFile, deviceHostMachinesLock, deviceHostRoot, deviceViewersDir, diskUsageCacheDir, diskUsageCacheFile, diskUsageFailureFile, diskUsageWalkClaims, easMachineStateRoot, easSessionLedgerFile, easSessionLedgerLock, emulatorLogFile, endedAgentSessionOf, endpoint, expectedShape, fileIdentity, fileSizes, findEnclosingWorktreeRoot, findPeer, findProjectRoot, fingerprintMemoDir, fingerprintMemoFile, fingerprintMemoLock, followLogs, footageDrops, gcLogDir, gcLogFile, getConcurrencyLimits, getConfigPath, getParkedMax, getPlatformDeviceLimits, getProject, getProjectSettings, getRepoSettings, gitMergeCacheDir, gitMergeCacheFile, hostedAgentDriverName, hostedAndroidDeviceName, hostedAndroidPlacements, hostedAndroidRecords, hostedAndroidStatus, hostedAppArea, hostedAppAttempt, hostedAppBlobs, hostedConsolePort, hostedDeviceId, hostedIdleStopHours, hostedIosPlacements, hostedIosRecords, hostedIosStatus, hostedMacosAppSlot, hostedMacosBundleId, hostedMacosLogsDir, hostedMemoryRefusal, hostedMetroLinks, hostedMetroRequests, hostedNativeLogsDir, hostedNativeRecords, hostedWorkerSettleMs, isBuildLedgerRecord, isExpoErrorContext, isGcLogRecord, isJournalExpired, isJsonObject, isLayeredSetting, isPathPrefix, isSensitiveReference, isSetupJournalPrunable, lastNativeUseFrom, lastUseFrom, levelRank, linkReplacedArchives, listRecordedDevices, listRecordedDevicesAsync, listSegments, listSegmentsAsync, listStatusCacheEntries, loadConfig, loadPerCore, loadState, localEndpoint, logFiles, machineCacheUsageFile, machineCapacity, machineEndpoint, macosAppState, maintenanceChildLogFile, maintenanceDir, maintenanceNdjsonFile, maintenanceRunClaims, maintenanceStateFile, markerWindow, maxLoadPerCore, maxOffloadedBuilds, mayRunHere, offloadSummary, openLogDir, openSegmentName, parseHostedAgentAccess, parseHostedAgentGrant, parseHostedAndroidDevice, parseHostedAndroidPlacement, parseHostedAppManifest, parseHostedAppOffer, parseHostedChoice, parseHostedDevice, parseHostedIosPlacement, parseHostedLocalDeviceCount, parseHostedLocalPlatformCounts, parseHostedLogsCursor, parseHostedMacosChoice, parseHostedMacosDevice, parseHostedMacosPlacement, parseHostedNativeOffer, parseHostedNativePlacement, parseHostedOfferRequest, parseHostedPlatformDevice, parseHostedRequest, parseMachine, parseMachineCredential, parseMacosRecord, parseMaintenanceState, parseMissReason, parseNdjsonLine, parseNdjsonText, parseSetupJournal, parseSince, parseTailnetIdentity, placementWord, planLogQuery, prefersRemote, projectRootDirectories, pullRequestCacheDir, pullRequestCacheFile, queryJsonLogs, queryLogs, readAgentDeviceUsage, readAgentDeviceUsageCache, readAgentSessionsCache, readArchive, readArchiveAsync, readArchiveState, readArchives, readArchivesAsync, readBuildDetail, readBuildHistory, readBuildLedger, readBuildMachines, readCreatedDevices, readDaemonSnapshot, readDevServerStop, readDevServerStopRequest, readDeviceHostMachines, readDeviceIdleShutdowns, readDevicePlacement, readDiskUsage, readDiskUsageFailure, readDormantStage, readEasSessionLedger, readEndedAgentSessions, readFingerprintMemo, readGcLog, readHomeIdentity, readHostedApp, readHostedAppMetadata, readHostedDevice, readHostedDeviceLedger, readHostedMacosApp, readHostedNativeLogsCheckpoint, readHostedSessions, readIdleStage, readIdleStop, readInteractions, readJsonFile, readJsonObject, readLastBuilds, readLogRecords, readLogTimeline, readLogsSince, readMachineCacheUsage, readMacosRecord, readMaintenanceState, readNdjsonGenerations, readPullRequestCache, readRunEstimates, readSetupJournal, readStateFile, readStats, readStatsReport, readSwiftpmCacheUsage, readViewedDevices, readWarmRecord, readWorkspaceAgent, readWorkspaceState, recordMatches, recordedBytes, recordingDeviceName, recordingEnabled, redactArgv, redactCommandLine, rememberHostedAppBlobRename, replacementAdvice, requireAutomaticMachine, runId, sameTailnet, saturation, serverLocalSocket, serverSetupDir, settingDefinition, settingValueError, settingsJsonSchema, setupJournalFile, sharedCcache, sharedCompilationCache, sharedGradle, sharedPods, sortByTs, statsFile, statsProjectKey, statusViews, stimBuildDigest, supervisorLogFile, supervisorPidFile, swiftpmCacheUsageFile, tailRead, tailscaleEnv, trace, trashRoot, trimCapacityRefusals, trimCapacityWaits, trimSamples, tryAcquireBuildSlotClaim, unreadableHostedAndroid, unreadableHostedIos, unreadableHostedNative, validEasSessionClaim, validHostedAppArguments, validHostedAppBlob, validRunId, validateAutomaticPool, wholePhases, windowsShortDir, windowsShortDirKey, withConfigLock, withConfigLockAsync, withDerivedFacts, withGitChip, withStateReadCache, workspaceAgentDeviceDir, workspaceBuildDetailFile, workspaceDerivedData, workspaceEndedAgentsFile, workspaceEndedAgentsLock, workspaceGradleBuild, workspaceLastUsed, workspaceLightenedFile, workspaceLogErrorIndex, workspaceLogsDir, workspaceMetadataFile, workspaceRecordingsDir, workspaceStateFile, workspaceStateLock, workspaceSummary, worktreeArchiveRoot, wrongTailnet };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stim-cli/core",
3
- "version": "1.38.0",
3
+ "version": "1.40.0-next.20261103050129.gd5fe899",
4
4
  "description": "Shared internal cache and runtime primitives for Stim packages.",
5
5
  "license": "MIT",
6
6
  "repository": {