export declare const MAX_TITLE_INPUT_CHARS = 2000;
export declare function truncateTitleInput(message: string): string;
/**
 * Strip fenced code blocks from a message before titling.
 *
 * Small title models latch onto literal text inside code blocks — e.g. a pasted
 * UI mockup containing "Welcome to Claude Code v2.1.158" yields that string as
 * the title instead of the surrounding intent. Removing fenced blocks leaves the
 * prose that actually describes the task. Inline code (single backticks) is kept
 * — it is short, high-signal context like `/login`.
 *
 * Falls back to the original message when stripping leaves too little to title
 * (a message that is essentially just a code block).
 */
export declare function stripCodeBlocks(message: string): string;
/** Prepare a raw user message for titling: drop code blocks, then bound length. */
export declare function prepareTitleInput(message: string): string;
export declare function formatTitleUserMessage(message: string): string;
/** Single recent conversation turn supplied to title refresh after replanning. */
export interface TitleConversationTurn {
    role: "user" | "assistant";
    text?: string;
    thinking?: string;
}
/** Format recent user/assistant context for title generation after a todo replan. */
export declare function formatTitleConversationContext(turns: readonly TitleConversationTurn[]): string;
/**
 * True when a first user message is too low-signal to title (greeting, ack,
 * bare number, or empty once code/punctuation/emoji are stripped).
 *
 * Deterministic pre-filter: the default tiny title model (~350M local) cannot
 * reliably follow a "respond with none" instruction and tends to hallucinate a
 * title for trivial input, so we never ask it — the caller defers titling to
 * the next message instead.
 */
export declare function isLowSignalTitleInput(message: string): boolean;
/**
 * Sentinel a capable title model may emit when a message carries no concrete
 * task. Treated as "no title yet" so the caller can defer titling. Backstop for
 * the deterministic {@link isLowSignalTitleInput} filter; kept in sync with the
 * `none` instruction in `prompts/system/title-system.md`.
 */
export declare const NO_TITLE_SENTINEL = "none";
export declare function normalizeGeneratedTitle(value: string | null | undefined, sourceText?: string): string | null;
