/**
 * Shared core for prompt-tier "analysis → one LLM edit" proposers. `haloProposer`
 * and `traceAnalystProposer` differ ONLY in who produces the findings; the
 * materialize-traces → apply-via-`APPLY_SYSTEM` → candidate pipeline is
 * identical. Keeping it in one place IS the fairness contract their head-to-head
 * (`compareProposers`) depends on — the apply step can no longer drift between the
 * two engines being compared.
 */
import type { LlmClientOptions } from '../../llm-client';
import type { ProposeContext, SurfaceProposer } from '../types';
export declare const APPLY_SYSTEM = "You apply a trace-analysis report to an agent instruction prompt. Output ONLY the full revised prompt \u2014 no preamble, no commentary, no code fences. Make the minimal edits that address the report findings; preserve everything else verbatim.";
/** Serialize a surface (string or structured) into prompt text. */
export declare function surfaceToPromptText(surface: unknown): string;
export interface AnalysisEditProposerOptions {
    kind: string;
    label: string;
    baseUrl: string;
    apiKey?: string;
    applyModel: string;
    fetchImpl?: LlmClientOptions['fetch'];
    /** Resolve the OTLP traces (JSONL) for THIS generation. Empty → `noTracesError`. */
    resolveTraces: (ctx: ProposeContext) => string | Promise<string>;
    /** Produce the analysis REPORT string from the materialized trace file. Owns
     *  its engine-specific failure + no-findings throws. */
    analyze: (tracePath: string, ctx: ProposeContext) => Promise<string>;
    noTracesError: string;
    rationale: (report: string) => string;
}
/** Build a `SurfaceProposer` that runs `analyze` over the generation's OTLP
 *  traces and applies the report to the surface via one identical LLM edit. */
export declare function analysisEditProposer(opts: AnalysisEditProposerOptions): SurfaceProposer;
//# sourceMappingURL=analysis-edit.d.ts.map