import type { ToolExecutionComponent, MarkdownTransformer, MessageRenderer, Theme } from "@earendil-works/pi-coding-agent"; import type { TUI } from "@earendil-works/pi-tui"; import type { CodePreviewSettings } from "./code-preview.js"; import type { FabricConversationTarget } from "./conversation.js"; import type { NativeConversationTranscript } from "./conversation-native-reader.js"; export type { NativeAgentMessage, NativeConversationTranscript, NativeToolExecution, } from "./conversation-native-reader.js"; /** Exactly what ToolExecutionComponent accepts as its tool definition. */ export type FabricToolDefinitionLike = ConstructorParameters[4]; export type FabricGetToolDefinition = (toolName: string) => FabricToolDefinitionLike; export interface FabricConversationTranscriptRendererOptions { /** * Registered tool definitions (Main wires the actual fabricTool and * capturedTools.get(name).definition). Undefined falls back to the native * generic tool card, exactly like interactive-mode getRegisteredToolDefinition. */ getToolDefinition?: FabricGetToolDefinition | undefined; /** Extension message renderers (capturedTools.runner.getMessageRenderer). */ getMessageRenderer?: ((customType: string) => MessageRenderer | undefined) | undefined; /** Native markdown transformers (capturedTools.runner.getMarkdownTransformers). */ markdownTransformers?: readonly MarkdownTransformer[] | undefined; hiddenThinkingLabel?: string | undefined; imageWidthCells?: number | undefined; } export interface FabricConversationTranscriptRenderOptions { target: FabricConversationTarget; toolsExpanded: boolean; outputPad?: 0 | 1; codeBlockIndent?: string; codePreviewSettings?: CodePreviewSettings | undefined; hideThinking?: boolean; showImages?: boolean; } /** * Renders a conversation-native transcript with the exact registered Pi * components (UserMessageComponent, AssistantMessageComponent, * ToolExecutionComponent, BashExecutionComponent, compaction/branch/custom * summaries), dispatched the way interactive-mode addMessageToChat and * renderSessionItems do. Native component rows are preserved verbatim — no * dashboard normalization, no per-line re-truncation, no extra background or * glyph decoration — so full-width backgrounds and native spacing survive. */ export declare class FabricConversationTranscriptRenderer { private readonly tui; private readonly theme; private readonly rendererOptions; private readonly toolComponents; private readonly messageComponents; private readonly assistantComponents; private readonly markdownThemeCache; private readonly highlightInvalidate; private disposed; private currentTargetId; private readonly rendererStates; private readonly liveStates; private readonly messageRows; private readonly toolRows; private readonly toolTokens; private readonly messageIds; private nextMessageId; private rows; private lastMessages; private lastTools; private lastPartial; private lastVersion; private sourceKey; private optionsKey; private lastRendererHooks; private lastWidth; private frameLines; private frameFlags; private planDirty; constructor(tui: TUI, theme: Theme, rendererOptions?: FabricConversationTranscriptRendererOptions); /** Drop cached components; stray renderer timers/invalidations become no-ops. */ invalidate(): void; /** Finalize: live spinner/timing intervals may still fire once; guarded. */ dispose(): void; render(transcript: NativeConversationTranscript, width: number, options: FabricConversationTranscriptRenderOptions): string[]; private reconcileRows; private messageKey; private markdownTheme; private renderMessage; private renderUserMessage; private userComponentLines; private renderAssistantContent; private reconcileTool; private releaseTool; private renderBashExecution; private renderCustomMessage; private renderBoxedMessage; /** * Registered definition with wrapped renderer callbacks: the render context * invalidate becomes a no-op once disposed, so a live spinner/timing timer * firing after dispose cannot touch the TUI. ToolExecutionComponent has no * dispose; this finalizes its renderer subscriptions instead. */ private definitionFor; private assistantRecord; private messageRecord; private releaseRendererStates; private imageWidthCells; private plainTextFallback; private pushSpacer; } //# sourceMappingURL=conversation-render.d.ts.map