import type { AssistantMessage, ImageContent } from "@oh-my-pi/pi-ai";
import { Container, type ImageBudget } from "@oh-my-pi/pi-tui";
import type { AssistantThinkingRenderer } from "../../extensibility/extensions/types.js";
import { type CacheInvalidation } from "./cache-invalidation-marker.js";
/** Test-only: clear the shared gauge so observations don't leak across cases. */
export declare function resetThinkingSpeedTracker(): void;
/**
 * Component that renders a complete assistant message
 */
export declare class AssistantMessageComponent extends Container {
    #private;
    private hideThinkingBlock;
    private readonly onImageUpdate?;
    private readonly thinkingRenderers;
    private readonly imageBudget?;
    private proseOnlyThinking;
    constructor(message?: AssistantMessage, hideThinkingBlock?: boolean, onImageUpdate?: (() => void) | undefined, thinkingRenderers?: readonly AssistantThinkingRenderer[], imageBudget?: ImageBudget | undefined, proseOnlyThinking?: boolean);
    /**
     * Show or clear the slim cache-invalidation divider above this turn. Set at
     * `message_end` (live) or during rebuild, once the turn's usage is known and
     * compared against the previous turn's cache footprint. Bumps the transcript
     * block version so the change repaints even after content finalized.
     */
    setCacheInvalidation(info: CacheInvalidation | undefined): void;
    invalidate(): void;
    render(width: number): readonly string[];
    setHideThinkingBlock(hide: boolean): void;
    setProseOnlyThinking(proseOnly: boolean): void;
    dispose(): void;
    /**
     * Toggle suppression of the inline `Error: …` line while the same error is
     * pinned in the banner above the editor. Re-renders so the change is visible.
     */
    setErrorPinned(pinned: boolean): void;
    isTranscriptBlockFinalized(): boolean;
    /**
     * Settled leading rows for mid-stream native-scrollback commits (see
     * `FinalizableBlock.getTranscriptBlockSettledRows`). Completed content
     * blocks render in final form (non-transient) and settle in full; the
     * actively streaming markdown contributes its rendered frozen-token
     * prefix. The walk stops at the first child that is not declared
     * byte-stable (the animated thinking pulse, extension components, images,
     * error rows), and a cache-invalidation marker above the content defers
     * settling entirely. Mermaid anywhere defers wholesale — its ASCII
     * rendering resolves asynchronously and can re-layout settled-looking
     * rows. Reads only L1-cached child renders at the width recorded by this
     * frame's render().
     */
    getTranscriptBlockSettledRows(): number;
    getTranscriptBlockVersion(): number;
    markTranscriptBlockFinalized(): void;
    applyRetryRecovery(retryRecovery: AssistantMessage["retryRecovery"]): void;
    messagePersistenceKey(): string | undefined;
    setToolResultImages(toolCallId: string, images: ImageContent[]): void;
    updateContent(message: AssistantMessage, opts?: {
        transient?: boolean;
    }): void;
}
