feat(gateway): 配置只读事实面 + 后台思考行「档位/穿透」(契约 v0.68)

- 新增 GET /api/v1/admin/config-facts:记忆整理 7 键 + 安静时段 2 键的**进程生效值** + 声明默认值(反射读 default 标签,不读 .env)
- 面板:记忆整理卡 + 安静时段卡(Miuix 只读),文案按新语义「只服务主动搭话,不静默回复」
- 后台思考行加 urgency(**只能是下限**,存档不可分 high/critical)+ quietHoursBypassed(与既有 bypassed 是两件事)
- 红线实测:往响应里塞 JWT ⇒ TestAdminConfigFacts_NeverLeaksSecretValues 打红(连断言消息都把整个响应打出来了)
- 前端:configFacts 24 checks / ConfigFactsCards 29 / BackthinkUrgencyTags 19 全过
- 契约 v0.68(纯增量:B12 新端点 + B8 两字段 + §4.10 形状与语义 + §7.4-17 下限限定)
This commit is contained in:
AskaEth committed 2026-10-05 13:54:56 +08:00
1 parent a057a0f61f
commit 34cef95e17
25 files changed
+1741 -14

No files matched your search

@@ -0,0 +1,62 @@
import type { BackthinkItem } from "../../lib/types";
/**
* 后台思考行「紧急度 / 穿透安静时段」标记的**纯逻辑**(契约 v0.68 §4.10(b))。
*
* 后端 `urgency` 的语义是**存档可证的档位下限**(`warning` = 至少 high 档,可能更
* 高),不是精确档位;而窗口之外的轮次存档里没有档位,键**缺席**。因此本层:
* - 缺席 ⇒ 显示「档位未知」(**不是**「例常」——把未知画成事实就是这次要避免的坑);
* - 未知取值 ⇒ 原样显示后端给的词,不猜一个更好听的;
* - `quietHoursBypassed` 只在 true 时渲染「穿透安静时段」。
*/
export type UrgencyTagTone = "ok" | "warn" | "err" | "neutral" | "accent";
export interface UrgencyTag {
label: string;
tone: UrgencyTagTone;
/** 悬停说明(为什么是这个档位 / 为什么未知),给人看的口径。 */
hint: string;
}
/** 档位未知时的标签(键缺席 = 后端没有这个事实)。 */
export const URGENCY_UNKNOWN_LABEL = "档位未知";
/** 穿透安静时段的标签。 */
export const QUIET_HOURS_BYPASS_LABEL = "穿透安静时段";
/** urgencyTag 把后端 `urgency` 映射成标签;键缺席时给「档位未知」。 */
export function urgencyTag(item: Pick<BackthinkItem, "urgency">): UrgencyTag {
const level = item.urgency;
switch (level) {
case "routine":
return { label: "例常", tone: "neutral", hint: "安静时段内被扣下的轮次:档位低于 high,不穿透" };
case "warning":
return {
label: "紧急(≥ 高)",
tone: "warn",
hint: "安静时段内仍被放行 ⇒ 档位至少 high;记录里无法区分 high 与 critical,故显示下限",
};
case "critical":
return { label: "紧急·安全域", tone: "err", hint: "安全域事件(可穿透工作/忙碌与安静时段)" };
case undefined:
case "":
return {
label: URGENCY_UNKNOWN_LABEL,
tone: "neutral",
hint: "这一轮的档位在存档里不可证(轮次不在安静时段窗口内,记录不保存档位)——不是「例常」",
};
default:
return { label: level, tone: "neutral", hint: "后端给了本面板不认识的档位,原样显示" };
}
}
/** quietHoursBypassTag 只在后端确实标记了穿透时返回标签。 */
export function quietHoursBypassTag(item: Pick<BackthinkItem, "quietHoursBypassed">): UrgencyTag | null {
if (item.quietHoursBypassed !== true) return null;
return {
label: QUIET_HOURS_BYPASS_LABEL,
tone: "accent",
hint: "这一轮落在安静时段窗口内、但仍被放行发出(档位 ≥ high)",
};
}