Files
ARTEX/web/src/lib/status.ts
T
Autumn-27 377ccc7e5a fix(web): 修正意图状态标签 exhausted/blocked 语义错误
- exhausted「已穷尽」→「预算耗尽」:实为达步数/时间预算被中途掐断、只写回部分结果,
  并非该方向已探尽(易被误读为无需再探)。
- blocked「被拦截」→「执行出错」:实为模型/API/网络故障重试用尽、意图基本没真正探成,
  并非目标/WAF 拦截。
- 补上缺失的 stopped「已停止」(用户手动停止的 work)。
2026-09-09 12:59:48 -04:00

128 lines
4.1 KiB
TypeScript

// Centralised status → color/label semantics, reused across the whole app.
// Spec §8.3: 意图 / 覆盖 / 任务 / 严重度 each have a consistent color set.
export type Tone =
| "neutral"
| "blue"
| "green"
| "amber"
| "red"
| "rose"
| "violet"
| "slate";
export const toneClasses: Record<Tone, string> = {
neutral:
"bg-muted text-muted-foreground border-transparent",
blue: "bg-blue-500/15 text-blue-600 dark:text-blue-400 border-blue-500/20",
green:
"bg-emerald-500/15 text-emerald-600 dark:text-emerald-400 border-emerald-500/20",
amber:
"bg-amber-500/15 text-amber-600 dark:text-amber-400 border-amber-500/20",
red: "bg-red-500/15 text-red-600 dark:text-red-400 border-red-500/20",
// rose 用作「严重」——实心高强调,视觉上明显高于「高危」的软红描边。
rose: "bg-rose-600 text-white border-rose-600 dark:bg-rose-600 dark:text-white",
violet:
"bg-violet-500/15 text-violet-600 dark:text-violet-400 border-violet-500/20",
slate:
"bg-slate-500/15 text-slate-600 dark:text-slate-400 border-slate-500/20",
};
export const toneDot: Record<Tone, string> = {
neutral: "bg-muted-foreground",
blue: "bg-blue-500",
green: "bg-emerald-500",
amber: "bg-amber-500",
red: "bg-red-500",
rose: "bg-white",
violet: "bg-violet-500",
slate: "bg-slate-500",
};
interface StatusMeta {
label: string;
tone: Tone;
}
const intent: Record<string, StatusMeta> = {
open: { label: "待领", tone: "slate" },
running: { label: "执行中", tone: "blue" },
paused: { label: "已暂停", tone: "amber" },
done: { label: "已完成", tone: "green" },
// blocked = 模型/API/网络故障重试用尽,这条意图基本没真正探成(非目标拦截)。
blocked: { label: "执行出错", tone: "red" },
// exhausted = 达到步数/时间预算被中途掐断、只写回部分结果(非方向已探尽)。
exhausted: { label: "预算耗尽", tone: "violet" },
// stopped = 用户手动删除/停止了该 work(保留已产出的事实)。
stopped: { label: "已停止", tone: "slate" },
};
const task: Record<string, StatusMeta> = {
created: { label: "已创建", tone: "slate" },
queued: { label: "排队中", tone: "amber" },
running: { label: "运行中", tone: "blue" },
paused: { label: "已暂停", tone: "amber" },
done: { label: "已完成", tone: "green" },
failed: { label: "失败", tone: "red" },
timeout: { label: "已超时", tone: "amber" },
};
const severity: Record<string, StatusMeta> = {
critical: { label: "严重", tone: "rose" },
high: { label: "高危", tone: "red" },
medium: { label: "中危", tone: "amber" },
low: { label: "低危", tone: "slate" },
};
const finding: Record<string, StatusMeta> = {
pending: { label: "待处理", tone: "amber" },
in_progress: { label: "处理中", tone: "blue" },
confirmed: { label: "已确认", tone: "red" },
resolved: { label: "已处理", tone: "green" },
false_positive: { label: "误报", tone: "slate" },
ignored: { label: "忽略", tone: "neutral" },
duplicate: { label: "重复", tone: "neutral" },
risk_accepted: { label: "风险接受", tone: "violet" },
};
const engine: Record<string, StatusMeta> = {
exploring: { label: "探索中", tone: "blue" },
paused: { label: "已暂停", tone: "amber" },
stalled: { label: "停滞", tone: "red" },
idle: { label: "空闲", tone: "neutral" },
};
const goal: Record<string, StatusMeta> = {
open: { label: "进行中", tone: "blue" },
met: { label: "已达成", tone: "green" },
abandoned: { label: "已放弃", tone: "slate" },
};
const audit: Record<string, StatusMeta> = {
allow: { label: "放行", tone: "green" },
block: { label: "拦截", tone: "red" },
};
const node: Record<string, StatusMeta> = {
observed: { label: "观测", tone: "slate" },
confirmed: { label: "确认", tone: "green" },
tombstoned: { label: "废弃", tone: "neutral" },
};
const maps = {
intent,
task,
severity,
finding,
engine,
goal,
audit,
node,
} as const;
export type StatusDomain = keyof typeof maps;
export function statusMeta(domain: StatusDomain, key: string): StatusMeta {
return maps[domain][key] ?? { label: key, tone: "neutral" };
}