import { type ReactNode } from 'react'; export type ThemedChatMessageRole = 'assistant' | 'user'; export interface ThemedChatAttachment { id: string; name: string; status?: 'pending' | 'uploading' | 'done' | 'error'; progress?: number; } export interface ThemedChatMessageDef { id: string; role: ThemedChatMessageRole; content: ReactNode; /** App-owned classification; tool detection remains outside the DS. */ kind?: 'text' | 'tool'; /** Suggestion chips below assistant message. */ chips?: string[]; /** Action buttons below assistant message. */ actions?: string[]; } export interface ThemedChatThreadRenderContext { /** Invokes the panel's configured tool-message slot with DS-owned wrapping. */ renderToolMessage: (message: ThemedChatMessageDef) => ReactNode; /** Invokes the panel's configured or default typing indicator when typing is active. */ renderTypingIndicator: () => ReactNode; } export interface ThemedChatTool { id: string; label: ReactNode; disabled?: boolean; disabledLabel?: string; } export interface ThemedChatPanelProps { /** Currently selected assistant name shown in the header pill. */ title?: string; /** Options in the assistant-switcher dropdown. */ dropdownOptions?: string[]; onSelectOption?: (name: string) => void; messages?: ThemedChatMessageDef[]; onClose?: () => void; onExpand?: () => void; onMore?: () => void; /** When true, the built-in header is not rendered (host provides its own). */ hideHeader?: boolean; attachedFile?: string; attachments?: ThemedChatAttachment[]; onAttachFile?: (files: File[]) => void; onRemoveAttachment?: (id?: string) => void; renderAttachment?: (attachment: ThemedChatAttachment) => ReactNode; /** Defaults to whether an attachment callback is supplied for existing consumers. */ showAttach?: boolean; attachAriaLabel?: string; toolsAriaLabel?: string; tools?: ThemedChatTool[]; onToolSelect?: (toolId: string) => void; /** Aggregate host-owned upload progress, paired with attachment status/progress. */ uploadProgress?: number; uploadProgressLabel?: ReactNode; /** @deprecated Use onSendMessage to receive the composed text. */ onSend?: () => void; inputValue?: string; onInputChange?: (value: string) => void; onSendMessage?: (text: string) => void; isStreaming?: boolean; onStop?: () => void; isTyping?: boolean; renderTypingIndicator?: () => ReactNode; renderToolMessage?: (message: ThemedChatMessageDef) => ReactNode; /** App-owned thread renderer for message types that are outside the DS message model. */ renderMessageThread?: (context: ThemedChatThreadRenderContext) => ReactNode; inputPlaceholder?: string; inputHint?: string; creditsLabel?: ((used: number, total: number) => ReactNode) | string; aiDisclaimer?: ReactNode; userLabel?: string; assistantLabel?: string; expandAriaLabel?: string; moreAriaLabel?: string; closeAriaLabel?: string; sendAriaLabel?: string; stopAriaLabel?: string; credits?: { used: number; total: number; }; /** Visibility of the credits block. Defaults to whether `credits` is supplied. */ showCredits?: boolean; charCount?: number; charLimit?: number; /** Visibility of the "count / limit" footer text. */ showCharCount?: boolean; /** Visibility of the small hint line under the input (e.g. "Type / to switch assistants"). */ showInputHint?: boolean; /** Keeps the composer presentational while allowing the host to mirror request state. */ isRunning?: boolean; isInputDisabled?: boolean; isSendDisabled?: boolean; multiline?: boolean; maxRows?: number; } /** * The AI assistant conversation content intended for composition inside a * `ThemedRightPanel`. The panel host owns layout and Escape behavior; this * component owns its chat header controls, including close. */ export declare const ThemedChatPanel: import("react").ForwardRefExoticComponent>; //# sourceMappingURL=ThemedChatPanel.d.ts.map