import type { KdCompiledWorkflowContext } from "./context-compiler.ts"; export interface ContextValidationResult { passed: boolean; errors: string[]; warnings: string[]; } export function validateCompiledWorkflowContext(packet: KdCompiledWorkflowContext): ContextValidationResult { const errors: string[] = []; const warnings: string[] = []; const focus = packet.controlFrame.focus; if (!packet.status.trim()) errors.push("缺少 Harness 状态。"); if (!packet.budgetReport.includes(`focus:${focus}`)) errors.push("预算报告未匹配 control frame focus。"); if (!packet.workingSet.trim() || packet.workingSet === "无。") errors.push("缺少 Working Set。"); if (focus === "consistency" && packet.controlFrame.consistency.errors.length === 0) { errors.push("control frame focus=consistency,但 consistency report 没有 errors。"); } if (focus === "blocking-question" && !packet.controlFrame.openQuestion) { errors.push("focus=blocking-question,但 control frame 缺少 openQuestion。"); } if (focus === "blocking-question" && !/未回答问题|未回答阻断问题|Q-\d+/.test(packet.questionFacts)) { errors.push("focus=blocking-question,但 questionFacts 未包含 open question。"); } if (focus === "resume-snapshot" && !packet.controlFrame.resumeSnapshot) { errors.push("focus=resume-snapshot,但 control frame 缺少 resumeSnapshot。"); } if (packet.recentEvents.includes("tool.succeeded") && packet.toolResults === "无。") { warnings.push("ledger 存在 tool.succeeded,但 Tool Result Contracts 为空。"); } if (packet.phaseArtifacts.includes("[...已截断") && !packet.budgetReport.includes("truncated=yes")) { warnings.push("阶段资料发生截断,但预算报告未显示截断。"); } return { passed: errors.length === 0, errors, warnings }; } export function formatContextValidation(result: ContextValidationResult): string { if (result.passed && result.warnings.length === 0) return "[OK] Context Pack Validation passed."; const lines = ["Context Pack Validation"]; for (const error of result.errors) lines.push(`[ERROR] ${error}`); for (const warning of result.warnings) lines.push(`[WARN] ${warning}`); return lines.join("\n"); }