75 lines
4.5 KiB
JavaScript
75 lines
4.5 KiB
JavaScript
const WINDOWS_STATUS = {
|
|
0xC0000005: ["STATUS_ACCESS_VIOLATION", "runtime_crash", ["Reinstall the runtime.", "Install or update Microsoft Visual C++ Redistributable x64.", "Unblock downloaded runtime files.", "Try a local disk path or alternate runtime build."]],
|
|
0xC000001D: ["STATUS_ILLEGAL_INSTRUCTION", "cpu_incompatible", ["Use a baseline or more compatible CPU runtime build.", "Verify CPU AVX/AVX2 support."]],
|
|
0xC0000135: ["STATUS_DLL_NOT_FOUND", "missing_dependency", ["Reinstall the runtime.", "Verify sibling DLL files.", "Install or update Microsoft Visual C++ Redistributable x64."]],
|
|
0xC0000139: ["STATUS_ENTRYPOINT_NOT_FOUND", "dependency_mismatch", ["Delete and reinstall the complete runtime folder.", "Do not mix DLLs from different releases."]],
|
|
0xC000007B: ["STATUS_INVALID_IMAGE_FORMAT", "architecture_mismatch", ["Download the runtime matching the detected OS and architecture.", "Reinstall and verify the archive hash."]],
|
|
0xC0000142: ["STATUS_DLL_INIT_FAILED", "dependency_initialization_failed", ["Unblock runtime files.", "Install or update Microsoft Visual C++ Redistributable x64.", "Review security software restrictions."]],
|
|
0xC0000409: ["STATUS_STACK_BUFFER_OVERRUN", "runtime_crash", ["Reinstall the runtime.", "Try an alternate runtime build.", "Inspect the captured runtime logs."]],
|
|
0xC0000374: ["STATUS_HEAP_CORRUPTION", "runtime_crash", ["Reinstall the runtime.", "Try an alternate build.", "Reduce context size if failure occurs after model load."]]
|
|
};
|
|
const WINDOWS_LAUNCH = {
|
|
2: ["ERROR_FILE_NOT_FOUND", "executable_missing"],
|
|
3: ["ERROR_PATH_NOT_FOUND", "path_missing"],
|
|
5: ["ERROR_ACCESS_DENIED", "permission_denied"],
|
|
126: ["ERROR_MOD_NOT_FOUND", "missing_dependency"],
|
|
127: ["ERROR_PROC_NOT_FOUND", "dependency_mismatch"],
|
|
193: ["ERROR_BAD_EXE_FORMAT", "architecture_mismatch"],
|
|
206: ["ERROR_FILENAME_EXCED_RANGE", "path_too_long"],
|
|
740: ["ERROR_ELEVATION_REQUIRED", "permission_denied"],
|
|
1114: ["ERROR_DLL_INIT_FAILED", "dependency_initialization_failed"],
|
|
1455: ["ERROR_COMMITMENT_LIMIT", "insufficient_memory"]
|
|
};
|
|
const POSIX = {
|
|
11: ["SIGSEGV", "runtime_crash"],
|
|
4: ["SIGILL", "cpu_incompatible"],
|
|
6: ["SIGABRT", "runtime_abort"],
|
|
9: ["SIGKILL", "killed_or_oom"],
|
|
15: ["SIGTERM", "terminated"]
|
|
};
|
|
|
|
function normalizeExitCode(code, signal, platform = process.platform) {
|
|
if (platform === "win32" && Number.isInteger(code)) {
|
|
const unsigned = code >>> 0;
|
|
const signed = unsigned | 0;
|
|
const known = WINDOWS_STATUS[unsigned];
|
|
return {
|
|
raw_exit_code: code,
|
|
signed_exit_code: signed,
|
|
unsigned_exit_code: unsigned,
|
|
hex_exit_code: `0x${unsigned.toString(16).toUpperCase().padStart(8, "0")}`,
|
|
code: known?.[0] || "WINDOWS_PROCESS_EXIT",
|
|
category: known?.[1] || "runtime_exit",
|
|
remediation_steps: known?.[2] || ["Inspect runtime stdout and stderr.", "Reinstall or try an alternate runtime build."]
|
|
};
|
|
}
|
|
const signalNumber = typeof signal === "string" ? require("os").constants.signals[signal] : null;
|
|
const number = signalNumber || (Number.isInteger(code) && code >= 128 ? code - 128 : Number.isInteger(code) && code < 0 ? -code : null);
|
|
const known = number ? POSIX[number] : null;
|
|
return {
|
|
raw_exit_code: code,
|
|
signed_exit_code: code,
|
|
unsigned_exit_code: Number.isInteger(code) ? code >>> 0 : null,
|
|
hex_exit_code: Number.isInteger(code) ? `0x${(code >>> 0).toString(16).toUpperCase().padStart(8, "0")}` : null,
|
|
code: known?.[0] || signal || "PROCESS_EXIT",
|
|
category: known?.[1] || "runtime_exit",
|
|
remediation_steps: known ? ["Inspect runtime logs.", "Verify runtime compatibility and model settings."] : ["Inspect runtime stdout and stderr."]
|
|
};
|
|
}
|
|
|
|
function classifyLaunchError(error, platform = process.platform) {
|
|
const numeric = Number(error?.errno);
|
|
const known = platform === "win32" ? WINDOWS_LAUNCH[numeric] : null;
|
|
return {
|
|
raw_exit_code: numeric || null,
|
|
signed_exit_code: numeric || null,
|
|
unsigned_exit_code: Number.isInteger(numeric) ? numeric >>> 0 : null,
|
|
hex_exit_code: Number.isInteger(numeric) ? `0x${(numeric >>> 0).toString(16).toUpperCase().padStart(8, "0")}` : null,
|
|
code: known?.[0] || error?.code || "PROCESS_LAUNCH_FAILED",
|
|
category: known?.[1] || (/EACCES|EPERM/.test(error?.code) ? "permission_denied" : /ENOENT/.test(error?.code) ? "executable_missing" : "launch_failed"),
|
|
remediation_steps: ["Verify the executable and working directory.", "Reinstall the runtime.", "Check file permissions and security software."]
|
|
};
|
|
}
|
|
|
|
module.exports = { normalizeExitCode, classifyLaunchError };
|