@futdevpro/nts-dynamo 1.15.438 → 1.15.440

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 (25) hide show
  1. package/build/_modules/machine-monitor/_models/disk-space.interface.d.ts +37 -0
  2. package/build/_modules/machine-monitor/_models/disk-space.interface.d.ts.map +1 -0
  3. package/build/_modules/machine-monitor/_models/disk-space.interface.js +3 -0
  4. package/build/_modules/machine-monitor/_models/disk-space.interface.js.map +1 -0
  5. package/build/_modules/machine-monitor/disk-space-windows-reader.util.d.ts +16 -0
  6. package/build/_modules/machine-monitor/disk-space-windows-reader.util.d.ts.map +1 -0
  7. package/build/_modules/machine-monitor/disk-space-windows-reader.util.js +31 -0
  8. package/build/_modules/machine-monitor/disk-space-windows-reader.util.js.map +1 -0
  9. package/build/_modules/machine-monitor/disk-space.runner.d.ts +37 -0
  10. package/build/_modules/machine-monitor/disk-space.runner.d.ts.map +1 -0
  11. package/build/_modules/machine-monitor/disk-space.runner.js +100 -0
  12. package/build/_modules/machine-monitor/disk-space.runner.js.map +1 -0
  13. package/build/_modules/machine-monitor/disk-space.util.d.ts +51 -0
  14. package/build/_modules/machine-monitor/disk-space.util.d.ts.map +1 -0
  15. package/build/_modules/machine-monitor/disk-space.util.js +103 -0
  16. package/build/_modules/machine-monitor/disk-space.util.js.map +1 -0
  17. package/build/_modules/machine-monitor/fs-read-meter.util.d.ts +68 -0
  18. package/build/_modules/machine-monitor/fs-read-meter.util.d.ts.map +1 -0
  19. package/build/_modules/machine-monitor/fs-read-meter.util.js +145 -0
  20. package/build/_modules/machine-monitor/fs-read-meter.util.js.map +1 -0
  21. package/build/_modules/machine-monitor/index.d.ts +5 -0
  22. package/build/_modules/machine-monitor/index.d.ts.map +1 -1
  23. package/build/_modules/machine-monitor/index.js +9 -1
  24. package/build/_modules/machine-monitor/index.js.map +1 -1
  25. package/package.json +1 -1
@@ -0,0 +1,37 @@
1
+ /** The measurement of one drive. */
2
+ export interface DyNTS_DiskReading_Interface {
3
+ /** The machine the drive belongs to. */
4
+ host: string;
5
+ /** The drive (e.g. `C:` or `/`). */
6
+ mount: string;
7
+ usedPct: number;
8
+ freeGb: number;
9
+ }
10
+ /** One alert to send. */
11
+ export interface DyNTS_DiskAlert_Interface extends DyNTS_DiskReading_Interface {
12
+ level: 'warn' | 'critical';
13
+ }
14
+ /** The saved state: per drive, the last alert. */
15
+ export type DyNTS_DiskAlertState = Record<string, {
16
+ level: 'warn' | 'critical';
17
+ at: string;
18
+ }>;
19
+ /** The dependencies of the disk-space runner — the spec replaces them. */
20
+ export interface DyNTS_DiskSpaceRunnerDeps_Interface {
21
+ /** The JSON file of the alert state. */
22
+ statePath: string;
23
+ /** The machine's drives (local + network); not measurable ⇒ throws. */
24
+ readLocal: () => Promise<DyNTS_DiskReading_Interface[]>;
25
+ /** Further drives (e.g. a remote server's); not reachable ⇒ throws (logged, the local measurement goes on). */
26
+ readRemote?: () => Promise<DyNTS_DiskReading_Interface[]>;
27
+ /** "Do not disturb": only the critical alert goes out. Missing ⇒ never. */
28
+ readDnd?: (now: Date) => Promise<boolean>;
29
+ send: (text: string) => Promise<{
30
+ sent: boolean;
31
+ detail: string;
32
+ }>;
33
+ log: (code: string, detail: string, isError: boolean) => void;
34
+ /** The prefix of the logged codes (`<prefix>-DISK-SPACE-…`). Default: `DyNTS-MM`. */
35
+ codePrefix?: string;
36
+ }
37
+ //# sourceMappingURL=disk-space.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/machine-monitor/_models/disk-space.interface.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,MAAM,WAAW,2BAA2B;IAC1C,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,yBAAyB;AACzB,MAAM,WAAW,yBAA0B,SAAQ,2BAA2B;IAC5E,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CAC5B;AAED,kDAAkD;AAClD,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAE9F,0EAA0E;AAC1E,MAAM,WAAW,mCAAmC;IAClD,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,SAAS,EAAE,MAAM,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IACxD,+GAA+G;IAC/G,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAAC;IAC1D,2EAA2E;IAC3E,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=disk-space.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space.interface.js","sourceRoot":"","sources":["../../../../src/_modules/machine-monitor/_models/disk-space.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { DyNTS_DiskReading_Interface } from './_models/disk-space.interface';
2
+ /**
3
+ * BFR-FLEET-033 — the default Windows reader of the disk-space watcher: the local and network drives from the CIM
4
+ * (`Win32_LogicalDisk`) through PowerShell, an asynchronous child process with a hidden window and a timeout.
5
+ *
6
+ * @description Transplanted from My Assistant's wiring (the same command and timeout). ⛔ Windows only.
7
+ */
8
+ export declare class DyNTS_DiskSpaceWindowsReader_Util {
9
+ /**
10
+ * The machine's drives.
11
+ *
12
+ * @param skipServers the network servers whose disks are measured directly (their shares are skipped)
13
+ */
14
+ static readLocal(skipServers?: readonly string[]): Promise<DyNTS_DiskReading_Interface[]>;
15
+ }
16
+ //# sourceMappingURL=disk-space-windows-reader.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space-windows-reader.util.d.ts","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/disk-space-windows-reader.util.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAK7E;;;;;GAKG;AACH,qBAAa,iCAAiC;IAE5C;;;;OAIG;WACU,SAAS,CAAC,WAAW,GAAE,SAAS,MAAM,EAAO,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC;CASpG"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_DiskSpaceWindowsReader_Util = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const os_1 = require("os");
6
+ const util_1 = require("util");
7
+ const disk_space_util_1 = require("./disk-space.util");
8
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
9
+ /**
10
+ * BFR-FLEET-033 — the default Windows reader of the disk-space watcher: the local and network drives from the CIM
11
+ * (`Win32_LogicalDisk`) through PowerShell, an asynchronous child process with a hidden window and a timeout.
12
+ *
13
+ * @description Transplanted from My Assistant's wiring (the same command and timeout). ⛔ Windows only.
14
+ */
15
+ class DyNTS_DiskSpaceWindowsReader_Util {
16
+ /**
17
+ * The machine's drives.
18
+ *
19
+ * @param skipServers the network servers whose disks are measured directly (their shares are skipped)
20
+ */
21
+ static async readLocal(skipServers = []) {
22
+ const { stdout } = await execFileAsync('powershell', [
23
+ '-NoProfile', '-Command',
24
+ 'Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID,DriveType,ProviderName,Size,FreeSpace '
25
+ + '| ConvertTo-Json -Compress',
26
+ ], { windowsHide: true, timeout: 60_000 });
27
+ return disk_space_util_1.DyNTS_DiskSpace_Util.parseCim({ host: (0, os_1.hostname)(), cim: JSON.parse(stdout), skipServers: skipServers });
28
+ }
29
+ }
30
+ exports.DyNTS_DiskSpaceWindowsReader_Util = DyNTS_DiskSpaceWindowsReader_Util;
31
+ //# sourceMappingURL=disk-space-windows-reader.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space-windows-reader.util.js","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/disk-space-windows-reader.util.ts"],"names":[],"mappings":";;;AAAA,iDAAyC;AACzC,2BAA8B;AAC9B,+BAAiC;AAGjC,uDAAyD;AAEzD,MAAM,aAAa,GAAG,IAAA,gBAAS,EAAC,wBAAQ,CAAC,CAAC;AAE1C;;;;;GAKG;AACH,MAAa,iCAAiC;IAE5C;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,cAAiC,EAAE;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE;YACnD,YAAY,EAAE,UAAU;YACxB,mGAAmG;kBAC/F,4BAA4B;SACjC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAE3C,OAAO,sCAAoB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAA,aAAQ,GAAE,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;IAChH,CAAC;CACF;AAhBD,8EAgBC"}
@@ -0,0 +1,37 @@
1
+ import { DyNTS_DiskSpaceRunnerDeps_Interface } from './_models/disk-space.interface';
2
+ /**
3
+ * BFR-FLEET-033 — the disk-space watcher: every 30 minutes on the app's own tick. ⛔ It never throws: a failed
4
+ * measurement is a coded log line, never a silent "all fine".
5
+ *
6
+ * @description Transplanted from My Assistant (`DiskSpaceRunner`), the logic unchanged. The state is written
7
+ * atomically (temporary file + rename); a failed send keeps the state, so the next tick tries again.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * const runner = new DyNTS_DiskSpace_Runner({
12
+ * statePath: DyNTS_DiskSpace_Runner.resolveStatePath('my-app'),
13
+ * readLocal: DyNTS_DiskSpaceWindowsReader_Util.readLocal,
14
+ * send: async (text) => ({ sent: await notify(text), detail: '' }),
15
+ * log: (code, detail) => DyFM_Log.warn(code, detail),
16
+ * });
17
+ * ```
18
+ */
19
+ export declare class DyNTS_DiskSpace_Runner {
20
+ static readonly EVERY_MS: number;
21
+ private lastRunAt;
22
+ private isRunning;
23
+ private readonly deps;
24
+ constructor(deps: DyNTS_DiskSpaceRunnerDeps_Interface);
25
+ /**
26
+ * The state file under the user's config folder.
27
+ *
28
+ * @param appFolder the app's own folder under `~/.config` (e.g. `my-app`)
29
+ * @param userHome the home folder (default: the current user's)
30
+ */
31
+ static resolveStatePath(appFolder: string, userHome?: string): string;
32
+ /** The code with the configured prefix. */
33
+ private code;
34
+ /** One measurement, if 30 minutes passed since the last. */
35
+ tick(now?: Date): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=disk-space.runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space.runner.d.ts","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/disk-space.runner.ts"],"names":[],"mappings":"AAKA,OAAO,EACyE,mCAAmC,EAClH,MAAM,gCAAgC,CAAC;AAGxC;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,sBAAsB;IAEjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAe;IAE/C,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAsC;gBAE/C,IAAI,EAAE,mCAAmC;IAIrD;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAkB,GAAG,MAAM;IAIhF,2CAA2C;IAC3C,OAAO,CAAC,IAAI;IAIZ,4DAA4D;IACtD,IAAI,CAAC,GAAG,GAAE,IAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CA2DlD"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_DiskSpace_Runner = void 0;
4
+ const fs_1 = require("fs");
5
+ const promises_1 = require("fs/promises");
6
+ const os_1 = require("os");
7
+ const path_1 = require("path");
8
+ const disk_space_util_1 = require("./disk-space.util");
9
+ /**
10
+ * BFR-FLEET-033 — the disk-space watcher: every 30 minutes on the app's own tick. ⛔ It never throws: a failed
11
+ * measurement is a coded log line, never a silent "all fine".
12
+ *
13
+ * @description Transplanted from My Assistant (`DiskSpaceRunner`), the logic unchanged. The state is written
14
+ * atomically (temporary file + rename); a failed send keeps the state, so the next tick tries again.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const runner = new DyNTS_DiskSpace_Runner({
19
+ * statePath: DyNTS_DiskSpace_Runner.resolveStatePath('my-app'),
20
+ * readLocal: DyNTS_DiskSpaceWindowsReader_Util.readLocal,
21
+ * send: async (text) => ({ sent: await notify(text), detail: '' }),
22
+ * log: (code, detail) => DyFM_Log.warn(code, detail),
23
+ * });
24
+ * ```
25
+ */
26
+ class DyNTS_DiskSpace_Runner {
27
+ static EVERY_MS = 30 * 60_000;
28
+ lastRunAt = Number.NEGATIVE_INFINITY;
29
+ isRunning = false;
30
+ deps;
31
+ constructor(deps) {
32
+ this.deps = deps;
33
+ }
34
+ /**
35
+ * The state file under the user's config folder.
36
+ *
37
+ * @param appFolder the app's own folder under `~/.config` (e.g. `my-app`)
38
+ * @param userHome the home folder (default: the current user's)
39
+ */
40
+ static resolveStatePath(appFolder, userHome = (0, os_1.homedir)()) {
41
+ return (0, path_1.join)(userHome, '.config', appFolder, 'status', 'disk-space-alerts.json');
42
+ }
43
+ /** The code with the configured prefix. */
44
+ code(suffix) {
45
+ return `${this.deps.codePrefix ?? 'DyNTS-MM'}-${suffix}`;
46
+ }
47
+ /** One measurement, if 30 minutes passed since the last. */
48
+ async tick(now = new Date()) {
49
+ if (this.isRunning || now.getTime() - this.lastRunAt < DyNTS_DiskSpace_Runner.EVERY_MS)
50
+ return;
51
+ this.isRunning = true;
52
+ this.lastRunAt = now.getTime();
53
+ try {
54
+ let local = [];
55
+ try {
56
+ local = await this.deps.readLocal();
57
+ }
58
+ catch (err) {
59
+ this.deps.log(this.code('DISK-SPACE-LOCAL-UNMEASURABLE'), `the machine's drives are NOT measurable: ${err instanceof Error ? err.message : String(err)}`, true);
60
+ }
61
+ let remote = [];
62
+ try {
63
+ remote = this.deps.readRemote ? await this.deps.readRemote() : [];
64
+ }
65
+ catch (err) {
66
+ this.deps.log(this.code('DISK-SPACE-REMOTE-UNMEASURABLE'), `the remote drives are NOT measurable: ${err instanceof Error ? err.message : String(err)}`, false);
67
+ }
68
+ const state = (0, fs_1.existsSync)(this.deps.statePath)
69
+ ? JSON.parse(await (0, promises_1.readFile)(this.deps.statePath, 'utf-8')) : {};
70
+ const decision = disk_space_util_1.DyNTS_DiskSpace_Util.decide({
71
+ readings: [...local, ...remote],
72
+ state: state,
73
+ now: now,
74
+ dnd: this.deps.readDnd ? await this.deps.readDnd(now) : false,
75
+ });
76
+ if (decision.alerts.length) {
77
+ const result = await this.deps.send(disk_space_util_1.DyNTS_DiskSpace_Util.message(decision.alerts));
78
+ // ⛔ on a failed send the state stays ⇒ the next tick tries again
79
+ if (!result.sent) {
80
+ this.deps.log(this.code('DISK-SPACE-SEND-FAILED'), result.detail, true);
81
+ return;
82
+ }
83
+ this.deps.log(this.code('DISK-SPACE-ALERTED'), decision.alerts
84
+ .map((a) => `${a.host} ${a.mount} ${Math.round(a.usedPct)}%`).join(', '), false);
85
+ }
86
+ await (0, promises_1.mkdir)((0, path_1.dirname)(this.deps.statePath), { recursive: true });
87
+ const temporary = `${this.deps.statePath}.${process.pid}.tmp`;
88
+ await (0, promises_1.writeFile)(temporary, JSON.stringify(decision.state, null, 2), 'utf-8');
89
+ await (0, promises_1.rename)(temporary, this.deps.statePath);
90
+ }
91
+ catch (err) {
92
+ this.deps.log(this.code('DISK-SPACE-FAILED'), err instanceof Error ? err.message : String(err), true);
93
+ }
94
+ finally {
95
+ this.isRunning = false;
96
+ }
97
+ }
98
+ }
99
+ exports.DyNTS_DiskSpace_Runner = DyNTS_DiskSpace_Runner;
100
+ //# sourceMappingURL=disk-space.runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space.runner.js","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/disk-space.runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { DyNTS_DiskAlert_Interface, DyNTS_DiskAlertState, DyNTS_DiskReading_Interface } from './_models/disk-space.interface';
2
+ /**
3
+ * BFR-FLEET-033 — the pure decision logic of the disk-space alert: any drive above 95 % ⇒ an alert, without repeating.
4
+ *
5
+ * @description Transplanted from My Assistant (`cli/src/diagnostics/disk-space.ts`), the logic unchanged:
6
+ * - a drive alerts again ONLY when the level rises (warning ⇒ critical) or 24 hours passed; under 93 % it re-arms
7
+ * (the swing around 95 % is noise);
8
+ * - under "do not disturb" only the critical (≥ 99 %) goes out, and the warning is not stored, so it goes out after.
9
+ */
10
+ export declare class DyNTS_DiskSpace_Util {
11
+ static readonly WARN_PCT: number;
12
+ static readonly CRITICAL_PCT: number;
13
+ /** Under this it re-arms (the swing around 95 % is noise). */
14
+ static readonly CLEAR_PCT: number;
15
+ static readonly REPEAT_MS: number;
16
+ /** The key of a drive. **Pure function.** */
17
+ static keyOf(reading: DyNTS_DiskReading_Interface): string;
18
+ /** The level. **Pure function.** */
19
+ static levelOf(usedPct: number): 'warn' | 'critical' | null;
20
+ /** What goes out now, and the new state. **Pure function.** */
21
+ static decide(params: {
22
+ readings: readonly DyNTS_DiskReading_Interface[];
23
+ state: DyNTS_DiskAlertState;
24
+ now: Date;
25
+ dnd: boolean;
26
+ }): {
27
+ alerts: DyNTS_DiskAlert_Interface[];
28
+ state: DyNTS_DiskAlertState;
29
+ };
30
+ /** The message. **Pure function.** */
31
+ static message(alerts: readonly DyNTS_DiskAlert_Interface[]): string;
32
+ /**
33
+ * The machine's drives from the Windows CIM list (`Win32_LogicalDisk`: `DeviceID`, `DriveType`, `ProviderName`,
34
+ * `Size`, `FreeSpace`). **Pure function.**
35
+ *
36
+ * @description A local disk (3) under the machine's name; a NETWORK drive (4) under ITS OWN server's name (e.g.
37
+ * `\\SERVER\share` ⇒ `SERVER`) — and it is skipped when that server's disks are measured directly
38
+ * (`skipServers`), otherwise the same disk would alert twice. A zero size ⇒ skipped.
39
+ */
40
+ static parseCim(params: {
41
+ host: string;
42
+ cim: unknown;
43
+ skipServers: readonly string[];
44
+ }): DyNTS_DiskReading_Interface[];
45
+ /**
46
+ * A disk list in the `{ disks: [{ mount, freeGb, usedPct }] }` shape (e.g. a remote host's diagnostics JSON) under
47
+ * the given host name. **Pure function.**
48
+ */
49
+ static parseDiskList(host: string, diag: unknown): DyNTS_DiskReading_Interface[];
50
+ }
51
+ //# sourceMappingURL=disk-space.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space.util.d.ts","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/disk-space.util.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EAAE,oBAAoB,EAAE,2BAA2B,EAC7E,MAAM,gCAAgC,CAAC;AAExC;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAE/B,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAM;IACtC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAM;IAC1C,8DAA8D;IAC9D,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAM;IACvC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAoB;IAErD,6CAA6C;IAC7C,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM;IAI1D,oCAAoC;IACpC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI;IAK3D,+DAA+D;IAC/D,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QACpB,QAAQ,EAAE,SAAS,2BAA2B,EAAE,CAAC;QAAC,KAAK,EAAE,oBAAoB,CAAC;QAAC,GAAG,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC;KACxG,GAAG;QAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;QAAC,KAAK,EAAE,oBAAoB,CAAA;KAAE;IA4BxE,sCAAsC;IACtC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,yBAAyB,EAAE,GAAG,MAAM;IASpE;;;;;;;OAOG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,2BAA2B,EAAE;IAwBtH;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,2BAA2B,EAAE;CAYjF"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_DiskSpace_Util = void 0;
4
+ /**
5
+ * BFR-FLEET-033 — the pure decision logic of the disk-space alert: any drive above 95 % ⇒ an alert, without repeating.
6
+ *
7
+ * @description Transplanted from My Assistant (`cli/src/diagnostics/disk-space.ts`), the logic unchanged:
8
+ * - a drive alerts again ONLY when the level rises (warning ⇒ critical) or 24 hours passed; under 93 % it re-arms
9
+ * (the swing around 95 % is noise);
10
+ * - under "do not disturb" only the critical (≥ 99 %) goes out, and the warning is not stored, so it goes out after.
11
+ */
12
+ class DyNTS_DiskSpace_Util {
13
+ static WARN_PCT = 95;
14
+ static CRITICAL_PCT = 99;
15
+ /** Under this it re-arms (the swing around 95 % is noise). */
16
+ static CLEAR_PCT = 93;
17
+ static REPEAT_MS = 24 * 60 * 60_000;
18
+ /** The key of a drive. **Pure function.** */
19
+ static keyOf(reading) {
20
+ return `${reading.host}|${reading.mount}`;
21
+ }
22
+ /** The level. **Pure function.** */
23
+ static levelOf(usedPct) {
24
+ return usedPct >= DyNTS_DiskSpace_Util.CRITICAL_PCT
25
+ ? 'critical' : usedPct >= DyNTS_DiskSpace_Util.WARN_PCT ? 'warn' : null;
26
+ }
27
+ /** What goes out now, and the new state. **Pure function.** */
28
+ static decide(params) {
29
+ const state = { ...params.state };
30
+ const alerts = [];
31
+ for (const reading of params.readings) {
32
+ const key = DyNTS_DiskSpace_Util.keyOf(reading);
33
+ const level = DyNTS_DiskSpace_Util.levelOf(reading.usedPct);
34
+ const previous = state[key];
35
+ if (!level) {
36
+ if (reading.usedPct < DyNTS_DiskSpace_Util.CLEAR_PCT)
37
+ delete state[key];
38
+ continue;
39
+ }
40
+ // under DND only the critical one — the warning is NOT stored, so it goes out after the DND
41
+ if (params.dnd && level === 'warn')
42
+ continue;
43
+ const escalated = previous?.level === 'warn' && level === 'critical';
44
+ const due = !previous || escalated
45
+ || params.now.getTime() - Date.parse(previous.at) >= DyNTS_DiskSpace_Util.REPEAT_MS;
46
+ if (!due)
47
+ continue;
48
+ alerts.push({ ...reading, level: level });
49
+ state[key] = { level: level, at: params.now.toISOString() };
50
+ }
51
+ return { alerts: alerts, state: state };
52
+ }
53
+ /** The message. **Pure function.** */
54
+ static message(alerts) {
55
+ const critical = alerts.some((alert) => alert.level === 'critical');
56
+ const lines = alerts.map((alert) => `${alert.level === 'critical' ? '🔴' : '🟠'} ${alert.host} ${alert.mount} ${Math.round(alert.usedPct)}% full, `
57
+ + `${Math.round(alert.freeGb)} GB free`);
58
+ return [`${critical ? '[urgent]' : '[serious]'} 💾 Drive filling up:`, ...lines].join('\n');
59
+ }
60
+ /**
61
+ * The machine's drives from the Windows CIM list (`Win32_LogicalDisk`: `DeviceID`, `DriveType`, `ProviderName`,
62
+ * `Size`, `FreeSpace`). **Pure function.**
63
+ *
64
+ * @description A local disk (3) under the machine's name; a NETWORK drive (4) under ITS OWN server's name (e.g.
65
+ * `\\SERVER\share` ⇒ `SERVER`) — and it is skipped when that server's disks are measured directly
66
+ * (`skipServers`), otherwise the same disk would alert twice. A zero size ⇒ skipped.
67
+ */
68
+ static parseCim(params) {
69
+ const rows = Array.isArray(params.cim) ? params.cim : params.cim ? [params.cim] : [];
70
+ const skip = new Set(params.skipServers.map((server) => server.toUpperCase()));
71
+ return rows.flatMap((row) => {
72
+ const field = (key) => Reflect.get(Object(row), key);
73
+ const size = Number(field('Size'));
74
+ const free = Number(field('FreeSpace'));
75
+ const mount = String(field('DeviceID') ?? '');
76
+ const type = Number(field('DriveType'));
77
+ if (!mount || !Number.isFinite(size) || size <= 0 || !Number.isFinite(free) || (type !== 3 && type !== 4)) {
78
+ return [];
79
+ }
80
+ const server = type === 4
81
+ ? (/^\\\\([^\\]+)\\/u.exec(String(field('ProviderName') ?? ''))?.[1] ?? '').toUpperCase() : '';
82
+ if (type === 4 && (!server || skip.has(server)))
83
+ return [];
84
+ return [{ host: server || params.host, mount: mount, usedPct: 100 - (100 * free) / size, freeGb: free / 1e9 }];
85
+ });
86
+ }
87
+ /**
88
+ * A disk list in the `{ disks: [{ mount, freeGb, usedPct }] }` shape (e.g. a remote host's diagnostics JSON) under
89
+ * the given host name. **Pure function.**
90
+ */
91
+ static parseDiskList(host, diag) {
92
+ const disks = Reflect.get(Object(diag), 'disks');
93
+ return (Array.isArray(disks) ? disks : []).flatMap((disk) => {
94
+ const mount = String(Reflect.get(Object(disk), 'mount') ?? '').replace(/\\$/u, '');
95
+ const usedPct = Number(Reflect.get(Object(disk), 'usedPct'));
96
+ const freeGb = Number(Reflect.get(Object(disk), 'freeGb'));
97
+ return mount && Number.isFinite(usedPct)
98
+ ? [{ host: host, mount: mount, usedPct: usedPct, freeGb: Number.isFinite(freeGb) ? freeGb : 0 }] : [];
99
+ });
100
+ }
101
+ }
102
+ exports.DyNTS_DiskSpace_Util = DyNTS_DiskSpace_Util;
103
+ //# sourceMappingURL=disk-space.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disk-space.util.js","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/disk-space.util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /** The measurement of one path. */
2
+ export interface DyNTS_FsReadMeterRow_Interface {
3
+ path: string;
4
+ bytes: number;
5
+ reads: number;
6
+ /** The most frequent callers (`<file>:<line>` under the source root), at most two. */
7
+ callers: {
8
+ caller: string;
9
+ count: number;
10
+ }[];
11
+ }
12
+ /**
13
+ * BFR-FLEET-033 — the READ meter of a process: which file is read again and again (one per process).
14
+ *
15
+ * @description Transplanted from My Assistant (`cli/src/diagnostics/fs-read-meter.ts`), the logic unchanged. There a
16
+ * watcher read whole files ~15 times a minute, and nothing told WHICH reader it was; this meter told it.
17
+ * - `fs.promises.readFile` and `fs.readFileSync` are replaced by a thin counter (the behaviour is unchanged); the
18
+ * already imported ESM names follow through `syncBuiltinESMExports()`;
19
+ * - one report line per minute, ONLY if the minute read more than `HEAVY_BYTES_PER_MINUTE`;
20
+ * - each line names the CALLER too (taken from the stack at the moment of the read, before the `await`, because
21
+ * after it the caller is lost);
22
+ * - ⛔ it never throws (an error of the measurement must not stop the process).
23
+ *
24
+ * Adapted for the bedrock: the caller root is a setting (`sourceRoot`, default `src`; My Assistant: `cli/src`), and
25
+ * frames under `node_modules` are never the caller.
26
+ */
27
+ export declare class DyNTS_FsReadMeter_Util {
28
+ /** This much reading per minute is worth a report line. */
29
+ static readonly HEAVY_BYTES_PER_MINUTE: number;
30
+ /** The report period. */
31
+ static readonly REPORT_EVERY_MS: number;
32
+ /** The folder the callers are shown relative to (`/` separated, e.g. `src` or `cli/src`). */
33
+ static sourceRoot: string;
34
+ private static readonly rows;
35
+ private static original;
36
+ /**
37
+ * The caller from the stack: the first frame under the source root that is NOT the meter itself and not under
38
+ * `node_modules`. No such frame ⇒ `?`. **Pure function.**
39
+ *
40
+ * @param stack the stack text
41
+ * @param sourceRoot the source root (default: `DyNTS_FsReadMeter_Util.sourceRoot`)
42
+ */
43
+ static callerOf(stack: string | undefined, sourceRoot?: string): string;
44
+ /** Records one read. */
45
+ static record(path: unknown, result: unknown, caller?: string): void;
46
+ /** Drains the measurement so far: the `top` largest paths + the totals. */
47
+ static drain(top?: number): {
48
+ rows: DyNTS_FsReadMeterRow_Interface[];
49
+ totalBytes: number;
50
+ totalReads: number;
51
+ };
52
+ /** The report line (MB, count, shortened path). */
53
+ static describe(report: {
54
+ rows: DyNTS_FsReadMeterRow_Interface[];
55
+ totalBytes: number;
56
+ totalReads: number;
57
+ }): string;
58
+ /**
59
+ * Turns the meter on (once per process) + the per-minute report.
60
+ *
61
+ * @param onHeavy called with the report line of a heavy minute
62
+ * @returns the timer (`unref`), or `null` if it was already on
63
+ */
64
+ static install(onHeavy: (line: string) => void): NodeJS.Timeout | null;
65
+ /** Turns the meter off (spec). */
66
+ static uninstall(): void;
67
+ }
68
+ //# sourceMappingURL=fs-read-meter.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-read-meter.util.d.ts","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/fs-read-meter.util.ts"],"names":[],"mappings":"AAGA,mCAAmC;AACnC,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,sFAAsF;IACtF,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9C;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAsB;IAEjC,2DAA2D;IAC3D,MAAM,CAAC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAoB;IAElE,yBAAyB;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAU;IAEjD,6FAA6F;IAC7F,MAAM,CAAC,UAAU,EAAE,MAAM,CAAS;IAElC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAA0F;IAEtH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgG;IAEvH;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,GAAE,MAA0C,GAAG,MAAM;IAiB1G,wBAAwB;IACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAE,MAAY,GAAG,IAAI;IAkBzE,2EAA2E;IAC3E,MAAM,CAAC,KAAK,CAAC,GAAG,GAAE,MAAU,GAAG;QAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAqBjH,mDAAmD;IACnD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,8BAA8B,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAWnH;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,IAAI;IA0CtE,kCAAkC;IAClC,MAAM,CAAC,SAAS,IAAI,IAAI;CASzB"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DyNTS_FsReadMeter_Util = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = tslib_1.__importDefault(require("fs"));
6
+ const module_1 = require("module");
7
+ /**
8
+ * BFR-FLEET-033 — the READ meter of a process: which file is read again and again (one per process).
9
+ *
10
+ * @description Transplanted from My Assistant (`cli/src/diagnostics/fs-read-meter.ts`), the logic unchanged. There a
11
+ * watcher read whole files ~15 times a minute, and nothing told WHICH reader it was; this meter told it.
12
+ * - `fs.promises.readFile` and `fs.readFileSync` are replaced by a thin counter (the behaviour is unchanged); the
13
+ * already imported ESM names follow through `syncBuiltinESMExports()`;
14
+ * - one report line per minute, ONLY if the minute read more than `HEAVY_BYTES_PER_MINUTE`;
15
+ * - each line names the CALLER too (taken from the stack at the moment of the read, before the `await`, because
16
+ * after it the caller is lost);
17
+ * - ⛔ it never throws (an error of the measurement must not stop the process).
18
+ *
19
+ * Adapted for the bedrock: the caller root is a setting (`sourceRoot`, default `src`; My Assistant: `cli/src`), and
20
+ * frames under `node_modules` are never the caller.
21
+ */
22
+ class DyNTS_FsReadMeter_Util {
23
+ /** This much reading per minute is worth a report line. */
24
+ static HEAVY_BYTES_PER_MINUTE = 10 * 1024 * 1024;
25
+ /** The report period. */
26
+ static REPORT_EVERY_MS = 60_000;
27
+ /** The folder the callers are shown relative to (`/` separated, e.g. `src` or `cli/src`). */
28
+ static sourceRoot = 'src';
29
+ static rows = new Map();
30
+ static original = null;
31
+ /**
32
+ * The caller from the stack: the first frame under the source root that is NOT the meter itself and not under
33
+ * `node_modules`. No such frame ⇒ `?`. **Pure function.**
34
+ *
35
+ * @param stack the stack text
36
+ * @param sourceRoot the source root (default: `DyNTS_FsReadMeter_Util.sourceRoot`)
37
+ */
38
+ static callerOf(stack, sourceRoot = DyNTS_FsReadMeter_Util.sourceRoot) {
39
+ const root = sourceRoot.split('/').map((part) => part.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&')).join('[\\\\/]');
40
+ const frame = new RegExp(`[\\\\/]${root}[\\\\/](.+?):(\\d+):\\d+\\)?\\s*$`, 'u');
41
+ for (const line of (stack ?? '').split('\n').slice(1)) {
42
+ if (/[\\/]node_modules[\\/]/u.test(line))
43
+ continue;
44
+ const match = frame.exec(line);
45
+ const file = match?.[1]?.replace(/\\/gu, '/');
46
+ if (file && !/(?:^|\/)fs-read-meter\.util\.(?:ts|js)$/u.test(file))
47
+ return `${file}:${match?.[2] ?? '?'}`;
48
+ }
49
+ return '?';
50
+ }
51
+ /** Records one read. */
52
+ static record(path, result, caller = '?') {
53
+ try {
54
+ const key = typeof path === 'string'
55
+ ? path : path instanceof URL ? path.pathname : Buffer.isBuffer(path) ? path.toString() : 'fd';
56
+ const bytes = typeof result === 'string' ? Buffer.byteLength(result) : Buffer.isBuffer(result) ? result.length : 0;
57
+ const row = DyNTS_FsReadMeter_Util.rows.get(key) ?? { bytes: 0, reads: 0, callers: new Map() };
58
+ row.bytes += bytes;
59
+ row.reads += 1;
60
+ row.callers.set(caller, (row.callers.get(caller) ?? 0) + 1);
61
+ DyNTS_FsReadMeter_Util.rows.set(key, row);
62
+ }
63
+ catch {
64
+ // ⛔ an error of the measurement never reaches the caller
65
+ }
66
+ }
67
+ /** Drains the measurement so far: the `top` largest paths + the totals. */
68
+ static drain(top = 5) {
69
+ const rows = [...DyNTS_FsReadMeter_Util.rows.entries()]
70
+ .map(([path, row]) => ({
71
+ path: path,
72
+ bytes: row.bytes,
73
+ reads: row.reads,
74
+ callers: [...row.callers.entries()]
75
+ .map(([caller, count]) => ({ caller: caller, count: count }))
76
+ .sort((a, b) => b.count - a.count).slice(0, 2),
77
+ }))
78
+ .sort((a, b) => b.bytes - a.bytes);
79
+ DyNTS_FsReadMeter_Util.rows.clear();
80
+ return {
81
+ rows: rows.slice(0, top),
82
+ totalBytes: rows.reduce((sum, row) => sum + row.bytes, 0),
83
+ totalReads: rows.reduce((sum, row) => sum + row.reads, 0),
84
+ };
85
+ }
86
+ /** The report line (MB, count, shortened path). */
87
+ static describe(report) {
88
+ const mb = (bytes) => (bytes / 1024 / 1024).toFixed(1);
89
+ return `${mb(report.totalBytes)} MB / min, ${report.totalReads} reads — most: `
90
+ + report.rows.map((row) => `${row.path.split(/[\\/]/u).slice(-2).join('/')} ${mb(row.bytes)} MB (${row.reads}×`
91
+ + `${row.callers.length
92
+ ? ` ← ${row.callers.map((entry) => `${entry.caller} ${entry.count}×`).join(', ')}` : ''})`)
93
+ .join('; ');
94
+ }
95
+ /**
96
+ * Turns the meter on (once per process) + the per-minute report.
97
+ *
98
+ * @param onHeavy called with the report line of a heavy minute
99
+ * @returns the timer (`unref`), or `null` if it was already on
100
+ */
101
+ static install(onHeavy) {
102
+ if (DyNTS_FsReadMeter_Util.original)
103
+ return null;
104
+ const readFile = fs_1.default.promises.readFile;
105
+ const readFileSync = fs_1.default.readFileSync;
106
+ DyNTS_FsReadMeter_Util.original = { readFile: readFile, readFileSync: readFileSync };
107
+ Object.assign(fs_1.default.promises, {
108
+ readFile: async (...args) => {
109
+ // ⚠️ the caller BEFORE the `await` — after it the stack no longer shows it
110
+ const caller = DyNTS_FsReadMeter_Util.callerOf(new Error().stack);
111
+ const result = await readFile(...args);
112
+ DyNTS_FsReadMeter_Util.record(args[0], result, caller);
113
+ return result;
114
+ },
115
+ });
116
+ Object.assign(fs_1.default, {
117
+ readFileSync: (...args) => {
118
+ const result = readFileSync(...args);
119
+ DyNTS_FsReadMeter_Util.record(args[0], result, DyNTS_FsReadMeter_Util.callerOf(new Error().stack));
120
+ return result;
121
+ },
122
+ });
123
+ (0, module_1.syncBuiltinESMExports)();
124
+ const timer = setInterval(() => {
125
+ const report = DyNTS_FsReadMeter_Util.drain();
126
+ if (report.totalBytes >= DyNTS_FsReadMeter_Util.HEAVY_BYTES_PER_MINUTE) {
127
+ onHeavy(DyNTS_FsReadMeter_Util.describe(report));
128
+ }
129
+ }, DyNTS_FsReadMeter_Util.REPORT_EVERY_MS);
130
+ timer.unref();
131
+ return timer;
132
+ }
133
+ /** Turns the meter off (spec). */
134
+ static uninstall() {
135
+ if (!DyNTS_FsReadMeter_Util.original)
136
+ return;
137
+ Object.assign(fs_1.default.promises, { readFile: DyNTS_FsReadMeter_Util.original.readFile });
138
+ Object.assign(fs_1.default, { readFileSync: DyNTS_FsReadMeter_Util.original.readFileSync });
139
+ (0, module_1.syncBuiltinESMExports)();
140
+ DyNTS_FsReadMeter_Util.original = null;
141
+ DyNTS_FsReadMeter_Util.rows.clear();
142
+ }
143
+ }
144
+ exports.DyNTS_FsReadMeter_Util = DyNTS_FsReadMeter_Util;
145
+ //# sourceMappingURL=fs-read-meter.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-read-meter.util.js","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/fs-read-meter.util.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,9 @@ export { DyNTS_MachineState_Util } from './machine-state.util';
5
5
  export { DyNTS_MachineStateWindow_Util } from './machine-state-window.util';
6
6
  export { DyNTS_MachineState_Recorder } from './machine-state.recorder';
7
7
  export { DyNTS_MachineStateWindowsRunners_Util } from './machine-state-windows-runners.util';
8
+ export { DyNTS_DiskAlert_Interface, DyNTS_DiskAlertState, DyNTS_DiskReading_Interface, DyNTS_DiskSpaceRunnerDeps_Interface, } from './_models/disk-space.interface';
9
+ export { DyNTS_DiskSpace_Util } from './disk-space.util';
10
+ export { DyNTS_DiskSpace_Runner } from './disk-space.runner';
11
+ export { DyNTS_DiskSpaceWindowsReader_Util } from './disk-space-windows-reader.util';
12
+ export { DyNTS_FsReadMeter_Util, DyNTS_FsReadMeterRow_Interface } from './fs-read-meter.util';
8
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,8BAA8B,EAC9B,oCAAoC,EACpC,+BAA+B,GAChC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAC;AAChG,OAAO,EAAE,wCAAwC,EAAE,MAAM,iDAAiD,CAAC;AAC3G,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,qCAAqC,EAAE,MAAM,sCAAsC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,8BAA8B,EAC9B,oCAAoC,EACpC,+BAA+B,GAChC,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,mCAAmC,EAAE,MAAM,2CAA2C,CAAC;AAChG,OAAO,EAAE,wCAAwC,EAAE,MAAM,iDAAiD,CAAC;AAC3G,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,qCAAqC,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EACL,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DyNTS_MachineStateWindowsRunners_Util = exports.DyNTS_MachineState_Recorder = exports.DyNTS_MachineStateWindow_Util = exports.DyNTS_MachineState_Util = void 0;
3
+ exports.DyNTS_FsReadMeter_Util = exports.DyNTS_DiskSpaceWindowsReader_Util = exports.DyNTS_DiskSpace_Runner = exports.DyNTS_DiskSpace_Util = exports.DyNTS_MachineStateWindowsRunners_Util = exports.DyNTS_MachineState_Recorder = exports.DyNTS_MachineStateWindow_Util = exports.DyNTS_MachineState_Util = void 0;
4
4
  var machine_state_util_1 = require("./machine-state.util");
5
5
  Object.defineProperty(exports, "DyNTS_MachineState_Util", { enumerable: true, get: function () { return machine_state_util_1.DyNTS_MachineState_Util; } });
6
6
  var machine_state_window_util_1 = require("./machine-state-window.util");
@@ -9,4 +9,12 @@ var machine_state_recorder_1 = require("./machine-state.recorder");
9
9
  Object.defineProperty(exports, "DyNTS_MachineState_Recorder", { enumerable: true, get: function () { return machine_state_recorder_1.DyNTS_MachineState_Recorder; } });
10
10
  var machine_state_windows_runners_util_1 = require("./machine-state-windows-runners.util");
11
11
  Object.defineProperty(exports, "DyNTS_MachineStateWindowsRunners_Util", { enumerable: true, get: function () { return machine_state_windows_runners_util_1.DyNTS_MachineStateWindowsRunners_Util; } });
12
+ var disk_space_util_1 = require("./disk-space.util");
13
+ Object.defineProperty(exports, "DyNTS_DiskSpace_Util", { enumerable: true, get: function () { return disk_space_util_1.DyNTS_DiskSpace_Util; } });
14
+ var disk_space_runner_1 = require("./disk-space.runner");
15
+ Object.defineProperty(exports, "DyNTS_DiskSpace_Runner", { enumerable: true, get: function () { return disk_space_runner_1.DyNTS_DiskSpace_Runner; } });
16
+ var disk_space_windows_reader_util_1 = require("./disk-space-windows-reader.util");
17
+ Object.defineProperty(exports, "DyNTS_DiskSpaceWindowsReader_Util", { enumerable: true, get: function () { return disk_space_windows_reader_util_1.DyNTS_DiskSpaceWindowsReader_Util; } });
18
+ var fs_read_meter_util_1 = require("./fs-read-meter.util");
19
+ Object.defineProperty(exports, "DyNTS_FsReadMeter_Util", { enumerable: true, get: function () { return fs_read_meter_util_1.DyNTS_FsReadMeter_Util; } });
12
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/index.ts"],"names":[],"mappings":";;;AAQA,2DAA+D;AAAtD,6HAAA,uBAAuB,OAAA;AAChC,yEAA4E;AAAnE,0IAAA,6BAA6B,OAAA;AACtC,mEAAuE;AAA9D,qIAAA,2BAA2B,OAAA;AACpC,2FAA6F;AAApF,2JAAA,qCAAqC,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/machine-monitor/index.ts"],"names":[],"mappings":";;;AAQA,2DAA+D;AAAtD,6HAAA,uBAAuB,OAAA;AAChC,yEAA4E;AAAnE,0IAAA,6BAA6B,OAAA;AACtC,mEAAuE;AAA9D,qIAAA,2BAA2B,OAAA;AACpC,2FAA6F;AAApF,2JAAA,qCAAqC,OAAA;AAO9C,qDAAyD;AAAhD,uHAAA,oBAAoB,OAAA;AAC7B,yDAA6D;AAApD,2HAAA,sBAAsB,OAAA;AAC/B,mFAAqF;AAA5E,mJAAA,iCAAiC,OAAA;AAC1C,2DAA8F;AAArF,4HAAA,sBAAsB,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/nts-dynamo",
3
- "version": "01.15.438",
3
+ "version": "01.15.440",
4
4
  "description": "Dynamic NodeTS (NodeJS-Typescript), MongoDB Backend System Framework by Future Development Program Ltd.",
5
5
  "DyBu_settings": {
6
6
  "packageType": "server-package",