import { LitElement, PropertyValues } from 'lit'; import { Ref } from 'lit/directives/ref.js'; import { AgentInfo } from '../ai-agent-info'; import { ForgeAiChatHeaderAgentChangeEventData } from '../ai-chat-header'; import { AiMessageThreadComponent, ForgeAiMessageThreadThumbsEventData } from '../ai-message-thread'; import { ForgeAiAttachmentRemoveEventData } from '../ai-attachment'; import { ForgeAiFilePickerChangeEventData, ForgeAiFilePickerErrorEventData } from '../ai-file-picker'; import { AiPromptComponent, ForgeAiPromptCommandEventData, ForgeAiPromptSendEventData } from '../ai-prompt'; import { ForgeAiSuggestionsEventData, Suggestion } from '../ai-suggestions'; import { ForgeAiVoiceInputResultEvent } from '../ai-voice-input'; import { AgentAdapter } from './agent-adapter.js'; import { ChatbotCoreController } from '../core/chatbot-core-controller.js'; import { Agent, ChatMessage, ContextItem, HeadingLevel, MessageItem, SlashCommand, ThreadState, ToolCall, ToolDefinition } from './types.js'; export type FeatureToggle = 'on' | 'off'; export declare abstract class AiChatbotBase extends LitElement { protected abstract _messageThreadRef: Ref; protected abstract _promptRef: Ref; adapter?: AgentAdapter; fileUpload: FeatureToggle; voiceInput: FeatureToggle; placeholder: string; suggestions?: Suggestion[]; enableReactions: boolean; titleText: string; headingLevel: HeadingLevel; debugMode: boolean; disclaimerText: string | null | undefined; debugCommand: FeatureToggle; agentInfo?: AgentInfo; agents: Agent[]; selectedAgentId?: string; contextItems: ContextItem[]; protected _coreController: ChatbotCoreController; protected get _isStreaming(): boolean; protected get _isUploading(): boolean; protected get _tools(): Map; protected get _messageItems(): MessageItem[]; protected get _hasMessages(): boolean; protected get _allContextItems(): ContextItem[]; connectedCallback(): void; willUpdate(changedProperties: PropertyValues): void; protected _onConnected(): void; protected get _slashCommands(): SlashCommand[]; protected _handleSlashCommand(evt: CustomEvent): void; protected _handleInfo(): void; protected _handleAgentChange(event: CustomEvent): void; protected _handleDebugToggle(): void; protected _handleAttachmentRemove(evt: CustomEvent): void; protected _handleContextChipRemove(evt: CustomEvent<{ id: string; item: ContextItem; }>): void; protected _handlePromptContextRemove(evt: CustomEvent<{ id: string; item: ContextItem; }>): void; protected _handleSend(evt: CustomEvent): Promise; protected _handleStop(): void; protected _handleCancel(): void; protected _handleCopy(evt: CustomEvent<{ messageId: string; }>): Promise; protected _handleUserCopy(evt: CustomEvent<{ messageId: string; }>): Promise; protected _handleUserResend(evt: CustomEvent<{ messageId: string; }>): void; protected _handleUserEdit(evt: CustomEvent<{ messageId: string; content: string; }>): void; protected _handleResend(evt: CustomEvent<{ messageId: string; }>): void; protected _handleFeedback(evt: CustomEvent, type: 'positive' | 'negative'): void; protected _handleThumbsUp(evt: CustomEvent): void; protected _handleThumbsDown(evt: CustomEvent): void; protected _handleFileSelect(evt: CustomEvent): void; protected _handleFileError(evt: CustomEvent): void; protected _handleSuggestionSelect(evt: CustomEvent): Promise; protected _handleVoiceInputResult(evt: CustomEvent): void; /** * Clears all messages from the chat. * * This is a lower-level operation that removes message history without * the semantic meaning of "starting a new conversation". For user-facing * "new chat" actions, prefer {@link startNewChat} which provides * conversation-level cleanup. * * @returns true if messages were cleared, false if prevented via event.preventDefault() * @fires forge-ai-chatbot-clear - Cancelable event fired before clearing */ clearMessages(): boolean; /** * Starts a new chat conversation. * * This clears all messages and resets the conversation to a fresh state. * Use this when the user explicitly wants to begin a new conversation. * * Contrast with {@link clearMessages}, which fires events and can be prevented. * This method does not fire events - it's meant for programmatic use. * For user-initiated actions, use event handlers that fire events before calling this. * * Subclasses may override this to add conversation-specific cleanup like * resetting thread IDs or closing panels. */ startNewChat(): void; getMessages(): ChatMessage[]; setMessages(messages: ChatMessage[]): void; sendMessage(content: string, files?: File[]): Promise; abort(): void; scrollToBottom({ behavior }?: { behavior?: ScrollBehavior; }): Promise; abstract focus(): void; getThreadState(): ThreadState; getSelectedAgent(): Agent | undefined; setThreadState(threadState: ThreadState): Promise; protected _dispatchHostEvent(config: { type: string; detail?: unknown; cancelable?: boolean; }): CustomEvent; protected _formatToolCallForExport(toolCall: ToolCall): string; protected _handleExport(): void; }