/**
 * Intent-match judge — "did the agent build the right APP, ignoring
 * whether every feature is wired up?"
 *
 * Distinct from {@link runSemanticConceptJudge} which scores per-concept
 * presence. The semantic judge can return 0/4 concepts present even
 * when the agent built a thoughtful, polished, on-brief app that just
 * lacks one or two features. The semantic judge can also return 4/4
 * present even when the agent shipped the wrong project (keyword-rich
 * stub).
 *
 * Intent-match asks ONE question:
 *   "Looking at the agent's work as a whole — independent of feature
 *    coverage — is this an honest attempt at the user's request?"
 *
 * Returns a 0–1 score and a 1-sentence evidence string. Use as a sanity
 * check on `completenessScore`-style metrics: if intent-match is high
 * and concept count is low, the agent built the right thing but is
 * missing features (ship and iterate). If intent-match is low, the
 * agent built the wrong thing (reject regardless of concept count).
 *
 * Soft-fails on LLM/JSON error (`available: false`) so callers can
 * treat failure as "judge skipped."
 */
import { type LlmClientOptions } from './llm-client';
export declare const INTENT_MATCH_JUDGE_VERSION = "intent-match-judge-v1-2026-04-24";
export interface IntentMatchInput {
    /** The full natural-language prompt the agent was handed. */
    userRequest: string;
    /** Top-level source files from the agent's workdir. */
    sourceFiles: Array<{
        path: string;
        content: string;
    }>;
    /** Rendered HTML the preview returned, when available. */
    servedHtml?: string;
    /** Optional metadata to inject (id, vertical, difficulty). */
    artifactLabel?: string;
    artifactDescription?: string;
}
export interface IntentMatchResult {
    kind: 'intent-match';
    version: string;
    /** 0..1 — 1 = unmistakably the right app, 0 = unrelated to the brief. */
    score: number;
    /** One-sentence rationale citing concrete evidence (file or HTML). */
    evidence: string;
    durationMs: number;
    costUsd: number | null;
    available: boolean;
    error?: string;
}
export interface IntentMatchOptions {
    model?: string;
    timeoutMs?: number;
    maxSourceChars?: number;
    maxPerFileChars?: number;
    maxHtmlChars?: number;
    llm?: LlmClientOptions;
}
/**
 * Run the intent-match judge. Soft-fails to available=false on error.
 */
export declare function runIntentMatchJudge(input: IntentMatchInput, options?: IntentMatchOptions): Promise<IntentMatchResult>;
/**
 * Factory: pin LLM options once, return a closure.
 */
export declare function createIntentMatchJudge(options?: IntentMatchOptions): (input: IntentMatchInput) => Promise<IntentMatchResult>;
//# sourceMappingURL=intent-match-judge.d.ts.map