/** * [WHO]: Provides ChatRendererController + ChatRendererContext — transcript rendering: * message→component mapping (addMessageToChat), session-context replay * (renderSessionContext), initial transcript + welcome banner (renderInitialMessages), * chat rebuild with optimistic-user dedupe (rebuildChatFromMessages), getUserMessageText * [FROM]: Depends on injected host capability closures + @catui/tui + message components + startup-wordmark; * no InteractiveMode reference. Internal cross-calls go through ctx callbacks so * host-side method patching (partial-mode tests) keeps intercepting them. * [TO]: Consumed by modes/interactive/interactive-mode.ts (held lazily as `this.chatRenderer` * behind thin delegators: addMessageToChat / renderInitialMessages / rebuildChatFromMessages / * getUserMessageText) * [HERE]: modes/interactive/controllers/chat-renderer.ts — P7 C-3c (extracted from * InteractiveMode message-rendering block; behavior-preserving move) */ import type { AgentMessage } from "@catui/agent-core"; import type { Message } from "@catui/ai/types"; import { type CachedContainer, type EditorComponent, type MarkdownTheme, type TUI } from "@catui/tui"; import { type AgentSession } from "../../../core/runtime/agent-session.js"; import type { SessionManager } from "../../../core/session/session-manager.js"; import type { SettingsManager } from "../../../core/platform/config/settings-manager.js"; import type { AppAction } from "../../../core/platform/keybindings.js"; import type { ToolDefinition } from "../../../core/extensions-host/types.js"; import type { InteractiveState } from "../state/interactive-state.js"; /** Host capabilities needed by transcript rendering. All members resolve dynamically. */ export interface ChatRendererContext { readonly session: AgentSession; readonly sessionManager: SessionManager; readonly settingsManager: SettingsManager; readonly state: InteractiveState; readonly ui: TUI; readonly chatContainer: CachedContainer; readonly footer: { invalidate(): void; }; readonly editor: EditorComponent; readonly version: string; getMarkdownThemeWithSettings(): MarkdownTheme; getRegisteredToolDefinition(toolName: string): ToolDefinition | undefined; updateEditorBorderColor(): void; stopWelcomeBannerTimer(): void; showStatus(message: string): void; clearStatusTimers(): void; getAppKeyDisplay(action: AppAction): string; addMessageToChat(message: AgentMessage, options?: { populateHistory?: boolean; }): void; getUserMessageText(message: Message): string; } export declare class ChatRendererController { private readonly ctx; constructor(ctx: ChatRendererContext); /** Extract text content from a user message */ getUserMessageText(message: Message): string; addMessageToChat(message: AgentMessage, options?: { populateHistory?: boolean; }): void; /** * Render session context to chat. Used for initial load and rebuild after compaction. * @param sessionContext Session context to render * @param options.updateFooter Update footer state * @param options.populateHistory Add user messages to editor history */ private renderSessionContext; renderInitialMessages(options?: { requestRender?: boolean; }): void; rebuildChatFromMessages(): void; }