import type { PendingLoosening } from "../../actions/index.js"; export declare const sanitize: (line: string) => string; /** One queued loosening, joined to the effective value it would move away from * so the diff can show a real before/after rather than just a target. */ export interface LooseningReviewItem { name: string; field: PendingLoosening["field"]; /** The tool's EFFECTIVE current value (skeleton ⊕ standing judgment). */ from: string | boolean; to: string | boolean; evidence: string; reason?: string; } /** The reviewable diff: one heading per tool, then `field: old → new` with the * evidence quote and reason indented under it. */ export declare function renderLooseningDiff(items: LooseningReviewItem[]): string[]; export interface ReviewOptions { note: (line: string) => void; confirm: (question: string, defaultYes: boolean) => Promise; } /** * Show the aggregated diff and ask once. Defaults to NO: a loosening that lands * because someone hit enter is not a human decision, and a non-TTY `confirm` * returns the default — so an unattended run queues rather than approves. */ export declare function reviewLoosenings(items: LooseningReviewItem[], options: ReviewOptions): Promise<"approved" | "declined">;