import type { Message } from "@kenkaiiii/gg-ai";
export interface IdealReviewStats {
    changedLines: number;
    toolCalls: number;
    toolFailures: number;
    turns: number;
    writeCalls: number;
    editCalls: number;
    bashCalls: number;
}
export interface IdealReviewDecision {
    shouldReview: boolean;
    score: number;
    reasons: string[];
}
export declare const IDEAL_REVIEW_PROMPT: string;
export declare function evaluateIdealReview(stats: IdealReviewStats): IdealReviewDecision;
export declare function buildIdealReviewMessage(reasons: readonly string[], driftedFiles?: readonly string[]): Message;
/**
 * Test-drift detector \u2014 the one stranding signal a typechecker is blind to.
 * Given the set of files the run mutated, return the source files whose sibling
 * test exists on disk but was NOT touched this run (a green-but-stale test).
 *
 * Pure structural check: no sibling test on disk \u2192 no signal, so it stays
 * silent on projects (or files) without co-located tests. `fileExists` is
 * injectable for tests; paths are resolved against `cwd` so relative tool paths
 * and absolute ones compare consistently.
 */
export declare function detectTestDrift(touchedFiles: Iterable<string>, cwd: string, fileExists?: (p: string) => boolean): string[];
export declare function shouldCountAsRiskyTool(toolName: string): boolean;
//# sourceMappingURL=ideal-review.d.ts.map