@glassmkr/crucible 0.11.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/collect/__tests__/c11-c18.test.d.ts +1 -0
  2. package/dist/collect/__tests__/c11-c18.test.js +375 -0
  3. package/dist/collect/__tests__/c11-c18.test.js.map +1 -0
  4. package/dist/collect/__tests__/gpu.test.d.ts +1 -0
  5. package/dist/collect/__tests__/gpu.test.js +196 -0
  6. package/dist/collect/__tests__/gpu.test.js.map +1 -0
  7. package/dist/collect/__tests__/systemd.test.js +10 -1
  8. package/dist/collect/__tests__/systemd.test.js.map +1 -1
  9. package/dist/collect/cve.d.ts +51 -0
  10. package/dist/collect/cve.js +327 -0
  11. package/dist/collect/cve.js.map +1 -0
  12. package/dist/collect/dmesg-events.d.ts +32 -0
  13. package/dist/collect/dmesg-events.js +196 -0
  14. package/dist/collect/dmesg-events.js.map +1 -0
  15. package/dist/collect/ethtool.d.ts +29 -0
  16. package/dist/collect/ethtool.js +99 -0
  17. package/dist/collect/ethtool.js.map +1 -0
  18. package/dist/collect/gpu.d.ts +13 -0
  19. package/dist/collect/gpu.js +438 -0
  20. package/dist/collect/gpu.js.map +1 -0
  21. package/dist/collect/ipmi.d.ts +19 -1
  22. package/dist/collect/ipmi.js +39 -2
  23. package/dist/collect/ipmi.js.map +1 -1
  24. package/dist/collect/lvm.d.ts +39 -0
  25. package/dist/collect/lvm.js +102 -0
  26. package/dist/collect/lvm.js.map +1 -0
  27. package/dist/collect/smart.d.ts +25 -0
  28. package/dist/collect/smart.js +36 -0
  29. package/dist/collect/smart.js.map +1 -1
  30. package/dist/collect/softnet.d.ts +17 -0
  31. package/dist/collect/softnet.js +82 -0
  32. package/dist/collect/softnet.js.map +1 -0
  33. package/dist/collect/systemd.d.ts +27 -2
  34. package/dist/collect/systemd.js +98 -5
  35. package/dist/collect/systemd.js.map +1 -1
  36. package/dist/index.js +37 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/lib/types.d.ts +248 -1
  39. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,375 @@
1
+ // Tests for the C11-C18 collectors (v0.12.0, 2026-05-19).
2
+ //
3
+ // Coverage strategy mirrors c7-c10.test.ts: pure parser functions are
4
+ // tested directly with fixture strings; capability-gated collectors
5
+ // are exercised via shape assertions on non-Linux dev hosts (collector
6
+ // must not throw and must return its declared shape with available
7
+ // either true or false based on /proc presence).
8
+ import { beforeEach, describe, expect, it } from "vitest";
9
+ import { __test_only as systemdTest } from "../systemd.js";
10
+ import { __test_only as lvmTest, parseLvsJson } from "../lvm.js";
11
+ import { __test_only as ethtoolTest, parseEthtoolOutput } from "../ethtool.js";
12
+ import { __test_only as softnetTest, collectSoftnet } from "../softnet.js";
13
+ import { decodeNvmeCriticalWarning, parseSmartctlJson } from "../smart.js";
14
+ import { __test_only_c11 as ipmiTest } from "../ipmi.js";
15
+ import { __test_only as cveTest, parseDnfUpdateinfoText, parseUbuntuProJson, parseZypperListPatchesText, } from "../cve.js";
16
+ import { __test_only as dmesgTest, parseDmesgOutput, parseDmesgTimestamp, } from "../dmesg-events.js";
17
+ // ============================================================================
18
+ // C12 systemd Result parsing
19
+ // ============================================================================
20
+ describe("C12 systemd: parseUnitDetailsOutput", () => {
21
+ it("parses Result + ActiveState + SubState + NRestarts", () => {
22
+ const out = [
23
+ "Result=oom-kill",
24
+ "ActiveState=failed",
25
+ "SubState=failed",
26
+ "NRestarts=7",
27
+ ].join("\n");
28
+ const r = systemdTest.parseUnitDetailsOutput("myapp.service", out);
29
+ expect(r.result).toBe("oom-kill");
30
+ expect(r.active_state).toBe("failed");
31
+ expect(r.sub_state).toBe("failed");
32
+ expect(r.n_restarts).toBe(7);
33
+ });
34
+ it("maps an unrecognized Result to 'unknown'", () => {
35
+ const out = "Result=some-future-value\nActiveState=failed\nSubState=failed\nNRestarts=0";
36
+ expect(systemdTest.parseUnitDetailsOutput("u.service", out).result).toBe("unknown");
37
+ });
38
+ it("defaults NRestarts to 0 on parse failure", () => {
39
+ const out = "Result=exit-code\nActiveState=failed\nSubState=failed\nNRestarts=garbage";
40
+ expect(systemdTest.parseUnitDetailsOutput("u.service", out).n_restarts).toBe(0);
41
+ });
42
+ it("RESULT_VALUES enumerates all known classifier values", () => {
43
+ expect(systemdTest.RESULT_VALUES.has("oom-kill")).toBe(true);
44
+ expect(systemdTest.RESULT_VALUES.has("watchdog")).toBe(true);
45
+ // Cast to bypass the literal-union type; we're testing runtime
46
+ // set membership for unrecognised classifier strings.
47
+ expect(systemdTest.RESULT_VALUES.has("nonexistent")).toBe(false);
48
+ });
49
+ });
50
+ // ============================================================================
51
+ // C14 LVM thin: parseLvsJson
52
+ // ============================================================================
53
+ describe("C14 LVM: parseLvsJson", () => {
54
+ it("parses a thin pool entry", () => {
55
+ const raw = JSON.stringify({
56
+ report: [
57
+ {
58
+ lv: [
59
+ {
60
+ lv_name: "thinpool",
61
+ vg_name: "vg0",
62
+ lv_attr: "twi-aotz--",
63
+ data_percent: "45.20",
64
+ metadata_percent: "12.30",
65
+ },
66
+ {
67
+ lv_name: "thin1",
68
+ vg_name: "vg0",
69
+ lv_attr: "Vwi-a-tz--",
70
+ data_percent: "0.00",
71
+ metadata_percent: "0.00",
72
+ },
73
+ ],
74
+ },
75
+ ],
76
+ });
77
+ const pools = parseLvsJson(raw);
78
+ expect(pools).not.toBeNull();
79
+ expect(pools.length).toBe(1);
80
+ expect(pools[0].lv_name).toBe("thinpool");
81
+ expect(pools[0].metadata_percent).toBeCloseTo(12.3);
82
+ });
83
+ it("returns empty array when no thin pools present", () => {
84
+ const raw = JSON.stringify({
85
+ report: [{ lv: [{ lv_name: "root", vg_name: "vg0", lv_attr: "-wi-ao----", data_percent: "0", metadata_percent: "0" }] }],
86
+ });
87
+ expect(parseLvsJson(raw)).toEqual([]);
88
+ });
89
+ it("returns null on malformed JSON", () => {
90
+ expect(parseLvsJson("not json")).toBeNull();
91
+ });
92
+ it("parsePercent handles number, string, and other inputs", () => {
93
+ expect(lvmTest.parsePercent(45.5)).toBe(45.5);
94
+ expect(lvmTest.parsePercent("12.3")).toBeCloseTo(12.3);
95
+ expect(lvmTest.parsePercent(null)).toBe(0);
96
+ });
97
+ });
98
+ // ============================================================================
99
+ // C15 ethtool: parseEthtoolOutput
100
+ // ============================================================================
101
+ describe("C15 ethtool: parseEthtoolOutput", () => {
102
+ it("captures Advertised auto-negotiation and link modes (multiline)", () => {
103
+ const raw = `Settings for eth0:
104
+ \tSupported ports: [ TP ]
105
+ \tAdvertised auto-negotiation: Yes
106
+ \tAdvertised link modes: 10baseT/Half 10baseT/Full
107
+ \t 100baseT/Half 100baseT/Full
108
+ \t 1000baseT/Full
109
+ \tSpeed: 1000Mb/s
110
+ \tDuplex: Full
111
+ \tAuto-negotiation: on
112
+ \tLink detected: yes`;
113
+ const r = parseEthtoolOutput("eth0", raw);
114
+ expect(r.iface).toBe("eth0");
115
+ expect(r.advertised_auto_negotiation).toBe(true);
116
+ expect(r.advertised_link_modes).toContain("1000baseT/Full");
117
+ expect(r.advertised_link_modes).toContain("100baseT/Full");
118
+ expect(r.advertised_link_modes.length).toBeGreaterThanOrEqual(5);
119
+ });
120
+ it("returns null auto-negotiation when not advertised", () => {
121
+ const raw = "Settings for eth1:\n\tSpeed: 10000Mb/s\n";
122
+ const r = parseEthtoolOutput("eth1", raw);
123
+ expect(r.advertised_auto_negotiation).toBeNull();
124
+ expect(r.advertised_link_modes).toEqual([]);
125
+ });
126
+ it("test-only export exposes parser", () => {
127
+ expect(typeof ethtoolTest.parseEthtoolOutput).toBe("function");
128
+ });
129
+ });
130
+ // ============================================================================
131
+ // C16 softnet: capability gate + column constants
132
+ // ============================================================================
133
+ describe("C16 softnet", () => {
134
+ beforeEach(() => {
135
+ softnetTest.resetForTests();
136
+ });
137
+ it("collectSoftnet does not throw on non-Linux dev hosts", () => {
138
+ expect(() => collectSoftnet()).not.toThrow();
139
+ const r = collectSoftnet();
140
+ expect(typeof r.available).toBe("boolean");
141
+ });
142
+ it("DROPPED_COL is column index 2 (per net/core/dev.c softnet_seq_show)", () => {
143
+ expect(softnetTest.DROPPED_COL).toBe(2);
144
+ });
145
+ it("rate is null on first call (no prior counter to delta against)", () => {
146
+ const r = collectSoftnet();
147
+ if (r.available) {
148
+ expect(r.total_dropped_rate_per_sec).toBeNull();
149
+ }
150
+ });
151
+ });
152
+ // ============================================================================
153
+ // C17 NVMe Critical Warning decode
154
+ // ============================================================================
155
+ describe("C17 NVMe critical warning decode", () => {
156
+ it("decodes 0x00 as all-false", () => {
157
+ const r = decodeNvmeCriticalWarning(0x00);
158
+ expect(r.available_spare_low).toBe(false);
159
+ expect(r.temperature_threshold).toBe(false);
160
+ expect(r.read_only).toBe(false);
161
+ });
162
+ it("decodes 0x09 (bits 0 + 3) as spare-low + read-only", () => {
163
+ const r = decodeNvmeCriticalWarning(0x09);
164
+ expect(r.available_spare_low).toBe(true);
165
+ expect(r.read_only).toBe(true);
166
+ expect(r.temperature_threshold).toBe(false);
167
+ expect(r.reliability_degraded).toBe(false);
168
+ });
169
+ it("decodes 0x3f as all flags set", () => {
170
+ const r = decodeNvmeCriticalWarning(0x3f);
171
+ expect(Object.values(r).every((v) => v === true)).toBe(true);
172
+ });
173
+ it("parseSmartctlJson surfaces critical_warning_decoded on NVMe", () => {
174
+ const raw = {
175
+ model_name: "INTEL SSDPE2KX020T8",
176
+ smart_status: { passed: true },
177
+ nvme_smart_health_information_log: {
178
+ critical_warning: 0x02, // temperature threshold
179
+ percentage_used: 12,
180
+ temperature: 305,
181
+ available_spare: 100,
182
+ available_spare_threshold: 10,
183
+ },
184
+ };
185
+ const info = parseSmartctlJson(raw, "/dev/nvme0");
186
+ expect(info.critical_warning_raw).toBe(0x02);
187
+ expect(info.critical_warning_decoded?.temperature_threshold).toBe(true);
188
+ expect(info.critical_warning_decoded?.read_only).toBe(false);
189
+ expect(info.nvme_available_spare).toBe(100);
190
+ expect(info.nvme_available_spare_threshold).toBe(10);
191
+ });
192
+ it("parseSmartctlJson omits decoded field on SATA (no critical_warning)", () => {
193
+ const raw = {
194
+ model_name: "Samsung SSD",
195
+ smart_status: { passed: true },
196
+ ata_smart_attributes: { table: [] },
197
+ };
198
+ const info = parseSmartctlJson(raw, "/dev/sda");
199
+ expect(info.critical_warning_decoded).toBeUndefined();
200
+ expect(info.critical_warning_raw).toBeUndefined();
201
+ });
202
+ });
203
+ // ============================================================================
204
+ // C11 vendor SEL parser quality mapping
205
+ // ============================================================================
206
+ describe("C11 ipmi: vendor -> BMC vendor + parser_quality", () => {
207
+ it("dell/hpe/supermicro map to fleet-tested", () => {
208
+ expect(ipmiTest.mapVendorToBmcVendor("dell")).toBe("dell");
209
+ expect(ipmiTest.mapVendorToBmcVendor("hpe")).toBe("hpe");
210
+ expect(ipmiTest.mapVendorToBmcVendor("supermicro")).toBe("supermicro");
211
+ expect(ipmiTest.parserQualityFor("dell")).toBe("fleet-tested");
212
+ expect(ipmiTest.parserQualityFor("hpe")).toBe("fleet-tested");
213
+ expect(ipmiTest.parserQualityFor("supermicro")).toBe("fleet-tested");
214
+ });
215
+ it("lenovo/cisco map to stub", () => {
216
+ expect(ipmiTest.parserQualityFor("lenovo")).toBe("stub");
217
+ expect(ipmiTest.parserQualityFor("cisco")).toBe("stub");
218
+ // openbmc isn't a DMI vendor; only flagged when detected via
219
+ // ipmitool mc info (follow-up). The function still classifies it
220
+ // as stub if a caller passes it explicitly.
221
+ expect(ipmiTest.parserQualityFor("openbmc")).toBe("stub");
222
+ });
223
+ it("asrockrack / inspur / generic / virtual all collapse to unknown", () => {
224
+ expect(ipmiTest.mapVendorToBmcVendor("asrockrack")).toBe("unknown");
225
+ expect(ipmiTest.mapVendorToBmcVendor("inspur")).toBe("unknown");
226
+ expect(ipmiTest.mapVendorToBmcVendor("generic")).toBe("unknown");
227
+ expect(ipmiTest.mapVendorToBmcVendor("virtual")).toBe("unknown");
228
+ expect(ipmiTest.parserQualityFor("unknown")).toBe("unknown");
229
+ });
230
+ });
231
+ // ============================================================================
232
+ // C13 CVE collection parsers
233
+ // ============================================================================
234
+ describe("C13 CVE: severity normalization", () => {
235
+ it("maps Critical/High/Moderate variations correctly", () => {
236
+ expect(cveTest.normaliseSeverity("Critical")).toBe("critical");
237
+ expect(cveTest.normaliseSeverity("CRIT")).toBe("critical");
238
+ expect(cveTest.normaliseSeverity("Important")).toBe("important");
239
+ expect(cveTest.normaliseSeverity("high")).toBe("important");
240
+ expect(cveTest.normaliseSeverity("Moderate")).toBe("moderate");
241
+ expect(cveTest.normaliseSeverity("medium")).toBe("moderate");
242
+ expect(cveTest.normaliseSeverity("low")).toBe("low");
243
+ expect(cveTest.normaliseSeverity("something-weird")).toBe("unknown");
244
+ });
245
+ });
246
+ describe("C13 CVE: Ubuntu Pro JSON parser", () => {
247
+ it("extracts kernel CVEs and severity counts", () => {
248
+ const raw = JSON.stringify({
249
+ summary: {
250
+ "kernel-cves": {
251
+ pending: [
252
+ { cve: "CVE-2026-1234", severity: "critical", package: "linux-image-6.8.0-107-generic" },
253
+ { cve: "CVE-2026-5678", severity: "high", package: "linux-image-6.8.0-107-generic" },
254
+ { cve: "CVE-2026-9012", severity: "moderate", package: "linux-image-6.8.0-107-generic" },
255
+ ],
256
+ },
257
+ },
258
+ });
259
+ const r = parseUbuntuProJson(raw);
260
+ expect(r.critical).toBe(1);
261
+ expect(r.important).toBe(1);
262
+ expect(r.kernel_cves.length).toBe(3);
263
+ expect(r.kernel_cves[0].cve_id).toBe("CVE-2026-1234");
264
+ expect(r.kernel_cves[0].severity).toBe("critical");
265
+ });
266
+ it("returns empty result on malformed JSON", () => {
267
+ const r = parseUbuntuProJson("not json");
268
+ expect(r.kernel_cves).toEqual([]);
269
+ expect(r.critical).toBe(0);
270
+ });
271
+ });
272
+ describe("C13 CVE: dnf updateinfo text parser", () => {
273
+ it("extracts kernel security advisories with severity", () => {
274
+ const raw = [
275
+ "RHSA-2026:1234 Critical/Sec. kernel-5.14.0-1234.x86_64",
276
+ "RHSA-2026:5678 Important/Sec. kernel-headers-5.14.0-1234.x86_64",
277
+ "RHBA-2026:9012 Moderate/Sec. bash-5.1.8-9.el9_4.x86_64",
278
+ ].join("\n");
279
+ const r = parseDnfUpdateinfoText(raw);
280
+ expect(r.critical).toBe(1);
281
+ expect(r.important).toBe(1);
282
+ expect(r.kernel_cves.length).toBe(2); // bash advisory filtered out
283
+ expect(r.kernel_cves[0].package_name).toContain("kernel");
284
+ });
285
+ });
286
+ describe("C13 CVE: zypper list-patches text parser", () => {
287
+ it("extracts kernel security patches with severity", () => {
288
+ const raw = [
289
+ "Repository | Name | Category | Severity | Status",
290
+ "SLES15-SP6-Updates | SUSE-SLE-Module-Kernel-Sec-1 | security | critical | needed",
291
+ "SLES15-SP6-Updates | SUSE-SLE-Other | security | important| needed",
292
+ "SLES15-SP6-Updates | SUSE-SLE-Kernel-Live-Patch | security | important| needed",
293
+ ].join("\n");
294
+ const r = parseZypperListPatchesText(raw);
295
+ expect(r.kernel_cves.length).toBe(2); // both have "kernel" in name
296
+ expect(r.critical).toBe(1);
297
+ expect(r.important).toBe(1);
298
+ });
299
+ });
300
+ // ============================================================================
301
+ // C18 dmesg structured events
302
+ // ============================================================================
303
+ describe("C18 dmesg: parseDmesgTimestamp", () => {
304
+ it("parses ISO format with fractional seconds and timezone", () => {
305
+ const ts = parseDmesgTimestamp("2026-05-19T12:34:56,789012+00:00 some message");
306
+ expect(ts).not.toBeNull();
307
+ expect(typeof ts).toBe("number");
308
+ });
309
+ it("parses ctime format from --ctime", () => {
310
+ const ts = parseDmesgTimestamp("[Mon May 19 12:34:56 2026] some message");
311
+ expect(ts).not.toBeNull();
312
+ });
313
+ it("returns null for relative-time format", () => {
314
+ expect(parseDmesgTimestamp("[12345.678] some message")).toBeNull();
315
+ });
316
+ });
317
+ describe("C18 dmesg: parseDmesgOutput by event class", () => {
318
+ const cutoff = 0; // accept all events
319
+ it("captures SCSI sense codes with severity by sense key", () => {
320
+ const raw = [
321
+ "[12345.678] sd 1:0:0:0: [sda] Sense Key : Medium Error [current]",
322
+ "[12345.789] sd 2:0:0:0: [sdb] Sense Key : Aborted Command",
323
+ "[12345.890] sd 3:0:0:0: [sdc] Sense Key : Recovered Error",
324
+ ].join("\n");
325
+ const events = parseDmesgOutput(raw, cutoff);
326
+ const scsi = events.filter((e) => e.event_type === "scsi_sense");
327
+ expect(scsi.length).toBe(3);
328
+ expect(scsi[0].severity).toBe("critical"); // Medium Error
329
+ expect(scsi[1].severity).toBe("critical"); // Aborted Command
330
+ expect(scsi[2].severity).toBe("warning"); // Recovered Error
331
+ expect(scsi[0].details.device).toBe("sda");
332
+ expect(scsi[0].details.sense_key).toBe("Medium Error");
333
+ });
334
+ it("captures NVMe controller resets", () => {
335
+ const raw = "[12345.123] nvme nvme0: I/O 256 QID 1 timeout, reset controller";
336
+ const events = parseDmesgOutput(raw, cutoff);
337
+ const nvme = events.filter((e) => e.event_type === "nvme_reset");
338
+ expect(nvme.length).toBe(1);
339
+ expect(nvme[0].severity).toBe("critical");
340
+ expect(nvme[0].details.controller).toBe("nvme0");
341
+ });
342
+ it("captures ext4 remount-readonly", () => {
343
+ const raw = [
344
+ "[12345.789] EXT4-fs error (device sda1): __ext4_read_inode_lock:5234: ...",
345
+ "[12345.790] EXT4-fs (sda1): Remounting filesystem read-only",
346
+ ].join("\n");
347
+ const events = parseDmesgOutput(raw, cutoff);
348
+ const ext4 = events.filter((e) => e.event_type === "ext4_remount_readonly");
349
+ expect(ext4.length).toBe(1);
350
+ expect(ext4[0].details.device).toBe("sda1");
351
+ expect(ext4[0].details.remount_readonly).toBe(true);
352
+ });
353
+ it("returns empty when no patterns match", () => {
354
+ const raw = [
355
+ "[12345.000] some unrelated kernel message",
356
+ "[12345.100] another harmless line",
357
+ ].join("\n");
358
+ expect(parseDmesgOutput(raw, cutoff).length).toBe(0);
359
+ });
360
+ it("3-class handler set ships in this release", () => {
361
+ expect(dmesgTest.HANDLERS.length).toBe(3);
362
+ expect(dmesgTest.WINDOW_SECONDS).toBe(3600);
363
+ });
364
+ });
365
+ // ============================================================================
366
+ // Combined capability gate sanity
367
+ // ============================================================================
368
+ describe("C11-C18 combined capability gates", () => {
369
+ it("none of the new collectors throw on non-Linux dev hosts", () => {
370
+ // softnet is sync; others are async — async failures already
371
+ // tolerated via try/catch in index.ts; we just verify the sync one.
372
+ expect(() => collectSoftnet()).not.toThrow();
373
+ });
374
+ });
375
+ //# sourceMappingURL=c11-c18.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"c11-c18.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/c11-c18.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,196 @@
1
+ // Tests for C19 GPU collection (v0.13.0, 2026-05-19).
2
+ //
3
+ // Coverage strategy matches c11-c18.test.ts: pure parser functions
4
+ // with synthetic fixtures inline; capability-gated collector
5
+ // exercised via shape assertions on non-Linux/non-NVIDIA dev hosts
6
+ // (collector must not throw and must return its declared shape with
7
+ // available=false and a reason).
8
+ import { describe, expect, it } from "vitest";
9
+ import { __test_only as gpuTest, collectGpu, parseNvidiaSmiCsvRow, parseNvLinkStatus, parseXidEvents, probeGpuCapabilities, } from "../gpu.js";
10
+ // ============================================================================
11
+ // Detection probe + capability gating
12
+ // ============================================================================
13
+ describe("C19 GPU probe + capability gate", () => {
14
+ it("probe returns nvidia_smi=false on a host without nvidia-smi (fast path)", async () => {
15
+ const caps = await probeGpuCapabilities();
16
+ // CI runners + dev macOS lack nvidia-smi -> nvidia_smi must be false.
17
+ expect(typeof caps.nvidia_smi).toBe("boolean");
18
+ if (!caps.nvidia_smi) {
19
+ expect(caps.nvidia_driver_version).toBeNull();
20
+ expect(caps.dcgm).toBe(false);
21
+ }
22
+ // Probe must be fast on non-NVIDIA hosts (<100ms is well within
23
+ // the spec's <10ms target; we use a looser bound for noisy CI).
24
+ expect(caps.probe_duration_ms).toBeLessThan(2500);
25
+ });
26
+ it("collectGpu returns available:false with reason on non-NVIDIA hosts", async () => {
27
+ const snap = await collectGpu();
28
+ if (!snap.available) {
29
+ expect(snap.reason).toMatch(/nvidia-smi/i);
30
+ expect(snap.capabilities.nvidia_smi).toBe(false);
31
+ }
32
+ });
33
+ it("Tier 3 ships as stub in v0.13.0 (Simon's 2026-05-19 decision)", async () => {
34
+ const snap = await collectGpu();
35
+ if (snap.available && snap.tier3 && "available" in snap.tier3) {
36
+ // When Tier 3 fires, it's always available:false in this
37
+ // release with the stub-pending reason.
38
+ expect(snap.tier3.available).toBe(false);
39
+ if (!snap.tier3.available) {
40
+ expect(snap.tier3.reason).toMatch(/stub|pending/i);
41
+ }
42
+ }
43
+ });
44
+ });
45
+ // ============================================================================
46
+ // Tier 1: nvidia-smi CSV parser
47
+ // ============================================================================
48
+ describe("C19 Tier 1: parseNvidiaSmiCsvRow", () => {
49
+ it("parses a fully-populated L4 row", () => {
50
+ // Real nvidia-smi CSV output shape from an NVIDIA L4 host.
51
+ const row = [
52
+ "0", "GPU-12345678-90ab-cdef-1234-567890abcdef", "NVIDIA L4",
53
+ "00000000:01:00.0", "95.02.66.00.04",
54
+ "22528", "1024",
55
+ "65", "27", "72",
56
+ "0", "0",
57
+ "1230", "1230", "6250",
58
+ "P8",
59
+ "4", "4", "16", "16",
60
+ "Enabled",
61
+ "0", "0", "0", "0",
62
+ "0", "0", "0",
63
+ "[Not Supported]",
64
+ ].join(", ");
65
+ const gpu = parseNvidiaSmiCsvRow(row);
66
+ expect(gpu).not.toBeNull();
67
+ expect(gpu.index).toBe(0);
68
+ expect(gpu.name).toBe("NVIDIA L4");
69
+ expect(gpu.pci_bdf).toBe("00000000:01:00.0");
70
+ expect(gpu.vram_total_mib).toBe(22528);
71
+ expect(gpu.temp_c).toBe(65);
72
+ expect(gpu.power_draw_w).toBe(27);
73
+ expect(gpu.power_limit_w).toBe(72);
74
+ expect(gpu.pcie_link_gen_current).toBe(4);
75
+ expect(gpu.pcie_link_gen_max).toBe(4);
76
+ expect(gpu.ecc_mode_current).toBe(true);
77
+ expect(gpu.fan_speed_percent).toBeNull();
78
+ });
79
+ it("handles [N/A] and [Not Supported] markers as null/0", () => {
80
+ const row = [
81
+ "0", "GPU-x", "Test GPU", "0000:01:00.0", "1.0",
82
+ "16384", "0",
83
+ "[N/A]", "0", "0",
84
+ "0", "0",
85
+ "0", "0", "0",
86
+ "P0",
87
+ "4", "4", "16", "16",
88
+ "Disabled",
89
+ "0", "0", "0", "0",
90
+ "[Not Supported]", "[Not Supported]", "[Not Supported]",
91
+ "50",
92
+ ].join(", ");
93
+ const gpu = parseNvidiaSmiCsvRow(row);
94
+ expect(gpu.temp_c).toBe(0);
95
+ expect(gpu.retired_pages_single_bit).toBeNull();
96
+ expect(gpu.retired_pages_double_bit).toBeNull();
97
+ expect(gpu.ecc_mode_current).toBe(false);
98
+ expect(gpu.fan_speed_percent).toBe(50);
99
+ });
100
+ it("returns null on malformed input", () => {
101
+ expect(parseNvidiaSmiCsvRow("short, row")).toBeNull();
102
+ });
103
+ });
104
+ // ============================================================================
105
+ // Tier 1: NVLink basic parser
106
+ // ============================================================================
107
+ describe("C19 Tier 1: parseNvLinkStatus", () => {
108
+ it("parses up/inactive/down link states", () => {
109
+ const raw = `GPU 0: NVIDIA H100 80GB HBM3 (UUID: GPU-abc)
110
+ \t Link 0: 26.562 GB/s
111
+ \t Link 1: <inactive>
112
+ \t Link 2: 26.562 GB/s
113
+ \t Link 3: 0.000 GB/s`;
114
+ const links = parseNvLinkStatus(raw);
115
+ expect(links.length).toBe(4);
116
+ expect(links[0]).toEqual({ link_id: 0, state: "up", speed_gbps: 26.562 });
117
+ expect(links[1].state).toBe("inactive");
118
+ expect(links[3].state).toBe("inactive"); // 0 GB/s parsed but bw==0 => inactive
119
+ });
120
+ it("returns empty array on input with no Link N: lines", () => {
121
+ expect(parseNvLinkStatus("nothing here")).toEqual([]);
122
+ });
123
+ });
124
+ // ============================================================================
125
+ // Tier 1: XID event parser
126
+ // ============================================================================
127
+ describe("C19 Tier 1: parseXidEvents", () => {
128
+ it("classifies XID 79 as critical (GPU fell off bus)", () => {
129
+ const now = new Date();
130
+ const ts = now.toISOString();
131
+ const raw = `${ts} kernel: NVRM: Xid (PCI:0000:01:00): 79, GPU has fallen off the bus.`;
132
+ const events = parseXidEvents(raw);
133
+ expect(events.length).toBe(1);
134
+ expect(events[0].xid_code).toBe(79);
135
+ expect(events[0].severity).toBe("critical");
136
+ expect(events[0].pci_bdf).toBe("0000:01:00");
137
+ });
138
+ it("classifies XID 48 (DBE) as critical", () => {
139
+ const ts = new Date().toISOString();
140
+ const raw = `${ts} kernel: NVRM: Xid (PCI:0000:01:00): 48, Double Bit ECC Error`;
141
+ const events = parseXidEvents(raw);
142
+ expect(events[0]?.severity).toBe("critical");
143
+ });
144
+ it("classifies XID 32 as warning (recoverable)", () => {
145
+ const ts = new Date().toISOString();
146
+ const raw = `${ts} kernel: NVRM: Xid (PCI:0000:01:00): 32, Invalid push buffer stream`;
147
+ const events = parseXidEvents(raw);
148
+ expect(events[0]?.severity).toBe("warning");
149
+ });
150
+ it("classifies an unknown XID as info", () => {
151
+ const ts = new Date().toISOString();
152
+ const raw = `${ts} kernel: NVRM: Xid (PCI:0000:01:00): 999, Unknown future XID`;
153
+ const events = parseXidEvents(raw);
154
+ expect(events[0]?.severity).toBe("info");
155
+ });
156
+ it("dedups events with identical (timestamp, bdf, code) tuple", () => {
157
+ const ts = new Date().toISOString();
158
+ const raw = [
159
+ `${ts} kernel: NVRM: Xid (PCI:0000:01:00): 79, GPU has fallen off the bus.`,
160
+ `${ts} kernel: NVRM: Xid (PCI:0000:01:00): 79, GPU has fallen off the bus.`,
161
+ `${ts} kernel: NVRM: Xid (PCI:0000:01:00): 79, GPU has fallen off the bus.`,
162
+ ].join("\n");
163
+ const events = parseXidEvents(raw);
164
+ expect(events.length).toBe(1);
165
+ });
166
+ it("skips events older than 24h window", () => {
167
+ const oldTs = new Date(Date.now() - 48 * 3600 * 1000).toISOString();
168
+ const raw = `${oldTs} kernel: NVRM: Xid (PCI:0000:01:00): 79, GPU has fallen off the bus.`;
169
+ expect(parseXidEvents(raw).length).toBe(0);
170
+ });
171
+ it("XID severity table aligns with NVIDIA documentation", () => {
172
+ // Spot-check the critical set per the spec's appendix A.
173
+ expect(gpuTest.XID_CRITICAL.has(79)).toBe(true); // fell off bus
174
+ expect(gpuTest.XID_CRITICAL.has(48)).toBe(true); // DBE
175
+ expect(gpuTest.XID_CRITICAL.has(94)).toBe(true); // contained ECC
176
+ expect(gpuTest.XID_CRITICAL.has(95)).toBe(true); // uncontained ECC
177
+ expect(gpuTest.XID_WARNING.has(32)).toBe(true); // push buffer
178
+ expect(gpuTest.XID_CRITICAL.has(32)).toBe(false);
179
+ });
180
+ });
181
+ // ============================================================================
182
+ // Performance budget
183
+ // ============================================================================
184
+ describe("C19 performance budget", () => {
185
+ it("collectGpu does not throw on non-NVIDIA hosts", async () => {
186
+ await expect(collectGpu()).resolves.toBeDefined();
187
+ });
188
+ it("probe under 100ms on non-NVIDIA host (spec target: <10ms; we allow CI slack)", async () => {
189
+ const caps = await probeGpuCapabilities();
190
+ if (!caps.nvidia_smi) {
191
+ // Looser than spec's <10ms target to account for noisy CI runners.
192
+ expect(caps.probe_duration_ms).toBeLessThan(100);
193
+ }
194
+ });
195
+ });
196
+ //# sourceMappingURL=gpu.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu.test.js","sourceRoot":"","sources":["../../../src/collect/__tests__/gpu.test.ts"],"names":[],"mappings":"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"}