@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
+ {"version":3,"file":"dmesg-events.js","sourceRoot":"","sources":["../../src/collect/dmesg-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface EthtoolInterface {
2
+ iface: string;
3
+ advertised_auto_negotiation: boolean | null;
4
+ advertised_link_modes: string[];
5
+ }
6
+ export interface EthtoolSnapshot {
7
+ available: boolean;
8
+ reason?: string;
9
+ interfaces: EthtoolInterface[];
10
+ }
11
+ export declare function collectEthtool(): Promise<EthtoolSnapshot>;
12
+ /**
13
+ * Parse the relevant subset of `ethtool <iface>` output.
14
+ *
15
+ * The two fields of interest:
16
+ *
17
+ * Advertised auto-negotiation: Yes|No
18
+ * Advertised link modes: 10baseT/Half 10baseT/Full
19
+ * 100baseT/Half 100baseT/Full
20
+ * 1000baseT/Full
21
+ *
22
+ * Advertised link modes can span multiple lines (continuation lines
23
+ * are indented). We collect everything from the colon to the next
24
+ * non-continuation line.
25
+ */
26
+ export declare function parseEthtoolOutput(iface: string, raw: string): EthtoolInterface;
27
+ export declare const __test_only: {
28
+ parseEthtoolOutput: typeof parseEthtoolOutput;
29
+ };
@@ -0,0 +1,99 @@
1
+ // ethtool advertised link-mode collection.
2
+ //
3
+ // network.ts collects current speed via /sys/class/net/<iface>/speed.
4
+ // C15 (2026-05-19) adds the advertised modes from `ethtool <iface>` so
5
+ // Dashboard's link_speed_mismatch rule can compare current vs highest
6
+ // advertised. A 1 Gb/s link on a 10 Gb/s NIC isn't always wrong (the
7
+ // switch port might also be 1 Gb/s) but is worth surfacing.
8
+ //
9
+ // Per CC_SPEC_CRUCIBLE_C11_C18_FULL_BUNDLE_2026-05-19.md §1.3.
10
+ //
11
+ // Capability gating: `ethtool` missing (some containers lack it) ->
12
+ // available: false. Per-interface read failures are tolerated; the
13
+ // snapshot ships data for whatever interfaces returned cleanly.
14
+ import { readdirSync } from "fs";
15
+ import { run } from "../lib/exec.js";
16
+ const VIRTUAL_PREFIXES = ["lo", "veth", "docker", "br-", "virbr"];
17
+ function listPhysicalInterfaces() {
18
+ try {
19
+ const all = readdirSync("/sys/class/net");
20
+ return all.filter((iface) => iface !== "lo" &&
21
+ !VIRTUAL_PREFIXES.some((p) => iface.startsWith(p)));
22
+ }
23
+ catch {
24
+ return [];
25
+ }
26
+ }
27
+ export async function collectEthtool() {
28
+ const probe = await run("ethtool", ["--version"]);
29
+ if (!probe) {
30
+ return {
31
+ available: false,
32
+ reason: "ethtool not installed",
33
+ interfaces: [],
34
+ };
35
+ }
36
+ const interfaces = listPhysicalInterfaces();
37
+ if (interfaces.length === 0) {
38
+ return { available: true, interfaces: [] };
39
+ }
40
+ const results = [];
41
+ for (const iface of interfaces) {
42
+ const out = await run("ethtool", [iface]);
43
+ if (!out)
44
+ continue; // per-interface read failure tolerated
45
+ results.push(parseEthtoolOutput(iface, out));
46
+ }
47
+ return { available: true, interfaces: results };
48
+ }
49
+ /**
50
+ * Parse the relevant subset of `ethtool <iface>` output.
51
+ *
52
+ * The two fields of interest:
53
+ *
54
+ * Advertised auto-negotiation: Yes|No
55
+ * Advertised link modes: 10baseT/Half 10baseT/Full
56
+ * 100baseT/Half 100baseT/Full
57
+ * 1000baseT/Full
58
+ *
59
+ * Advertised link modes can span multiple lines (continuation lines
60
+ * are indented). We collect everything from the colon to the next
61
+ * non-continuation line.
62
+ */
63
+ export function parseEthtoolOutput(iface, raw) {
64
+ const lines = raw.split("\n");
65
+ let auto = null;
66
+ const modes = [];
67
+ for (let i = 0; i < lines.length; i++) {
68
+ const line = lines[i];
69
+ if (/^\s*Advertised auto-negotiation:/i.test(line)) {
70
+ const val = line.split(":").slice(1).join(":").trim();
71
+ auto = val.toLowerCase() === "yes";
72
+ }
73
+ else if (/^\s*Advertised link modes:/i.test(line)) {
74
+ // Continuation lines are indented and have no colon at the
75
+ // expected key position. Walk forward until we hit a line that
76
+ // looks like a new key (Word: at start).
77
+ let buf = line.split(":").slice(1).join(":").trim();
78
+ for (let j = i + 1; j < lines.length; j++) {
79
+ const cont = lines[j];
80
+ if (/^\s*[A-Za-z][^:]*:/.test(cont) && !/^\s/.test(cont))
81
+ break;
82
+ if (!/^\s+\S/.test(cont))
83
+ break;
84
+ buf += " " + cont.trim();
85
+ }
86
+ for (const token of buf.split(/\s+/)) {
87
+ if (token.length > 0)
88
+ modes.push(token);
89
+ }
90
+ }
91
+ }
92
+ return {
93
+ iface,
94
+ advertised_auto_negotiation: auto,
95
+ advertised_link_modes: modes,
96
+ };
97
+ }
98
+ export const __test_only = { parseEthtoolOutput };
99
+ //# sourceMappingURL=ethtool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethtool.js","sourceRoot":"","sources":["../../src/collect/ethtool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Gpu, GpuSnapshot, GpuCapabilities, NvLinkBasic, XidEvent } from "../lib/types.js";
2
+ export declare function collectGpu(): Promise<GpuSnapshot>;
3
+ export declare function probeGpuCapabilities(): Promise<GpuCapabilities>;
4
+ export declare function parseNvidiaSmiCsvRow(line: string): Gpu | null;
5
+ export declare function parseNvLinkStatus(raw: string): NvLinkBasic[];
6
+ export declare function parseXidEvents(raw: string): XidEvent[];
7
+ declare function parseLineTimestamp(line: string): number | null;
8
+ export declare const __test_only: {
9
+ XID_CRITICAL: Set<number>;
10
+ XID_WARNING: Set<number>;
11
+ parseLineTimestamp: typeof parseLineTimestamp;
12
+ };
13
+ export {};
@@ -0,0 +1,438 @@
1
+ // GPU collection (NVIDIA data-center GPUs).
2
+ //
3
+ // Three-tier, capability-gated. Per CC_SPEC_CRUCIBLE_GPU_COLLECTION_
4
+ // 2026-05-19.md + handoff Decisions locked (Simon, 2026-05-19).
5
+ //
6
+ // Tier 1 (nvidia-smi): always tried first; <10ms short-circuit on
7
+ // non-NVIDIA hosts. Validation-pending provenance: ships ahead of
8
+ // fleet validation, lifted to fleet-tested in a follow-up PR after
9
+ // Simon's 2-3 GPU hosts come online.
10
+ // Tier 2 (DCGM): basic dcgmi parsing. Desk-research-only provenance.
11
+ // Lifts to fleet-tested if a validation host runs nv-hostengine.
12
+ // Tier 3 (Redfish OEM): SHIPS AS STUB. Detection probe returns
13
+ // available: false with parser_quality "stub" so Dashboard can
14
+ // render the honesty surface (same pattern as the HPE/Adaptec RAID
15
+ // stub parsers from PR #163 and the lenovo/cisco/openbmc SEL
16
+ // stubs from PR #165). Full Supermicro HGX / NVIDIA reference
17
+ // schema implementation is a post-validation follow-up.
18
+ //
19
+ // Critical constraint: zero performance and zero error overhead on
20
+ // hosts without NVIDIA GPUs. The `which nvidia-smi` probe is the
21
+ // gate; everything else short-circuits.
22
+ import { existsSync } from "fs";
23
+ import { run } from "../lib/exec.js";
24
+ const NVIDIA_SMI_TIMEOUT_MS = 5000;
25
+ const DCGM_TIMEOUT_MS = 5000;
26
+ const PROBE_TIMEOUT_MS = 2000;
27
+ // XID error severity table (NVIDIA XID Errors documentation).
28
+ // Maintenance note: NVIDIA adds new XIDs in driver releases; refresh
29
+ // when major driver versions land. Last refreshed 2026-05-19 against
30
+ // the published XID error reference.
31
+ const XID_CRITICAL = new Set([
32
+ 13, 31, 43, 45, 48, 56, 57, 58, 62, 63, 64,
33
+ 65, 66, 68, 69, 71, 72, 73, 74, 76, 78,
34
+ 79, // GPU has fallen off the bus -> most severe
35
+ 92, 94, 95, 96, 100, 101, 110, 111, 119, 120,
36
+ ]);
37
+ const XID_WARNING = new Set([8, 14, 22, 25, 32, 38, 39, 42, 44, 46, 60, 67]);
38
+ export async function collectGpu() {
39
+ const caps = await probeGpuCapabilities();
40
+ if (!caps.nvidia_smi) {
41
+ return {
42
+ available: false,
43
+ reason: "nvidia-smi not present (non-NVIDIA host or driver not installed)",
44
+ capabilities: caps,
45
+ };
46
+ }
47
+ const tier1 = await collectTier1();
48
+ const tier2 = caps.dcgm
49
+ ? await collectTier2()
50
+ : {
51
+ available: false,
52
+ reason: "DCGM not active (nv-hostengine service not running)",
53
+ };
54
+ const tier3 = await collectTier3Stub(caps);
55
+ return { available: true, capabilities: caps, tier1, tier2, tier3 };
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Detection probe
59
+ // ---------------------------------------------------------------------------
60
+ export async function probeGpuCapabilities() {
61
+ const startMs = Date.now();
62
+ // Fast path: nvidia-smi binary presence. existsSync is synchronous
63
+ // and ~microseconds; the spec's <10ms target is easily met when the
64
+ // file is absent.
65
+ const nvidiaSmiPath = findInPath("nvidia-smi");
66
+ if (!nvidiaSmiPath) {
67
+ return {
68
+ nvidia_smi: false,
69
+ nvidia_driver_version: null,
70
+ dcgm: false,
71
+ dcgmi_version: null,
72
+ redfish_endpoint: null,
73
+ redfish_oem_schema: null,
74
+ probe_duration_ms: Date.now() - startMs,
75
+ };
76
+ }
77
+ // Driver version + sanity check (nvidia-smi might exist but be broken
78
+ // on a host with a kernel/driver mismatch; treat that as
79
+ // nvidia_smi=false per the spec).
80
+ const driverOut = await run("nvidia-smi", ["--query-gpu=driver_version", "--format=csv,noheader,nounits"], PROBE_TIMEOUT_MS);
81
+ if (!driverOut) {
82
+ return {
83
+ nvidia_smi: false,
84
+ nvidia_driver_version: null,
85
+ dcgm: false,
86
+ dcgmi_version: null,
87
+ redfish_endpoint: null,
88
+ redfish_oem_schema: null,
89
+ probe_duration_ms: Date.now() - startMs,
90
+ };
91
+ }
92
+ const driverVersion = driverOut.split("\n")[0].trim() || null;
93
+ // DCGM probe. Both `pgrep nv-hostengine` (or `systemctl is-active`)
94
+ // and `dcgmi --version` must succeed.
95
+ const dcgmActive = await isDcgmActive();
96
+ const dcgmiVersionOut = dcgmActive
97
+ ? await run("dcgmi", ["--version"], PROBE_TIMEOUT_MS)
98
+ : null;
99
+ const dcgmiVersion = dcgmiVersionOut
100
+ ? (dcgmiVersionOut.split("\n").find((l) => /version/i.test(l)) ?? dcgmiVersionOut.split("\n")[0]).trim()
101
+ : null;
102
+ // Redfish probe ships as stub: detection returns null endpoint /
103
+ // unknown schema so Tier 3 falls through to "available: false".
104
+ // Per Simon's 2026-05-19 locked decision; full OEM schema queries
105
+ // are a post-fleet-validation follow-up.
106
+ return {
107
+ nvidia_smi: true,
108
+ nvidia_driver_version: driverVersion,
109
+ dcgm: dcgmActive && dcgmiVersion !== null,
110
+ dcgmi_version: dcgmiVersion,
111
+ redfish_endpoint: null,
112
+ redfish_oem_schema: null,
113
+ probe_duration_ms: Date.now() - startMs,
114
+ };
115
+ }
116
+ function findInPath(binary) {
117
+ const pathEnv = process.env.PATH || "";
118
+ for (const dir of pathEnv.split(":")) {
119
+ if (!dir)
120
+ continue;
121
+ const candidate = `${dir}/${binary}`;
122
+ if (existsSync(candidate))
123
+ return candidate;
124
+ }
125
+ return null;
126
+ }
127
+ async function isDcgmActive() {
128
+ // Prefer systemctl is-active; fall back to pgrep.
129
+ const sysctlOut = await run("systemctl", ["is-active", "nv-hostengine"], PROBE_TIMEOUT_MS);
130
+ if (sysctlOut && /^active\s*$/.test(sysctlOut.trim()))
131
+ return true;
132
+ const pgrepOut = await run("pgrep", ["-f", "nv-hostengine"], PROBE_TIMEOUT_MS);
133
+ return Boolean(pgrepOut && pgrepOut.trim().length > 0);
134
+ }
135
+ // ---------------------------------------------------------------------------
136
+ // Tier 1 (nvidia-smi)
137
+ // ---------------------------------------------------------------------------
138
+ const NVIDIA_SMI_CSV_FIELDS = [
139
+ "index", "uuid", "name", "pci.bus_id", "vbios_version",
140
+ "memory.total", "memory.used",
141
+ "temperature.gpu", "power.draw", "power.limit",
142
+ "utilization.gpu", "utilization.memory",
143
+ "clocks.gr", "clocks.sm", "clocks.mem",
144
+ "pstate",
145
+ "pcie.link.gen.current", "pcie.link.gen.max",
146
+ "pcie.link.width.current", "pcie.link.width.max",
147
+ "ecc.mode.current",
148
+ "ecc.errors.corrected.volatile.total", "ecc.errors.corrected.aggregate.total",
149
+ "ecc.errors.uncorrected.volatile.total", "ecc.errors.uncorrected.aggregate.total",
150
+ "retired_pages.single_bit_ecc.count", "retired_pages.double_bit_ecc.count",
151
+ "retired_pages.pending",
152
+ "fan.speed",
153
+ ];
154
+ async function collectTier1() {
155
+ const csvOut = await run("nvidia-smi", [`--query-gpu=${NVIDIA_SMI_CSV_FIELDS.join(",")}`, "--format=csv,noheader,nounits"], NVIDIA_SMI_TIMEOUT_MS);
156
+ if (!csvOut) {
157
+ return { available: false, reason: "nvidia-smi query timeout or returned no output" };
158
+ }
159
+ const gpus = [];
160
+ for (const line of csvOut.split("\n").map((l) => l.trim()).filter(Boolean)) {
161
+ const parsed = parseNvidiaSmiCsvRow(line);
162
+ if (parsed)
163
+ gpus.push(parsed);
164
+ }
165
+ if (gpus.length === 0) {
166
+ return { available: false, reason: "nvidia-smi returned no GPU rows" };
167
+ }
168
+ // Throttle reasons from XML output (CSV path doesn't expose
169
+ // performance_state.reasons cleanly).
170
+ await enrichThrottleReasons(gpus);
171
+ // NVLink basic state per GPU.
172
+ for (const gpu of gpus) {
173
+ gpu.nvlink_links = await collectNvLinkBasic(gpu.index);
174
+ }
175
+ // XID events from dmesg (last 24h).
176
+ const xidEvents = await collectXidEvents();
177
+ // Driver version (already in probe; re-read here to keep tier 1
178
+ // self-contained for callers that import it directly).
179
+ const driverOut = await run("nvidia-smi", ["--query-gpu=driver_version", "--format=csv,noheader,nounits"], NVIDIA_SMI_TIMEOUT_MS);
180
+ const driverVersion = driverOut ? driverOut.split("\n")[0].trim() : "unknown";
181
+ return {
182
+ available: true,
183
+ gpus,
184
+ xid_events: xidEvents,
185
+ driver_version: driverVersion,
186
+ };
187
+ }
188
+ export function parseNvidiaSmiCsvRow(line) {
189
+ const parts = line.split(",").map((p) => p.trim());
190
+ if (parts.length < NVIDIA_SMI_CSV_FIELDS.length - 3)
191
+ return null; // tolerate trailing empty cols on older driver versions
192
+ const num = (i) => {
193
+ const v = parts[i];
194
+ if (v === undefined || v === "" || /\[(N\/A|Not Supported)\]/i.test(v))
195
+ return 0;
196
+ const n = Number(v);
197
+ return Number.isFinite(n) ? n : 0;
198
+ };
199
+ const nullableNum = (i) => {
200
+ const v = parts[i];
201
+ if (!v || /\[(N\/A|Not Supported)\]/i.test(v))
202
+ return null;
203
+ const n = Number(v);
204
+ return Number.isFinite(n) ? n : null;
205
+ };
206
+ const str = (i) => parts[i] ?? "";
207
+ const bool = (i) => /enabled/i.test(parts[i] ?? "");
208
+ return {
209
+ index: num(0),
210
+ uuid: str(1),
211
+ name: str(2),
212
+ pci_bdf: str(3),
213
+ vbios_version: str(4),
214
+ vram_total_mib: num(5),
215
+ vram_used_mib: num(6),
216
+ temp_c: num(7),
217
+ power_draw_w: num(8),
218
+ power_limit_w: num(9),
219
+ utilization_gpu_percent: num(10),
220
+ utilization_mem_percent: num(11),
221
+ clock_graphics_mhz: num(12),
222
+ clock_sm_mhz: num(13),
223
+ clock_mem_mhz: num(14),
224
+ pstate: str(15),
225
+ pcie_link_gen_current: num(16),
226
+ pcie_link_gen_max: num(17),
227
+ pcie_link_width_current: num(18),
228
+ pcie_link_width_max: num(19),
229
+ ecc_mode_current: bool(20),
230
+ ecc_errors_corrected_volatile: num(21),
231
+ ecc_errors_corrected_aggregate: num(22),
232
+ ecc_errors_uncorrected_volatile: num(23),
233
+ ecc_errors_uncorrected_aggregate: num(24),
234
+ retired_pages_single_bit: nullableNum(25),
235
+ retired_pages_double_bit: nullableNum(26),
236
+ retired_pages_pending: nullableNum(27),
237
+ thermal_slowdown_active: false, // set by enrichThrottleReasons
238
+ thermal_violation_total_ms: null, // Tier 2 enriches
239
+ power_violation_total_ms: null, // Tier 2 enriches
240
+ fan_speed_percent: nullableNum(28),
241
+ nvlink_links: [], // set by collectNvLinkBasic
242
+ performance_state_reasons: [], // set by enrichThrottleReasons
243
+ };
244
+ }
245
+ async function enrichThrottleReasons(gpus) {
246
+ // nvidia-smi -q -x emits a deeply-nested XML; we extract the
247
+ // <clocks_throttle_reasons> block per GPU and flag the active
248
+ // reasons. Lightweight regex-based extraction; avoids pulling a
249
+ // full xml2js dependency for what is essentially a flat key-value
250
+ // section.
251
+ const xmlOut = await run("nvidia-smi", ["-q", "-x"], NVIDIA_SMI_TIMEOUT_MS);
252
+ if (!xmlOut)
253
+ return;
254
+ const gpuBlocks = xmlOut.split(/<gpu /).slice(1); // skip the header
255
+ for (let i = 0; i < gpuBlocks.length && i < gpus.length; i++) {
256
+ const block = gpuBlocks[i];
257
+ const reasonsBlock = block.match(/<clocks_throttle_reasons>([\s\S]*?)<\/clocks_throttle_reasons>/);
258
+ if (!reasonsBlock)
259
+ continue;
260
+ const reasons = [];
261
+ for (const [key, label] of [
262
+ ["clocks_throttle_reason_gpu_idle", "gpu_idle"],
263
+ ["clocks_throttle_reason_applications_clocks_setting", "applications_clocks_setting"],
264
+ ["clocks_throttle_reason_sw_power_cap", "sw_power_cap"],
265
+ ["clocks_throttle_reason_hw_slowdown", "hw_slowdown"],
266
+ ["clocks_throttle_reason_hw_thermal_slowdown", "hw_thermal_slowdown"],
267
+ ["clocks_throttle_reason_hw_power_brake_slowdown", "hw_power_brake"],
268
+ ["clocks_throttle_reason_sw_thermal_slowdown", "sw_thermal_slowdown"],
269
+ ["clocks_throttle_reason_sync_boost", "sync_boost"],
270
+ ["clocks_throttle_reason_display_clock_setting", "display_clock_setting"],
271
+ ]) {
272
+ const re = new RegExp(`<${key}>([^<]+)</${key}>`);
273
+ const m = reasonsBlock[1].match(re);
274
+ if (m && /^(active|true)/i.test(m[1].trim())) {
275
+ reasons.push(label);
276
+ }
277
+ }
278
+ gpus[i].performance_state_reasons = reasons;
279
+ gpus[i].thermal_slowdown_active =
280
+ reasons.includes("hw_slowdown") ||
281
+ reasons.includes("hw_thermal_slowdown") ||
282
+ reasons.includes("sw_thermal_slowdown");
283
+ }
284
+ }
285
+ async function collectNvLinkBasic(gpuIndex) {
286
+ const out = await run("nvidia-smi", ["nvlink", "--status", "-i", String(gpuIndex)], NVIDIA_SMI_TIMEOUT_MS);
287
+ if (!out)
288
+ return [];
289
+ return parseNvLinkStatus(out);
290
+ }
291
+ export function parseNvLinkStatus(raw) {
292
+ // nvidia-smi nvlink --status output format:
293
+ // GPU 0: NVIDIA H100 80GB HBM3 (UUID: GPU-...)
294
+ // Link 0: 26.562 GB/s
295
+ // Link 1: <inactive>
296
+ // Link 2: 26.562 GB/s
297
+ //
298
+ // Inactive shown as "<inactive>" or "Inactive"; down often shown
299
+ // as "Down" or similar. We classify three buckets: up (positive
300
+ // bandwidth), inactive (idle but no fault), down (faulted).
301
+ const links = [];
302
+ for (const line of raw.split("\n")) {
303
+ const m = line.match(/^\s*Link\s+(\d+):\s*(.+?)\s*$/);
304
+ if (!m)
305
+ continue;
306
+ const linkId = Number(m[1]);
307
+ const value = m[2];
308
+ const bwMatch = value.match(/(\d+(?:\.\d+)?)\s*GB\/s/i);
309
+ let state;
310
+ let speedGbps = 0;
311
+ if (bwMatch) {
312
+ const bw = Number(bwMatch[1]);
313
+ state = bw > 0 ? "up" : "inactive";
314
+ speedGbps = bw;
315
+ }
316
+ else if (/inactive/i.test(value)) {
317
+ state = "inactive";
318
+ }
319
+ else {
320
+ // Any other value (Down, error text, ...): treat as down.
321
+ state = "down";
322
+ }
323
+ links.push({ link_id: linkId, state, speed_gbps: speedGbps });
324
+ }
325
+ return links;
326
+ }
327
+ async function collectXidEvents() {
328
+ const out = await run("dmesg", ["--time-format=iso", "--no-pager"], NVIDIA_SMI_TIMEOUT_MS);
329
+ if (!out) {
330
+ // Fallback without --time-format flag (older kernels)
331
+ const fallback = await run("dmesg", ["--no-pager"], NVIDIA_SMI_TIMEOUT_MS);
332
+ if (!fallback)
333
+ return [];
334
+ return parseXidEvents(fallback);
335
+ }
336
+ return parseXidEvents(out);
337
+ }
338
+ export function parseXidEvents(raw) {
339
+ const events = [];
340
+ const cutoffMs = Date.now() - 24 * 3600 * 1000; // 24h window
341
+ const seen = new Set(); // dedup key (timestamp, bdf, code)
342
+ for (const line of raw.split("\n")) {
343
+ const m = line.match(/NRM(?:: )?Xid \(PCI:([\da-fA-F:.]+)\):\s*(\d+)(?:,)?\s*(.*)$/) || line.match(/NVRM: Xid \(PCI:([\da-fA-F:.]+)\):\s*(\d+)(?:,)?\s*(.*)$/);
344
+ if (!m)
345
+ continue;
346
+ const [, bdf, codeStr, rest] = m;
347
+ const code = Number.parseInt(codeStr, 10);
348
+ if (!Number.isFinite(code))
349
+ continue;
350
+ const ts = parseLineTimestamp(line);
351
+ if (ts !== null && ts < cutoffMs)
352
+ continue;
353
+ const key = `${ts ?? "unknown"}|${bdf}|${code}`;
354
+ if (seen.has(key))
355
+ continue;
356
+ seen.add(key);
357
+ const severity = XID_CRITICAL.has(code)
358
+ ? "critical"
359
+ : XID_WARNING.has(code)
360
+ ? "warning"
361
+ : "info";
362
+ events.push({
363
+ timestamp_iso: ts !== null ? new Date(ts).toISOString() : new Date().toISOString(),
364
+ xid_code: code,
365
+ pci_bdf: bdf,
366
+ severity,
367
+ raw_message: line.trim(),
368
+ });
369
+ }
370
+ return events;
371
+ }
372
+ function parseLineTimestamp(line) {
373
+ const isoMatch = line.match(/^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:[,.]\d+)?(?:[+-]\d{2}:?\d{2}|Z)?)/);
374
+ if (isoMatch) {
375
+ const t = Date.parse(isoMatch[1].replace(",", "."));
376
+ return Number.isFinite(t) ? t : null;
377
+ }
378
+ return null;
379
+ }
380
+ // ---------------------------------------------------------------------------
381
+ // Tier 2 (DCGM)
382
+ // ---------------------------------------------------------------------------
383
+ async function collectTier2() {
384
+ // Best-effort tier 2 collection. parser_quality=stub per
385
+ // CC_HANDOFF_GPU_WORKSTREAM_2026-05-19.md Decisions locked: ships
386
+ // as desk-research-only because we have no DCGM-equipped host in
387
+ // the validation fleet yet. Lifts to fleet-tested in the follow-up
388
+ // PR if one of Simon's 2-3 incoming validation hosts runs
389
+ // nv-hostengine.
390
+ //
391
+ // Implementation intentionally narrow: ship the shape Dashboard
392
+ // expects with the actively-queryable fields, leave topology +
393
+ // detailed nvlink as null for now.
394
+ const healthOut = await run("dcgmi", ["health", "-g", "0", "-c"], DCGM_TIMEOUT_MS);
395
+ if (!healthOut) {
396
+ return {
397
+ available: false,
398
+ reason: "dcgmi health query returned no output (DCGM accessible but query failed)",
399
+ };
400
+ }
401
+ return {
402
+ available: true,
403
+ parser_quality: "stub",
404
+ nvswitch_status: [],
405
+ nvlink_detailed: [],
406
+ retired_pages_detail: [],
407
+ thermal_violation_time_series_ms: 0,
408
+ power_violation_time_series_ms: 0,
409
+ topology_actual: { nodes: [], edges: [] },
410
+ topology_expected: null,
411
+ health_summary_raw: healthOut.slice(0, 4096), // cap at 4KB for snapshot size
412
+ };
413
+ }
414
+ // ---------------------------------------------------------------------------
415
+ // Tier 3 (Redfish OEM) — stub per Simon's locked decision
416
+ // ---------------------------------------------------------------------------
417
+ async function collectTier3Stub(_caps) {
418
+ // Per CC_HANDOFF_GPU_WORKSTREAM_2026-05-19.md Decisions locked:
419
+ // "Tier 3 (Redfish OEM) ships as stub with parser_quality: 'stub'
420
+ // honesty surface, matching the BMC vendor matrix pattern from
421
+ // PR #165 and the HPE/Adaptec hardware RAID parsers from PR #163."
422
+ //
423
+ // The detection probe (probeGpuCapabilities) returns
424
+ // redfish_endpoint: null and redfish_oem_schema: null in this
425
+ // release; this stub returns available: false with the appropriate
426
+ // reason. Post-fleet-validation follow-up will implement Supermicro
427
+ // HGX and NVIDIA reference Redfish schemas.
428
+ return {
429
+ available: false,
430
+ reason: "Tier 3 Redfish OEM ships as stub in v0.13.0 (parser_quality: stub); Supermicro HGX + NVIDIA reference schemas pending fleet validation",
431
+ };
432
+ }
433
+ export const __test_only = {
434
+ XID_CRITICAL,
435
+ XID_WARNING,
436
+ parseLineTimestamp,
437
+ };
438
+ //# sourceMappingURL=gpu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gpu.js","sourceRoot":"","sources":["../../src/collect/gpu.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,17 @@
1
- import type { IpmiInfo, FanStatus, Vendor, IpmiCapability } from "../lib/types.js";
1
+ import type { BmcVendor, IpmiInfo, FanStatus, Vendor, IpmiCapability } from "../lib/types.js";
2
+ /**
3
+ * C11 (2026-05-19): map DMI vendor to BMC vendor + parser quality tier.
4
+ *
5
+ * Fleet-tested: dell, hpe, supermicro (years of fleet validation; SEL
6
+ * classifier confirmed against real-host event streams).
7
+ * Stub: lenovo, cisco, openbmc (parser ships but unvalidated against
8
+ * real fleet data; first real customer per vendor surfaces gaps).
9
+ * Unknown: everything else (asrockrack, inspur, generic, virtual, ...);
10
+ * classifier still runs (it's keyword-driven, vendor-agnostic) but
11
+ * we tag the events honestly.
12
+ */
13
+ declare function mapVendorToBmcVendor(vendor: Vendor): BmcVendor;
14
+ declare function parserQualityFor(bmcVendor: BmcVendor): "fleet-tested" | "stub" | "unknown";
2
15
  /**
3
16
  * Collect IPMI snapshot.
4
17
  *
@@ -10,6 +23,10 @@ import type { IpmiInfo, FanStatus, Vendor, IpmiCapability } from "../lib/types.j
10
23
  * and back-compat).
11
24
  */
12
25
  export declare function collectIpmi(vendor?: Vendor, capability?: IpmiCapability): Promise<IpmiInfo>;
26
+ export declare const __test_only_c11: {
27
+ mapVendorToBmcVendor: typeof mapVendorToBmcVendor;
28
+ parserQualityFor: typeof parserQualityFor;
29
+ };
13
30
  /**
14
31
  * Re-parse the full SEL elist counting ECC events on the Memory entity.
15
32
  * Used for vendors (notably Dell) that don't expose ECC counters as
@@ -29,3 +46,4 @@ export declare function parseSelTimestamp(date: string, time: string): string;
29
46
  export declare function classifySensor(sensor: string): string;
30
47
  export declare function deriveSelSeverity(event: string, sensorType: string): string;
31
48
  export declare function parseFanStatus(output: string): FanStatus[];
49
+ export {};