import type { TypingMode } from "../../config/types.js";
import type { TemplateContext } from "../templating.js";
import type { GetReplyOptions, ReplyPayload } from "../types.js";
import type { TypingController } from "./typing.js";
import { type SessionEntry } from "../../config/sessions.js";
import { type VerboseLevel } from "../thinking.js";
import { type FollowupRun, type QueueSettings } from "./queue.js";
/**
 * Executes a full koi reply turn: memory flush → koi LLM call (with model
 * fallback) → heartbeat productivity enforcement → block-streaming pipeline
 * flush → reply payload assembly → usage diagnostics.
 *
 * Handles session resets on compaction/role-ordering failures and queues
 * follow-up runs when the session is already active.
 *
 * @returns One or more reply payloads to send, or `undefined` if the run was
 *          queued, aborted, or produced no renderable output.
 */
export declare function runReplyKoi(params: {
    commandBody: string;
    followupRun: FollowupRun;
    queueKey: string;
    resolvedQueue: QueueSettings;
    shouldSteer: boolean;
    shouldFollowup: boolean;
    isActive: boolean;
    isStreaming: boolean;
    opts?: GetReplyOptions;
    typing: TypingController;
    sessionEntry?: SessionEntry;
    sessionStore?: Record<string, SessionEntry>;
    sessionKey?: string;
    storePath?: string;
    defaultModel: string;
    koiCfgContextTokens?: number;
    resolvedVerboseLevel: VerboseLevel;
    isNewSession: boolean;
    blockStreamingEnabled: boolean;
    blockReplyChunking?: {
        minChars: number;
        maxChars: number;
        breakPreference: "paragraph" | "newline" | "sentence";
        flushOnParagraph?: boolean;
    };
    resolvedBlockStreamingBreak: "text_end" | "message_end";
    sessionCtx: TemplateContext;
    shouldInjectGroupIntro: boolean;
    typingMode: TypingMode;
}): Promise<ReplyPayload | ReplyPayload[] | undefined>;
