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): 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): UrgencyTag | null { if (item.quietHoursBypassed !== true) return null; return { label: QUIET_HOURS_BYPASS_LABEL, tone: "accent", hint: "这一轮落在安静时段窗口内、但仍被放行发出(档位 ≥ high)", }; }