import type { SymiConfig } from "../config/config.js";
import type { SynthesizeFn } from "./consolidate.js";
import type { ChunkKind } from "./types.js";
/**
 * Build a SynthesizeFn that wraps runAgentTurn for L3 stage 4.
 *
 * Each invocation:
 *   1. Concatenates the cluster's source texts (capped to keep the prompt bounded)
 *   2. Calls runAgentTurn with tools disabled and a constrained output format
 *   3. Parses the response into { kind, text }
 *   4. Returns null on any failure — stage 4 treats null as "skip this cluster"
 *
 * Caller controls provider/model via the current agent's config. On local
 * model setups the cost is free so every cluster gets a turn; on remote
 * setups callers can bound frequency via `runL3CycleIfDue`'s minInterval.
 */
export declare function createSynthesizer(params: {
    cfg: SymiConfig;
    agentId: string;
    workspaceDir: string;
    /** Override the model used for synthesis. Defaults to the agent's default. */
    modelId?: string;
    provider?: string;
    timeoutMs?: number;
}): SynthesizeFn;
/**
 * Parse "KIND: <k>\n<text>" responses. Returns null on malformed output,
 * or when the model chose to skip.
 */
export declare function parseSynthesisOutput(raw: string): {
    text: string;
    kind: Exclude<ChunkKind, "observation">;
} | null;
