import { POLICY_CAPS } from "../config/defaults.js"; import type { FailureFingerprint, Policy, VerificationPlan, VerificationResult } from "../types.js"; import { repairModel } from "../workflows/repair.js"; import { isVerified, verify } from "./verifier.js"; export interface RepairAttempt { attempt: number; model: "luna" | "sol"; thinking: "high" | "xhigh"; fingerprint: FailureFingerprint } export interface GoalLoopResult { verified: boolean; results: VerificationResult[]; attempts: RepairAttempt[] } export async function goalLoop(plan: VerificationPlan, cwd: string, policy: Policy, repair: (attempt: RepairAttempt) => Promise): Promise { const attempts: RepairAttempt[] = []; const seen = new Map(); let results = await verify(plan, cwd); while (!isVerified(results) && attempts.length < POLICY_CAPS[policy].maxRepairCycles) { const failed = results.find((result) => !result.passed); if (!failed?.fingerprint) break; const previousCount = seen.get(failed.fingerprint.hash) ?? 0; if (previousCount === 0) seen.clear(); const count = previousCount + 1; seen.set(failed.fingerprint.hash, count); const attempt: RepairAttempt = { attempt: attempts.length + 1, ...repairModel(count), fingerprint: failed.fingerprint }; attempts.push(attempt); await repair(attempt); results = await verify(plan, cwd); } return { verified: isVerified(results), results, attempts }; }