@atomic-chat/core 0.21.0 → 0.21.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/advisor/advisor.js +11 -2
- package/dist/backend/advisor/advisor.js.map +1 -1
- package/dist/backend/install/cuda-guard.d.ts +62 -0
- package/dist/backend/install/cuda-guard.js +80 -0
- package/dist/backend/install/cuda-guard.js.map +1 -0
- package/dist/backend/install/cuda-runtime-source.d.ts +76 -0
- package/dist/backend/install/cuda-runtime-source.js +294 -0
- package/dist/backend/install/cuda-runtime-source.js.map +1 -0
- package/dist/backend/install/index.d.ts +3 -0
- package/dist/backend/install/index.js +3 -0
- package/dist/backend/install/index.js.map +1 -1
- package/dist/backend/install/runtime-backend.d.ts +30 -3
- package/dist/backend/install/runtime-backend.js +106 -28
- package/dist/backend/install/runtime-backend.js.map +1 -1
- package/dist/backend/install/service.d.ts +42 -24
- package/dist/backend/install/service.js +176 -31
- package/dist/backend/install/service.js.map +1 -1
- package/dist/backend/install/windows-launch-check.d.ts +72 -0
- package/dist/backend/install/windows-launch-check.js +173 -0
- package/dist/backend/install/windows-launch-check.js.map +1 -0
- package/dist/backend/installed/installed.d.ts +13 -0
- package/dist/backend/installed/installed.js +32 -0
- package/dist/backend/installed/installed.js.map +1 -1
- package/dist/backend/select/bad-backends.d.ts +68 -0
- package/dist/backend/select/bad-backends.js +136 -0
- package/dist/backend/select/bad-backends.js.map +1 -0
- package/dist/backend/select/features.d.ts +18 -1
- package/dist/backend/select/features.js +29 -1
- package/dist/backend/select/features.js.map +1 -1
- package/dist/backend/select/index.d.ts +1 -0
- package/dist/backend/select/index.js +1 -0
- package/dist/backend/select/index.js.map +1 -1
- package/dist/backend/turboquant.d.ts +8 -0
- package/dist/backend/turboquant.js +37 -9
- package/dist/backend/turboquant.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/contracts/diagnostics.d.ts +21 -0
- package/dist/contracts/diagnostics.js +71 -0
- package/dist/contracts/diagnostics.js.map +1 -0
- package/dist/contracts/errors.d.ts +18 -76
- package/dist/contracts/errors.js +145 -2
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/hardware.d.ts +8 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/load-diag.d.ts +34 -0
- package/dist/contracts/load-diag.js +48 -0
- package/dist/contracts/load-diag.js.map +1 -0
- package/dist/core/atomic-core.d.ts +1 -1
- package/dist/core/atomic-core.js +2 -1
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +25 -15
- package/dist/core/create.js.map +1 -1
- package/dist/core/managed-environment.d.ts +2 -0
- package/dist/core/managed-environment.js +2 -0
- package/dist/core/managed-environment.js.map +1 -1
- package/dist/decision/service.d.ts +2 -23
- package/dist/decision/service.js +27 -0
- package/dist/decision/service.js.map +1 -1
- package/dist/decision/wiring.d.ts +2 -0
- package/dist/decision/wiring.js +1 -6
- package/dist/decision/wiring.js.map +1 -1
- package/dist/diffusion/errors.js +3 -3
- package/dist/diffusion/errors.js.map +1 -1
- package/dist/diffusion/jobs.js +1 -0
- package/dist/diffusion/jobs.js.map +1 -1
- package/dist/diffusion/remote-job.js +1 -0
- package/dist/diffusion/remote-job.js.map +1 -1
- package/dist/diffusion/service.d.ts +2 -6
- package/dist/diffusion/service.js +1 -0
- package/dist/diffusion/service.js.map +1 -1
- package/dist/diffusion/session.d.ts +2 -5
- package/dist/diffusion/session.js +1 -0
- package/dist/diffusion/session.js.map +1 -1
- package/dist/diffusion/wiring.d.ts +2 -0
- package/dist/diffusion/wiring.js +1 -5
- package/dist/diffusion/wiring.js.map +1 -1
- package/dist/downloads/archive.js +8 -3
- package/dist/downloads/archive.js.map +1 -1
- package/dist/downloads/disk.d.ts +18 -0
- package/dist/downloads/disk.js +32 -1
- package/dist/downloads/disk.js.map +1 -1
- package/dist/downloads/downloader.d.ts +2 -18
- package/dist/downloads/downloader.js +208 -97
- package/dist/downloads/downloader.js.map +1 -1
- package/dist/downloads/fs-retry.d.ts +27 -0
- package/dist/downloads/fs-retry.js +40 -0
- package/dist/downloads/fs-retry.js.map +1 -0
- package/dist/downloads/index.d.ts +1 -0
- package/dist/downloads/index.js +1 -0
- package/dist/downloads/index.js.map +1 -1
- package/dist/downloads/protocol.d.ts +6 -2
- package/dist/downloads/protocol.js +27 -5
- package/dist/downloads/protocol.js.map +1 -1
- package/dist/embedding/service.d.ts +2 -18
- package/dist/embedding/service.js +21 -1
- package/dist/embedding/service.js.map +1 -1
- package/dist/embedding/wiring.d.ts +2 -0
- package/dist/embedding/wiring.js +1 -6
- package/dist/embedding/wiring.js.map +1 -1
- package/dist/hardware/index.d.ts +1 -0
- package/dist/hardware/index.js +1 -0
- package/dist/hardware/index.js.map +1 -1
- package/dist/hardware/probe-common.d.ts +9 -1
- package/dist/hardware/probe-common.js.map +1 -1
- package/dist/hardware/probe-windows.d.ts +10 -2
- package/dist/hardware/probe-windows.js +65 -10
- package/dist/hardware/probe-windows.js.map +1 -1
- package/dist/hardware/probe.js +1 -1
- package/dist/hardware/probe.js.map +1 -1
- package/dist/hardware/service.d.ts +11 -0
- package/dist/hardware/service.js +31 -4
- package/dist/hardware/service.js.map +1 -1
- package/dist/hardware/windows-registry.d.ts +80 -0
- package/dist/hardware/windows-registry.js +197 -0
- package/dist/hardware/windows-registry.js.map +1 -0
- package/dist/lock/instance-lock.js +7 -3
- package/dist/lock/instance-lock.js.map +1 -1
- package/dist/remote-access/manager.d.ts +2 -0
- package/dist/remote-access/manager.js +18 -2
- package/dist/remote-access/manager.js.map +1 -1
- package/dist/runtime/environment/service.d.ts +2 -14
- package/dist/runtime/environment/service.js +10 -0
- package/dist/runtime/environment/service.js.map +1 -1
- package/dist/runtime/environment/wiring.d.ts +2 -23
- package/dist/runtime/environment/wiring.js +1 -0
- package/dist/runtime/environment/wiring.js.map +1 -1
- package/dist/runtime/llamacpp/args.d.ts +11 -0
- package/dist/runtime/llamacpp/args.js +28 -3
- package/dist/runtime/llamacpp/args.js.map +1 -1
- package/dist/runtime/llamacpp/devices.d.ts +11 -0
- package/dist/runtime/llamacpp/devices.js +22 -0
- package/dist/runtime/llamacpp/devices.js.map +1 -1
- package/dist/runtime/llamacpp/errors.d.ts +34 -4
- package/dist/runtime/llamacpp/errors.js +105 -22
- package/dist/runtime/llamacpp/errors.js.map +1 -1
- package/dist/runtime/llamacpp/index.d.ts +1 -0
- package/dist/runtime/llamacpp/index.js +1 -0
- package/dist/runtime/llamacpp/index.js.map +1 -1
- package/dist/runtime/llamacpp/load-failure.d.ts +52 -0
- package/dist/runtime/llamacpp/load-failure.js +105 -0
- package/dist/runtime/llamacpp/load-failure.js.map +1 -0
- package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
- package/dist/runtime/llamacpp/load-plan.js +34 -4
- package/dist/runtime/llamacpp/load-plan.js.map +1 -1
- package/dist/runtime/llamacpp/runtime.d.ts +24 -1
- package/dist/runtime/llamacpp/runtime.js +116 -27
- package/dist/runtime/llamacpp/runtime.js.map +1 -1
- package/dist/runtime/shared/env.js +13 -15
- package/dist/runtime/shared/env.js.map +1 -1
- package/dist/server/public/errors.d.ts +2 -0
- package/dist/server/public/errors.js +6 -2
- package/dist/server/public/errors.js.map +1 -1
- package/dist/server/public/forward.js +22 -18
- package/dist/server/public/forward.js.map +1 -1
- package/dist/settings/store.js +1 -1
- package/dist/settings/store.js.map +1 -1
- package/dist/telemetry/diagnostics.d.ts +14 -0
- package/dist/telemetry/diagnostics.js +289 -0
- package/dist/telemetry/diagnostics.js.map +1 -0
- package/dist/telemetry/envelope.d.ts +1 -1
- package/dist/telemetry/envelope.js +57 -28
- package/dist/telemetry/envelope.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -0
- package/dist/telemetry/index.js +1 -0
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/policy.d.ts +1 -1
- package/dist/telemetry/policy.js +45 -2
- package/dist/telemetry/policy.js.map +1 -1
- package/dist/telemetry/reporter.d.ts +1 -0
- package/dist/telemetry/reporter.js +0 -0
- package/dist/telemetry/reporter.js.map +1 -1
- package/dist/telemetry/reports.d.ts +2 -7
- package/dist/telemetry/reports.js +34 -29
- package/dist/telemetry/reports.js.map +1 -1
- package/dist/telemetry/stack.d.ts +1 -1
- package/dist/telemetry/stack.js +8 -1
- package/dist/telemetry/stack.js.map +1 -1
- package/dist/telemetry/subscribe.d.ts +1 -1
- package/dist/telemetry/subscribe.js +7 -5
- package/dist/telemetry/subscribe.js.map +1 -1
- package/dist/telemetry/types.d.ts +3 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe-common.js","sourceRoot":"","sources":["../../src/hardware/probe-common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAE/C,OAAO,EACL,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,iBAAiB,CAAA;AAExB,wEAAwE;AACxE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAA;AAC1C,uGAAuG;AACvG,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAA;AACjD,mHAAmH;AACnH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"probe-common.js","sourceRoot":"","sources":["../../src/hardware/probe-common.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Windows: one `powershell.exe` run (`WINDOWS_PROBE_SCRIPT`: adapters, class registry, CPU, OS, Vulkan
|
|
3
|
-
* loader, CPU flags) and `nvidia-smi`, in parallel.
|
|
4
|
-
*
|
|
3
|
+
* loader, CPU flags) and `nvidia-smi`, in parallel. nvidia-smi missing is the normal case without an
|
|
4
|
+
* NVIDIA driver.
|
|
5
|
+
*
|
|
6
|
+
* PowerShell failing (blocked by AppLocker or AMSI, past its deadline on a cold start), or answering
|
|
7
|
+
* no video controller at all (a broken WMI repository; every Windows has at least the basic display
|
|
8
|
+
* adapter), used to leave the GPU list to nvidia-smi alone: AMD and Intel GPUs vanished. The display
|
|
9
|
+
* class key is then read with `reg.exe` instead (`windows-registry.ts`) and merged with nvidia-smi the
|
|
10
|
+
* same way. CPU flags have no such second source and stay unknown without PowerShell. A result that
|
|
11
|
+
* still has no GPU, or that no enumeration but nvidia-smi produced, is marked `degraded`, so the
|
|
12
|
+
* service probes again later instead of keeping it.
|
|
5
13
|
*/
|
|
6
14
|
import type { HardwareProbeResult, ProbeDeps } from './probe-common.js';
|
|
7
15
|
export declare function probeWindows(deps: ProbeDeps): Promise<HardwareProbeResult>;
|
|
@@ -1,30 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Windows: one `powershell.exe` run (`WINDOWS_PROBE_SCRIPT`: adapters, class registry, CPU, OS, Vulkan
|
|
3
|
-
* loader, CPU flags) and `nvidia-smi`, in parallel.
|
|
4
|
-
*
|
|
3
|
+
* loader, CPU flags) and `nvidia-smi`, in parallel. nvidia-smi missing is the normal case without an
|
|
4
|
+
* NVIDIA driver.
|
|
5
|
+
*
|
|
6
|
+
* PowerShell failing (blocked by AppLocker or AMSI, past its deadline on a cold start), or answering
|
|
7
|
+
* no video controller at all (a broken WMI repository; every Windows has at least the basic display
|
|
8
|
+
* adapter), used to leave the GPU list to nvidia-smi alone: AMD and Intel GPUs vanished. The display
|
|
9
|
+
* class key is then read with `reg.exe` instead (`windows-registry.ts`) and merged with nvidia-smi the
|
|
10
|
+
* same way. CPU flags have no such second source and stay unknown without PowerShell. A result that
|
|
11
|
+
* still has no GPU, or that no enumeration but nvidia-smi produced, is marked `degraded`, so the
|
|
12
|
+
* service probes again later instead of keeping it.
|
|
5
13
|
*/
|
|
6
14
|
import { cpuExtensionsFromWindowsPf } from './cpu-flags.js';
|
|
7
15
|
import { assembleSystemInfo, mergeGpus } from './merge.js';
|
|
8
|
-
import { PROBE_POWERSHELL_TIMEOUT_MS, commonFacts, firstLine, runNvidiaSmi, settledOrWarn, } from './probe-common.js';
|
|
16
|
+
import { PROBE_POWERSHELL_TIMEOUT_MS, PROBE_TOOL_TIMEOUT_MS, commonFacts, firstLine, runNvidiaSmi, settledOrWarn, warningOf, } from './probe-common.js';
|
|
9
17
|
import { coreCount, osName, parseWindowsProbe, windowsGpus, windowsProbeArgs } from './windows-video.js';
|
|
18
|
+
import { DISPLAY_CLASS_REG_KEY, VULKAN_DRIVERS_REG_KEY, isDisplayDriverKey, parseRegQuery, regExePath, regQueryArgs, registryDisplayKeys, registryGpus, vulkanDriverPaths, } from './windows-registry.js';
|
|
10
19
|
export async function probeWindows(deps) {
|
|
11
20
|
const warnings = [];
|
|
12
21
|
const common = commonFacts(deps);
|
|
13
22
|
const [powershell, nvidia] = await Promise.allSettled([runPowerShellProbe(deps), runNvidiaSmi(deps)]);
|
|
14
23
|
const probe = settledOrWarn(powershell, 'powershell', warnings);
|
|
15
24
|
const nvidiaRows = settledOrWarn(nvidia, 'nvidia-smi', warnings) ?? [];
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
25
|
+
let list;
|
|
26
|
+
let gpuSource;
|
|
27
|
+
if (probe && probe.video.length > 0) {
|
|
28
|
+
list = { ...windowsGpus(probe), loaderPresent: probe.vulkan.dll };
|
|
29
|
+
gpuSource = 'powershell';
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
if (probe)
|
|
33
|
+
warnings.push('powershell: Win32_VideoController answered nothing; reading GPUs from the registry');
|
|
34
|
+
try {
|
|
35
|
+
list = await registryAdapters(deps, nvidiaRows.map((row) => row.gpu.name));
|
|
36
|
+
gpuSource = 'registry';
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
warnings.push(warningOf('registry', error));
|
|
40
|
+
gpuSource = nvidiaRows.length > 0 ? 'nvidia-smi' : 'none';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (list)
|
|
44
|
+
warnings.push(...list.warnings);
|
|
19
45
|
const merged = mergeGpus({
|
|
20
46
|
nvidia: nvidiaRows,
|
|
21
|
-
pci:
|
|
47
|
+
pci: list?.adapters ?? [],
|
|
22
48
|
vulkan: [],
|
|
23
|
-
icdVendors:
|
|
24
|
-
// Without
|
|
25
|
-
loaderPresent:
|
|
49
|
+
icdVendors: list?.icdVendors ?? new Set(),
|
|
50
|
+
// Without an answer the loader's presence is unknown; an nvidia-smi GPU is still a GPU.
|
|
51
|
+
loaderPresent: list ? list.loaderPresent : true,
|
|
26
52
|
});
|
|
27
53
|
warnings.push(...merged.warnings);
|
|
54
|
+
const degraded = gpuSource !== 'powershell' && (gpuSource !== 'registry' || merged.gpus.length === 0);
|
|
28
55
|
return {
|
|
29
56
|
info: assembleSystemInfo({
|
|
30
57
|
cpu: {
|
|
@@ -39,6 +66,8 @@ export async function probeWindows(deps) {
|
|
|
39
66
|
gpus: merged.gpus,
|
|
40
67
|
}),
|
|
41
68
|
warnings,
|
|
69
|
+
gpuSource,
|
|
70
|
+
...(degraded ? { degraded: true } : {}),
|
|
42
71
|
};
|
|
43
72
|
}
|
|
44
73
|
async function runPowerShellProbe(deps) {
|
|
@@ -47,4 +76,30 @@ async function runPowerShellProbe(deps) {
|
|
|
47
76
|
throw new Error(`powershell.exe exited with ${result.code ?? 'signal'}: ${firstLine(result.stderr) || firstLine(result.stdout)}`);
|
|
48
77
|
return parseWindowsProbe(result.stdout);
|
|
49
78
|
}
|
|
79
|
+
async function runRegQuery(deps, reg, key) {
|
|
80
|
+
const result = await deps.run(reg, regQueryArgs(key), PROBE_TOOL_TIMEOUT_MS);
|
|
81
|
+
if (result.code !== 0)
|
|
82
|
+
throw new Error(`reg.exe query ${key} exited with ${result.code ?? 'signal'}: ${firstLine(result.stderr) || firstLine(result.stdout)}`);
|
|
83
|
+
return parseRegQuery(result.stdout);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The display class key's driver instances, one `reg query` each (a recursive query would also walk
|
|
87
|
+
* the drivers' large private subkeys and the `Properties` key no user may open), the Khronos driver
|
|
88
|
+
* registrations and `vulkan-1.dll`. Throws only when the class key itself cannot be read.
|
|
89
|
+
*/
|
|
90
|
+
async function registryAdapters(deps, nvidiaNames) {
|
|
91
|
+
const reg = regExePath(deps.env);
|
|
92
|
+
const root = await runRegQuery(deps, reg, DISPLAY_CLASS_REG_KEY);
|
|
93
|
+
const children = root.map((key) => key.path).filter(isDisplayDriverKey);
|
|
94
|
+
const systemRoot = deps.env['SystemRoot'] ?? deps.env['SYSTEMROOT'] ?? 'C:\\Windows';
|
|
95
|
+
const [instances, drivers, loaderPresent] = await Promise.all([
|
|
96
|
+
Promise.allSettled(children.map((path) => runRegQuery(deps, reg, path))),
|
|
97
|
+
runRegQuery(deps, reg, VULKAN_DRIVERS_REG_KEY).catch(() => []),
|
|
98
|
+
deps.fs.exists(`${systemRoot}\\System32\\vulkan-1.dll`),
|
|
99
|
+
]);
|
|
100
|
+
const warnings = [];
|
|
101
|
+
const keys = instances.flatMap((settled) => settledOrWarn(settled, 'registry', warnings) ?? []);
|
|
102
|
+
const gpus = registryGpus(registryDisplayKeys(keys), vulkanDriverPaths(drivers), nvidiaNames);
|
|
103
|
+
return { ...gpus, warnings: [...warnings, ...gpus.warnings], loaderPresent };
|
|
104
|
+
}
|
|
50
105
|
//# sourceMappingURL=probe-windows.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe-windows.js","sourceRoot":"","sources":["../../src/hardware/probe-windows.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"probe-windows.js","sourceRoot":"","sources":["../../src/hardware/probe-windows.ts"],"names":[],"mappings":"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"}
|
package/dist/hardware/probe.js
CHANGED
|
@@ -59,7 +59,7 @@ export async function probeSystemInfo(deps) {
|
|
|
59
59
|
return { ...fallbackProbe(deps), warnings: [`no hardware probe for platform ${String(deps.platform)}`] };
|
|
60
60
|
}
|
|
61
61
|
catch (error) {
|
|
62
|
-
return { ...fallbackProbe(deps), warnings: [warningOf('hardware probe failed', error)] };
|
|
62
|
+
return { ...fallbackProbe(deps), warnings: [warningOf('hardware probe failed', error)], degraded: true };
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
//# sourceMappingURL=probe.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/hardware/probe.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../src/hardware/probe.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,19 @@
|
|
|
6
6
|
* is still starting; the first caller that needs the facts (`facts()`, a backend load, `info()`)
|
|
7
7
|
* waits for that probe, and every later one reads the answer. Nothing is persisted, for the reasons
|
|
8
8
|
* `override.ts` gives: hardware changes between runs.
|
|
9
|
+
*
|
|
10
|
+
* An answer the probe marks `degraded` (it threw, or on Windows PowerShell failed and nothing made up
|
|
11
|
+
* for it) is not kept for the core's lifetime: the first request after `DEGRADED_RETRY_MS` probes
|
|
12
|
+
* again, the wait doubling with each degraded answer in a row up to `DEGRADED_RETRY_MAX_MS`, so a
|
|
13
|
+
* PowerShell that is blocked for good costs one more try now and then, not one per request.
|
|
9
14
|
*/
|
|
10
15
|
import type { HardwareInfoResponse, HardwareOverride, HardwareOverrideInput } from '../contracts/index.js';
|
|
11
16
|
import type { HardwareFacts, HardwareFactsSource } from './facts.js';
|
|
12
17
|
import type { HardwareProbeResult } from './probe-common.js';
|
|
18
|
+
/** The first wait before a degraded answer is probed again. */
|
|
19
|
+
export declare const DEGRADED_RETRY_MS = 60000;
|
|
20
|
+
/** The longest wait between probes while every answer comes back degraded. */
|
|
21
|
+
export declare const DEGRADED_RETRY_MAX_MS: number;
|
|
13
22
|
export interface HardwareServiceOptions {
|
|
14
23
|
/** Measure the machine. Expected not to throw; when it does, the answer is cpu/os/memory only. */
|
|
15
24
|
probe: () => Promise<HardwareProbeResult>;
|
|
@@ -37,6 +46,8 @@ export declare class HardwareService implements HardwareFactsSource, HardwareCon
|
|
|
37
46
|
private readonly override;
|
|
38
47
|
private inFlight;
|
|
39
48
|
private last;
|
|
49
|
+
/** Degraded answers in a row; the wait before the next try doubles with each. */
|
|
50
|
+
private degradedRun;
|
|
40
51
|
constructor(options: HardwareServiceOptions);
|
|
41
52
|
/** Start the first probe without waiting for it. Idempotent. */
|
|
42
53
|
start(): void;
|
package/dist/hardware/service.js
CHANGED
|
@@ -6,9 +6,18 @@
|
|
|
6
6
|
* is still starting; the first caller that needs the facts (`facts()`, a backend load, `info()`)
|
|
7
7
|
* waits for that probe, and every later one reads the answer. Nothing is persisted, for the reasons
|
|
8
8
|
* `override.ts` gives: hardware changes between runs.
|
|
9
|
+
*
|
|
10
|
+
* An answer the probe marks `degraded` (it threw, or on Windows PowerShell failed and nothing made up
|
|
11
|
+
* for it) is not kept for the core's lifetime: the first request after `DEGRADED_RETRY_MS` probes
|
|
12
|
+
* again, the wait doubling with each degraded answer in a row up to `DEGRADED_RETRY_MAX_MS`, so a
|
|
13
|
+
* PowerShell that is blocked for good costs one more try now and then, not one per request.
|
|
9
14
|
*/
|
|
10
15
|
import { factsOf, osTypeOf, rustArch, systemInfoWithOverride } from './facts.js';
|
|
11
16
|
import { HardwareOverrideStore } from './override.js';
|
|
17
|
+
/** The first wait before a degraded answer is probed again. */
|
|
18
|
+
export const DEGRADED_RETRY_MS = 60_000;
|
|
19
|
+
/** The longest wait between probes while every answer comes back degraded. */
|
|
20
|
+
export const DEGRADED_RETRY_MAX_MS = 15 * 60_000;
|
|
12
21
|
export class HardwareService {
|
|
13
22
|
options;
|
|
14
23
|
arch;
|
|
@@ -18,6 +27,8 @@ export class HardwareService {
|
|
|
18
27
|
override;
|
|
19
28
|
inFlight;
|
|
20
29
|
last;
|
|
30
|
+
/** Degraded answers in a row; the wait before the next try doubles with each. */
|
|
31
|
+
degradedRun = 0;
|
|
21
32
|
constructor(options) {
|
|
22
33
|
this.options = options;
|
|
23
34
|
this.arch = rustArch(options.arch);
|
|
@@ -61,24 +72,39 @@ export class HardwareService {
|
|
|
61
72
|
return this.override.clear();
|
|
62
73
|
}
|
|
63
74
|
current() {
|
|
64
|
-
|
|
65
|
-
|
|
75
|
+
const last = this.last;
|
|
76
|
+
if (last && (last.retryAt === undefined || this.now() < last.retryAt))
|
|
77
|
+
return Promise.resolve(last);
|
|
66
78
|
return this.inFlight ?? this.run();
|
|
67
79
|
}
|
|
68
80
|
run() {
|
|
69
81
|
const started = this.now();
|
|
70
82
|
const attempt = this.options
|
|
71
83
|
.probe()
|
|
72
|
-
.then((result) => ({
|
|
84
|
+
.then((result) => ({
|
|
85
|
+
info: result.info,
|
|
86
|
+
warnings: [...result.warnings],
|
|
87
|
+
probedAt: started,
|
|
88
|
+
...(result.gpuSource ? { gpuSource: result.gpuSource } : {}),
|
|
89
|
+
degraded: result.degraded === true,
|
|
90
|
+
}), (error) => {
|
|
73
91
|
const message = error instanceof Error ? error.message : String(error);
|
|
74
92
|
this.log('warn', `hardware probe failed: ${message}`);
|
|
75
93
|
return {
|
|
76
94
|
info: this.minimalInfo(),
|
|
77
95
|
warnings: [`hardware probe failed: ${message}`],
|
|
78
96
|
probedAt: started,
|
|
97
|
+
degraded: true,
|
|
79
98
|
};
|
|
80
99
|
})
|
|
81
|
-
.then((probed) => {
|
|
100
|
+
.then(({ degraded, ...probed }) => {
|
|
101
|
+
if (degraded) {
|
|
102
|
+
this.degradedRun += 1;
|
|
103
|
+
const wait = Math.min(DEGRADED_RETRY_MAX_MS, DEGRADED_RETRY_MS * 2 ** (this.degradedRun - 1));
|
|
104
|
+
probed.retryAt = this.now() + wait;
|
|
105
|
+
}
|
|
106
|
+
else
|
|
107
|
+
this.degradedRun = 0;
|
|
82
108
|
this.last = probed;
|
|
83
109
|
for (const warning of probed.warnings)
|
|
84
110
|
this.log('info', `hardware probe: ${warning}`);
|
|
@@ -98,6 +124,7 @@ export class HardwareService {
|
|
|
98
124
|
source: override ? 'override' : 'probe',
|
|
99
125
|
probed_at: probed.probedAt,
|
|
100
126
|
warnings: [...probed.warnings],
|
|
127
|
+
...(!override && probed.gpuSource ? { gpu_source: probed.gpuSource } : {}),
|
|
101
128
|
};
|
|
102
129
|
}
|
|
103
130
|
/** What is left when the probe itself threw: the arch and OS the service was built for. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/hardware/service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/hardware/service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAEhF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAGrD,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,MAAM,CAAA;AA+BhD,MAAM,OAAO,eAAe;IAWG;IAVZ,IAAI,CAAQ;IACZ,MAAM,CAAQ;IACd,GAAG,CAAc;IACjB,GAAG,CAA6D;IAChE,QAAQ,CAAuB;IACxC,QAAQ,CAA6B;IACrC,IAAI,CAAoB;IAChC,iFAAiF;IACzE,WAAW,GAAG,CAAC,CAAA;IAEvB,YAA6B,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;QAC1D,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAA;QACrD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;QAClC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrD,CAAC;IAED,gEAAgE;IAChE,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,KAAK,IAAI,CAAC,GAAG,EAAE,CAAA;IACnD,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;QACnC,6FAA6F;QAC7F,uFAAuF;QACvF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;IACrF,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;IAC5B,CAAC;IAED,WAAW,CAAC,KAA4B;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,CACN,MAAM,EACN,mCAAmC,OAAO,CAAC,MAAM,IAAI,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,SAAS,CAChG,CAAA;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAC9B,CAAC;IAEO,OAAO;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACnG,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;IACpC,CAAC;IAEO,GAAG;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;aACzB,KAAK,EAAE;aACP,IAAI,CACH,CAAC,MAAM,EAAkC,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC9B,QAAQ,EAAE,OAAO;YACjB,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,QAAQ,EAAE,MAAM,CAAC,QAAQ,KAAK,IAAI;SACnC,CAAC,EACF,CAAC,KAAc,EAAkC,EAAE;YACjD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,0BAA0B,OAAO,EAAE,CAAC,CAAA;YACrD,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;gBACxB,QAAQ,EAAE,CAAC,0BAA0B,OAAO,EAAE,CAAC;gBAC/C,QAAQ,EAAE,OAAO;gBACjB,QAAQ,EAAE,IAAI;aACf,CAAA;QACH,CAAC,CACF;aACA,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE;YAChC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,WAAW,IAAI,CAAC,CAAA;gBACrB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,iBAAiB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAA;gBAC7F,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;YACpC,CAAC;;gBAAM,IAAI,CAAC,WAAW,GAAG,CAAC,CAAA;YAC3B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAA;YAClB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;gBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,OAAO,EAAE,CAAC,CAAA;YACrF,OAAO,MAAM,CAAA;QACf,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;gBAAE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;QAC1D,CAAC,CAAC,CAAA;QACJ,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;QACvB,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAA;QACpC,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;YAC7F,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;YACvC,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC9B,GAAG,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAA;IACH,CAAC;IAED,2FAA2F;IACnF,WAAW;QACjB,OAAO;YACL,GAAG,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE;YACrG,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,OAAO,EAAE,EAAE;YACX,YAAY,EAAE,CAAC;YACf,IAAI,EAAE,EAAE;SACT,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows GPUs from `reg.exe`, for when the PowerShell probe cannot run: AppLocker or AMSI blocking
|
|
3
|
+
* `powershell.exe`, a cold start past its deadline, a broken WMI repository that answers no video
|
|
4
|
+
* controller. `reg.exe` is a plain console tool: no execution policy, no script host, nothing for AMSI
|
|
5
|
+
* to scan. It reads the same display class key the PowerShell script reads — one `NNNN` subkey per
|
|
6
|
+
* installed display driver instance, with the driver's name (`DriverDesc`), vendor (`ProviderName`),
|
|
7
|
+
* PCI ids (`MatchingDeviceId`), version and VRAM (`HardwareInformation.qwMemorySize`, or the 32-bit
|
|
8
|
+
* `HardwareInformation.MemorySize`) — and the Khronos Vulkan driver registrations.
|
|
9
|
+
*
|
|
10
|
+
* What it cannot see is which of those driver instances belongs to a device that is present: a card
|
|
11
|
+
* moved to another slot or replaced keeps its old key. So a vendor and device id is listed once (two
|
|
12
|
+
* identical non-NVIDIA cards read as one), and an NVIDIA key counts only as often as `nvidia-smi`,
|
|
13
|
+
* which is authoritative for NVIDIA, reports a GPU of that name. CPU flags have no cheap source
|
|
14
|
+
* outside PowerShell (`wmic` is deprecated and gone from new installs) and stay unknown.
|
|
15
|
+
*
|
|
16
|
+
* Pure: the key names, the parse of `reg query` output and the adapter list. `probe-windows.ts` runs it.
|
|
17
|
+
*/
|
|
18
|
+
import type { WindowsAdapter } from './windows-video.js';
|
|
19
|
+
/** The display adapter class key, in `reg.exe` spelling. */
|
|
20
|
+
export declare const DISPLAY_CLASS_REG_KEY = "HKLM\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}";
|
|
21
|
+
/** The Vulkan loader's driver registrations: one value per ICD manifest, named by its path. */
|
|
22
|
+
export declare const VULKAN_DRIVERS_REG_KEY = "HKLM\\SOFTWARE\\Khronos\\Vulkan\\Drivers";
|
|
23
|
+
/** `reg.exe` from `%SystemRoot%`, not whatever `reg.exe` comes first on PATH. */
|
|
24
|
+
export declare function regExePath(env: NodeJS.ProcessEnv): string;
|
|
25
|
+
/** One key, no recursion: its values, and its subkeys as lines of their own. */
|
|
26
|
+
export declare function regQueryArgs(key: string): string[];
|
|
27
|
+
export interface RegValue {
|
|
28
|
+
name: string;
|
|
29
|
+
/** `REG_SZ`, `REG_DWORD`, `REG_QWORD`, `REG_BINARY`, `REG_MULTI_SZ`, … */
|
|
30
|
+
type: string;
|
|
31
|
+
/** As `reg.exe` prints it: hex for numbers and binary, `\0` between the strings of a multi-string. */
|
|
32
|
+
data: string;
|
|
33
|
+
}
|
|
34
|
+
export interface RegKey {
|
|
35
|
+
/** `HKEY_LOCAL_MACHINE\…`, as `reg.exe` prints it. */
|
|
36
|
+
path: string;
|
|
37
|
+
values: RegValue[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* `reg query` output: a key path at the start of a line, then its values indented four spaces
|
|
41
|
+
* (`name TYPE data`); the subkeys of a non-recursive query follow as bare key paths. Error
|
|
42
|
+
* lines (`ERROR: Access is denied.`) and blank lines are skipped. Tolerates CRLF, a BOM and the NULs
|
|
43
|
+
* of UTF-16 output read as single bytes.
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseRegQuery(text: string): RegKey[];
|
|
46
|
+
/** Whether `path` is one driver instance of the display class (`…\{4d36e968-…}\0003`). */
|
|
47
|
+
export declare function isDisplayDriverKey(path: string): boolean;
|
|
48
|
+
/** A `REG_DWORD`/`REG_QWORD` (`0x…`) or a little-endian `REG_BINARY`, as a number; `undefined` for anything else. */
|
|
49
|
+
export declare function regNumber(value: RegValue | undefined): number | undefined;
|
|
50
|
+
/** The strings of a `REG_MULTI_SZ` (or a `REG_SZ`), empty ones dropped. */
|
|
51
|
+
export declare function regStrings(value: RegValue | undefined): string[];
|
|
52
|
+
/** One display driver instance, as its class key describes it. */
|
|
53
|
+
export interface RegistryDisplayKey {
|
|
54
|
+
/** `0000`, `0001`, … */
|
|
55
|
+
key: string;
|
|
56
|
+
MatchingDeviceId?: string;
|
|
57
|
+
DriverDesc?: string;
|
|
58
|
+
ProviderName?: string;
|
|
59
|
+
DriverVersion?: string;
|
|
60
|
+
/** Bytes: `HardwareInformation.qwMemorySize` (64-bit). */
|
|
61
|
+
qwMemorySize?: number;
|
|
62
|
+
/** Bytes: `HardwareInformation.MemorySize` (32-bit, so 4 GiB at most). */
|
|
63
|
+
memorySize?: number;
|
|
64
|
+
VulkanDriverName: string[];
|
|
65
|
+
}
|
|
66
|
+
/** The driver instances among the parsed keys, with the values the adapter list needs. */
|
|
67
|
+
export declare function registryDisplayKeys(keys: RegKey[]): RegistryDisplayKey[];
|
|
68
|
+
/** The Vulkan ICD manifests a `HKLM\SOFTWARE\Khronos\Vulkan\Drivers` query lists (value names are paths). */
|
|
69
|
+
export declare function vulkanDriverPaths(keys: RegKey[]): string[];
|
|
70
|
+
/**
|
|
71
|
+
* The GPUs the display class key names, in key order, as the PowerShell path's `WindowsAdapter` rows
|
|
72
|
+
* so `mergeGpus` treats them alike. Software adapters (no PCI or Adreno id) are skipped. `nvidiaNames`
|
|
73
|
+
* are the GPUs `nvidia-smi` reported: when it answered, an NVIDIA key is kept only as often as a GPU
|
|
74
|
+
* of that name is there; when it did not, each NVIDIA device id is listed once, like the other vendors.
|
|
75
|
+
*/
|
|
76
|
+
export declare function registryGpus(displayKeys: RegistryDisplayKey[], vulkanDrivers: string[], nvidiaNames: string[]): {
|
|
77
|
+
adapters: WindowsAdapter[];
|
|
78
|
+
icdVendors: Set<string>;
|
|
79
|
+
warnings: string[];
|
|
80
|
+
};
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows GPUs from `reg.exe`, for when the PowerShell probe cannot run: AppLocker or AMSI blocking
|
|
3
|
+
* `powershell.exe`, a cold start past its deadline, a broken WMI repository that answers no video
|
|
4
|
+
* controller. `reg.exe` is a plain console tool: no execution policy, no script host, nothing for AMSI
|
|
5
|
+
* to scan. It reads the same display class key the PowerShell script reads — one `NNNN` subkey per
|
|
6
|
+
* installed display driver instance, with the driver's name (`DriverDesc`), vendor (`ProviderName`),
|
|
7
|
+
* PCI ids (`MatchingDeviceId`), version and VRAM (`HardwareInformation.qwMemorySize`, or the 32-bit
|
|
8
|
+
* `HardwareInformation.MemorySize`) — and the Khronos Vulkan driver registrations.
|
|
9
|
+
*
|
|
10
|
+
* What it cannot see is which of those driver instances belongs to a device that is present: a card
|
|
11
|
+
* moved to another slot or replaced keeps its old key. So a vendor and device id is listed once (two
|
|
12
|
+
* identical non-NVIDIA cards read as one), and an NVIDIA key counts only as often as `nvidia-smi`,
|
|
13
|
+
* which is authoritative for NVIDIA, reports a GPU of that name. CPU flags have no cheap source
|
|
14
|
+
* outside PowerShell (`wmic` is deprecated and gone from new installs) and stay unknown.
|
|
15
|
+
*
|
|
16
|
+
* Pure: the key names, the parse of `reg query` output and the adapter list. `probe-windows.ts` runs it.
|
|
17
|
+
*/
|
|
18
|
+
import { icdVendorOf } from './vulkan.js';
|
|
19
|
+
import { parsePnpDeviceId } from './windows-video.js';
|
|
20
|
+
const DISPLAY_CLASS_GUID = '{4d36e968-e325-11ce-bfc1-08002be10318}';
|
|
21
|
+
/** The display adapter class key, in `reg.exe` spelling. */
|
|
22
|
+
export const DISPLAY_CLASS_REG_KEY = `HKLM\\SYSTEM\\CurrentControlSet\\Control\\Class\\${DISPLAY_CLASS_GUID}`;
|
|
23
|
+
/** The Vulkan loader's driver registrations: one value per ICD manifest, named by its path. */
|
|
24
|
+
export const VULKAN_DRIVERS_REG_KEY = 'HKLM\\SOFTWARE\\Khronos\\Vulkan\\Drivers';
|
|
25
|
+
/** `reg.exe` from `%SystemRoot%`, not whatever `reg.exe` comes first on PATH. */
|
|
26
|
+
export function regExePath(env) {
|
|
27
|
+
return `${env['SystemRoot'] ?? env['SYSTEMROOT'] ?? 'C:\\Windows'}\\System32\\reg.exe`;
|
|
28
|
+
}
|
|
29
|
+
/** One key, no recursion: its values, and its subkeys as lines of their own. */
|
|
30
|
+
export function regQueryArgs(key) {
|
|
31
|
+
return ['query', key];
|
|
32
|
+
}
|
|
33
|
+
const VALUE_LINE = /^ {4}(.+?) {4}(REG_[A-Z0-9_]+)(?: {4}(.*))?$/;
|
|
34
|
+
/**
|
|
35
|
+
* `reg query` output: a key path at the start of a line, then its values indented four spaces
|
|
36
|
+
* (`name TYPE data`); the subkeys of a non-recursive query follow as bare key paths. Error
|
|
37
|
+
* lines (`ERROR: Access is denied.`) and blank lines are skipped. Tolerates CRLF, a BOM and the NULs
|
|
38
|
+
* of UTF-16 output read as single bytes.
|
|
39
|
+
*/
|
|
40
|
+
export function parseRegQuery(text) {
|
|
41
|
+
const keys = [];
|
|
42
|
+
let current;
|
|
43
|
+
for (const raw of text
|
|
44
|
+
.replaceAll('\u0000', '')
|
|
45
|
+
.replace(/^[\uFEFF\uFFFD]+/, '')
|
|
46
|
+
.split(/\r?\n/)) {
|
|
47
|
+
if (raw.startsWith('HKEY_')) {
|
|
48
|
+
current = { path: raw.trimEnd(), values: [] };
|
|
49
|
+
keys.push(current);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const m = VALUE_LINE.exec(raw.trimEnd());
|
|
53
|
+
if (!m || !current)
|
|
54
|
+
continue;
|
|
55
|
+
current.values.push({ name: m[1], type: m[2], data: (m[3] ?? '').trim() });
|
|
56
|
+
}
|
|
57
|
+
return keys;
|
|
58
|
+
}
|
|
59
|
+
/** Whether `path` is one driver instance of the display class (`…\{4d36e968-…}\0003`). */
|
|
60
|
+
export function isDisplayDriverKey(path) {
|
|
61
|
+
const i = path.toLowerCase().lastIndexOf(`\\${DISPLAY_CLASS_GUID}\\`);
|
|
62
|
+
return i >= 0 && /^\d{4}$/.test(path.slice(i + DISPLAY_CLASS_GUID.length + 2));
|
|
63
|
+
}
|
|
64
|
+
/** A `REG_DWORD`/`REG_QWORD` (`0x…`) or a little-endian `REG_BINARY`, as a number; `undefined` for anything else. */
|
|
65
|
+
export function regNumber(value) {
|
|
66
|
+
if (!value)
|
|
67
|
+
return undefined;
|
|
68
|
+
if (value.type === 'REG_DWORD' || value.type === 'REG_QWORD') {
|
|
69
|
+
const m = /^0x([0-9a-f]+)$/i.exec(value.data);
|
|
70
|
+
return m ? Number.parseInt(m[1], 16) : undefined;
|
|
71
|
+
}
|
|
72
|
+
if (value.type === 'REG_BINARY') {
|
|
73
|
+
const hex = value.data.replace(/\s+/g, '');
|
|
74
|
+
if (hex === '' || hex.length % 2 !== 0 || !/^[0-9a-f]+$/i.test(hex) || hex.length > 16)
|
|
75
|
+
return undefined;
|
|
76
|
+
let n = 0;
|
|
77
|
+
for (let i = hex.length - 2; i >= 0; i -= 2)
|
|
78
|
+
n = n * 256 + Number.parseInt(hex.slice(i, i + 2), 16);
|
|
79
|
+
return n;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
/** The strings of a `REG_MULTI_SZ` (or a `REG_SZ`), empty ones dropped. */
|
|
84
|
+
export function regStrings(value) {
|
|
85
|
+
if (!value || (value.type !== 'REG_MULTI_SZ' && value.type !== 'REG_SZ'))
|
|
86
|
+
return [];
|
|
87
|
+
return value.data.split('\\0').filter((s) => s.trim() !== '');
|
|
88
|
+
}
|
|
89
|
+
/** The driver instances among the parsed keys, with the values the adapter list needs. */
|
|
90
|
+
export function registryDisplayKeys(keys) {
|
|
91
|
+
const out = [];
|
|
92
|
+
for (const key of keys) {
|
|
93
|
+
if (!isDisplayDriverKey(key.path))
|
|
94
|
+
continue;
|
|
95
|
+
const value = (name) => key.values.find((v) => v.name.toLowerCase() === name.toLowerCase());
|
|
96
|
+
const text = (name) => {
|
|
97
|
+
const v = value(name);
|
|
98
|
+
return v && v.type === 'REG_SZ' && v.data !== '' ? v.data : undefined;
|
|
99
|
+
};
|
|
100
|
+
const entry = {
|
|
101
|
+
key: key.path.slice(-4),
|
|
102
|
+
VulkanDriverName: regStrings(value('VulkanDriverName')),
|
|
103
|
+
};
|
|
104
|
+
const fields = {
|
|
105
|
+
MatchingDeviceId: text('MatchingDeviceId'),
|
|
106
|
+
DriverDesc: text('DriverDesc'),
|
|
107
|
+
ProviderName: text('ProviderName'),
|
|
108
|
+
DriverVersion: text('DriverVersion'),
|
|
109
|
+
qwMemorySize: regNumber(value('HardwareInformation.qwMemorySize')),
|
|
110
|
+
memorySize: regNumber(value('HardwareInformation.MemorySize')),
|
|
111
|
+
};
|
|
112
|
+
for (const [k, v] of Object.entries(fields))
|
|
113
|
+
if (v !== undefined)
|
|
114
|
+
Object.assign(entry, { [k]: v });
|
|
115
|
+
out.push(entry);
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
/** The Vulkan ICD manifests a `HKLM\SOFTWARE\Khronos\Vulkan\Drivers` query lists (value names are paths). */
|
|
120
|
+
export function vulkanDriverPaths(keys) {
|
|
121
|
+
return keys.flatMap((key) => key.values.map((v) => v.name)).filter((name) => /\.json$/i.test(name));
|
|
122
|
+
}
|
|
123
|
+
const NVIDIA_VENDOR_ID = 0x10de;
|
|
124
|
+
const sameName = (a, b) => a.trim().toLowerCase() === b.trim().toLowerCase();
|
|
125
|
+
/**
|
|
126
|
+
* The GPUs the display class key names, in key order, as the PowerShell path's `WindowsAdapter` rows
|
|
127
|
+
* so `mergeGpus` treats them alike. Software adapters (no PCI or Adreno id) are skipped. `nvidiaNames`
|
|
128
|
+
* are the GPUs `nvidia-smi` reported: when it answered, an NVIDIA key is kept only as often as a GPU
|
|
129
|
+
* of that name is there; when it did not, each NVIDIA device id is listed once, like the other vendors.
|
|
130
|
+
*/
|
|
131
|
+
export function registryGpus(displayKeys, vulkanDrivers, nvidiaNames) {
|
|
132
|
+
const icdVendors = new Set();
|
|
133
|
+
for (const manifest of [...vulkanDrivers, ...displayKeys.flatMap((k) => k.VulkanDriverName)]) {
|
|
134
|
+
const vendor = icdVendorOf(manifest);
|
|
135
|
+
if (vendor)
|
|
136
|
+
icdVendors.add(vendor);
|
|
137
|
+
}
|
|
138
|
+
const candidates = [];
|
|
139
|
+
for (const key of displayKeys) {
|
|
140
|
+
const ids = key.MatchingDeviceId ? parsePnpDeviceId(key.MatchingDeviceId) : undefined;
|
|
141
|
+
if (!ids)
|
|
142
|
+
continue;
|
|
143
|
+
let vramTotalMiB;
|
|
144
|
+
let memoryFrom;
|
|
145
|
+
if (key.qwMemorySize !== undefined && key.qwMemorySize > 0)
|
|
146
|
+
vramTotalMiB = Math.floor(key.qwMemorySize / 2 ** 20);
|
|
147
|
+
else if (key.memorySize !== undefined && key.memorySize > 0) {
|
|
148
|
+
vramTotalMiB = Math.floor(key.memorySize / 2 ** 20);
|
|
149
|
+
memoryFrom = 'MemorySize';
|
|
150
|
+
}
|
|
151
|
+
candidates.push({
|
|
152
|
+
adapter: {
|
|
153
|
+
name: key.DriverDesc?.trim() || `GPU ${key.MatchingDeviceId}`,
|
|
154
|
+
vendorId: ids.vendorId,
|
|
155
|
+
deviceId: ids.deviceId,
|
|
156
|
+
// The driver key a device instance points at: stable across boots, unique per card.
|
|
157
|
+
pnpDeviceId: `${DISPLAY_CLASS_GUID}\\${key.key}`,
|
|
158
|
+
driverVersion: key.DriverVersion ?? '',
|
|
159
|
+
...(vramTotalMiB !== undefined ? { vramTotalMiB } : {}),
|
|
160
|
+
vulkanDriver: key.VulkanDriverName.length > 0,
|
|
161
|
+
},
|
|
162
|
+
...(memoryFrom ? { memoryFrom } : {}),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
// A key with a VRAM figure is the one kept when several describe the same device.
|
|
166
|
+
const ordered = [...candidates].sort((a, b) => Number(b.adapter.vramTotalMiB !== undefined) - Number(a.adapter.vramTotalMiB !== undefined));
|
|
167
|
+
const kept = new Set();
|
|
168
|
+
const nvidiaLeft = [...nvidiaNames];
|
|
169
|
+
const seen = new Set();
|
|
170
|
+
for (const candidate of ordered) {
|
|
171
|
+
const { adapter } = candidate;
|
|
172
|
+
if (adapter.vendorId === NVIDIA_VENDOR_ID && nvidiaNames.length > 0) {
|
|
173
|
+
const i = nvidiaLeft.findIndex((name) => sameName(name, adapter.name));
|
|
174
|
+
if (i < 0)
|
|
175
|
+
continue;
|
|
176
|
+
nvidiaLeft.splice(i, 1);
|
|
177
|
+
kept.add(candidate);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const id = `${adapter.vendorId}:${adapter.deviceId}`;
|
|
181
|
+
if (seen.has(id))
|
|
182
|
+
continue;
|
|
183
|
+
seen.add(id);
|
|
184
|
+
kept.add(candidate);
|
|
185
|
+
}
|
|
186
|
+
const adapters = [];
|
|
187
|
+
const warnings = [];
|
|
188
|
+
for (const candidate of candidates) {
|
|
189
|
+
if (!kept.has(candidate))
|
|
190
|
+
continue;
|
|
191
|
+
adapters.push(candidate.adapter);
|
|
192
|
+
if (candidate.memoryFrom)
|
|
193
|
+
warnings.push(`${candidate.adapter.name}: VRAM read from HardwareInformation.MemorySize, which caps at 4 GiB`);
|
|
194
|
+
}
|
|
195
|
+
return { adapters, icdVendors, warnings };
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=windows-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows-registry.js","sourceRoot":"","sources":["../../src/hardware/windows-registry.ts"],"names":[],"mappings":"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"}
|