export type RequiredFactsContractId = "implementation" | "integration" | "data-source"; export interface RequiredFactsContractIssue { contract: RequiredFactsContractId; missing: string[]; } export interface RequiredFactsContractEvaluation { required: boolean; issues: RequiredFactsContractIssue[]; } export function hasFactsContractIssues(evaluation: RequiredFactsContractEvaluation): boolean { return evaluation.issues.some((issue) => issue.missing.length > 0); } export function firstFactsContractIssue(evaluation: RequiredFactsContractEvaluation): RequiredFactsContractIssue | undefined { return evaluation.issues.find((issue) => issue.missing.length > 0); } export function formatFactsContractSummary(evaluation: RequiredFactsContractEvaluation): string { if (!evaluation.required) return "无必需事实契约。"; if (!hasFactsContractIssues(evaluation)) return "必需事实契约已满足。"; return evaluation.issues .filter((issue) => issue.missing.length > 0) .map((issue) => `- ${contractLabel(issue.contract)}:缺少 ${issue.missing.join("、")}`) .join("\n"); } export function contractLabel(contract: RequiredFactsContractId): string { if (contract === "implementation") return "实现契约"; if (contract === "integration") return "第三方对接上下文"; return "业务数据源上下文"; }