import { type JSX } from "react"; import type { ChatMessage, ChatMessageContextFile } from "../types/ui-schema.js"; import { type MarkdownRenderOptions } from "./MarkdownMessage.js"; export interface ChatConversationProps extends MarkdownRenderOptions { messages: ChatMessage[]; renderMarkdown?: (content: string) => string; onFeedback?: (messageId: string, rating: "up" | "down") => void; onDismissFeedback?: (messageId: string) => void; onContextFileClick?: (file: ChatMessageContextFile) => void; onFileReferenceClick?: (reference: string) => void; onPermissionChoice?: (id: string, choice: "once" | "session" | "save" | "deny", notes?: string) => void; /** When present, each assistant message renders a speaker pill that * invokes this callback with the message id, speakable text, and a * control action ("start" | "pause" | "resume" | "stop"). Host handles * TTS (fetch audio, play, pause, resume, stop). Currently active * message id is passed via `speakingMessageId`; pause vs play state via * `speakPaused`. Leave undefined to hide voice affordances entirely. */ onSpeak?: (messageId: string, text: string, action?: "start" | "pause" | "resume" | "stop") => void; speakingMessageId?: string | null; /** True when speakingMessageId's audio is paused (vs playing). */ speakPaused?: boolean; /** Id of the assistant message currently being streamed. While set, * the speaker pill on that message is hidden — listening to a * half-baked response is jarring. */ streamingMessageId?: string | null; } export declare const ChatConversation: ({ messages, renderMarkdown, onFeedback, onDismissFeedback, onContextFileClick, resolveFileHref, onFileReferenceClick, onPermissionChoice, onSpeak, speakingMessageId, speakPaused, streamingMessageId }: ChatConversationProps) => JSX.Element; //# sourceMappingURL=ChatConversation.d.ts.map