import type { SymiConfig } from "../config/config.js";
import type { ReplyDispatcher, ReplyDispatchKind } from "./reply/reply-dispatcher.js";
import type { FinalizedMsgContext, MsgContext } from "./templating.js";
import type { GetReplyOptions } from "./types.js";
export interface RunChannelTurnInput {
    ctx: MsgContext | FinalizedMsgContext;
    cfg: SymiConfig;
    dispatcher: ReplyDispatcher;
    /**
     * Reply options the channel monitor builds (runId, abortSignal,
     * images, onAgentRunStart, onModelSelected, ...). Forwarded to
     * `prepareReplyTurn` verbatim — the chain's prep needs them.
     */
    replyOptions?: Omit<GetReplyOptions, "onToolResult" | "onBlockReply">;
}
/**
 * Same shape as `DispatchInboundResult` so existing channel callers can
 * continue to destructure `{ queuedFinal, counts }` without changes.
 */
export interface RunChannelTurnResult {
    queuedFinal: boolean;
    counts: Record<ReplyDispatchKind, number>;
}
/**
 * Run a channel turn end-to-end. The new production entry point for
 * channel surfaces (Slack, Signal, iMessage, Telegram, WhatsApp).
 *
 * Replaces the chain's `dispatchInboundMessage` → `dispatchReplyFromConfig`
 * → `getReplyFromConfig` → `runPreparedReply` → `runReplyAgent` →
 * `runAgentTurn` for channel surfaces.
 */
export declare function runChannelTurn(input: RunChannelTurnInput): Promise<RunChannelTurnResult>;
