fix(qa): 前端错误文案——按 API 信封 surface 真实错因,去掉通用 toast
新增 friendlyFromApiError(apiError):兼容业务信封 {error:{code,message}}(ARCH §7.1)
与 FastAPI 422 {detail:[...]},422 映射为友好 VALIDATION 文案(不泄露技术细节)。
接入三处此前吞掉错因、永显通用文案的调用点:
- useOutline(QA #2):原 env.error.code 漏读 422 detail,永显「大纲生成失败」。
- ChainPage / ChainAdjudication(QA #11):原 friendlyError(undefined) 永显通用 toast,
现 surface 真实 code(如 LLM_UNAVAILABLE→去设置 provider / CONFLICT→提示裁决)。
+ messages.test.ts 加 3 例(业务码带动作 / 422→VALIDATION / 未知形兜底)。
门禁绿:vitest / tsc / eslint 干净。
This commit is contained in:
@@ -44,3 +44,22 @@ export function friendlyError(
|
||||
const fallback = fallbackMessage?.trim();
|
||||
return { text: fallback && fallback.length > 0 ? fallback : DEFAULT_TEXT };
|
||||
}
|
||||
|
||||
// 从原始 API 错误对象(openapi-fetch 的 `error`)提取友好文案。
|
||||
// 兼容两种信封:业务错误 `{error:{code,message}}`(ARCH §7.1)与 FastAPI 校验错误 `{detail:[...]}`。
|
||||
// 422 一律映射为友好的 VALIDATION 文案(不泄露技术性 detail)。未知形 → 通用兜底。
|
||||
export function friendlyFromApiError(apiError: unknown): FriendlyError {
|
||||
if (apiError && typeof apiError === "object") {
|
||||
const env = apiError as {
|
||||
error?: { code?: string; message?: string };
|
||||
detail?: unknown;
|
||||
};
|
||||
if (env.error?.code) {
|
||||
return friendlyError(env.error.code, env.error.message);
|
||||
}
|
||||
if (env.detail !== undefined) {
|
||||
return friendlyError("VALIDATION");
|
||||
}
|
||||
}
|
||||
return friendlyError(undefined);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user