pipeline.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import type { DashboardResponse } from "@/lib/api/types";
  2. export type PipelineStage = {
  3. id: string;
  4. label: string;
  5. status: "active" | "warn" | "plain";
  6. count?: number;
  7. };
  8. // stage_conclusions.status -> 导航卡状态。failed/blocked 必须可见为 warn,
  9. // 不再只按「有无数据」判断(V1 bug: 失败阶段曾显示为正常)。
  10. function fromConclusion(status: string | undefined, fallback: "active" | "warn" | "plain"): "active" | "warn" | "plain" {
  11. if (!status) return fallback;
  12. if (["failed", "fail", "rule_blocked", "error", "missing"].includes(status)) return "warn";
  13. if (["success", "pass", "partial_success", "pending", "review"].includes(status)) return "active";
  14. return fallback;
  15. }
  16. export function pipelineStages(dashboard?: DashboardResponse): PipelineStage[] {
  17. const counts = dashboard?.counts || {};
  18. const files = dashboard?.files || {};
  19. const conclusionByStage = new Map(
  20. (dashboard?.stage_conclusions || []).map((row) => [row.stage_id, row.status])
  21. );
  22. const stage = (
  23. id: string,
  24. label: string,
  25. fallback: "active" | "warn" | "plain",
  26. count?: number
  27. ): PipelineStage => ({
  28. id,
  29. label,
  30. status: fromConclusion(conclusionByStage.get(id), fallback),
  31. ...(count === undefined ? {} : { count })
  32. });
  33. return [
  34. stage("source", "数据源", files["source_context.json"] ? "active" : "warn"),
  35. stage("query", "Query", counts.queries ? "active" : "warn", counts.queries),
  36. stage("platform", "平台 / 内容", counts.discovered_content_items ? "active" : "warn", counts.discovered_content_items),
  37. stage("judge", "判断", counts.rule_decisions ? "active" : "warn", counts.rule_decisions),
  38. stage("walk", "游走", counts.walk_actions ? "active" : "plain", counts.walk_actions),
  39. stage("asset", "资产沉淀", files["final_output.json"] ? "active" : "plain"),
  40. stage("learning", "策略学习", files["strategy_review.json"] ? "active" : "plain")
  41. ];
  42. }