import { TemplateResult, CSSResult } from 'lit'; import { AiMessageThreadComponent } from '../ai-message-thread'; import { AiPromptComponent } from '../ai-prompt'; import { AiChatbotBase } from './ai-chatbot-base.js'; import { Agent, ChatMessage, ForgeAiChatbotConversationSelectEventData, ForgeAiChatbotConversationSearchEventData, ForgeAiChatbotConversationLoadMoreEventData, ForgeAiChatbotConversationRenameEventData, ForgeAiChatbotConversationDeleteEventData, ForgeAiChatbotContextRemoveEventData, Thread } from './types.js'; import { Ref } from 'lit/directives/ref.js'; declare global { interface HTMLElementTagNameMap { 'forge-ai-chatbot': AiChatbotComponent; } interface HTMLElementEventMap { 'forge-ai-chatbot-connected': CustomEvent; 'forge-ai-chatbot-disconnected': CustomEvent; 'forge-ai-chatbot-run-started': CustomEvent; 'forge-ai-chatbot-message-sent': CustomEvent; 'forge-ai-chatbot-message-received': CustomEvent; 'forge-ai-chatbot-tool-call': CustomEvent; 'forge-ai-chatbot-error': CustomEvent; 'forge-ai-chatbot-expand': CustomEvent; 'forge-ai-chatbot-minimize': CustomEvent; 'forge-ai-chatbot-clear': CustomEvent; 'forge-ai-chatbot-info': CustomEvent; 'forge-ai-chatbot-file-select': CustomEvent; 'forge-ai-chatbot-file-remove': CustomEvent; 'forge-ai-chatbot-response-feedback': CustomEvent; 'forge-ai-chatbot-agent-change': CustomEvent; 'forge-ai-chatbot-thread-state-change': CustomEvent; 'forge-ai-chatbot-conversations-open': CustomEvent; 'forge-ai-chatbot-conversations-close': CustomEvent; 'forge-ai-chatbot-conversation-select': CustomEvent; 'forge-ai-chatbot-new-chat': CustomEvent; 'forge-ai-chatbot-conversation-search': CustomEvent; 'forge-ai-chatbot-conversation-load-more': CustomEvent; 'forge-ai-chatbot-conversation-rename': CustomEvent; 'forge-ai-chatbot-conversation-delete': CustomEvent; 'forge-ai-chatbot-context-remove': CustomEvent; } } export interface ForgeAiChatbotMessageEventData { message: ChatMessage; } export interface ForgeAiChatbotToolCallEventData { toolCallId: string; toolName: string; arguments: Record; } export interface ForgeAiChatbotErrorEventData { error: string; } export interface ForgeAiChatbotFileSelectEventData { fileId: string; file: File; filename: string; size: number; mimeType: string; timestamp: number; onProgress: (progress: number) => void; onComplete: (result: { url?: string; error?: string; }) => void; onAbort: () => void; } export interface ForgeAiChatbotFileRemoveEventData { fileId: string; } export interface ForgeAiChatbotResponseFeedbackEventData { messageId: string; type: 'positive' | 'negative'; feedback?: string; } export interface ForgeAiChatbotAgentChangeEventData { agent: Agent | undefined; previousAgentId: string | undefined; } export declare const AiChatbotComponentTagName: keyof HTMLElementTagNameMap; /** * @tag forge-ai-chatbot * * @summary A complete, self-contained AI chatbot component. * * @description * The AI Chatbot component provides a full-featured chat interface with support for streaming responses, * client-side tool execution, file attachments, markdown rendering, and programmatic control. * It uses an adapter pattern to abstract communication, allowing for any protocol implementation. * * @slot header - Slot for custom header content * @slot icon - Slot for custom header icon (default: forge-ai-icon) * @slot header-actions - Slot for custom header action buttons (rendered before built-in header actions) * @slot empty-state-icon - Slot for custom empty state icon * @slot empty-state - Slot for custom empty state content (overrides default suggestions) * * @property {string} titleText - The title text to display in the header (default: 'AI Assistant') * @property {HeadingLevel} headingLevel - Controls the heading level for the title content (default: 2) * @property {string | null | undefined} disclaimerText - The disclaimer text to display below the prompt. Set to empty string, null, or undefined to hide. * @property {boolean} showConversationsButton - Controls conversations button visibility (default: false) * @property {AgentInfo} agentInfo - Agent metadata for info dialog * @property {Agent[]} agents - List of available agents for selector * @property {Suggestion[]} suggestions - Suggestions to display in the empty state * * @cssproperty --forge-ai-chatbot-icon-color - The fill color for the AI icon. Defaults to `tertiary`. * @cssproperty --forge-ai-chatbot-suggestion-background - The background color for suggestion buttons. Defaults to `tertiary-container`. * @cssproperty --forge-ai-chatbot-suggestion-foreground - The text color for suggestion buttons. Defaults to `on-tertiary-container`. * * @event {CustomEvent} forge-ai-chatbot-connected - Fired when adapter connects * @event {CustomEvent} forge-ai-chatbot-disconnected - Fired when adapter disconnects * @event {CustomEvent} forge-ai-chatbot-run-started - Fired synchronously when a run starts, before the request is sent. Use this to set adapter context just-in-time. * @event {CustomEvent} forge-ai-chatbot-message-sent - Fired when user sends a message * @event {CustomEvent} forge-ai-chatbot-message-received - Fired when assistant message is complete * @event {CustomEvent} forge-ai-chatbot-tool-call - Fired when a tool needs to be executed * @event {CustomEvent} forge-ai-chatbot-error - Fired when an error occurs * @event {CustomEvent} forge-ai-chatbot-expand - Fired when header expand button is clicked * @event {CustomEvent} forge-ai-chatbot-minimize - Fired when header minimize button is clicked * @event {CustomEvent} forge-ai-chatbot-clear - Fired when header clear option is selected (cancelable, prevents clearMessages() if default prevented) * @event {CustomEvent} forge-ai-chatbot-info - Fired when header info option is selected * @event {CustomEvent} forge-ai-chatbot-response-feedback - Fired when user provides feedback on a response (thumbs up/down) * @event {CustomEvent} forge-ai-chatbot-agent-change - Fired when user changes agent from the header * @event {CustomEvent} forge-ai-chatbot-thread-state-change - Fired when there is a change to the thread state (messages, files, selected agent, etc). Use this to capture the latest thread state for persistence. * @event {CustomEvent} forge-ai-chatbot-conversations-open - Fired when conversations panel opens * @event {CustomEvent} forge-ai-chatbot-conversations-close - Fired when conversations panel closes * @event {CustomEvent} forge-ai-chatbot-conversation-select - Fired when user selects a conversation thread * @event {CustomEvent} forge-ai-chatbot-new-chat - Fired when user clicks new chat button (cancelable) * @event {CustomEvent} forge-ai-chatbot-conversation-search - Fired when search query changes in conversations panel (debounced, cancelable) * @event {CustomEvent} forge-ai-chatbot-conversation-load-more - Fired when scrolling near bottom in recent chats or search chats. Query field differentiates contexts. * @event {CustomEvent} forge-ai-chatbot-conversation-rename - Fired when user renames a conversation thread. Cancelable - if prevented, call onSuccess() to commit or onError() to revert. * @event {CustomEvent} forge-ai-chatbot-conversation-delete - Fired when user deletes a conversation thread. Cancelable - if prevented, call onSuccess() to commit deletion or onError() to revert. Otherwise optimistically removed. */ export declare class AiChatbotComponent extends AiChatbotBase { #private; static styles: CSSResult; showExpandButton: boolean; showMinimizeButton: boolean; expanded: boolean; minimizeIcon: 'default' | 'panel'; showConversationsButton: boolean; recentThreads: Thread[]; conversationsOpen: boolean; showConversationRename: boolean; showConversationDelete: boolean; private _selectedThreadId; protected _messageThreadRef: Ref; protected _promptRef: Ref; protected _handleInfo(): void; sendMessage(content: string, files?: File[]): Promise; focus(): void; showConversations(): void; hideConversations(): void; /** * Starts a new chat conversation by clearing messages and resetting conversation state. * * This method: * - Clears all messages via the controller * - Resets the selected thread ID * * Does not fire events - meant for programmatic use. * For user-initiated actions, the event handler fires the event before calling this. */ startNewChat(): void; toggleConversations(): void; render(): TemplateResult; } export type { FeatureToggle } from './ai-chatbot-base.js'; export type { Thread, ForgeAiChatbotConversationSelectEventData, ForgeAiChatbotConversationSearchEventData, ForgeAiChatbotConversationLoadMoreEventData, ForgeAiChatbotConversationRenameEventData, ForgeAiChatbotConversationDeleteEventData } from './types.js';