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

+14
View File
@@ -124,6 +124,12 @@ type AdminUserRecord struct {
// design/10 §3 #12)回答「走了哪条路、为什么打扰/为什么不打扰」——
// 它们直接来自后端已存的 PushResult,因此面板不必靠猜来解释
// 一次静默。
//
// Urgency / QuietHoursBypassed(v0.68)回答「这一轮有多紧急、是不是
// 穿透了安静时段」。二者都**只在存档可证时**出现,缺席 ≠ 常规档位:
// 推导依据见 admin_backthink_urgency.go(那一轮的 `At` 落在安静时段窗口内
// 时,判定级联已把档位锁死到可证的范围;窗口之外的轮次存档里没有档位,
// 因此不下发,而不是编一个 routine)。
type AdminBackthinkItem struct {
ID string `json:"id"`
Trigger string `json:"trigger"`
@@ -137,6 +143,14 @@ type AdminBackthinkItem struct {
// Bypassed 表示这是事件驱动的推送、绕过了限频闸("该发就发")。
Bypassed bool `json:"bypassed"`
At int64 `json:"at"`
// Urgency 是这一轮紧急度的**存档可证下限**(urgency 档位词汇:
// routine | warning | critical)。`warning` 读作「≥ high 档(可能更高)」;
// 无法证明时省略该键(面板显示「未知」)。
Urgency string `json:"urgency,omitempty"`
// QuietHoursBypassed 为 true 时表示这一轮**穿透了安静时段**(轮次时间落在
// 安静时段窗口内且该轮判定要推送)。只在为 true 时出现:安静时段之外的轮次
// 与「没穿透」不必在线上区分,缺席即「没有这件事」。
QuietHoursBypassed bool `json:"quietHoursBypassed,omitempty"`
}
// AdminRagDoc 是管理 RAG 列表中一个知识库文档(项目索引