import type { ToolManager } from '../tools/tool-manager.js';
import type { TuneConfig } from '../types/config.js';
import type { DevelopmentMode, LLMClient, Message } from '../types/core.js';
export interface RunPlainConversationOptions {
    client: LLMClient;
    toolManager: ToolManager;
    systemMessage: Message;
    initialMessages: Message[];
    developmentMode: DevelopmentMode;
    nonInteractiveAlwaysAllow: string[];
    abortSignal: AbortSignal;
    tune?: TuneConfig;
    model?: string;
}
export type PlainConversationOutcome = {
    kind: 'success';
} | {
    kind: 'tool-approval-required';
    toolNames: string[];
} | {
    kind: 'error';
    message: string;
};
/**
 * Headless conversation loop. Streams assistant text to stdout, runs tools
 * via processToolUse, and recurses until the model produces a content-only
 * response or hits a tool that needs human approval (which exits early in
 * plain mode — there's no interactive prompt).
 *
 * The turn ceiling guards against a wedged model looping unbounded in an
 * unattended run. It defaults to DEFAULT_HEADLESS_MAX_TURNS and is overridable
 * via the NANOCODER_MAX_TURNS env var or `nanocoder.headless.maxTurns` config.
 */
export declare function runPlainConversation(options: RunPlainConversationOptions): Promise<PlainConversationOutcome>;
//# sourceMappingURL=conversation.d.ts.map