{"version":3,"sources":["../src/components/chat/Chat.tsx"],"sourcesContent":["/**\n * <br/>\n * <img src=\"https://cdn.vn.ai/docs/vn-sdk/images/AiChat.gif\" width=\"500\" />\n *\n * A chatbot panel component for the VN SDK framework. The component allows for a high degree\n * of customization through various props and custom CSS.\n *\n * ## Install Dependencies\n *\n * This component is part of the [@vn-sdk/react-ui](https://npmjs.com/package/@vn-sdk/react-ui) package.\n *\n * ```shell npm2yarn \\\"@vn-sdk/react-ui\"\\\n * npm install @vn-sdk/react-core @vn-sdk/react-ui\n * ```\n *\n * ## Usage\n *\n * ```tsx\n * import { AiChat } from \"@vn-sdk/react-ui\";\n * import \"@vn-sdk/react-ui/styles.css\";\n *\n * <AiChat\n *   labels={{\n *     title: \"Your Assistant\",\n *     initial: \"Hi! 👋 How can I assist you today?\",\n *   }}\n * />\n * ```\n *\n * ### With Observability Hooks\n *\n * To monitor user interactions, provide the `observabilityHooks` prop.\n * **Note:** This requires a `publicApiKey` in the `<AiProvider>` provider.\n *\n * ```tsx\n * <AiProvider publicApiKey=\"YOUR_PUBLIC_API_KEY\">\n *   <AiChat\n *     observabilityHooks={{\n *       onMessageSent: (message) => {\n *         console.log(\"Message sent:\", message);\n *       },\n *     }}\n *   />\n * </AiProvider>\n * ```\n *\n * ### Look & Feel\n *\n * By default, VN SDK components do not have any styles. You can import VN SDK's stylesheet at the root of your project:\n * ```tsx title=\"YourRootComponent.tsx\"\n * ...\n * import \"@vn-sdk/react-ui/styles.css\"; // [!code highlight]\n *\n * export function YourRootComponent() {\n *   return (\n *     <AiProvider>\n *       ...\n *     </AiProvider>\n *   );\n * }\n * ```\n * For more information about how to customize the styles, check out the [Customize Look & Feel](/guides/custom-look-and-feel/customize-built-in-ui-components) guide.\n */\n\nimport {\n  ChatContext,\n  ChatContextProvider,\n  AiChatIcons,\n  AiChatLabels,\n} from \"./ChatContext\";\nimport { Messages as DefaultMessages } from \"./Messages\";\nimport { Input as DefaultInput } from \"./Input\";\nimport { RenderMessage as DefaultRenderMessage } from \"./messages/RenderMessage\";\nimport { AssistantMessage as DefaultAssistantMessage } from \"./messages/AssistantMessage\";\nimport { UserMessage as DefaultUserMessage } from \"./messages/UserMessage\";\nimport { ImageRenderer as DefaultImageRenderer } from \"./messages/ImageRenderer\";\nimport React, { useEffect, useRef, useState, useCallback, useMemo } from \"react\";\nimport {\n  SystemMessageFunction,\n  useAiChatInternal as useAiChat,\n  useAiContext,\n  useAiMessagesContext,\n} from \"@vn-sdk/react-core\";\nimport type { SuggestionItem } from \"@vn-sdk/react-core\";\nimport {\n  AiSDKError,\n  AiSDKErrorCode,\n  AiErrorEvent,\n  Message,\n  Severity,\n  ErrorVisibility,\n  styledConsole,\n  AiErrorHandler,\n} from \"@vn-sdk/shared\";\nimport { randomId } from \"@vn-sdk/shared\";\nimport {\n  AssistantMessageProps,\n  ChatError,\n  ComponentsMap,\n  AiObservabilityHooks,\n  ErrorMessageProps,\n  ImageRendererProps,\n  InputProps,\n  MessagesProps,\n  RenderMessageProps,\n  RenderSuggestionsListProps,\n  UserMessageProps,\n} from \"./props\";\n\nimport { HintFunction, runAgent, stopAgent } from \"@vn-sdk/react-core\";\nimport { ImageUploadQueue } from \"./ImageUploadQueue\";\nimport { Suggestions as DefaultRenderSuggestionsList } from \"./Suggestions\";\n\n/**\n * The type of suggestions to use in the chat.\n *\n * `auto` - Suggestions are generated automatically.\n * `manual` - Suggestions are controlled programmatically.\n * `SuggestionItem[]` - Static suggestions array.\n */\nexport type ChatSuggestions = \"auto\" | \"manual\" | SuggestionItem[];\n\n/**\n * Props for AiChat component.\n */\nexport interface AiChatProps {\n  /**\n   * Custom instructions to be added to the system message. Use this property to\n   * provide additional context or guidance to the language model, influencing\n   * its responses. These instructions can include specific directions,\n   * preferences, or criteria that the model should consider when generating\n   * its output, thereby tailoring the conversation more precisely to the\n   * user's needs or the application's requirements.\n   */\n  instructions?: string;\n\n  /**\n   * Controls the behavior of suggestions in the chat interface.\n   *\n   * `auto` (default) - Suggestions are generated automatically:\n   *   - When the chat is first opened (empty state)\n   *   - After each message exchange completes\n   *   - Uses configuration from `useAiChatSuggestions` hooks\n   *\n   * `manual` - Suggestions are controlled programmatically:\n   *   - Use `setSuggestions()` to set custom suggestions\n   *   - Use `generateSuggestions()` to trigger AI generation\n   *   - Access via `useAiChat` hook\n   *\n   * `SuggestionItem[]` - Static suggestions array:\n   *   - Always shows the same suggestions\n   *   - No AI generation involved\n   */\n  suggestions?: ChatSuggestions;\n\n  /**\n   * A callback that gets called when the in progress state changes.\n   */\n  onInProgress?: (inProgress: boolean) => void;\n\n  /**\n   * A callback that gets called when a new message it submitted.\n   */\n  onSubmitMessage?: (message: string) => void | Promise<void>;\n\n  /**\n   * A custom stop generation function.\n   */\n  onStopGeneration?: OnStopGeneration;\n\n  /**\n   * A custom reload messages function.\n   */\n  onReloadMessages?: OnReloadMessages;\n\n  /**\n   * A callback function to regenerate the assistant's response\n   */\n  onRegenerate?: (messageId: string) => void;\n\n  /**\n   * A callback function when the message is copied\n   */\n  onCopy?: (message: string) => void;\n\n  /**\n   * A callback function for thumbs up feedback\n   */\n  onThumbsUp?: (message: Message) => void;\n\n  /**\n   * A callback function for thumbs down feedback\n   */\n  onThumbsDown?: (message: Message) => void;\n\n  /**\n   * A list of markdown components to render in assistant message.\n   * Useful when you want to render custom elements in the message (e.g a reference tag element)\n   */\n  markdownTagRenderers?: ComponentsMap;\n\n  /**\n   * Icons can be used to set custom icons for the chat window.\n   */\n  icons?: AiChatIcons;\n\n  /**\n   * Labels can be used to set custom labels for the chat window.\n   */\n  labels?: AiChatLabels;\n\n  /**\n   * Enable image upload button (image inputs only supported on some models)\n   */\n  imageUploadsEnabled?: boolean;\n\n  /**\n   * The 'accept' attribute for the file input used for image uploads.\n   * Defaults to \"image/*\".\n   */\n  inputFileAccept?: string;\n\n  /**\n   * A function that takes in context string and instructions and returns\n   * the system message to include in the chat request.\n   * Use this to completely override the system message, when providing\n   * instructions is not enough.\n   */\n  makeSystemMessage?: SystemMessageFunction;\n\n  /**\n   * Disables inclusion of VN SDK's default system message. When true, no system message is sent (this also suppresses any custom message from <code>makeSystemMessage</code>).\n   */\n  disableSystemMessage?: boolean;\n\n  /**\n   * A custom assistant message component to use instead of the default.\n   */\n  AssistantMessage?: React.ComponentType<AssistantMessageProps>;\n\n  /**\n   * A custom user message component to use instead of the default.\n   */\n  UserMessage?: React.ComponentType<UserMessageProps>;\n\n  /**\n   * A custom error message component to use instead of the default.\n   */\n  ErrorMessage?: React.ComponentType<ErrorMessageProps>;\n\n  /**\n   * A custom Messages component to use instead of the default.\n   */\n  Messages?: React.ComponentType<MessagesProps>;\n\n  /**\n   * @deprecated - use RenderMessage instead\n   */\n  RenderTextMessage?: React.ComponentType<RenderMessageProps>;\n\n  /**\n   * @deprecated - use RenderMessage instead\n   */\n  RenderActionExecutionMessage?: React.ComponentType<RenderMessageProps>;\n\n  /**\n   * @deprecated - use RenderMessage instead\n   */\n  RenderAgentStateMessage?: React.ComponentType<RenderMessageProps>;\n\n  /**\n   * @deprecated - use RenderMessage instead\n   */\n  RenderResultMessage?: React.ComponentType<RenderMessageProps>;\n\n  /**\n   * @deprecated - use RenderMessage instead\n   */\n  RenderImageMessage?: React.ComponentType<RenderMessageProps>;\n\n  /**\n   * A custom RenderMessage component to use instead of the default.\n   *\n   * **Warning**: This is a break-glass solution to allow for custom\n   * rendering of messages. You are most likely looking to swap out\n   * the AssistantMessage and UserMessage components instead which\n   * are also props.\n   */\n  RenderMessage?: React.ComponentType<RenderMessageProps>;\n\n  /**\n   * A custom suggestions list component to use instead of the default.\n   */\n  RenderSuggestionsList?: React.ComponentType<RenderSuggestionsListProps>;\n\n  /**\n   * A custom Input component to use instead of the default.\n   */\n  Input?: React.ComponentType<InputProps>;\n\n  /**\n   * A custom image rendering component to use instead of the default.\n   */\n  ImageRenderer?: React.ComponentType<ImageRendererProps>;\n\n  /**\n   * A class name to apply to the root element.\n   */\n  className?: string;\n\n  /**\n   * Children to render.\n   */\n  children?: React.ReactNode;\n\n  hideStopButton?: boolean;\n\n  /**\n   * Event hooks for VN SDK chat events.\n   * These hooks only work when publicApiKey is provided.\n   */\n  observabilityHooks?: AiObservabilityHooks;\n\n  /**\n   * Custom error renderer for chat-specific errors.\n   * When provided, errors will be displayed inline within the chat interface.\n   */\n  renderError?: (error: {\n    message: string;\n    operation?: string;\n    timestamp: number;\n    onDismiss: () => void;\n    onRetry?: () => void;\n  }) => React.ReactNode;\n\n  /**\n   * Optional handler for comprehensive debugging and observability.\n   */\n  onError?: AiErrorHandler;\n}\n\ninterface OnStopGenerationArguments {\n  /**\n   * The name of the currently executing agent.\n   */\n  currentAgentName: string | undefined;\n\n  /**\n   * The messages in the chat.\n   */\n  messages: Message[];\n\n  /**\n   * Set the messages in the chat.\n   */\n  setMessages: (messages: Message[]) => void;\n\n  /**\n   * Stop chat generation.\n   */\n  stopGeneration: () => void;\n\n  /**\n   * Restart the currently executing agent.\n   */\n  restartCurrentAgent: () => void;\n\n  /**\n   * Stop the currently executing agent.\n   */\n  stopCurrentAgent: () => void;\n\n  /**\n   * Run the currently executing agent.\n   */\n  runCurrentAgent: (hint?: HintFunction) => Promise<void>;\n\n  /**\n   * Set the state of the currently executing agent.\n   */\n  setCurrentAgentState: (state: any) => void;\n}\n\nexport type OnReloadMessagesArguments = OnStopGenerationArguments & {\n  /**\n   * The message on which \"regenerate\" was pressed\n   */\n  messageId: string;\n};\n\nexport type OnStopGeneration = (args: OnStopGenerationArguments) => void;\n\nexport type OnReloadMessages = (args: OnReloadMessagesArguments) => void;\n\nexport type ImageUpload = {\n  contentType: string;\n  bytes: string;\n};\n\nexport function AiChat({\n  instructions,\n  suggestions = \"auto\",\n  onSubmitMessage,\n  makeSystemMessage,\n  disableSystemMessage,\n  onInProgress,\n  onStopGeneration,\n  onReloadMessages,\n  onRegenerate,\n  onCopy,\n  onThumbsUp,\n  onThumbsDown,\n  markdownTagRenderers,\n  Messages = DefaultMessages,\n  RenderMessage = DefaultRenderMessage,\n  RenderSuggestionsList = DefaultRenderSuggestionsList,\n  Input = DefaultInput,\n  className,\n  icons,\n  labels,\n  AssistantMessage = DefaultAssistantMessage,\n  UserMessage = DefaultUserMessage,\n  ImageRenderer = DefaultImageRenderer,\n  ErrorMessage,\n  imageUploadsEnabled,\n  inputFileAccept = \"image/*\",\n  hideStopButton,\n  observabilityHooks,\n  renderError,\n  onError,\n  // Legacy props - deprecated\n  RenderTextMessage,\n  RenderActionExecutionMessage,\n  RenderAgentStateMessage,\n  RenderResultMessage,\n  RenderImageMessage,\n}: AiChatProps) {\n  const {\n    additionalInstructions,\n    setChatInstructions,\n    aiApiConfig,\n    setBannerError,\n    setInternalErrorHandler,\n    removeInternalErrorHandler,\n  } = useAiContext();\n\n  // Destructure stable values to avoid object reference changes\n  const { publicApiKey, chatApiEndpoint } = aiApiConfig;\n  const [selectedImages, setSelectedImages] = useState<Array<ImageUpload>>([]);\n  const [chatError, setChatError] = useState<ChatError | null>(null);\n  const fileInputRef = useRef<HTMLInputElement>(null);\n\n  // Helper function to trigger event hooks only if publicApiKey is provided\n  const triggerObservabilityHook = useCallback(\n    (hookName: keyof AiObservabilityHooks, ...args: any[]) => {\n      if (publicApiKey && observabilityHooks?.[hookName]) {\n        (observabilityHooks[hookName] as any)(...args);\n      }\n      if (observabilityHooks?.[hookName] && !publicApiKey) {\n        setBannerError(\n          new AiSDKError({\n            message: \"observabilityHooks requires a publicApiKey to function.\",\n            code: AiSDKErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n            severity: Severity.CRITICAL,\n            visibility: ErrorVisibility.BANNER,\n          }),\n        );\n        styledConsole.publicApiKeyRequired(\"observabilityHooks\");\n      }\n    },\n    [publicApiKey, observabilityHooks, setBannerError],\n  );\n\n  // Helper function to trigger chat error and render error UI\n  const triggerChatError = useCallback(\n    (error: any, operation: string, originalError?: any) => {\n      const errorMessage = error?.message || error?.toString() || \"An error occurred\";\n\n      // Set chat error state for rendering\n      setChatError({\n        message: errorMessage,\n        operation,\n        timestamp: Date.now(),\n      });\n\n      const errorEvent: AiErrorEvent = {\n        type: \"error\",\n        timestamp: Date.now(),\n        context: {\n          source: \"ui\",\n          request: {\n            operation,\n            url: chatApiEndpoint,\n            startTime: Date.now(),\n          },\n          technical: {\n            environment: \"browser\",\n            userAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : undefined,\n            stackTrace: originalError instanceof Error ? originalError.stack : undefined,\n          },\n        },\n        error,\n      };\n\n      if (onError) {\n        onError(errorEvent);\n      }\n\n      // Also trigger observability hook if available\n      if (publicApiKey && observabilityHooks?.onError) {\n        observabilityHooks.onError(errorEvent);\n      }\n\n      // Show banner error if onError hook is used without publicApiKey\n      if (observabilityHooks?.onError && !publicApiKey) {\n        setBannerError(\n          new AiSDKError({\n            message: \"observabilityHooks.onError requires a publicApiKey to function.\",\n            code: AiSDKErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n            severity: Severity.CRITICAL,\n            visibility: ErrorVisibility.BANNER,\n          }),\n        );\n        styledConsole.publicApiKeyRequired(\"observabilityHooks.onError\");\n      }\n    },\n    [publicApiKey, chatApiEndpoint, observabilityHooks, setBannerError],\n  );\n\n  useEffect(() => {\n    const id = \"chat-component\";\n    setInternalErrorHandler({\n      [id]: (error: AiErrorEvent) => {\n        if (!error) return;\n        triggerChatError(error.error, \"sendMessage\");\n      },\n    });\n    return () => {\n      // unregister when this instance unmounts\n      removeInternalErrorHandler?.(id);\n    };\n  }, [triggerChatError, setInternalErrorHandler, removeInternalErrorHandler]);\n\n  // Clipboard paste handler\n  useEffect(() => {\n    if (!imageUploadsEnabled) return;\n\n    const handlePaste = async (e: ClipboardEvent) => {\n      const target = e.target as HTMLElement;\n      if (!target.parentElement?.classList.contains(\"aiInput\")) return;\n\n      const items = Array.from(e.clipboardData?.items || []);\n      const imageItems = items.filter((item) => item.type.startsWith(\"image/\"));\n\n      if (imageItems.length === 0) return;\n\n      e.preventDefault(); // Prevent default paste behavior for images\n\n      const imagePromises: Promise<ImageUpload | null>[] = imageItems.map((item) => {\n        const file = item.getAsFile();\n        if (!file) return Promise.resolve(null);\n\n        return new Promise<ImageUpload | null>((resolve, reject) => {\n          const reader = new FileReader();\n          reader.onload = (e) => {\n            const base64String = (e.target?.result as string)?.split(\",\")[1];\n            if (base64String) {\n              resolve({\n                contentType: file.type,\n                bytes: base64String,\n              });\n            } else {\n              resolve(null);\n            }\n          };\n          reader.onerror = reject;\n          reader.readAsDataURL(file);\n        });\n      });\n\n      try {\n        const loadedImages = (await Promise.all(imagePromises)).filter((img) => img !== null);\n        setSelectedImages((prev) => [...prev, ...loadedImages]);\n      } catch (error) {\n        // Trigger chat-level error handler\n        triggerChatError(error, \"processClipboardImages\", error);\n        console.error(\"Error processing pasted images:\", error);\n      }\n    };\n\n    document.addEventListener(\"paste\", handlePaste);\n    return () => document.removeEventListener(\"paste\", handlePaste);\n  }, [imageUploadsEnabled, triggerChatError]);\n\n  useEffect(() => {\n    if (!additionalInstructions?.length) {\n      setChatInstructions(instructions || \"\");\n      return;\n    }\n\n    /*\n      Will result in a prompt like:\n\n      You are a helpful assistant. \n      Additionally, follow these instructions:\n      - Do not answer questions about the weather.\n      - Do not answer questions about the stock market.\"\n    */\n    const combinedAdditionalInstructions = [\n      instructions,\n      \"Additionally, follow these instructions:\",\n      ...additionalInstructions.map((instruction) => `- ${instruction}`),\n    ];\n\n    setChatInstructions(combinedAdditionalInstructions.join(\"\\n\") || \"\");\n  }, [instructions, additionalInstructions]);\n\n  const {\n    messages,\n    isLoading,\n    sendMessage,\n    stopGeneration,\n    reloadMessages,\n    suggestions: currentSuggestions,\n  } = useAiChatLogic(\n    suggestions,\n    makeSystemMessage,\n    disableSystemMessage,\n    onInProgress,\n    onSubmitMessage,\n    onStopGeneration,\n    onReloadMessages,\n  );\n\n  // Track loading state changes for chat start/stop events\n  const prevIsLoading = useRef(isLoading);\n  useEffect(() => {\n    if (prevIsLoading.current !== isLoading) {\n      if (isLoading) {\n        triggerObservabilityHook(\"onChatStarted\");\n      } else {\n        triggerObservabilityHook(\"onChatStopped\");\n      }\n      prevIsLoading.current = isLoading;\n    }\n  }, [isLoading, triggerObservabilityHook]);\n\n  // Wrapper for sendMessage to clear selected images\n  const handleSendMessage = (text: string) => {\n    const images = selectedImages;\n    setSelectedImages([]);\n    if (fileInputRef.current) {\n      fileInputRef.current.value = \"\";\n    }\n\n    // Trigger message sent event\n    triggerObservabilityHook(\"onMessageSent\", text);\n\n    return sendMessage(text, images);\n  };\n\n  const chatContext = React.useContext(ChatContext);\n  const isVisible = chatContext ? chatContext.open : true;\n\n  const handleRegenerate = (messageId: string) => {\n    if (onRegenerate) {\n      onRegenerate(messageId);\n    }\n\n    // Trigger message regenerated event\n    triggerObservabilityHook(\"onMessageRegenerated\", messageId);\n\n    reloadMessages(messageId);\n  };\n\n  const handleCopy = (message: string) => {\n    if (onCopy) {\n      onCopy(message);\n    }\n\n    // Trigger message copied event\n    triggerObservabilityHook(\"onMessageCopied\", message);\n  };\n\n  const handleImageUpload = async (event: React.ChangeEvent<HTMLInputElement>) => {\n    if (!event.target.files || event.target.files.length === 0) {\n      return;\n    }\n\n    const files = Array.from(event.target.files).filter((file) => file.type.startsWith(\"image/\"));\n    if (files.length === 0) return;\n\n    const fileReadPromises = files.map((file) => {\n      return new Promise<{ contentType: string; bytes: string }>((resolve, reject) => {\n        const reader = new FileReader();\n        reader.onload = (e) => {\n          const base64String = (e.target?.result as string)?.split(\",\")[1] || \"\";\n          if (base64String) {\n            resolve({\n              contentType: file.type,\n              bytes: base64String,\n            });\n          }\n        };\n        reader.onerror = reject;\n        reader.readAsDataURL(file);\n      });\n    });\n\n    try {\n      const loadedImages = await Promise.all(fileReadPromises);\n      setSelectedImages((prev) => [...prev, ...loadedImages]);\n    } catch (error) {\n      // Trigger chat-level error handler\n      triggerChatError(error, \"processUploadedImages\", error);\n      console.error(\"Error reading files:\", error);\n    }\n  };\n\n  const removeSelectedImage = (index: number) => {\n    setSelectedImages((prev) => prev.filter((_, i) => i !== index));\n  };\n\n  const handleThumbsUp = (message: Message) => {\n    if (onThumbsUp) {\n      onThumbsUp(message);\n    }\n\n    // Trigger feedback given event\n    triggerObservabilityHook(\"onFeedbackGiven\", message.id, \"thumbsUp\");\n  };\n\n  const handleThumbsDown = (message: Message) => {\n    if (onThumbsDown) {\n      onThumbsDown(message);\n    }\n\n    // Trigger feedback given event\n    triggerObservabilityHook(\"onFeedbackGiven\", message.id, \"thumbsDown\");\n  };\n\n  return (\n    <WrappedAiChat icons={icons} labels={labels} className={className}>\n      {/* Render error above messages if present */}\n      {chatError &&\n        renderError &&\n        renderError({\n          ...chatError,\n          onDismiss: () => setChatError(null),\n          onRetry: () => {\n            // Clear error and potentially retry based on operation\n            setChatError(null);\n            // TODO: Implement specific retry logic based on operation type\n          },\n        })}\n\n      <Messages\n        AssistantMessage={AssistantMessage}\n        UserMessage={UserMessage}\n        RenderMessage={RenderMessage}\n        messages={messages}\n        inProgress={isLoading}\n        onRegenerate={handleRegenerate}\n        onCopy={handleCopy}\n        onThumbsUp={handleThumbsUp}\n        onThumbsDown={handleThumbsDown}\n        markdownTagRenderers={markdownTagRenderers}\n        ImageRenderer={ImageRenderer}\n        ErrorMessage={ErrorMessage}\n        chatError={chatError}\n        // Legacy props - passed through to Messages component\n        RenderTextMessage={RenderTextMessage}\n        RenderActionExecutionMessage={RenderActionExecutionMessage}\n        RenderAgentStateMessage={RenderAgentStateMessage}\n        RenderResultMessage={RenderResultMessage}\n        RenderImageMessage={RenderImageMessage}\n      >\n        {currentSuggestions.length > 0 && (\n          <RenderSuggestionsList\n            onSuggestionClick={handleSendMessage}\n            suggestions={currentSuggestions}\n          />\n        )}\n      </Messages>\n\n      {imageUploadsEnabled && (\n        <>\n          <ImageUploadQueue images={selectedImages} onRemoveImage={removeSelectedImage} />\n          <input\n            type=\"file\"\n            multiple\n            ref={fileInputRef}\n            onChange={handleImageUpload}\n            accept={inputFileAccept}\n            style={{ display: \"none\" }}\n          />\n        </>\n      )}\n      <Input\n        inProgress={isLoading}\n        onSend={handleSendMessage}\n        isVisible={isVisible}\n        onStop={stopGeneration}\n        onUpload={imageUploadsEnabled ? () => fileInputRef.current?.click() : undefined}\n        hideStopButton={hideStopButton}\n      />\n    </WrappedAiChat>\n  );\n}\n\nexport function WrappedAiChat({\n  children,\n  icons,\n  labels,\n  className,\n}: {\n  children: React.ReactNode;\n  icons?: AiChatIcons;\n  labels?: AiChatLabels;\n  className?: string;\n}) {\n  const chatContext = React.useContext(ChatContext);\n  if (!chatContext) {\n    return (\n      <ChatContextProvider icons={icons} labels={labels} open={true} setOpen={() => {}}>\n        <div className={`aiChat ${className ?? \"\"}`}>{children}</div>\n      </ChatContextProvider>\n    );\n  }\n  return <>{children}</>;\n}\n\nexport const useAiChatLogic = (\n  chatSuggestions: ChatSuggestions,\n  makeSystemMessage?: SystemMessageFunction,\n  disableSystemMessage?: boolean,\n  onInProgress?: (isLoading: boolean) => void,\n  onSubmitMessage?: (messageContent: string) => Promise<void> | void,\n  onStopGeneration?: OnStopGeneration,\n  onReloadMessages?: OnReloadMessages,\n) => {\n  const {\n    messages,\n    sendMessage,\n    setMessages,\n    reloadMessages: defaultReloadMessages,\n    stopGeneration: defaultStopGeneration,\n    runChatCompletion,\n    isLoading,\n    suggestions,\n    setSuggestions,\n    generateSuggestions,\n    resetSuggestions: resetSuggestionsFromHook,\n    isLoadingSuggestions,\n  } = useAiChat({\n    makeSystemMessage,\n    disableSystemMessage,\n  });\n\n  const generalContext = useAiContext();\n  const messagesContext = useAiMessagesContext();\n\n  // Get actions from context for message conversion\n  const { actions } = generalContext;\n\n  // Suggestion state management\n  const [suggestionsFailed, setSuggestionsFailed] = useState(false);\n  const hasGeneratedInitialSuggestions = useRef<boolean>(false);\n\n  // Handle static suggestions (when suggestions prop is an array)\n  useEffect(() => {\n    if (Array.isArray(chatSuggestions)) {\n      setSuggestions(chatSuggestions);\n      hasGeneratedInitialSuggestions.current = true;\n    }\n  }, [JSON.stringify(chatSuggestions), setSuggestions]);\n\n  // Error handling wrapper\n  const generateSuggestionsWithErrorHandling = useCallback(\n    async (context: string) => {\n      try {\n        await generateSuggestions();\n      } catch (error) {\n        console.error(\"Failed to generate suggestions:\", error);\n        setSuggestionsFailed(true);\n      }\n    },\n    [generateSuggestions],\n  );\n\n  // Automatic suggestion generation logic\n  useEffect(() => {\n    // Only proceed if in auto mode, not currently loading, and not failed\n    if (chatSuggestions !== \"auto\" || isLoadingSuggestions || suggestionsFailed) {\n      return;\n    }\n\n    // Don't run during chat loading (when the assistant is responding)\n    if (isLoading) {\n      return;\n    }\n\n    // Check if we have any configurations\n    if (Object.keys(generalContext.chatSuggestionConfiguration).length === 0) {\n      return;\n    }\n\n    // Generate initial suggestions when chat is empty\n    if (messages.length === 0 && !hasGeneratedInitialSuggestions.current) {\n      hasGeneratedInitialSuggestions.current = true;\n      generateSuggestionsWithErrorHandling(\"initial\");\n      return;\n    }\n\n    // Generate post-message suggestions after assistant responds\n    if (messages.length > 0 && suggestions.length === 0) {\n      generateSuggestionsWithErrorHandling(\"post-message\");\n      return;\n    }\n  }, [\n    chatSuggestions,\n    isLoadingSuggestions,\n    suggestionsFailed,\n    messages.length,\n    isLoading,\n    suggestions.length,\n    Object.keys(generalContext.chatSuggestionConfiguration).join(\",\"), // Use stable string instead of object reference\n    generateSuggestionsWithErrorHandling,\n  ]);\n\n  // Reset suggestion state when switching away from auto mode\n  useEffect(() => {\n    if (chatSuggestions !== \"auto\") {\n      hasGeneratedInitialSuggestions.current = false;\n      setSuggestionsFailed(false);\n    }\n  }, [chatSuggestions]);\n\n  // Memoize context to prevent infinite re-renders\n  const stableContext = useMemo(\n    () => ({\n      ...generalContext,\n      ...messagesContext,\n    }),\n    [\n      // Only include stable dependencies\n      generalContext.actions,\n      messagesContext.messages.length,\n      generalContext.isLoading,\n    ],\n  );\n\n  // Wrapper for resetSuggestions that also resets local state\n  const resetSuggestions = useCallback(() => {\n    resetSuggestionsFromHook();\n    setSuggestionsFailed(false);\n    hasGeneratedInitialSuggestions.current = false;\n  }, [resetSuggestionsFromHook]);\n\n  useEffect(() => {\n    onInProgress?.(isLoading);\n  }, [onInProgress, isLoading]);\n\n  const safelySendMessage = async (\n    messageContent: string,\n    imagesToUse?: Array<{ contentType: string; bytes: string }>,\n  ) => {\n    const images = imagesToUse || [];\n\n    // Clear existing suggestions when user sends a message\n    // This prevents stale suggestions from remaining visible during new conversation flow\n    if (chatSuggestions === \"auto\" || chatSuggestions === \"manual\") {\n      setSuggestions([]);\n    }\n\n    let firstMessage: Message | null = null;\n\n    // Send text message if content provided\n    if (messageContent.trim().length > 0) {\n      const textMessage: Message = {\n        id: randomId(),\n        role: \"user\",\n        content: messageContent,\n      };\n\n      // Call user-provided submit handler if available\n      if (onSubmitMessage) {\n        try {\n          await onSubmitMessage(messageContent);\n        } catch (error) {\n          console.error(\"Error in onSubmitMessage:\", error);\n        }\n      }\n\n      // Send the message and clear suggestions for auto/manual modes\n      await sendMessage(textMessage, {\n        followUp: images.length === 0,\n        clearSuggestions: chatSuggestions === \"auto\" || chatSuggestions === \"manual\",\n      });\n\n      if (!firstMessage) {\n        firstMessage = textMessage;\n      }\n    }\n\n    // Send image messages\n    if (images.length > 0) {\n      for (let i = 0; i < images.length; i++) {\n        const imageMessage = {\n          id: randomId(),\n          role: \"user\" as const,\n          image: {\n            format: images[i].contentType.replace(\"image/\", \"\"),\n            bytes: images[i].bytes,\n          },\n        } as unknown as Message;\n        await sendMessage(imageMessage, { followUp: i === images.length - 1 });\n        if (!firstMessage) {\n          firstMessage = imageMessage;\n        }\n      }\n    }\n\n    if (!firstMessage) {\n      // Should not happen if send button is properly disabled, but handle just in case\n      return { role: \"user\", content: \"\", id: randomId() } as Message; // Return a dummy message\n    }\n\n    // The hook implicitly triggers API call on appendMessage.\n    // We return the first message sent (either text or first image)\n    return firstMessage;\n  };\n\n  const currentAgentName = generalContext.agentSession?.agentName;\n  const restartCurrentAgent = async (hint?: HintFunction) => {\n    if (generalContext.agentSession) {\n      generalContext.setAgentSession({\n        ...generalContext.agentSession,\n        nodeName: undefined,\n        threadId: undefined,\n      });\n      generalContext.setAiAgentStates((prevAgentStates) => {\n        return {\n          ...prevAgentStates,\n          [generalContext.agentSession!.agentName]: {\n            ...prevAgentStates[generalContext.agentSession!.agentName],\n            threadId: undefined,\n            nodeName: undefined,\n            runId: undefined,\n          },\n        };\n      });\n    }\n  };\n  const runCurrentAgent = async (hint?: HintFunction) => {\n    if (generalContext.agentSession) {\n      await runAgent(\n        generalContext.agentSession.agentName,\n        stableContext,\n        messagesContext.messages,\n        sendMessage,\n        runChatCompletion,\n      );\n    }\n  };\n  const stopCurrentAgent = () => {\n    if (generalContext.agentSession) {\n      stopAgent(generalContext.agentSession.agentName, stableContext);\n    }\n  };\n  const setCurrentAgentState = (state: any) => {\n    if (generalContext.agentSession) {\n      generalContext.setAiAgentStates((prevAgentStates) => {\n        return {\n          ...prevAgentStates,\n          [generalContext.agentSession!.agentName]: {\n            state,\n          },\n        } as any;\n      });\n    }\n  };\n\n  function stopGeneration() {\n    // Clear suggestions when stopping generation\n    setSuggestions([]);\n\n    if (onStopGeneration) {\n      onStopGeneration({\n        messages: messages,\n        setMessages,\n        stopGeneration: defaultStopGeneration,\n        currentAgentName,\n        restartCurrentAgent,\n        stopCurrentAgent,\n        runCurrentAgent,\n        setCurrentAgentState,\n      });\n    } else {\n      defaultStopGeneration();\n    }\n  }\n  function reloadMessages(messageId: string) {\n    if (onReloadMessages) {\n      onReloadMessages({\n        messages: messages,\n        setMessages,\n        stopGeneration: defaultStopGeneration,\n        currentAgentName,\n        restartCurrentAgent,\n        stopCurrentAgent,\n        runCurrentAgent,\n        setCurrentAgentState,\n        messageId,\n      });\n    } else {\n      defaultReloadMessages(messageId);\n    }\n  }\n\n  return {\n    messages,\n    isLoading,\n    suggestions,\n    sendMessage: safelySendMessage,\n    stopGeneration,\n    reloadMessages,\n    resetSuggestions,\n    context: stableContext,\n    actions,\n  };\n};\n"],"mappings":"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","names":["Messages","RenderMessage","Input","AssistantMessage","UserMessage","ImageRenderer","e","_a","_b"]}