67 lines
2.0 KiB
TypeScript

export const OPENCLAW_UPGRADE_RETRY_MESSAGE =
"claw正在升级更新稍等5分钟再试";
export const OPENCLAW_TIMEOUT_MESSAGE =
"任务处理时间较长,本次等待已超时。任务可能仍在后台执行,请稍后在 Claw 历史对话中查看,或重新发送。";
export const OPENCLAW_AUTH_REQUIRED_CODE = "AUTH_REQUIRED";
export const OPENCLAW_AUTH_REQUIRED_MESSAGE =
"登录状态已失效,请重新登录后使用 Claw";
export const OPENCLAW_FORBIDDEN_MESSAGE = "当前账号无权访问该 Claw 对话";
function readPayloadString(payload: unknown, key: "code" | "error") {
if (!payload || typeof payload !== "object" || !(key in payload)) {
return "";
}
const value = (payload as Record<string, unknown>)[key];
return typeof value === "string" ? value.trim() : "";
}
export function getOpenClawClientErrorMessage(
status: number,
payload: unknown
) {
const error = readPayloadString(payload, "error");
if (isOpenClawAuthRequiredError(status, payload)) {
return OPENCLAW_AUTH_REQUIRED_MESSAGE;
}
if (status === 403) {
return OPENCLAW_FORBIDDEN_MESSAGE;
}
if (status >= 400 && status < 500 && status !== 401 && error) {
return error;
}
return OPENCLAW_UPGRADE_RETRY_MESSAGE;
}
export function isOpenClawAuthRequiredError(
status: number,
payload: unknown
) {
const code = readPayloadString(payload, "code");
const error = readPayloadString(payload, "error");
return (
status === 401 &&
(code === OPENCLAW_AUTH_REQUIRED_CODE || /^Unauthorized$/i.test(error))
);
}
export function isOpenClawTimeoutError(error: unknown) {
if (!error || typeof error !== "object") return false;
const candidate = error as { name?: unknown; message?: unknown };
return (
candidate.name === "AbortError" ||
/\b(?:aborted|timeout|timed out)\b/i.test(String(candidate.message || ""))
);
}
export function getOpenClawTaskFailureMessage(error: unknown) {
return isOpenClawTimeoutError(error)
? OPENCLAW_TIMEOUT_MESSAGE
: OPENCLAW_UPGRADE_RETRY_MESSAGE;
}