openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
108 lines (107 loc) • 4.42 kB
JavaScript
import { c as redactSensitiveText } from "./redact-DduLliKq.js";
//#region src/infra/errors.ts
function extractErrorCode(err) {
if (!err || typeof err !== "object") return;
const code = err.code;
if (typeof code === "string") return code;
if (typeof code === "number") return String(code);
}
function readErrorName(err) {
if (!err || typeof err !== "object") return "";
const name = err.name;
return typeof name === "string" ? name : "";
}
function collectErrorGraphCandidates(err, resolveNested) {
const queue = [err];
const seen = /* @__PURE__ */ new Set();
const candidates = [];
while (queue.length > 0) {
const current = queue.shift();
if (current == null || seen.has(current)) continue;
seen.add(current);
candidates.push(current);
if (!current || typeof current !== "object" || !resolveNested) continue;
for (const nested of resolveNested(current)) if (nested != null && !seen.has(nested)) queue.push(nested);
}
return candidates;
}
/**
* Type guard for NodeJS.ErrnoException (any error with a `code` property).
*/
function isErrno(err) {
return Boolean(err && typeof err === "object" && "code" in err);
}
/**
* Check if an error has a specific errno code.
*/
function hasErrnoCode(err, code) {
return isErrno(err) && err.code === code;
}
function formatErrorMessage(err) {
let formatted;
if (err instanceof Error) {
formatted = err.message || err.name || "Error";
let cause = err.cause;
const seen = new Set([err]);
const seenMessages = new Set([formatted]);
const appendCauseMessage = (message) => {
if (!message || seenMessages.has(message)) return;
formatted += ` | ${message}`;
seenMessages.add(message);
};
while (cause && !seen.has(cause)) {
seen.add(cause);
if (cause instanceof Error) {
appendCauseMessage(cause.message);
cause = cause.cause;
} else if (typeof cause === "string") {
appendCauseMessage(cause);
break;
} else break;
}
} else if (typeof err === "string") formatted = err;
else if (typeof err === "number" || typeof err === "boolean" || typeof err === "bigint") formatted = String(err);
else try {
formatted = JSON.stringify(err);
} catch {
formatted = Object.prototype.toString.call(err);
}
return redactSensitiveText(formatted);
}
/**
* Render a non-Error `cause` value (string, number, plain object, etc.) for inclusion in
* a flattened error chain. Returns `[object Object]`-free text without throwing.
*/
function stringifyNonErrorCause(value) {
if (value === null) return "null";
if (typeof value === "string") return value;
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") return String(value);
try {
return JSON.stringify(value) ?? Object.prototype.toString.call(value);
} catch {
return Object.prototype.toString.call(value);
}
}
function toErrorObject(value, fallbackMessage) {
if (value instanceof Error) return value;
if (typeof value === "string") return new Error(value);
const error = new Error(fallbackMessage, { cause: value });
if (typeof value === "object" && value !== null || typeof value === "function") Object.assign(error, value);
return error;
}
function formatUncaughtError(err) {
if (extractErrorCode(err) === "INVALID_CONFIG") return formatErrorMessage(err);
if (err instanceof Error) return redactSensitiveText(err.stack ?? err.message ?? err.name);
return formatErrorMessage(err);
}
function detectErrorKind(err) {
if (err === void 0) return;
const message = formatErrorMessage(err).toLowerCase();
const code = extractErrorCode(err)?.toLowerCase();
if (message.includes("refusal") || message.includes("content_filter") || message.includes("sensitive") || message.includes("unhandled stop reason: refusal_policy")) return "refusal";
if (message.includes("timeout") || code === "etimedout" || code === "timeout") return "timeout";
if (message.includes("rate limit") || message.includes("too many requests") || message.includes("429") || code === "429") return "rate_limit";
if (message.includes("context length") || message.includes("too many tokens") || message.includes("token limit") || message.includes("context_window")) return "context_length";
}
//#endregion
export { formatUncaughtError as a, readErrorName as c, formatErrorMessage as i, stringifyNonErrorCause as l, detectErrorKind as n, hasErrnoCode as o, extractErrorCode as r, isErrno as s, collectErrorGraphCandidates as t, toErrorObject as u };