stim 1.19.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -3
- package/dist/{activity-BSw0x84R.mjs → activity-BrGh9EAI.mjs} +3 -3
- package/dist/{agent-device-usage-output-Bjxu_VmX.mjs → agent-device-usage-output-DVyv_hWj.mjs} +7 -7
- package/dist/android-0vv-OruW.mjs +6 -0
- package/dist/android-Brx6EKvJ.mjs +1258 -0
- package/dist/{android-BdQC6zs1.mjs → android-BsYNR81W.mjs} +103 -45
- package/dist/{android-DE5g_5gv.mjs → android-CK3fpEyZ.mjs} +2 -2
- package/dist/{android-cas-C87geAg-.mjs → android-cas-DCAuXryb.mjs} +9 -5
- package/dist/android-cas-compiler.mjs +1 -1
- package/dist/api-run.mjs +159 -8
- package/dist/{api-DIf_s86s.mjs → api-zuX3ynYN.mjs} +5 -1
- package/dist/api.d.mts +98 -4
- package/dist/api.mjs +1 -1
- package/dist/{app-install-CFI4ptUL.mjs → app-install-0LgaQRT7.mjs} +9 -8
- package/dist/artifact-CnC0mfov.mjs +807 -0
- package/dist/artifact-DClXJNWx.mjs +772 -0
- package/dist/artifact-lifecycle-DzPpBYvK.mjs +30 -0
- package/dist/{browser-web-CDhqQxhv.mjs → browser-web-CzBmhmgs.mjs} +19 -19
- package/dist/{budget-Dz-kyXLv.mjs → budget-BONq9vXY.mjs} +3101 -3062
- package/dist/build-BixRI6sB.mjs +462 -0
- package/dist/{build-facts-B87vo-Im.d.mts → build-facts-DcLv2HSd.d.mts} +1 -32
- package/dist/build-plan-CP0tckNU.mjs +553 -0
- package/dist/{cache-manifest-DiwKSyv9.mjs → cache-manifest-qA3dT2x2.mjs} +1 -1
- package/dist/cache-manifest.mjs +1 -1
- package/dist/{manifest-CX0d1IkZ.mjs → ccache-CjHQ5F8g.mjs} +13 -19
- package/dist/{chrome-BTUOo8p2.mjs → chrome-Dp2lMLBe.mjs} +1 -1
- package/dist/{cli-C9Zvgbdc.mjs → cli-B2R8wH1F.mjs} +20 -20
- package/dist/cli.mjs +1 -1
- package/dist/{client-CuUo8Nvg.mjs → client-BLy1Pw2V.mjs} +89 -307
- package/dist/collector-run.d.mts +4 -0
- package/dist/collector-run.mjs +7 -7
- package/dist/{command-output-Bt8ygHE7.mjs → command-output-BjPN99ZB.mjs} +2 -2
- package/dist/{config-DC5jEtd1.mjs → config-D0LhTY3S.mjs} +8 -12
- package/dist/{created-devices-D0s26Hx5.mjs → created-devices-HU_DAb_Q.mjs} +7 -6
- package/dist/{dependency-state-DKaS1OM9.mjs → dependency-state-B2m8eqsS.mjs} +2 -2
- package/dist/{detached-entry-pB_IPfV4.mjs → detached-entry-BXq4fIl-.mjs} +1 -1
- package/dist/{dev-client-CDY_zAmD.mjs → dev-client-ClATaJoH.mjs} +2 -2
- package/dist/{device-BHw0WlHl.mjs → device-B7lsC0K1.mjs} +8 -8
- package/dist/device-DVCwAFlX.mjs +727 -0
- package/dist/{device-capacity-BoN1jQkO.mjs → device-capacity-Ca_ke1LE.mjs} +13 -14
- package/dist/device-host-worker.mjs +38 -18
- package/dist/device-ios-CRUqPxKw.mjs +413 -0
- package/dist/{device-lease-Cu7PtQpZ.mjs → device-lease-DHOBXGgS.mjs} +135 -22
- package/dist/{device-lease-run-D38SnZtt.mjs → device-lease-run-CvDeHTkG.mjs} +4 -4
- package/dist/{device-pool-CP4rAsHx.mjs → device-pool-L2-5GxMy.mjs} +3 -3
- package/dist/{device-remote-B5GiUifk.mjs → device-remote-Bmg42063.mjs} +17 -68
- package/dist/doctor-C2MSuMMg.mjs +515 -0
- package/dist/{doctor-PRJH94v6.mjs → doctor-DPAqhVCK.mjs} +333 -744
- package/dist/{doctor-watchman-wZhyTdp4.mjs → doctor-watchman-CB4NnVZm.mjs} +13 -12
- package/dist/{simslim-D9LkJxIO.mjs → eas-build-Dw_ec2Km.mjs} +6 -152
- package/dist/{stim-installations-DbmUjsLv.mjs → eas-session-ledger-DZlC-Fq3.mjs} +57 -4
- package/dist/{error-diagnostics--v5HGOU0.mjs → error-diagnostics-Du7I_GuY.mjs} +17 -12
- package/dist/errors-DzkMYh8Q.mjs +205 -0
- package/dist/{exec-i8GDPwq9.mjs → exec-B81Qodjn.mjs} +40 -10
- package/dist/{gc-CyHMcKcn.mjs → gc-PWp34zGb.mjs} +21 -20
- package/dist/{device-ios-B2ruohE-.mjs → gradle-C2OEKCCI.mjs} +21 -650
- package/dist/{guide-dRaQJJk9.mjs → guide-Dai9lphv.mjs} +504 -117
- package/dist/{hosted-android-Bs7fytj7.mjs → hosted-android-DQ-Agsd8.mjs} +5 -5
- package/dist/{hosted-client-C5G4h_OJ.mjs → hosted-client-Io01s5By.mjs} +9 -3
- package/dist/{hosted-ios-Bik035eL.mjs → hosted-ios-DIxFnYp-.mjs} +3 -3
- package/dist/{hosted-logs-CI9Az9a4.mjs → hosted-logs-DP-ABU_M.mjs} +8 -8
- package/dist/{hosted-macos-DABm3ScO.mjs → hosted-macos-Aziw9T_9.mjs} +7 -6
- package/dist/{hosted-native-DbV2aUVw.mjs → hosted-native-BdAQi21M.mjs} +17 -14
- package/dist/{idle-shutdown-DYiMBn34.mjs → idle-shutdown-DdMqoSUB.mjs} +7 -7
- package/dist/{ios-DYUr9LGc.mjs → ios-BZ9dg2Fr.mjs} +8 -7
- package/dist/{ios-BWbHFZVz.mjs → ios-CXLIUxXJ.mjs} +180 -24
- package/dist/ios-CZuv6gRv.mjs +1112 -0
- package/dist/{ios-DCrkgXEM.mjs → ios-VGvNdsv2.mjs} +1 -1
- package/dist/{ios-device-CrW8aMb5.mjs → ios-device-B1B14xND.mjs} +1 -1
- package/dist/{ios-device-CJ_ZOGky.mjs → ios-device-BreZOpM0.mjs} +3 -3
- package/dist/ios-project-B9drt_aY.mjs +197 -0
- package/dist/{ios-state-By0XuLTQ.mjs → ios-state-CjrL2qv-.mjs} +1 -1
- package/dist/js-swap-C8icNYIY.mjs +432 -0
- package/dist/launch-DxH0THLP.mjs +745 -0
- package/dist/{react-native-ios-CSpIxexZ.mjs → launch-YrbqaIFj.mjs} +59 -612
- package/dist/{launch-verify-DCveSE6d.mjs → launch-verify-BzRdbuO1.mjs} +26 -7
- package/dist/{logs-Bao1HOMy.mjs → logs-DHaRNfg7.mjs} +11 -11
- package/dist/macos-C0iljhsN.mjs +2 -0
- package/dist/{macos-ciyBdTY5.mjs → macos-V_3Ui7g4.mjs} +42 -50
- package/dist/macos-run.mjs +1 -1
- package/dist/maintenance-run.mjs +13 -10
- package/dist/{metro-DI2AjPF_.mjs → metro-D_j9sN-B.mjs} +18 -5
- package/dist/{metro-gateway-BxpJLIwh.mjs → metro-gateway-BBJldOdi.mjs} +2 -2
- package/dist/miss-reason-BPAzZS0r.mjs +238 -0
- package/dist/{named-ports-B4iWH4E-.mjs → named-ports-C2lvoPsb.mjs} +3 -3
- package/dist/native-android-lHzaew7r.mjs +226 -0
- package/dist/native-gradle-inputs-BQnIdAlL.mjs +356 -0
- package/dist/{native-runtime-BGxsbfny.mjs → native-runtime-BRmWL7ru.mjs} +9 -8
- package/dist/native-xcode-inputs-eutS19jU.mjs +307 -0
- package/dist/native-xcode-ios-DP3cHLwu.mjs +434 -0
- package/dist/{ndjson-LGZAMsqa.mjs → ndjson-GOnbyvso.mjs} +6 -6
- package/dist/offload-worker.d.mts +41 -7
- package/dist/offload-worker.mjs +409 -74
- package/dist/{ownership-EB0ySdGK.mjs → ownership-DXzMMSx6.mjs} +2 -2
- package/dist/{placement-log-Dxe34rJm.mjs → placement-log-reFbjqEr.mjs} +1 -1
- package/dist/plan-BDk2AeY_.mjs +260 -0
- package/dist/plan-placement-D_YYlE6N.mjs +73 -0
- package/dist/{ports-ByPc0_97.mjs → ports-jzvAJXXL.mjs} +3 -3
- package/dist/{prebuild-BKJ3wJI1.mjs → prebuild-Bw44QxVh.mjs} +4 -4
- package/dist/{preview-BbSottmO.mjs → preview-BaBJ72Al.mjs} +50 -32
- package/dist/project-B8_duAzW.mjs +1067 -0
- package/dist/project-plan-BPwbLwQu.mjs +10 -0
- package/dist/{pull-request-IHNdMnG8.mjs → pull-request-vOhLNmIb.mjs} +1 -1
- package/dist/pull-requests.mjs +1 -1
- package/dist/react-native-android-chm1DMlA.mjs +921 -0
- package/dist/react-native-build-oAw6gQeW.mjs +239 -0
- package/dist/react-native-doctor-DYXoh-6I.mjs +78 -0
- package/dist/react-native-ios-SCTK_CT5.mjs +595 -0
- package/dist/{recordings-Bv8McZN4.mjs → recordings-Bk-VivUV.mjs} +1 -1
- package/dist/{reload-rAPdqeRR.mjs → reload-D34GkY78.mjs} +17 -13
- package/dist/remote-BU9UyhCJ.mjs +192 -0
- package/dist/{remote-cache-N3hAEaAL.mjs → remote-cache-Bsts6f6Y.mjs} +5 -5
- package/dist/result-BDoRk1k3.mjs +186 -0
- package/dist/{run-lAkle1-c.mjs → run-qvff78hv.mjs} +3 -3
- package/dist/{server-bare-CkIjnegq.mjs → server-bare-dWjAarki.mjs} +5 -5
- package/dist/server-command-7XIKlWtO.mjs +69 -0
- package/dist/{server-expo-n3tUi3Em.mjs → server-expo-CsYu2aKL.mjs} +107 -82
- package/dist/server-expo-DV43vep4.mjs +2 -0
- package/dist/{settings-CxgngUZk.mjs → settings-Bbztm4oV.mjs} +179 -129
- package/dist/{settings-2am7TSxp.mjs → settings-CT3E71-i.mjs} +6 -6
- package/dist/{state-lKh8shBp.d.mts → settings-vk3mJGSm.d.mts} +4 -2
- package/dist/settings.schema.json +84 -0
- package/dist/simslim-ChMfe8rg.mjs +149 -0
- package/dist/{slot-launch-HV_KtPIw.mjs → slot-launch-B9hn96wd.mjs} +6 -6
- package/dist/{stage-BgaZJVZY.mjs → stage-BNKKdDNc.mjs} +6 -3
- package/dist/start-CbQCSnXQ.mjs +2 -0
- package/dist/{start-DtxthMfI.mjs → start-CdvcTaXr.mjs} +97 -68
- package/dist/{state-Tp4uImDS.mjs → state-Boo0IMJq.mjs} +1 -1
- package/dist/{state-D2KtnALG.mjs → state-DI84A-uu.mjs} +29 -10
- package/dist/{stats-8EJ5ivFT.mjs → stats-BIIDrjA8.mjs} +5 -5
- package/dist/{status-BEeL6IKz.mjs → status-BDGHwkCs.mjs} +3 -1
- package/dist/{status-BOyp0CUl.mjs → status-DARMkc9q.mjs} +81 -293
- package/dist/status-watch-DvmI3SmN.mjs +296 -0
- package/dist/{stim-desktop-C65jk_q2.mjs → stim-desktop-8GQX2OV8.mjs} +1 -1
- package/dist/{stop-DRipAg-e.mjs → stop-CCZS-C9m.mjs} +2 -2
- package/dist/{stop-D0UIpZuh.mjs → stop-WQPQHLuy.mjs} +5 -5
- package/dist/{stop-zDlknFoz.mjs → stop-iNemHsJC.mjs} +21 -20
- package/dist/supervisor-run.d.mts +7 -2
- package/dist/supervisor-run.mjs +32 -20
- package/dist/{support-DsNaFg6D.mjs → support-CnE_SIjt.mjs} +17 -7
- package/dist/{support-CNqYkV0y.mjs → support-DCco5fut.mjs} +61 -8
- package/dist/{swiftpm-macos-aJzPAj1t.mjs → swiftpm-macos-afeNUExW.mjs} +5 -5
- package/dist/tailnet-CoJUb2tB.mjs +265 -0
- package/dist/toolchain-BIupIro1.mjs +2 -0
- package/dist/{toolchain-C3xSoyUl.mjs → toolchain-DqyDXs30.mjs} +206 -53
- package/dist/{trigger-CAhmG-4s.mjs → trigger-C0MWBi8O.mjs} +2 -2
- package/dist/trigger-SHLOWJ4O.mjs +2 -0
- package/dist/{warm-progress-pFLB2e6P.mjs → warm-progress-C3ASD6z5.mjs} +6 -6
- package/dist/{watchman-BL1IdOtq.mjs → watchman-CQl51YZu.mjs} +6 -6
- package/dist/{web-DbbrPUn0.mjs → web-B3eldHFH.mjs} +9 -13
- package/dist/web-BLXpOe6b.mjs +2 -0
- package/dist/web-run.mjs +10 -10
- package/dist/{workspace-state-CR9X86xJ.mjs → workspace-state-CSIFuuDa.mjs} +33 -33
- package/dist/{workspaces-Djb2gfi9.mjs → workspaces-D2xSHBDY.mjs} +1260 -1258
- package/dist/{worktree-BL4M1rhB.mjs → worktree-BxDqaTev.mjs} +84 -48
- package/dist/worktree-q7_OZNY0.mjs +2 -0
- package/package.json +8 -6
- package/shim/native-android.gradle +101 -0
- package/dist/android-BXc6BmEi.mjs +0 -3732
- package/dist/android-BvV1gGdN.mjs +0 -4
- package/dist/ios-ITYno9rO.mjs +0 -2241
- package/dist/macos-nIOATJmR.mjs +0 -2
- package/dist/metro-store-BAHFcJm6.mjs +0 -106
- package/dist/miss-reason-CjQCOKqq.mjs +0 -1743
- package/dist/plan-placement-BVY59qa8.mjs +0 -290
- package/dist/project-B5eQ1USs.mjs +0 -612
- package/dist/react-native-ios-BMh2i25I.mjs +0 -2
- package/dist/server-expo-DGsdUGX2.mjs +0 -2
- package/dist/start-D8NbxNBb.mjs +0 -2
- package/dist/trigger-CoalsMTV.mjs +0 -2
- package/dist/web-DFpFeZu5.mjs +0 -2
- package/dist/worktree-DV-A0LNL.mjs +0 -2
|
@@ -1,40 +1,41 @@
|
|
|
1
1
|
import { t as process_identity_exports } from "./process-identity-Biv3arCO.mjs";
|
|
2
|
-
import { t as getExecutor } from "./exec-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { f as
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import { d as readIosDevices, s as isReachable } from "./ios-device-
|
|
22
|
-
import "./hosted-macos-
|
|
23
|
-
import { i as readSupervisorState } from "./stop-
|
|
24
|
-
import { i as createStatusMeasurer, n as workspacePhase, r as applyStatusMeasures, s as mergeState } from "./warm-progress-
|
|
25
|
-
import { r as workspaceRecordingEnabled } from "./recordings-
|
|
26
|
-
import { n as maintenanceLines, r as maintenanceStatus } from "./status-
|
|
2
|
+
import { t as getExecutor } from "./exec-B81Qodjn.mjs";
|
|
3
|
+
import { B as parseDeviceSlotKey, F as volumeRootFor, H as projectDeviceSlots, R as deviceSlotKey, _ as loadConfig$1, d as getConfigDir, j as formatBytes } from "./config-D0LhTY3S.mjs";
|
|
4
|
+
import { Et as repoRoot, bt as linkedWorktreesOnDisk, ht as gitCommonDirOnDisk, mt as gitCommonDir, q as resolveSettings } from "./settings-Bbztm4oV.mjs";
|
|
5
|
+
import { i as listLeaseFiles, r as leaseIsExpired, s as parseWorkspaceLeases } from "./device-lease-DHOBXGgS.mjs";
|
|
6
|
+
import { C as workspaceLogErrorIndex, r as readWorkspaceState$1, w as workspaceLogsDir$1 } from "./workspace-state-CSIFuuDa.mjs";
|
|
7
|
+
import { a as formatElapsed, i as formatDuration, r as clockTime, u as plural } from "./command-output-BjPN99ZB.mjs";
|
|
8
|
+
import { F as readWorkspaceLaunches, N as readRemoteSession, _ as detectIsExpo, c as projectShortcut, i as findServerWorkspace, j as readMetroTunnel, l as detectPlatforms, v as detectTutorial, x as readAppJson } from "./project-B8_duAzW.mjs";
|
|
9
|
+
import { F as ownedAvdDeviceProfile, O as listAdbDevices, at as POOL_SETTING_REMEDY, dt as parkedMaxSetting, ft as readParked, z as ownedAvdSerialResolver } from "./android-BsYNR81W.mjs";
|
|
10
|
+
import { a as listeningPidsByPort, c as processCwd, i as listeningPids, l as processCwds, p as isMetroRunning, s as pidExists, u as resolveProjectMetro } from "./metro-D_j9sN-B.mjs";
|
|
11
|
+
import { P as resolveSupervisorTarget } from "./workspaces-D2xSHBDY.mjs";
|
|
12
|
+
import { Ct as bundlingActivity, It as statsProjectKey$1, Mt as readStats$1, St as buildStatusLine, Tt as parseActiveBuild, bt as activeBuildState, it as readFootprints, mt as metroLastStop, o as machineNumber, rt as attributeMachineUsage, ut as describeMetroLastStop, vt as ACTIVE_BUILD_KEY, xt as buildReport } from "./budget-BONq9vXY.mjs";
|
|
13
|
+
import { a as parseNdjsonLine } from "./ndjson-GOnbyvso.mjs";
|
|
14
|
+
import { a as readWebPage, o as readWebRecord, u as webFacts } from "./state-DI84A-uu.mjs";
|
|
15
|
+
import { C as statusActivity, E as withWebFacts, S as remoteDeviceState, T as unprovisionedWorktrees, _ as gitSummaryText, b as poolLine, c as activityLabel, d as capacity, f as deviceLeaseLines, h as environmentState, l as addReverseMissingIssue, m as diskLine, p as deviceLeaseStates, u as applyMachineMemory, v as metroReverseTargets, w as tightVolumes, x as remoteDeviceLine, y as parseDfFree } from "./watchman-CQl51YZu.mjs";
|
|
16
|
+
import { d as readWebActivity, f as tailLines, i as createDeviceProcessTables, r as createActivityReader } from "./activity-BrGh9EAI.mjs";
|
|
17
|
+
import { b as parseSimctlList, f as listAllIosSimsAsync } from "./ios-CXLIUxXJ.mjs";
|
|
18
|
+
import { m as hasMetroReverse } from "./app-install-0LgaQRT7.mjs";
|
|
19
|
+
import { u as probeHostedSession } from "./hosted-client-Io01s5By.mjs";
|
|
20
|
+
import { r as readEasSessionLedger$1 } from "./eas-session-ledger-DZlC-Fq3.mjs";
|
|
21
|
+
import { d as readIosDevices, s as isReachable } from "./ios-device-BreZOpM0.mjs";
|
|
22
|
+
import "./hosted-macos-Aziw9T_9.mjs";
|
|
23
|
+
import { i as readSupervisorState } from "./stop-iNemHsJC.mjs";
|
|
24
|
+
import { i as createStatusMeasurer, n as workspacePhase, r as applyStatusMeasures, s as mergeState } from "./warm-progress-C3ASD6z5.mjs";
|
|
25
|
+
import { r as workspaceRecordingEnabled } from "./recordings-Bk-VivUV.mjs";
|
|
26
|
+
import { n as maintenanceLines, r as maintenanceStatus } from "./status-BDGHwkCs.mjs";
|
|
27
|
+
import { a as watchStatusSources, i as watchPayload, n as WATCH_LIGHT_INTERVAL_MS, r as createRefreshScheduler, t as WATCH_FALLBACK_MS } from "./status-watch-DvmI3SmN.mjs";
|
|
27
28
|
import { t as watchStdoutReader } from "./stdout-reader-C8yjre1x.mjs";
|
|
28
|
-
import { t as triggerMaintenance } from "./trigger-
|
|
29
|
-
import { mkdirSync, readFileSync,
|
|
29
|
+
import { t as triggerMaintenance } from "./trigger-C0MWBi8O.mjs";
|
|
30
|
+
import { mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
30
31
|
import { join, posix, resolve } from "node:path";
|
|
31
32
|
import { basename as basename$1, dirname as dirname$1, join as join$1 } from "path";
|
|
32
33
|
import { DEVICE_RECLAIM_REASON, ERROR_SOURCES, archiveRoot, archivedUsage, bundleMarkerPlatform, countErrorEntries, gitMergeCacheDir, hostedAndroidPlacements, hostedAndroidRecords, hostedAndroidStatus, hostedIosPlacements, hostedIosRecords, hostedIosStatus, linkReplacedArchives, logFiles, macosAppState, parseHostedAndroidPlacement, parseHostedIosPlacement, queryLogs, readArchives, readBuildDetail, readBuildHistory, readDeviceIdleShutdowns, readDevicePlacement, readIdleStop, readLastBuilds, readMacosRecord, recordMatches, sortByTs, unreadableHostedAndroid, unreadableHostedIos, withDerivedFacts, withGitChip, withStateReadCache } from "@stim-cli/core/state";
|
|
33
|
-
import chalk from "chalk";
|
|
34
34
|
import { closeSync as closeSync$1, existsSync as existsSync$1, fstatSync as fstatSync$1, openSync as openSync$1, readFileSync as readFileSync$1, readSync as readSync$1, renameSync as renameSync$1, rmSync as rmSync$1, statSync as statSync$1, writeFileSync as writeFileSync$1 } from "fs";
|
|
35
35
|
import { rotatedLogPath } from "@stim-cli/core";
|
|
36
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
37
36
|
import { homedir, totalmem } from "os";
|
|
37
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
38
|
+
import chalk from "chalk";
|
|
38
39
|
//#region src/device-host/hosted-native-status.ts
|
|
39
40
|
function hostedNativeProbe(placement, probe, slot, platform) {
|
|
40
41
|
const label = platform === "ios" ? "iOS" : "Android";
|
|
@@ -116,252 +117,6 @@ async function readHostedMacosStatus(record, options) {
|
|
|
116
117
|
return applyHostedMacosProbe(record, await probeHostedSession(record.host, options));
|
|
117
118
|
}
|
|
118
119
|
//#endregion
|
|
119
|
-
//#region src/status-watch.ts
|
|
120
|
-
const WATCH_FALLBACK_MS = 3e4;
|
|
121
|
-
const WATCH_LIGHT_INTERVAL_MS = 15e3;
|
|
122
|
-
const WATCH_SIMCTL_INTERVAL_MS = 5e3;
|
|
123
|
-
const ADB_RESTART_MIN_MS = 1e3;
|
|
124
|
-
const ADB_RESTART_MAX_MS = 6e4;
|
|
125
|
-
const SIMCTL_TIMEOUT_MS = 1e4;
|
|
126
|
-
/**
|
|
127
|
-
* Coalesces change signals into refreshes: a burst of full triggers runs `run('full')` once after `debounceMs` of
|
|
128
|
-
* quiet, at most one run is in flight, and a trigger that arrives during a run causes exactly one more run after it.
|
|
129
|
-
* A `light` trigger runs `run('light')` no sooner than `debounceMs` from the trigger and `lightIntervalMs` from the
|
|
130
|
-
* start of the previous run, unless a queued full run covers it; later light triggers do not postpone it.
|
|
131
|
-
*/
|
|
132
|
-
function createRefreshScheduler({ debounceMs, lightIntervalMs = 0, run }) {
|
|
133
|
-
let timer = null;
|
|
134
|
-
let queued = "full";
|
|
135
|
-
let running = false;
|
|
136
|
-
let pending = null;
|
|
137
|
-
let stopped = false;
|
|
138
|
-
let lastRunAt = -Infinity;
|
|
139
|
-
const fire = async () => {
|
|
140
|
-
timer = null;
|
|
141
|
-
running = true;
|
|
142
|
-
lastRunAt = Date.now();
|
|
143
|
-
try {
|
|
144
|
-
await run(queued);
|
|
145
|
-
} finally {
|
|
146
|
-
running = false;
|
|
147
|
-
if (pending) {
|
|
148
|
-
const next = pending;
|
|
149
|
-
pending = null;
|
|
150
|
-
trigger(next);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
function trigger(kind = "full", delayMs = debounceMs) {
|
|
155
|
-
if (stopped) return;
|
|
156
|
-
if (running) {
|
|
157
|
-
pending = pending === "full" ? "full" : kind;
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
if (kind === "light") {
|
|
161
|
-
if (timer) return;
|
|
162
|
-
queued = "light";
|
|
163
|
-
timer = setTimeout(() => void fire(), Math.max(delayMs, lastRunAt + lightIntervalMs - Date.now()));
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
if (timer) clearTimeout(timer);
|
|
167
|
-
queued = "full";
|
|
168
|
-
timer = setTimeout(() => void fire(), delayMs);
|
|
169
|
-
}
|
|
170
|
-
return {
|
|
171
|
-
trigger,
|
|
172
|
-
stop() {
|
|
173
|
-
stopped = true;
|
|
174
|
-
if (timer) clearTimeout(timer);
|
|
175
|
-
timer = null;
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* Which refresh a change to `name` in a watched `$STIM_HOME` directory needs: `light` for a log append or a running
|
|
181
|
-
* build's detail, which can change only the log-derived fields, `full` for anything else that can change the payload,
|
|
182
|
-
* null for none. A null name means the platform did not report one.
|
|
183
|
-
*/
|
|
184
|
-
function statusChange(dir, name) {
|
|
185
|
-
if (dir === "archive" && (name?.startsWith(".incoming-") || name?.startsWith(".removing-") || name?.startsWith(".lock"))) return null;
|
|
186
|
-
if (name?.includes(".lock")) return null;
|
|
187
|
-
if (dir === "logs") return "light";
|
|
188
|
-
if (name === null) return "full";
|
|
189
|
-
switch (dir) {
|
|
190
|
-
case "home":
|
|
191
|
-
if (name === "maintenance") return "light";
|
|
192
|
-
return name.startsWith("config.json") || name === "archive" || name === "workspaces" || name === "device-locks" ? "full" : null;
|
|
193
|
-
case "workspace":
|
|
194
|
-
if (name.startsWith("build-detail.json")) return "light";
|
|
195
|
-
return name.startsWith("state.json") || name.startsWith("ended-agents.json") || name === "logs" ? "full" : null;
|
|
196
|
-
case "maintenance": return name === "state.json" ? "light" : null;
|
|
197
|
-
case "eas": return name.startsWith("sessions.json") ? "full" : null;
|
|
198
|
-
default: return "full";
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
/** A stable summary of every simulator's state, or null when the listing is unreadable. */
|
|
202
|
-
function simulatorSignature(simctlJson) {
|
|
203
|
-
try {
|
|
204
|
-
return parseSimctlList(simctlJson, { includeUnavailable: true }).map((sim) => `${sim.udid}:${sim.state}`).toSorted().join(",");
|
|
205
|
-
} catch {
|
|
206
|
-
return null;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Calls `onChange` when anything `stim status` reports may have changed:
|
|
211
|
-
* `$STIM_HOME` files, adb device arrivals and departures, and simulator
|
|
212
|
-
* state. simctl has no push API reachable from Node, so it is polled.
|
|
213
|
-
*/
|
|
214
|
-
function watchStatusSources({ home, onChange, platform = process.platform, simctlIntervalMs = WATCH_SIMCTL_INTERVAL_MS }) {
|
|
215
|
-
let stopped = false;
|
|
216
|
-
const watchers = /* @__PURE__ */ new Map();
|
|
217
|
-
const desiredDirs = () => {
|
|
218
|
-
const dirs = /* @__PURE__ */ new Map([
|
|
219
|
-
[home, "home"],
|
|
220
|
-
[join(home, "archive"), "archive"],
|
|
221
|
-
[join(home, "workspaces"), "workspaces"],
|
|
222
|
-
[join(home, "maintenance"), "maintenance"],
|
|
223
|
-
[join(home, "device-locks"), "leases"],
|
|
224
|
-
[easMachineStateRoot$1(), "eas"]
|
|
225
|
-
]);
|
|
226
|
-
let names = [];
|
|
227
|
-
try {
|
|
228
|
-
names = readdirSync(join(home, "workspaces"));
|
|
229
|
-
} catch {}
|
|
230
|
-
for (const name of names) {
|
|
231
|
-
const dir = join(home, "workspaces", name);
|
|
232
|
-
dirs.set(dir, "workspace");
|
|
233
|
-
dirs.set(join(dir, "logs"), "logs");
|
|
234
|
-
}
|
|
235
|
-
return dirs;
|
|
236
|
-
};
|
|
237
|
-
const reconcile = () => {
|
|
238
|
-
if (stopped) return;
|
|
239
|
-
const desired = desiredDirs();
|
|
240
|
-
for (const [dir, watcher] of watchers) if (!desired.has(dir)) {
|
|
241
|
-
watcher.close();
|
|
242
|
-
watchers.delete(dir);
|
|
243
|
-
}
|
|
244
|
-
for (const [dir, kind] of desired) {
|
|
245
|
-
if (watchers.has(dir)) continue;
|
|
246
|
-
try {
|
|
247
|
-
const watcher = watch(dir, (_event, name) => {
|
|
248
|
-
const change = statusChange(kind, name === null ? null : String(name));
|
|
249
|
-
if (!change) return;
|
|
250
|
-
if (kind === "home" || kind === "workspaces" || kind === "workspace") {
|
|
251
|
-
listingStaleBefore = Date.now();
|
|
252
|
-
reconcile();
|
|
253
|
-
}
|
|
254
|
-
onChange(change);
|
|
255
|
-
});
|
|
256
|
-
watcher.on("error", () => {
|
|
257
|
-
watcher.close();
|
|
258
|
-
watchers.delete(dir);
|
|
259
|
-
});
|
|
260
|
-
watchers.set(dir, watcher);
|
|
261
|
-
} catch {}
|
|
262
|
-
}
|
|
263
|
-
};
|
|
264
|
-
const adb = trackAdbDevices(() => onChange("full"));
|
|
265
|
-
let simctl = null;
|
|
266
|
-
let listing = null;
|
|
267
|
-
let listingStaleBefore = 0;
|
|
268
|
-
let simTimer = null;
|
|
269
|
-
if (platform === "darwin") {
|
|
270
|
-
let last = null;
|
|
271
|
-
const check = () => {
|
|
272
|
-
if (simctl || stopped) return;
|
|
273
|
-
const startedAt = Date.now();
|
|
274
|
-
let out = "";
|
|
275
|
-
const child = getExecutor().spawn("xcrun", [
|
|
276
|
-
"simctl",
|
|
277
|
-
"list",
|
|
278
|
-
"devices",
|
|
279
|
-
"--json"
|
|
280
|
-
], {
|
|
281
|
-
stdio: [
|
|
282
|
-
"ignore",
|
|
283
|
-
"pipe",
|
|
284
|
-
"ignore"
|
|
285
|
-
],
|
|
286
|
-
timeout: SIMCTL_TIMEOUT_MS,
|
|
287
|
-
killSignal: "SIGKILL"
|
|
288
|
-
});
|
|
289
|
-
simctl = child;
|
|
290
|
-
child.stdout?.on("data", (chunk) => out += chunk.toString());
|
|
291
|
-
child.on("error", () => {
|
|
292
|
-
simctl = null;
|
|
293
|
-
});
|
|
294
|
-
child.on("close", () => {
|
|
295
|
-
simctl = null;
|
|
296
|
-
const signature = simulatorSignature(out);
|
|
297
|
-
if (signature === null || stopped) return;
|
|
298
|
-
listing = {
|
|
299
|
-
at: startedAt,
|
|
300
|
-
json: out
|
|
301
|
-
};
|
|
302
|
-
if (last !== null && signature !== last) onChange("full");
|
|
303
|
-
last = signature;
|
|
304
|
-
});
|
|
305
|
-
};
|
|
306
|
-
check();
|
|
307
|
-
simTimer = setInterval(check, simctlIntervalMs);
|
|
308
|
-
}
|
|
309
|
-
reconcile();
|
|
310
|
-
return {
|
|
311
|
-
reconcile,
|
|
312
|
-
simulatorListing: () => listing && listing.at > listingStaleBefore && Date.now() - listing.at <= 2 * simctlIntervalMs ? listing.json : null,
|
|
313
|
-
stop() {
|
|
314
|
-
stopped = true;
|
|
315
|
-
for (const watcher of watchers.values()) watcher.close();
|
|
316
|
-
watchers.clear();
|
|
317
|
-
if (simTimer) clearInterval(simTimer);
|
|
318
|
-
simctl?.kill("SIGKILL");
|
|
319
|
-
adb.stop();
|
|
320
|
-
}
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Runs `adb track-devices` and calls `onChange` on every device list it
|
|
325
|
-
* reports. adb exits when its server restarts, so the tracker restarts with a
|
|
326
|
-
* doubling delay that resets once a run lasts a minute.
|
|
327
|
-
*/
|
|
328
|
-
function trackAdbDevices(onChange) {
|
|
329
|
-
const exec = getExecutor();
|
|
330
|
-
const resolved = androidToolPath("adb");
|
|
331
|
-
const adb = resolved === "adb" ? exec.findExecutable("adb") : resolved;
|
|
332
|
-
if (!adb) return { stop() {} };
|
|
333
|
-
let child = null;
|
|
334
|
-
let restart = null;
|
|
335
|
-
let delay = ADB_RESTART_MIN_MS;
|
|
336
|
-
let stopped = false;
|
|
337
|
-
const start = () => {
|
|
338
|
-
restart = null;
|
|
339
|
-
if (stopped) return;
|
|
340
|
-
const startedAt = Date.now();
|
|
341
|
-
const current = exec.spawn(adb, ["track-devices"], { stdio: [
|
|
342
|
-
"ignore",
|
|
343
|
-
"pipe",
|
|
344
|
-
"ignore"
|
|
345
|
-
] });
|
|
346
|
-
child = current;
|
|
347
|
-
current.stdout?.on("data", () => onChange());
|
|
348
|
-
current.on("error", () => {});
|
|
349
|
-
current.on("close", () => {
|
|
350
|
-
if (child === current) child = null;
|
|
351
|
-
if (stopped) return;
|
|
352
|
-
if (Date.now() - startedAt >= ADB_RESTART_MAX_MS) delay = ADB_RESTART_MIN_MS;
|
|
353
|
-
restart = setTimeout(start, delay);
|
|
354
|
-
delay = Math.min(delay * 2, ADB_RESTART_MAX_MS);
|
|
355
|
-
});
|
|
356
|
-
};
|
|
357
|
-
start();
|
|
358
|
-
return { stop() {
|
|
359
|
-
stopped = true;
|
|
360
|
-
if (restart) clearTimeout(restart);
|
|
361
|
-
child?.kill("SIGTERM");
|
|
362
|
-
} };
|
|
363
|
-
}
|
|
364
|
-
//#endregion
|
|
365
120
|
//#region src/diagnostics/error-index.ts
|
|
366
121
|
const INDEX_VERSION = 7;
|
|
367
122
|
const HEAD_BYTES = 1024;
|
|
@@ -554,6 +309,7 @@ function writeIndex(file, index) {
|
|
|
554
309
|
//#endregion
|
|
555
310
|
//#region src/workspace/git-summary.ts
|
|
556
311
|
const GIT_TIMEOUT_MS = 3e3;
|
|
312
|
+
const GIT_CONCURRENCY = 6;
|
|
557
313
|
const MERGE_BUDGET_MS = 250;
|
|
558
314
|
const MERGE_TIMEOUT_BACKOFF_MS = 3e5;
|
|
559
315
|
const ORIGIN_PREFIX = "refs/remotes/origin/";
|
|
@@ -594,7 +350,11 @@ function inPrivacyProtectedFolder(path, home) {
|
|
|
594
350
|
"Library/CloudStorage"
|
|
595
351
|
].map((dir) => posix.join(home, dir)), "/Volumes"].some((dir) => path === dir || path.startsWith(`${dir}/`));
|
|
596
352
|
}
|
|
353
|
+
const gitQueue = [];
|
|
354
|
+
let gitRunning = 0;
|
|
597
355
|
async function git(path, args) {
|
|
356
|
+
if (gitRunning < GIT_CONCURRENCY) gitRunning++;
|
|
357
|
+
else await new Promise((proceed) => gitQueue.push(proceed));
|
|
598
358
|
try {
|
|
599
359
|
return await getExecutor().runFileAsync("git", [
|
|
600
360
|
"--no-optional-locks",
|
|
@@ -604,6 +364,10 @@ async function git(path, args) {
|
|
|
604
364
|
], { timeoutMs: GIT_TIMEOUT_MS });
|
|
605
365
|
} catch {
|
|
606
366
|
return null;
|
|
367
|
+
} finally {
|
|
368
|
+
const next = gitQueue.shift();
|
|
369
|
+
if (next) next();
|
|
370
|
+
else gitRunning--;
|
|
607
371
|
}
|
|
608
372
|
}
|
|
609
373
|
async function defaultBranchOf(repository) {
|
|
@@ -750,7 +514,7 @@ function gitFilesStamp(worktree, refs) {
|
|
|
750
514
|
};
|
|
751
515
|
}
|
|
752
516
|
/**
|
|
753
|
-
* Reads every worktree's git summary
|
|
517
|
+
* Reads every worktree's git summary, at most six git calls at a time, each bounded by a timeout once it starts. A worktree `skip` rejects, or
|
|
754
518
|
* one git cannot answer in time, maps to null. After every read, merge verdicts missing from the cache are judged one
|
|
755
519
|
* at a time; no new judgement starts 250 ms after the first, and a verdict for the same HEAD judged at an older
|
|
756
520
|
* default-branch commit stands in, because a merged branch stays merged. A judgement that timed out is not retried
|
|
@@ -789,7 +553,8 @@ async function readWorktreeGit(worktrees, { skip, maxAgeMs = 0 }) {
|
|
|
789
553
|
status: out === null ? null : parseGitStatus(out),
|
|
790
554
|
target,
|
|
791
555
|
files,
|
|
792
|
-
refs
|
|
556
|
+
refs,
|
|
557
|
+
at: Date.now()
|
|
793
558
|
};
|
|
794
559
|
}));
|
|
795
560
|
const budget = {};
|
|
@@ -801,7 +566,7 @@ async function readWorktreeGit(worktrees, { skip, maxAgeMs = 0 }) {
|
|
|
801
566
|
}
|
|
802
567
|
if (!read.status) {
|
|
803
568
|
if (read.files?.missing) recent.set(read.path, {
|
|
804
|
-
at:
|
|
569
|
+
at: read.at,
|
|
805
570
|
files: read.files.stamp,
|
|
806
571
|
refs: read.refs,
|
|
807
572
|
git: null
|
|
@@ -821,7 +586,7 @@ async function readWorktreeGit(worktrees, { skip, maxAgeMs = 0 }) {
|
|
|
821
586
|
};
|
|
822
587
|
const settled = !merge?.deferred && refs.upstream === read.refs.upstream && refs.target === read.refs.target;
|
|
823
588
|
recent.set(read.path, {
|
|
824
|
-
at:
|
|
589
|
+
at: read.at,
|
|
825
590
|
files: settled ? read.files?.stamp ?? null : null,
|
|
826
591
|
refs,
|
|
827
592
|
git: summary
|
|
@@ -1098,6 +863,14 @@ function androidStatusLines(record, slotLabel) {
|
|
|
1098
863
|
if (record?.host?.agent.driver === "agent-device") out.push(chalk.dim(` agent: ${record.host.agent.command}`));
|
|
1099
864
|
return out;
|
|
1100
865
|
}
|
|
866
|
+
function doctorRunTimes(proj) {
|
|
867
|
+
const runs = {};
|
|
868
|
+
for (const platform of ["ios", "android"]) {
|
|
869
|
+
const at = proj.doctorRuns?.[platform]?.at;
|
|
870
|
+
if (typeof at === "string") runs[platform] = { at };
|
|
871
|
+
}
|
|
872
|
+
return Object.keys(runs).length ? runs : void 0;
|
|
873
|
+
}
|
|
1101
874
|
function formatGb(mb) {
|
|
1102
875
|
return `${(mb / 1024).toFixed(1)} GB`;
|
|
1103
876
|
}
|
|
@@ -1131,7 +904,8 @@ async function readStatusFacts(gitMaxAgeMs, simctlListing, cachedArchives) {
|
|
|
1131
904
|
};
|
|
1132
905
|
}));
|
|
1133
906
|
processes.catch(() => {});
|
|
1134
|
-
const
|
|
907
|
+
const watching = gitMaxAgeMs > 0;
|
|
908
|
+
const gitRead = watching ? readGitInto(worktrees, orphanWorktrees, gitMaxAgeMs) : null;
|
|
1135
909
|
const androidRuntimeOf = androidRuntimeReader();
|
|
1136
910
|
const devices = projects.map(([, proj]) => ({
|
|
1137
911
|
androidRuntimes: Object.fromEntries(projectDeviceSlots(proj).slice(1).map(({ slot, platforms }) => [slot, platforms.android?.owned && platforms.android.avdName ? androidRuntimeOf(platforms.android.avdName) : null])),
|
|
@@ -1245,15 +1019,23 @@ async function readStatusFacts(gitMaxAgeMs, simctlListing, cachedArchives) {
|
|
|
1245
1019
|
state.live ||= macos.state === "running" || macos.state === "orphaned" || macos.build.state === "running";
|
|
1246
1020
|
}
|
|
1247
1021
|
Object.assign(state, builds, workspacePhase(state.live, saved, { now: leaseNow }), {
|
|
1248
|
-
platforms:
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1022
|
+
platforms: (() => {
|
|
1023
|
+
const context = {
|
|
1024
|
+
projectPath: path,
|
|
1025
|
+
gitCommonDir: gitCommonDirOnDisk(path),
|
|
1026
|
+
repoRoot: state.worktree?.path ?? path
|
|
1027
|
+
};
|
|
1028
|
+
return detectPlatforms(path, {
|
|
1029
|
+
context,
|
|
1030
|
+
settings: resolveSettings(context)
|
|
1031
|
+
});
|
|
1032
|
+
})(),
|
|
1253
1033
|
recording: { enabled: workspaceRecordingEnabled(path, proj, cfg, process.env) }
|
|
1254
1034
|
});
|
|
1255
1035
|
const tutorial = detectTutorial(readAppJson(path));
|
|
1256
1036
|
if (tutorial) state.tutorial = tutorial;
|
|
1037
|
+
const doctorRuns = doctorRunTimes(proj);
|
|
1038
|
+
if (doctorRuns) state.doctorRuns = doctorRuns;
|
|
1257
1039
|
}
|
|
1258
1040
|
const physicalDevices = physicalDeviceStates(leaseFiles, parseWorkspaceLeases(saved?.deviceLeases), {
|
|
1259
1041
|
root: path,
|
|
@@ -1264,6 +1046,7 @@ async function readStatusFacts(gitMaxAgeMs, simctlListing, cachedArchives) {
|
|
|
1264
1046
|
if (state && physicalDevices.length) state.physicalDevices = physicalDevices;
|
|
1265
1047
|
labelOnlyRoots.push(Boolean(proj.worktreeRoot && !proj.bundleId && !state?.metro && !state?.ios && !state?.android && !state?.web && !state?.macos));
|
|
1266
1048
|
}
|
|
1049
|
+
if (!watching) await readGitInto(worktrees, orphanWorktrees, gitMaxAgeMs, new Set(states.flatMap((state) => state.live && state.worktree ? [state.worktree.path] : [])));
|
|
1267
1050
|
applyStatusMeasures(states, worktrees);
|
|
1268
1051
|
readLogDerivedFacts(states);
|
|
1269
1052
|
const tables = createDeviceProcessTables();
|
|
@@ -1349,6 +1132,8 @@ function readLogDerivedFacts(states) {
|
|
|
1349
1132
|
const detail = record.phase === "compile" ? readBuildDetail(state.path, record.claim.claimId) : null;
|
|
1350
1133
|
if (detail) state.build.detail = detail;
|
|
1351
1134
|
else delete state.build.detail;
|
|
1135
|
+
const activity = bundlingActivity(state.build.activity, state.build.platform, state.metro?.bundle);
|
|
1136
|
+
if (activity) state.build.activity = activity;
|
|
1352
1137
|
}
|
|
1353
1138
|
}
|
|
1354
1139
|
}
|
|
@@ -1405,7 +1190,7 @@ async function refreshLightFacts(snapshot, machine) {
|
|
|
1405
1190
|
busy: true
|
|
1406
1191
|
});
|
|
1407
1192
|
}
|
|
1408
|
-
function renderStatus({ archived, archivedUsage: usage, projects, states, labelOnlyRoots, leases, leaseNow, orphanWorktrees, simsAvailable, simctlError, cwdRoot, machine }, json) {
|
|
1193
|
+
function renderStatus({ archived, archivedUsage: usage, projects, states, labelOnlyRoots, leases, leaseNow, orphanWorktrees, simsAvailable, simctlError, cwdRoot, machine }, json, settle = (payload) => payload) {
|
|
1409
1194
|
const out = [];
|
|
1410
1195
|
const totalMemoryMb = Math.round(totalmem() / 1048576);
|
|
1411
1196
|
const cap = capacity(states, totalMemoryMb);
|
|
@@ -1422,7 +1207,7 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
|
|
|
1422
1207
|
});
|
|
1423
1208
|
const maintenance = maintenanceStatus();
|
|
1424
1209
|
if (json) {
|
|
1425
|
-
|
|
1210
|
+
const payload = {
|
|
1426
1211
|
environments: states.map((state, i) => withDerivedFacts(labelOnlyRoots[i] ? {
|
|
1427
1212
|
...state,
|
|
1428
1213
|
labelOnly: true
|
|
@@ -1435,7 +1220,8 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
|
|
|
1435
1220
|
simctlAvailable: simsAvailable,
|
|
1436
1221
|
machine,
|
|
1437
1222
|
maintenance
|
|
1438
|
-
}
|
|
1223
|
+
};
|
|
1224
|
+
out.push(JSON.stringify(settle(payload)));
|
|
1439
1225
|
return out;
|
|
1440
1226
|
}
|
|
1441
1227
|
out.push(...maintenanceLines(maintenance).map((line) => chalk.dim(line)));
|
|
@@ -1539,6 +1325,7 @@ function renderStatus({ archived, archivedUsage: usage, projects, states, labelO
|
|
|
1539
1325
|
}
|
|
1540
1326
|
async function watchStatus(json) {
|
|
1541
1327
|
let last = null;
|
|
1328
|
+
let lastPayload = null;
|
|
1542
1329
|
let archiveStamp = null;
|
|
1543
1330
|
let archives;
|
|
1544
1331
|
let snapshot = null;
|
|
@@ -1550,6 +1337,7 @@ async function watchStatus(json) {
|
|
|
1550
1337
|
run: async (kind) => {
|
|
1551
1338
|
triggerMaintenance("status-watch");
|
|
1552
1339
|
let text;
|
|
1340
|
+
let payload = null;
|
|
1553
1341
|
try {
|
|
1554
1342
|
if (kind === "light" && snapshot) await refreshLightFacts(snapshot, json);
|
|
1555
1343
|
else {
|
|
@@ -1564,7 +1352,7 @@ async function watchStatus(json) {
|
|
|
1564
1352
|
snapshot = await readStatus(WATCH_GIT_MAX_AGE_MS, sources?.simulatorListing(), archives);
|
|
1565
1353
|
}
|
|
1566
1354
|
measurer.schedule(snapshot.states, snapshot.worktrees);
|
|
1567
|
-
text = renderStatus(snapshot, json).join("\n");
|
|
1355
|
+
text = renderStatus(snapshot, json, (full) => payload = watchPayload(lastPayload, full)).join("\n");
|
|
1568
1356
|
} catch (error) {
|
|
1569
1357
|
console.error(chalk.red(String(error?.message || error)));
|
|
1570
1358
|
return;
|
|
@@ -1573,6 +1361,7 @@ async function watchStatus(json) {
|
|
|
1573
1361
|
}
|
|
1574
1362
|
if (text === last) return;
|
|
1575
1363
|
last = text;
|
|
1364
|
+
lastPayload = payload;
|
|
1576
1365
|
process.stdout.write(`${!json && process.stdout.isTTY ? "\x1B[2J\x1B[H" : ""}${text}\n`);
|
|
1577
1366
|
}
|
|
1578
1367
|
});
|
|
@@ -1596,11 +1385,11 @@ async function watchStatus(json) {
|
|
|
1596
1385
|
scheduler.trigger("full", 0);
|
|
1597
1386
|
await new Promise(() => {});
|
|
1598
1387
|
}
|
|
1599
|
-
async function readGitInto(worktrees, orphans, maxAgeMs) {
|
|
1388
|
+
async function readGitInto(worktrees, orphans, maxAgeMs, only) {
|
|
1600
1389
|
const home = homedir();
|
|
1601
1390
|
const byPath = await readWorktreeGit(worktrees, {
|
|
1602
1391
|
maxAgeMs,
|
|
1603
|
-
skip: (w) => process.platform === "darwin" && orphans.includes(w) && inPrivacyProtectedFolder(w.path, home)
|
|
1392
|
+
skip: (w) => only !== void 0 && !only.has(w.path) || process.platform === "darwin" && orphans.includes(w) && inPrivacyProtectedFolder(w.path, home)
|
|
1604
1393
|
});
|
|
1605
1394
|
for (const worktree of worktrees) worktree.git = byPath.get(worktree.path) ?? null;
|
|
1606
1395
|
}
|
|
@@ -1787,8 +1576,7 @@ function readVolumes(projectPath) {
|
|
|
1787
1576
|
])];
|
|
1788
1577
|
const volumes = [];
|
|
1789
1578
|
for (const volume of roots) {
|
|
1790
|
-
const
|
|
1791
|
-
const disk = parseDfFree(getExecutor().runQuiet(`df -k ${quoted}`, { timeoutMs: 5e3 }));
|
|
1579
|
+
const disk = parseDfFree(getExecutor().runFileQuiet("df", ["-k", volume], { timeoutMs: 5e3 }));
|
|
1792
1580
|
if (disk) volumes.push({
|
|
1793
1581
|
volume,
|
|
1794
1582
|
disk
|