reachat 3.2.0 → 3.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/assets/send.svg?react","../src/assets/stop.svg?react","../src/ChatContext.ts","../src/assets/paperclip.svg?react","../src/ChatInput/FileInput.tsx","../src/theme.ts","../src/ChatInput/MentionList.tsx","../src/ChatInput/RichTextInput.tsx","../src/ChatInput/ChatInput.tsx","../src/SessionMessages/SessionEmpty.tsx","../src/SessionMessages/SessionMessagesHeader.tsx","../src/assets/back.svg?react","../src/SessionMessages/SessionMessagePanel.tsx","../src/assets/copy.svg?react","../src/Markdown/themes/dark.ts","../src/Markdown/themes/light.ts","../src/Markdown/CodeHighlighter.tsx","../src/Markdown/Table.tsx","../src/Markdown/Markdown.tsx","../src/ComponentCatalog/ComponentError.tsx","../src/Markdown/charts/ChartRenderer.tsx","../src/Markdown/plugins/remarkCve.ts","../src/Markdown/plugins/remarkComponent.ts","../src/Markdown/plugins/remarkRedact.ts","../src/Markdown/plugins/redactMatchers.ts","../src/assets/file.svg?react","../src/SessionMessages/SessionMessage/MessageFile/MessageFile.tsx","../src/SessionMessages/SessionMessage/MessageFile/renderers/DefaultFileRenderer.tsx","../src/utils/sanitize.ts","../src/utils/parseCSV.ts","../src/assets/download.svg?react","../src/SessionMessages/SessionMessage/MessageFile/renderers/CSVFileRenderer.tsx","../src/SessionMessages/SessionMessage/MessageFile/renderers/ImageFileRenderer.tsx","../src/SessionMessages/SessionMessage/MessageFile/renderers/PDFFileRenderer.tsx","../src/SessionMessages/SessionMessage/MessageFiles.tsx","../src/SessionMessages/SessionMessage/MessageQuestion.tsx","../src/SessionMessages/SessionMessage/MessageResponse.tsx","../src/SessionMessages/SessionMessage/MessageSource.tsx","../src/SessionMessages/SessionMessage/MessageSources.tsx","../src/assets/thumbs-down.svg?react","../src/assets/thumbs-up.svg?react","../src/assets/refresh.svg?react","../src/SessionMessages/SessionMessage/MessageActions.tsx","../src/SessionMessages/SessionMessage/SessionMessage.tsx","../src/assets/arrow-down.svg?react","../src/SessionMessages/SessionMessages.tsx","../src/utils/useDimensions.ts","../src/Chat.tsx","../src/assets/trash.svg?react","../src/assets/chat.svg?react","../src/SessionsList/SessionListItem.tsx","../src/SessionsList/SessionsList.tsx","../src/assets/plus.svg?react","../src/SessionsList/NewSessionButton.tsx","../src/utils/grouping.ts","../src/SessionsList/SessionsGroup.tsx","../src/SessionsList/SessionGroups.tsx","../src/AppBar/AppBar.tsx","../src/ChatBubble/ChatBubble.tsx","../src/ChatSuggestions/ChatSuggestion.tsx","../src/ChatSuggestions/ChatSuggestions.tsx","../src/assets/spinner.svg?react","../src/assets/check.svg?react","../src/assets/error.svg?react","../src/MessageStatus/StatusIcon.tsx","../src/MessageStatus/MessageStatusItem.tsx","../src/MessageStatus/MessageStatus.tsx","../src/useAgUi/types.ts","../src/useAgUi/useAgUi.ts","../src/ComponentCatalog/validateSpec.ts","../src/ComponentCatalog/ComponentRenderer.tsx","../src/utils/getChildText.ts","../src/ComponentCatalog/ComponentPre.tsx","../src/ComponentCatalog/generatePrompt.ts","../src/ComponentCatalog/componentCatalog.ts","../src/ComponentCatalog/chartComponentDef.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgSend = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 17, height: 17, viewBox: \"0 0 17 17\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"send\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"Vector\", d: \"M14.6111 2.33327C14.5349 2.3339 14.4598 2.35194 14.3917 2.386L2.39168 8.386C2.31456 8.42456 2.24872 8.4824 2.20055 8.55391C2.15238 8.62543 2.12352 8.70818 2.11677 8.79414C2.11002 8.88009 2.12561 8.96634 2.16203 9.04449C2.19845 9.12264 2.25446 9.19005 2.32462 9.24017L4.52514 10.8124L5.47371 13.6581C5.50257 13.7447 5.55457 13.8217 5.62406 13.8808C5.69355 13.9399 5.7779 13.9789 5.86796 13.9935C5.95802 14.0082 6.05036 13.9979 6.13499 13.9638C6.21962 13.9297 6.2933 13.873 6.34806 13.8001L7.05249 12.8606L10.3207 15.2376C10.3843 15.2839 10.4579 15.3146 10.5355 15.3271C10.6132 15.3396 10.6927 15.3336 10.7676 15.3097C10.8425 15.2857 10.9107 15.2444 10.9667 15.1891C11.0226 15.1338 11.0647 15.0661 11.0896 14.9915L15.0896 2.99147C15.1148 2.91597 15.1216 2.83555 15.1094 2.7569C15.0972 2.67825 15.0665 2.60363 15.0197 2.53926C14.9729 2.47488 14.9114 2.42261 14.8403 2.38678C14.7693 2.35096 14.6907 2.33261 14.6111 2.33327ZM13.2478 5.35345L10.3565 14.0266L7.67293 12.0755L13.2478 5.35345ZM10.684 5.35801L4.934 9.87559L3.58113 8.90879L10.684 5.35801ZM11.2784 6.16205L6.56746 11.843C6.56681 11.8437 6.56616 11.8443 6.56551 11.845L6.56355 11.8476C6.55841 11.8538 6.55342 11.8601 6.54858 11.8665C6.54319 11.8733 6.53798 11.8802 6.53295 11.8873L6.12085 12.4361L5.53426 10.6751L11.2784 6.16205Z\", fill: \"currentColor\" })));\nexport default SvgSend;\n","import * as React from \"react\";\nconst SvgStop = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-octagon-x\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m15 9-6 6\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"m9 9 6 6\" }));\nexport default SvgStop;\n","import { createContext } from 'react';\nimport { Components } from 'react-markdown';\nimport { Session } from './types';\nimport { ChatTheme } from './theme';\nimport { Plugin } from 'unified';\n\nexport type ChatViewType = 'chat' | 'companion' | 'console';\n\nexport interface ChatContextProps {\n sessions: Session[];\n disabled?: boolean;\n activeSessionId: string | null;\n theme?: ChatTheme;\n isLoading?: boolean;\n isCompact?: boolean;\n viewType?: ChatViewType;\n activeSession?: Session | null;\n remarkPlugins?: Plugin[];\n markdownComponents?: Components;\n selectSession?: (sessionId: string) => void;\n deleteSession?: (sessionId: string) => void;\n createSession?: () => void;\n sendMessage?: (message: string) => void;\n stopMessage?: () => void;\n fileUpload?: (file: File | File[]) => void;\n}\n\nexport const ChatContext = createContext<ChatContextProps>({\n sessions: [],\n activeSessionId: null\n});\n","import * as React from \"react\";\nconst SvgPaperclip = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-paperclip\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\" }));\nexport default SvgPaperclip;\n","import { ChatContext } from '@/ChatContext';\nimport { Button, cn } from 'reablocks';\nimport { FC, ReactNode, useRef, ChangeEvent, useContext } from 'react';\nimport AttachIcon from '@/assets/paperclip.svg?react';\n\ninterface FileInputProps {\n /**\n * Array of allowed file extensions.\n */\n allowedFiles: string[];\n\n /**\n * Allow multiple file uploads.\n */\n multiple: boolean;\n\n /**\n * Indicates whether a file upload is in progress.\n */\n isLoading: boolean;\n\n /**\n * Disables the file input when true.\n */\n disabled: boolean;\n\n /**\n * Custom icon for the attach button.\n */\n attachIcon: ReactNode;\n\n /**\n * Callback function triggered when a file is selected.\n */\n onFileUpload: (event: ChangeEvent<HTMLInputElement>) => void;\n}\n\nexport const FileInput: FC<FileInputProps> = ({\n allowedFiles,\n multiple,\n onFileUpload,\n isLoading,\n disabled,\n attachIcon = <AttachIcon />\n}) => {\n const { theme } = useContext(ChatContext);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n return (\n <>\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept={allowedFiles.join(',')}\n multiple={multiple}\n onChange={e => {\n onFileUpload(e);\n // Cleanup field value after fire callback\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }}\n />\n <Button\n title=\"Upload\"\n variant=\"text\"\n disabled={isLoading || disabled}\n className={cn(theme.input.upload)}\n onClick={() => fileInputRef.current?.click()}\n >\n {attachIcon}\n </Button>\n </>\n );\n};\n","import { DeepPartial } from 'reablocks';\n\nexport interface ChatTheme {\n base: string;\n console: string;\n companion: string;\n empty: string;\n appbar: string;\n status: {\n base: string;\n header: string;\n icon: {\n base: string;\n loading: string;\n complete: string;\n error: string;\n };\n text: {\n base: string;\n loading: string;\n complete: string;\n error: string;\n };\n steps: {\n base: string;\n step: {\n base: string;\n icon: string;\n text: string;\n loading: string;\n complete: string;\n error: string;\n };\n };\n };\n sessions: {\n base: string;\n console: string;\n companion: string;\n create: string;\n group: string;\n session: {\n base: string;\n active: string;\n delete: string;\n };\n };\n messages: {\n base: string;\n console: string;\n companion: string;\n back: string;\n inner: string;\n title: string;\n date: string;\n content: string;\n header: string;\n showMore: string;\n message: {\n base: string;\n question: string;\n response: string;\n cursor: string;\n overlay: string;\n expand: string;\n scrollToBottom: {\n container: string;\n button: string;\n };\n files: {\n base: string;\n file: {\n base: string;\n name: string;\n };\n };\n sources: {\n base: string;\n source: {\n base: string;\n companion: string;\n image: string;\n title: string;\n url: string;\n };\n };\n markdown: {\n hr: string;\n p: string;\n a: string;\n table: string;\n th: string;\n td: string;\n code: string;\n inlineCode: string;\n toolbar: string;\n li: string;\n ul: string;\n ol: string;\n copy: string;\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n };\n footer: {\n base: string;\n copy: string;\n upvote: string;\n downvote: string;\n refresh: string;\n };\n };\n };\n input: {\n base: string;\n upload: string;\n input: string;\n actions: {\n base: string;\n send: string;\n stop: string;\n };\n popup: {\n base: string;\n content: string;\n item: string;\n itemHighlighted: string;\n itemIcon: string;\n itemContent: string;\n itemLabel: string;\n itemDescription: string;\n itemShortcut: string;\n empty: string;\n loading: string;\n };\n tag: {\n base: string;\n mention: string;\n command: string;\n };\n editor: {\n base: string;\n container: string;\n placeholder: string;\n };\n };\n suggestions: {\n base: string;\n item: {\n base: string;\n icon: string;\n text: string;\n };\n };\n chart: {\n base: string;\n title: string;\n content: string;\n error: {\n base: string;\n title: string;\n code: string;\n };\n warning: {\n base: string;\n title: string;\n };\n };\n component?: {\n base?: string;\n };\n}\n\nexport type PartialChatTheme = DeepPartial<ChatTheme>;\n\nexport const chatTheme: ChatTheme = {\n base: 'dark:text-white text-gray-500',\n console: 'flex w-full gap-4 h-full',\n companion: 'w-full h-full overflow-hidden',\n empty: 'text-center flex-1',\n appbar: 'flex p-5',\n status: {\n base: 'py-2 px-3 rounded-lg bg-gray-100/50 dark:bg-gray-800/30',\n header: 'flex items-center gap-2',\n icon: {\n base: 'flex-shrink-0 w-4 h-4',\n loading: 'text-blue-500 dark:text-blue-400',\n complete: 'text-green-500 dark:text-green-400',\n error: 'text-red-500 dark:text-red-400'\n },\n text: {\n base: 'text-sm',\n loading: 'text-gray-600 dark:text-gray-400',\n complete: 'text-gray-600 dark:text-gray-400',\n error: 'text-red-600 dark:text-red-400'\n },\n steps: {\n base: 'mt-1 ml-6 space-y-0.5',\n step: {\n base: 'flex items-center gap-2',\n icon: 'flex-shrink-0 w-3.5 h-3.5',\n text: 'text-sm',\n loading: 'text-gray-500 dark:text-gray-500',\n complete: 'text-gray-500 dark:text-gray-500',\n error: 'text-red-500 dark:text-red-400'\n }\n }\n },\n sessions: {\n base: 'overflow-auto',\n console:\n 'min-w-[150px] w-[30%] max-w-[300px] dark:bg-[#11111F] bg-[#F2F3F7] p-5 rounded-3xl',\n companion: 'w-full h-full',\n group:\n 'text-xs dart:text-gray-400 text-gray-700 mt-4 hover:bg-transparent mb-1',\n create: 'relative mb-4 rounded-[10px] text-white',\n session: {\n base: [\n 'group my-1 rounded-[10px] p-2 text-gray-500 border border-transparent hover:bg-gray-300 hover:border-gray-400 [&_svg]:text-gray-500',\n 'dark:text-typography dark:text-gray-400 dark:hover:bg-gray-800/50 dark:hover:border-gray-700/50 dark:[&_svg]:text-gray-200'\n ].join(' '),\n active: [\n 'border border-gray-300 hover:border-gray-400 text-gray-700 bg-gray-200 hover:bg-gray-300 ',\n 'dark:text-gray-500 dark:bg-gray-800/70 dark:border-gray-700/50 dark:text-white dark:border-gray-700/70 dark:hover:bg-gray-800/50',\n '[&_button]:opacity-100!'\n ].join(' '),\n delete: '[&>svg]:w-4 [&>svg]:h-4 opacity-0 group-hover:opacity-50!'\n }\n },\n messages: {\n base: '',\n console: 'flex flex-col mx-5 flex-1 min-h-0',\n companion: 'flex w-full h-full',\n back: 'self-start p-0 my-2',\n inner: 'flex-1 h-full flex flex-col',\n title: ['text-base font-bold text-gray-500', 'dark:text-gray-200'].join(\n ' '\n ),\n date: 'text-xs whitespace-nowrap text-gray-400',\n content: [\n 'mt-2 flex-1 overflow-auto [&_hr]:bg-gray-200',\n 'dark:[&_hr]:bg-gray-800/60'\n ].join(' '),\n header: 'flex justify-between items-center gap-2',\n showMore: 'mb-4',\n message: {\n base: 'mt-4 mb-4 flex flex-col p-0 rounded-sm border-none bg-transparent',\n question: [\n 'relative font-semibold mb-4 px-4 py-4 pb-2 rounded-3xl rounded-br-none text-typography border bg-gray-200 border-gray-300 text-gray-900',\n 'dark:bg-gray-900/60 dark:border-gray-700/50 dark:text-gray-100'\n ].join(' '),\n response: [\n 'relative data-[compact=false]:px-4 text-gray-900',\n 'dark:text-gray-100'\n ].join(' '),\n overlay:\n \"overflow-y-hidden max-h-[350px] after:content-[''] after:absolute after:inset-x-0 after:bottom-0 after:h-16 after:bg-linear-to-b after:from-transparent dark:after:to-gray-900 after:to-gray-200\",\n cursor: 'inline-block w-1 h-4 bg-current',\n expand: 'absolute bottom-1 right-1 z-10',\n scrollToBottom: {\n container: 'absolute bottom-2 left-1/2 transform -translate-x-1/2 z-10',\n button: 'rounded-full p-2 shadow-lg'\n },\n files: {\n base: 'mb-2 flex flex-wrap gap-3 ',\n file: {\n base: [\n 'flex items-center gap-2 border border-gray-300 px-3 py-2 rounded-lg cursor-pointer',\n 'dark:border-gray-700'\n ].join(' '),\n name: ['text-sm text-gray-500', 'dark:text-gray-200'].join(' ')\n }\n },\n sources: {\n base: 'my-4 flex flex-wrap gap-3',\n source: {\n base: [\n 'flex gap-2 border border-gray-200 px-4 py-2 rounded-lg cursor-pointer',\n 'dark:border-gray-700'\n ].join(' '),\n companion: 'flex-1 px-3 py-1.5',\n image: 'max-w-10 max-h-10 rounded-md w-full h-fit self-center',\n title: 'text-md block',\n url: 'text-sm text-blue-400 underline'\n }\n },\n markdown: {\n hr: 'my-4 border-t border-stroke-neutral-4',\n copy: 'sticky py-1 [&>svg]:w-4 [&>svg]:h-4 opacity-50',\n p: 'mb-2',\n a: 'text-buttons-colors-link-primary-text-resting underline',\n table: 'table-auto w-full m-2',\n th: 'px-4 py-2 text-left font-bold border-b border-stroke-neutral-4',\n td: 'px-4 py-2',\n code: 'm-2 rounded-b relative',\n inlineCode: 'bg-gradient-neutral-200 p-1 rounded',\n toolbar:\n 'text-xs flex items-center justify-between px-2 py-1 rounded-t sticky top-0 backdrop-blur-md bg-gradient-neutral-500/50',\n li: 'mb-2 ml-6',\n ul: 'mb-4 list-disc',\n ol: 'mb-4 list-decimal',\n h1: 'text-4xl font-bold mb-4 mt-6',\n h2: 'text-3xl font-bold mb-3 mt-5',\n h3: 'text-2xl font-bold mb-3 mt-4',\n h4: 'text-xl font-bold mb-2 mt-3',\n h5: 'text-lg font-bold mb-2 mt-2',\n h6: 'text-base font-bold mb-2 mt-2'\n },\n footer: {\n base: 'mt-3 flex gap-1.5',\n copy: [\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-200 hover:text-gray-500',\n 'dark:hover:bg-gray-800 dark:hover:text-white text-gray-400'\n ].join(' '),\n upvote:\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-700/40 hover:text-white text-gray-400',\n downvote:\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-700/40 hover:text-white text-gray-400',\n refresh:\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-700/40 hover:text-white text-gray-400'\n }\n }\n },\n input: {\n base: 'flex mt-4 relative',\n upload: ['px-5 py-2 text-gray-400 size-10', 'dark:gray-500'].join(' '),\n input: [\n 'w-full border rounded-3xl px-3 py-2 pr-16 text-gray-500 border-gray-200 hover:bg-blue-100 hover:border-blue-500 after:hidden after:mx-10! bg-white [&>textarea]:w-full [&>textarea]:flex-none',\n 'dark:border-gray-700/50 dark:text-gray-200 dark:bg-gray-950 dark:hover:bg-blue-950/40'\n ].join(' '),\n actions: {\n base: 'absolute flex gap-2 items-center right-5 inset-y-1/2 -translate-y-1/2 z-10',\n send: [\n 'px-3 py-3 hover:bg-primary-hover rounded-full bg-gray-200 hover:bg-gray-300 text-gray-500',\n 'dark:text-white light:text-gray-500 dark:bg-gray-800 dark:hover:bg-gray-700'\n ].join(' '),\n stop: 'px-2 py-2 bg-red-500 text-white rounded-full hover:bg-red-700 '\n },\n popup: {\n base: [\n 'bg-white border border-gray-200 rounded-lg shadow-lg overflow-hidden min-w-[200px] max-w-[300px]',\n 'dark:bg-gray-900 dark:border-gray-700'\n ].join(' '),\n content: 'overflow-y-auto max-h-[250px]',\n item: [\n 'flex items-center gap-2 px-3 py-2 cursor-pointer transition-colors',\n 'hover:bg-gray-100 dark:hover:bg-gray-800'\n ].join(' '),\n itemHighlighted: 'bg-gray-100 dark:bg-gray-800',\n itemIcon: [\n 'flex-shrink-0 w-5 h-5 text-gray-500 [&>svg]:w-full [&>svg]:h-full',\n 'dark:text-gray-400'\n ].join(' '),\n itemContent: 'flex flex-col min-w-0 flex-1',\n itemLabel: [\n 'text-sm font-medium text-gray-900 truncate',\n 'dark:text-gray-100'\n ].join(' '),\n itemDescription: 'text-xs text-gray-500 dark:text-gray-400 truncate',\n itemShortcut: 'text-xs text-gray-400 dark:text-gray-500 ml-auto',\n empty: 'px-3 py-4 text-sm text-center text-gray-500 dark:text-gray-400',\n loading: [\n 'flex items-center justify-center gap-2 px-3 py-4 text-gray-500',\n 'dark:text-gray-400'\n ].join(' ')\n },\n tag: {\n base: [\n 'inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded',\n 'font-medium text-sm leading-[1.2] relative top-[1px]'\n ].join(' '),\n mention: [\n 'bg-blue-100 dark:bg-blue-900/30',\n 'text-blue-700 dark:text-blue-300'\n ].join(' '),\n command: [\n 'bg-purple-100 dark:bg-purple-900/30',\n 'text-purple-700 dark:text-purple-300'\n ].join(' ')\n },\n editor: {\n base: [\n 'outline-none w-full overflow-y-auto',\n 'text-inherit font-inherit',\n '[&_.tiptap-paragraph]:m-0'\n ].join(' '),\n container: 'px-3 py-2 pr-16',\n placeholder: [\n '[&_.is-editor-empty]:before:content-[attr(data-placeholder)]',\n '[&_.is-editor-empty]:before:text-gray-400',\n '[&_.is-editor-empty]:before:dark:text-gray-500',\n '[&_.is-editor-empty]:before:float-left',\n '[&_.is-editor-empty]:before:h-0',\n '[&_.is-editor-empty]:before:pointer-events-none'\n ].join(' ')\n }\n },\n suggestions: {\n base: 'flex flex-wrap gap-2 mt-4',\n item: {\n base: [\n 'rounded-full! max-w-full py-2 px-4',\n 'bg-gray-100 border-gray-200 hover:bg-gray-200 hover:border-gray-300 text-gray-700',\n 'dark:bg-gray-800/50 dark:border-gray-700 dark:hover:bg-gray-700/70 dark:hover:border-gray-600 dark:text-gray-200',\n '[&>svg]:w-4 [&>svg]:h-4 [&>svg]:text-blue-500 [&>svg]:dark:text-blue-400 [&>svg]:flex-shrink-0'\n ].join(' '),\n icon: 'w-4 h-4 text-blue-500 dark:text-blue-400 flex-shrink-0',\n text: 'text-sm truncate'\n }\n },\n chart: {\n base: 'my-6',\n title: 'text-sm font-medium mb-2 text-gray-600 dark:text-gray-400',\n content: 'flex items-center justify-center',\n error: {\n base: [\n 'my-4 p-4 border rounded',\n 'border-red-300 bg-red-50 text-red-500',\n 'dark:border-red-700 dark:bg-red-900/20'\n ].join(' '),\n title: 'text-red-600 dark:text-red-400 text-sm font-medium mb-2',\n code: 'text-xs overflow-auto'\n },\n warning: {\n base: [\n 'my-4 p-4 border rounded',\n 'border-yellow-300 bg-yellow-50 text-yellow-600',\n 'dark:border-yellow-700 dark:bg-yellow-900/20 dark:text-yellow-400'\n ].join(' '),\n title: 'text-yellow-600 dark:text-yellow-400 text-sm font-medium mb-2'\n }\n },\n component: {\n base: 'my-4'\n }\n};\n","import {\n forwardRef,\n memo,\n useEffect,\n useImperativeHandle,\n useState,\n useCallback,\n useContext,\n useRef\n} from 'react';\nimport { cn, List, ListItem } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { chatTheme } from '@/theme';\nimport { SuggestionConfig, SuggestionItem } from './types';\n\nconst POPUP_STYLE = { zIndex: 9999 } as const;\n\nexport interface MentionListRef {\n onKeyDown: (props: { event: KeyboardEvent }) => boolean;\n}\n\nexport interface MentionListProps {\n /**\n * List of suggestion items to display\n */\n items: SuggestionItem[];\n\n /**\n * Callback to execute the selected suggestion command\n */\n command: (item: { id: string; label: string }) => void;\n\n /**\n * The trigger character (e.g., '@' or '/')\n */\n triggerChar: string;\n\n /**\n * Configuration for the suggestion popup\n */\n config: SuggestionConfig;\n\n /**\n * Current search query text\n */\n query?: string;\n}\n\nexport const MentionList = forwardRef<MentionListRef, MentionListProps>(\n ({ items, command, triggerChar, config, query }, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const { theme } = useContext(ChatContext);\n const popupTheme = theme?.input?.popup || chatTheme.input.popup;\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [items]);\n\n useEffect(() => {\n if (itemRefs.current[selectedIndex]) {\n itemRefs.current[selectedIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth'\n });\n }\n }, [selectedIndex]);\n\n const selectItem = useCallback(\n (index: number) => {\n const item = items[index];\n if (!item) return;\n\n if (config.onSelect) {\n config.onSelect(item, (text: string) => {\n command({ id: item.id, label: text || item.label });\n });\n } else {\n command({ id: item.id, label: item.label });\n }\n },\n [items, command, config]\n );\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setSelectedIndex(prev => (prev <= 0 ? items.length - 1 : prev - 1));\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setSelectedIndex(prev => (prev >= items.length - 1 ? 0 : prev + 1));\n return true;\n }\n\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n selectItem(selectedIndex);\n return true;\n }\n\n return false;\n }\n }));\n\n const popupId = `mention-list-${triggerChar}`;\n\n return (\n <List\n className={cn(popupTheme.base, popupTheme.content)}\n style={POPUP_STYLE}\n role=\"listbox\"\n id={popupId}\n aria-label={`${triggerChar === '@' ? 'Mentions' : 'Commands'} suggestions`}\n >\n {items.length === 0 ? (\n <ListItem className={cn(popupTheme.empty)} disabled dense>\n {config.renderEmpty\n ? config.renderEmpty(query || '')\n : query\n ? `No results for \"${query}\"`\n : 'No items available'}\n </ListItem>\n ) : (\n items.map((item, index) => (\n <div\n key={item.id}\n id={`${popupId}-option-${item.id}`}\n role=\"option\"\n aria-selected={index === selectedIndex}\n ref={el => {\n itemRefs.current[index] = el;\n }}\n onClick={() => selectItem(index)}\n onMouseEnter={() => setSelectedIndex(index)}\n className=\"cursor-pointer\"\n >\n {config.renderItem ? (\n config.renderItem(item, index === selectedIndex)\n ) : (\n <DefaultItemRenderer\n item={item}\n isHighlighted={index === selectedIndex}\n popupTheme={popupTheme}\n />\n )}\n </div>\n ))\n )}\n </List>\n );\n }\n);\n\ninterface DefaultItemRendererProps {\n /**\n * The suggestion item to render\n */\n item: SuggestionItem;\n\n /**\n * Whether this item is currently highlighted/selected\n */\n isHighlighted: boolean;\n\n /**\n * Theme styles for the popup\n */\n popupTheme: typeof chatTheme.input.popup;\n}\n\nconst DefaultItemRenderer = memo<DefaultItemRendererProps>(\n ({ item, isHighlighted, popupTheme }) => {\n const shortcut = 'shortcut' in item ? (item as any).shortcut : undefined;\n\n return (\n <ListItem\n className={cn(\n popupTheme.item,\n isHighlighted && popupTheme.itemHighlighted\n )}\n dense\n start={\n item.icon ? (\n <span className={cn(popupTheme.itemIcon)}>{item.icon}</span>\n ) : undefined\n }\n end={\n shortcut ? (\n <span className={cn(popupTheme.itemShortcut)}>{shortcut}</span>\n ) : undefined\n }\n >\n <div className={cn(popupTheme.itemContent)}>\n <span className={cn(popupTheme.itemLabel)}>{item.label}</span>\n {item.description && (\n <span className={cn(popupTheme.itemDescription)}>\n {item.description}\n </span>\n )}\n </div>\n </ListItem>\n );\n }\n);\n\nDefaultItemRenderer.displayName = 'DefaultItemRenderer';\n\nMentionList.displayName = 'MentionList';\n","import React, {\n forwardRef,\n useImperativeHandle,\n useContext,\n useRef,\n useEffect,\n useMemo\n} from 'react';\nimport {\n useEditor,\n EditorContent,\n ReactRenderer,\n posToDOMRect\n} from '@tiptap/react';\nimport { computePosition, flip, shift } from '@floating-ui/dom';\nimport Document from '@tiptap/extension-document';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Text from '@tiptap/extension-text';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Mention from '@tiptap/extension-mention';\nimport { cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { MentionList, MentionListRef } from './MentionList';\nimport { SuggestionConfig, SuggestionItem } from './types';\n\nexport interface RichTextInputRef {\n focus: () => void;\n getValue: () => string;\n setValue: (value: string) => void;\n insertText: (text: string) => void;\n}\n\nexport interface RichTextInputProps {\n /**\n * Current value of the input\n */\n value?: string;\n\n /**\n * Placeholder text when empty\n */\n placeholder?: string;\n\n /**\n * Whether the input is disabled\n */\n disabled?: boolean;\n\n /**\n * Whether to auto-focus on mount (default: true)\n */\n autoFocus?: boolean;\n\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Minimum height in pixels (default: 24)\n */\n minHeight?: number;\n\n /**\n * Maximum height in pixels (default: 200)\n */\n maxHeight?: number;\n\n /**\n * Configuration for @ mentions\n */\n mentions?: SuggestionConfig;\n\n /**\n * Configuration for / slash commands\n */\n commands?: SuggestionConfig;\n\n /**\n * Callback when user submits (presses Enter)\n */\n onSubmit?: (value: string) => void;\n\n /**\n * Callback when input value changes\n */\n onChange?: (value: string) => void;\n}\n\n/**\n * Updates the position of the suggestion popup relative to the cursor.\n * Uses floating-ui to compute optimal placement with flip/shift middleware.\n */\nfunction updatePopupPosition(editor: any, element: HTMLElement) {\n const virtualElement = {\n getBoundingClientRect: () =>\n posToDOMRect(\n editor.view,\n editor.state.selection.from,\n editor.state.selection.to\n )\n };\n\n computePosition(virtualElement, element, {\n placement: 'bottom-start',\n strategy: 'absolute',\n middleware: [shift(), flip()]\n }).then(({ x, y, strategy }) => {\n element.style.width = 'max-content';\n element.style.position = strategy;\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n });\n}\n\n/**\n * Creates a Tiptap suggestion configuration for mentions or slash commands.\n * Handles item filtering, popup rendering, positioning, and keyboard navigation.\n */\nfunction createSuggestionConfig<T extends SuggestionItem>(\n config: SuggestionConfig<T>,\n triggerChar: string,\n suggestionActiveRef: React.RefObject<boolean>\n) {\n return {\n char: triggerChar,\n allowSpaces: false,\n\n // Fetch and filter suggestion items based on query\n items: async ({ query }: { query: string }) => {\n if (config.onSearch) {\n return await config.onSearch(query);\n }\n if (!config.items) return [];\n if (!query) return config.items.slice(0, config.maxResults || 10);\n\n const lowerQuery = query.toLowerCase();\n return config.items\n .filter(\n item =>\n item.label.toLowerCase().includes(lowerQuery) ||\n item.description?.toLowerCase().includes(lowerQuery)\n )\n .slice(0, config.maxResults || 10);\n },\n\n // Render callbacks for managing the popup lifecycle\n render: () => {\n let component: ReactRenderer<MentionListRef> | null = null;\n\n return {\n // Called when suggestion is triggered\n onStart: (props: any) => {\n suggestionActiveRef.current = true;\n component = new ReactRenderer(MentionList, {\n props: {\n ...props,\n triggerChar,\n config\n },\n editor: props.editor\n });\n\n if (!props.clientRect) {\n return;\n }\n\n // Set position before appending to body (important for correct positioning)\n component.element.style.position = 'absolute';\n document.body.appendChild(component.element);\n updatePopupPosition(props.editor, component.element);\n },\n\n // Called when query or items change\n onUpdate: (props: any) => {\n component?.updateProps({\n ...props,\n triggerChar,\n config\n });\n\n if (!props.clientRect) {\n return;\n }\n\n if (component?.element) {\n updatePopupPosition(props.editor, component.element);\n }\n },\n\n // Handle keyboard navigation (Escape closes popup)\n onKeyDown: (props: any) => {\n if (props.event.key === 'Escape') {\n component?.destroy();\n return true;\n }\n return component?.ref?.onKeyDown(props) ?? false;\n },\n\n // Cleanup when suggestion is dismissed\n onExit: () => {\n suggestionActiveRef.current = false;\n component?.element?.remove();\n component?.destroy();\n }\n };\n }\n };\n}\n\nexport const RichTextInput = forwardRef<RichTextInputRef, RichTextInputProps>(\n (\n {\n value = '',\n placeholder = 'Type a message...',\n disabled = false,\n autoFocus = true,\n className,\n minHeight = 24,\n maxHeight = 200,\n mentions,\n commands,\n onSubmit,\n onChange\n },\n ref\n ) => {\n const { theme } = useContext(ChatContext);\n const containerRef = useRef<HTMLDivElement>(null);\n const suggestionActiveRef = useRef(false);\n\n const extensions = useMemo(() => {\n const exts = [\n Document,\n Paragraph.configure({\n HTMLAttributes: {\n class: 'tiptap-paragraph'\n }\n }),\n Text,\n HardBreak,\n Placeholder.configure({\n placeholder,\n emptyEditorClass: 'is-editor-empty'\n })\n ];\n\n if (mentions) {\n exts.push(\n Mention.configure({\n HTMLAttributes: {\n class: cn(theme?.input?.tag?.base, theme?.input?.tag?.mention)\n },\n suggestion: createSuggestionConfig(\n mentions,\n mentions.trigger || '@',\n suggestionActiveRef\n )\n }).extend({\n name: 'mention'\n })\n );\n }\n\n if (commands) {\n exts.push(\n Mention.configure({\n HTMLAttributes: {\n class: cn(theme?.input?.tag?.base, theme?.input?.tag?.command)\n },\n suggestion: createSuggestionConfig(\n commands,\n commands.trigger || '/',\n suggestionActiveRef\n )\n }).extend({\n name: 'command'\n })\n );\n }\n\n return exts;\n }, [placeholder, mentions, commands, theme]);\n\n const editor = useEditor({\n extensions,\n content: value ? `<p>${value}</p>` : '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor }) => {\n const text = editor.getText();\n onChange?.(text);\n },\n editorProps: {\n attributes: {\n class: cn(\n theme?.input?.editor?.base,\n theme?.input?.editor?.placeholder\n ),\n style: `min-height: ${minHeight}px; max-height: ${maxHeight}px;`,\n role: 'textbox',\n 'aria-multiline': 'true',\n 'aria-placeholder': placeholder,\n 'aria-disabled': disabled ? 'true' : 'false',\n tabindex: disabled ? '-1' : '0'\n },\n handleKeyDown: (view, event) => {\n // Don't submit when suggestion popup is active\n if (suggestionActiveRef.current) {\n return false;\n }\n if (event.key === 'Enter' && !event.shiftKey) {\n const text = view.state.doc.textContent;\n if (text.trim() && onSubmit) {\n event.preventDefault();\n onSubmit(text);\n editor?.commands.clearContent();\n return true;\n }\n }\n return false;\n }\n }\n });\n\n useEffect(() => {\n if (autoFocus && editor) {\n setTimeout(() => {\n editor.commands.focus('end');\n }, 0);\n }\n }, [editor, autoFocus]);\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n editor?.commands.focus();\n },\n getValue: () => {\n return editor?.getText() || '';\n },\n setValue: (newValue: string) => {\n editor?.commands.setContent(newValue ? `<p>${newValue}</p>` : '');\n },\n insertText: (text: string) => {\n editor?.commands.insertContent(text);\n }\n }));\n\n return (\n <div ref={containerRef} className={cn('relative w-full', className)}>\n <EditorContent editor={editor} />\n </div>\n );\n }\n);\n\nRichTextInput.displayName = 'RichTextInput';\n","import {\n useState,\n ReactElement,\n useRef,\n useMemo,\n ChangeEvent,\n useContext,\n forwardRef,\n useImperativeHandle,\n useEffect,\n useCallback\n} from 'react';\nimport { Button, cn } from 'reablocks';\nimport SendIcon from '@/assets/send.svg?react';\nimport StopIcon from '@/assets/stop.svg?react';\nimport { ChatContext } from '@/ChatContext';\nimport { FileInput } from './FileInput';\nimport { RichTextInput, RichTextInputRef } from './RichTextInput';\nimport { SuggestionConfig, MentionItem, SlashCommandItem } from './types';\n\nexport interface ChatInputProps {\n /**\n * Default value for the input field.\n */\n defaultValue?: string;\n\n /**\n * Allowed file types for upload.\n */\n allowedFiles?: string[];\n\n /**\n * Allow multiple file uploads.\n */\n allowMultipleFiles?: boolean;\n\n /**\n * Placeholder text for the input field.\n */\n placeholder?: string;\n\n /**\n * Icon to show for send.\n */\n sendIcon?: ReactElement;\n\n /**\n * Icon to show for stop.\n */\n stopIcon?: ReactElement;\n\n /**\n * Icon to show for attach.\n */\n attachIcon?: ReactElement;\n\n /**\n * Configuration for mentions (@user).\n * Provide items or an onSearch function to enable mentions.\n */\n mentions?: SuggestionConfig<MentionItem>;\n\n /**\n * Configuration for commands (/command).\n * Provide items or an onSearch function to enable commands.\n */\n commands?: SuggestionConfig<SlashCommandItem>;\n\n /**\n * Minimum height for the input (default: 24px)\n */\n minHeight?: number;\n\n /**\n * Maximum height for the input (default: 200px)\n */\n maxHeight?: number;\n\n /**\n * Whether to auto-focus the input on mount (default: true)\n */\n autoFocus?: boolean;\n}\n\nexport interface ChatInputRef {\n /**\n * Focus the input.\n */\n focus: () => void;\n\n /**\n * Get the current input value.\n */\n getValue: () => string;\n\n /**\n * Set the input value.\n */\n setValue: (value: string) => void;\n\n /**\n * Insert text at the current cursor position.\n */\n insertText: (text: string) => void;\n}\n\nexport const ChatInput = forwardRef<ChatInputRef, ChatInputProps>(\n (\n {\n allowedFiles,\n placeholder = 'Type a message...',\n allowMultipleFiles = false,\n defaultValue,\n sendIcon = <SendIcon />,\n stopIcon = <StopIcon />,\n attachIcon,\n mentions,\n commands,\n minHeight = 24,\n maxHeight = 200,\n autoFocus = true\n },\n ref\n ) => {\n const {\n theme,\n isLoading,\n disabled,\n sendMessage,\n stopMessage,\n fileUpload,\n activeSessionId\n } = useContext(ChatContext);\n\n const [message, setMessage] = useState<string>(defaultValue || '');\n const inputRef = useRef<RichTextInputRef | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (autoFocus) {\n inputRef.current?.focus();\n }\n }, [activeSessionId, autoFocus]);\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n getValue: () => {\n return inputRef.current?.getValue() || '';\n },\n setValue: (value: string) => {\n setMessage(value);\n inputRef.current?.setValue(value);\n },\n insertText: (text: string) => {\n inputRef.current?.insertText(text);\n }\n }));\n\n const handleSendMessage = useCallback(() => {\n const currentMessage = inputRef.current?.getValue();\n if (currentMessage.trim()) {\n sendMessage?.(currentMessage);\n setMessage('');\n inputRef.current?.setValue('');\n }\n }, [sendMessage]);\n\n const handleSubmit = useCallback(\n (value: string) => {\n if (value.trim()) {\n sendMessage?.(value);\n setMessage('');\n }\n },\n [sendMessage]\n );\n\n const handleChange = useCallback((value: string) => {\n setMessage(value);\n }, []);\n\n const handleFileUpload = (event: ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (files?.length && fileUpload) {\n fileUpload(allowMultipleFiles ? Array.from(files) : files[0]);\n }\n };\n\n const mentionsConfig = useMemo(\n () =>\n mentions\n ? { ...mentions, trigger: mentions.trigger || '@' }\n : undefined,\n [mentions]\n );\n\n const commandsConfig = useMemo(\n () =>\n commands\n ? { ...commands, trigger: commands.trigger || '/' }\n : undefined,\n [commands]\n );\n\n return (\n <div ref={containerRef} className={cn(theme.input.base)}>\n <div className={cn('relative flex-1', theme.input.input)}>\n <RichTextInput\n ref={inputRef}\n value={message}\n onChange={handleChange}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n disabled={isLoading || disabled}\n autoFocus={autoFocus}\n minHeight={minHeight}\n maxHeight={maxHeight}\n className={theme.input.editor.container}\n mentions={mentionsConfig}\n commands={commandsConfig}\n />\n\n <div className={cn(theme.input.actions.base)}>\n {allowedFiles?.length > 0 && (\n <FileInput\n allowedFiles={allowedFiles}\n multiple={allowMultipleFiles}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n disabled={disabled}\n attachIcon={attachIcon}\n />\n )}\n {isLoading && (\n <Button\n title=\"Stop\"\n className={cn(theme.input.actions.stop)}\n onClick={stopMessage}\n disabled={disabled}\n >\n {stopIcon}\n </Button>\n )}\n <Button\n title=\"Send\"\n className={cn(theme.input.actions.send)}\n onClick={handleSendMessage}\n disabled={isLoading || disabled}\n >\n {sendIcon}\n </Button>\n </div>\n </div>\n </div>\n );\n }\n);\n","import { FC, PropsWithChildren, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { cn } from 'reablocks';\n\ninterface SessionEmptyProps extends PropsWithChildren {\n}\n\nexport const SessionEmpty: FC<SessionEmptyProps> = ({\n children\n}) => {\n const { theme } = useContext(ChatContext);\n return <div className={cn(theme.empty)}>{children}</div>;\n};\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn, Ellipsis, DateFormat } from 'reablocks';\nimport { FC, PropsWithChildren, useContext } from 'react';\n\nexport const SessionMessagesHeader: FC<PropsWithChildren> = ({ children }) => {\n const { activeSession, theme } = useContext(ChatContext);\n const Comp = children ? Slot : 'header';\n\n if (!activeSession) {\n return null;\n }\n\n return (\n <Comp className={cn(theme.messages.header)}>\n {children || (\n <>\n <h2 className={cn(theme.messages.title)}>\n <Ellipsis limit={125} value={activeSession.title} />\n </h2>\n <DateFormat\n className={cn(theme.messages.date)}\n date={activeSession.createdAt}\n />\n </>\n )}\n </Comp>\n );\n};\n","import * as React from \"react\";\nconst SvgBack = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-chevron-left\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m15 18-6-6 6-6\" }));\nexport default SvgBack;\n","import { FC, PropsWithChildren, useContext } from 'react';\nimport { Button, cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { motion } from 'motion/react';\nimport BackIcon from '@/assets/back.svg?react';\n\ninterface SessionMessagePanelProps extends PropsWithChildren {\n allowBack?: boolean;\n}\n\nexport const SessionMessagePanel: FC<SessionMessagePanelProps> = ({\n children,\n allowBack = true\n}) => {\n const { activeSessionId, theme, isCompact, selectSession, viewType } =\n useContext(ChatContext);\n const isVisible =\n (isCompact && activeSessionId) || viewType === 'chat' || !isCompact;\n\n return (\n isVisible && (\n <motion.div\n initial={{ translateX: '200%' }}\n animate={{\n translateX: '0%',\n transition: {\n type: 'tween',\n ease: 'linear',\n duration: 0.2,\n when: 'beforeChildren'\n }\n }}\n exit={{ translateX: '200%' }}\n className={cn(theme.messages.base, {\n [theme.messages.companion]: isCompact,\n [theme.messages.console]: !isCompact\n })}\n >\n <div className={cn(theme.messages.inner)}>\n {allowBack && isCompact && viewType !== 'chat' && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => selectSession(null)}\n className={cn(theme.messages.back)}\n >\n <BackIcon />\n Back\n </Button>\n )}\n {children}\n </div>\n </motion.div>\n )\n );\n};\n","import * as React from \"react\";\nconst SvgCopy = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-copy\", ...props }, /* @__PURE__ */ React.createElement(\"rect\", { width: 14, height: 14, x: 8, y: 8, rx: 2, ry: 2 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" }));\nexport default SvgCopy;\n","export const dark = {\n 'code[class*=\"language-\"]': {\n 'background': '#11111f',\n 'color': '#e2e8f0',\n 'textShadow': '0 1px rgba(0, 0, 0, 0.3)',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none'\n },\n 'pre[class*=\"language-\"]': {\n 'background': '#11111f',\n 'color': '#e2e8f0',\n 'textShadow': '0 1px rgba(0, 0, 0, 0.3)',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none',\n 'padding': '1em',\n 'margin': '0',\n 'overflow': 'auto'\n },\n 'code[class*=\"language-\"]::-moz-selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::-moz-selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::-moz-selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"]::selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n ':not(pre) > code[class*=\"language-\"]': {\n 'padding': '0.2em 0.3em',\n 'borderRadius': '0.3em',\n 'whiteSpace': 'normal'\n },\n 'comment': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n 'prolog': {\n 'color': '#64748b'\n },\n 'cdata': {\n 'color': '#64748b'\n },\n 'doctype': {\n 'color': '#e2e8f0'\n },\n 'punctuation': {\n 'color': '#e2e8f0'\n },\n 'entity': {\n 'color': '#3b82f6',\n 'cursor': 'help'\n },\n 'attr-name': {\n 'color': '#f59e0b'\n },\n 'class-name': {\n 'color': '#f59e0b'\n },\n 'boolean': {\n 'color': '#3b82f6'\n },\n 'constant': {\n 'color': '#3b82f6'\n },\n 'number': {\n 'color': '#3b82f6'\n },\n 'atrule': {\n 'color': '#f59e0b'\n },\n 'keyword': {\n 'color': '#f472b6'\n },\n 'property': {\n 'color': '#3b82f6'\n },\n 'tag': {\n 'color': '#3b82f6'\n },\n 'symbol': {\n 'color': '#3b82f6'\n },\n 'deleted': {\n 'color': '#ef4444'\n },\n 'important': {\n 'color': '#f472b6'\n },\n 'selector': {\n 'color': '#10b981'\n },\n 'string': {\n 'color': '#10b981'\n },\n 'char': {\n 'color': '#10b981'\n },\n 'builtin': {\n 'color': '#10b981'\n },\n 'inserted': {\n 'color': '#10b981'\n },\n 'regex': {\n 'color': '#10b981'\n },\n 'attr-value': {\n 'color': '#10b981'\n },\n 'attr-value > .token.punctuation': {\n 'color': '#10b981'\n },\n 'variable': {\n 'color': '#60a5fa'\n },\n 'operator': {\n 'color': '#60a5fa'\n },\n 'function': {\n 'color': '#60a5fa'\n },\n 'url': {\n 'color': '#60a5fa'\n },\n 'attr-value > .token.punctuation.attr-equals': {\n 'color': '#e2e8f0'\n },\n 'special-attr > .token.attr-value > .token.value.css': {\n 'color': '#e2e8f0'\n },\n '.language-css .token.selector': {\n 'color': '#3b82f6'\n },\n '.language-css .token.property': {\n 'color': '#e2e8f0'\n },\n '.language-css .token.function': {\n 'color': '#60a5fa'\n },\n '.language-css .token.url > .token.function': {\n 'color': '#60a5fa'\n },\n '.language-css .token.url > .token.string.url': {\n 'color': '#10b981'\n },\n '.language-css .token.important': {\n 'color': '#f472b6'\n },\n '.language-css .token.atrule .token.rule': {\n 'color': '#f472b6'\n },\n '.language-javascript .token.operator': {\n 'color': '#f472b6'\n },\n '.language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation': {\n 'color': '#ef4444'\n },\n '.language-json .token.operator': {\n 'color': '#e2e8f0'\n },\n '.language-json .token.null.keyword': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url': {\n 'color': '#e2e8f0'\n },\n '.language-markdown .token.url > .token.operator': {\n 'color': '#e2e8f0'\n },\n '.language-markdown .token.url-reference.url > .token.string': {\n 'color': '#e2e8f0'\n },\n '.language-markdown .token.url > .token.content': {\n 'color': '#60a5fa'\n },\n '.language-markdown .token.url > .token.url': {\n 'color': '#60a5fa'\n },\n '.language-markdown .token.url-reference.url': {\n 'color': '#60a5fa'\n },\n '.language-markdown .token.blockquote.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.hr.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.code-snippet': {\n 'color': '#10b981'\n },\n '.language-markdown .token.bold .token.content': {\n 'color': '#f59e0b'\n },\n '.language-markdown .token.italic .token.content': {\n 'color': '#f472b6'\n },\n '.language-markdown .token.strike .token.content': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.strike .token.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.list.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.title.important > .token.punctuation': {\n 'color': '#3b82f6'\n },\n 'bold': {\n 'fontWeight': 'bold'\n },\n 'italic': {\n 'fontStyle': 'italic'\n },\n 'namespace': {\n 'Opacity': '0.8'\n },\n 'token.tab:not(:empty):before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'token.cr:before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'token.lf:before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'token.space:before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item': {\n 'marginRight': '0.4em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button': {\n 'background': '#1e293b',\n 'color': '#94a3b8',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a': {\n 'background': '#1e293b',\n 'color': '#94a3b8',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span': {\n 'background': '#1e293b',\n 'color': '#94a3b8',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n '.line-highlight.line-highlight': {\n 'background': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-highlight.line-highlight:before': {\n 'background': '#1e293b',\n 'color': '#e2e8f0',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.2)'\n },\n '.line-highlight.line-highlight[data-end]:after': {\n 'background': '#1e293b',\n 'color': '#e2e8f0',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.2)'\n },\n 'pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before': {\n 'backgroundColor': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-numbers.line-numbers .line-numbers-rows': {\n 'borderRightColor': '#1e293b'\n },\n '.command-line .command-line-prompt': {\n 'borderRightColor': '#1e293b'\n },\n '.line-numbers .line-numbers-rows > span:before': {\n 'color': '#64748b'\n },\n '.command-line .command-line-prompt > span:before': {\n 'color': '#64748b'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-1': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-5': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-9': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-2': {\n 'color': '#10b981'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-6': {\n 'color': '#10b981'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-10': {\n 'color': '#10b981'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-3': {\n 'color': '#60a5fa'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-7': {\n 'color': '#60a5fa'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-11': {\n 'color': '#60a5fa'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-4': {\n 'color': '#f472b6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-8': {\n 'color': '#f472b6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-12': {\n 'color': '#f472b6'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n '.prism-previewer.prism-previewer:before': {\n 'borderColor': '#11111f'\n },\n '.prism-previewer-gradient.prism-previewer-gradient div': {\n 'borderColor': '#11111f',\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-color.prism-previewer-color:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-easing.prism-previewer-easing:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer.prism-previewer:after': {\n 'borderTopColor': '#11111f'\n },\n '.prism-previewer-flipped.prism-previewer-flipped.after': {\n 'borderBottomColor': '#11111f'\n },\n '.prism-previewer-angle.prism-previewer-angle:before': {\n 'background': '#1e293b'\n },\n '.prism-previewer-time.prism-previewer-time:before': {\n 'background': '#1e293b'\n },\n '.prism-previewer-easing.prism-previewer-easing': {\n 'background': '#1e293b'\n },\n '.prism-previewer-angle.prism-previewer-angle circle': {\n 'stroke': '#e2e8f0',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-time.prism-previewer-time circle': {\n 'stroke': '#e2e8f0',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-easing.prism-previewer-easing circle': {\n 'stroke': '#e2e8f0',\n 'fill': 'transparent'\n },\n '.prism-previewer-easing.prism-previewer-easing path': {\n 'stroke': '#e2e8f0'\n },\n '.prism-previewer-easing.prism-previewer-easing line': {\n 'stroke': '#e2e8f0'\n }\n}\n","export const light = {\n 'code[class*=\"language-\"]': {\n 'background': '#fff',\n 'color': '#1e293b',\n 'textShadow': 'none',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none'\n },\n 'pre[class*=\"language-\"]': {\n 'background': '#fff',\n 'color': '#1e293b',\n 'textShadow': 'none',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none',\n 'padding': '1em',\n 'margin': '0.5em 0',\n 'overflow': 'auto',\n 'borderRadius': '0.3em',\n 'border': '1px solid #e2e8f0'\n },\n 'code[class*=\"language-\"]::-moz-selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::-moz-selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::-moz-selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"]::selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n ':not(pre) > code[class*=\"language-\"]': {\n 'padding': '0.2em 0.3em',\n 'borderRadius': '0.3em',\n 'whiteSpace': 'normal',\n 'background': '#f1f5f9'\n },\n 'comment': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n 'prolog': {\n 'color': '#64748b'\n },\n 'cdata': {\n 'color': '#64748b'\n },\n 'doctype': {\n 'color': '#1e293b'\n },\n 'punctuation': {\n 'color': '#64748b'\n },\n 'entity': {\n 'color': '#3b82f6',\n 'cursor': 'help'\n },\n 'attr-name': {\n 'color': '#ea580c'\n },\n 'class-name': {\n 'color': '#ea580c'\n },\n 'boolean': {\n 'color': '#3b82f6'\n },\n 'constant': {\n 'color': '#3b82f6'\n },\n 'number': {\n 'color': '#3b82f6'\n },\n 'atrule': {\n 'color': '#ea580c'\n },\n 'keyword': {\n 'color': '#9333ea'\n },\n 'property': {\n 'color': '#3b82f6'\n },\n 'tag': {\n 'color': '#3b82f6'\n },\n 'symbol': {\n 'color': '#3b82f6'\n },\n 'deleted': {\n 'color': '#dc2626'\n },\n 'important': {\n 'color': '#9333ea'\n },\n 'selector': {\n 'color': '#16a34a'\n },\n 'string': {\n 'color': '#16a34a'\n },\n 'char': {\n 'color': '#16a34a'\n },\n 'builtin': {\n 'color': '#16a34a'\n },\n 'inserted': {\n 'color': '#16a34a'\n },\n 'regex': {\n 'color': '#16a34a'\n },\n 'attr-value': {\n 'color': '#16a34a'\n },\n 'attr-value > .token.punctuation': {\n 'color': '#16a34a'\n },\n 'variable': {\n 'color': '#3b82f6'\n },\n 'operator': {\n 'color': '#3b82f6'\n },\n 'function': {\n 'color': '#3b82f6'\n },\n 'url': {\n 'color': '#3b82f6'\n },\n 'attr-value > .token.punctuation.attr-equals': {\n 'color': '#64748b'\n },\n 'special-attr > .token.attr-value > .token.value.css': {\n 'color': '#1e293b'\n },\n '.language-css .token.selector': {\n 'color': '#3b82f6'\n },\n '.language-css .token.property': {\n 'color': '#1e293b'\n },\n '.language-css .token.function': {\n 'color': '#3b82f6'\n },\n '.language-css .token.url > .token.function': {\n 'color': '#3b82f6'\n },\n '.language-css .token.url > .token.string.url': {\n 'color': '#16a34a'\n },\n '.language-css .token.important': {\n 'color': '#9333ea'\n },\n '.language-css .token.atrule .token.rule': {\n 'color': '#9333ea'\n },\n '.language-javascript .token.operator': {\n 'color': '#9333ea'\n },\n '.language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation': {\n 'color': '#dc2626'\n },\n '.language-json .token.operator': {\n 'color': '#1e293b'\n },\n '.language-json .token.null.keyword': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url': {\n 'color': '#1e293b'\n },\n '.language-markdown .token.url > .token.operator': {\n 'color': '#1e293b'\n },\n '.language-markdown .token.url-reference.url > .token.string': {\n 'color': '#1e293b'\n },\n '.language-markdown .token.url > .token.content': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url > .token.url': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url-reference.url': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.blockquote.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.hr.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.code-snippet': {\n 'color': '#16a34a'\n },\n '.language-markdown .token.bold .token.content': {\n 'color': '#ea580c'\n },\n '.language-markdown .token.italic .token.content': {\n 'color': '#9333ea'\n },\n '.language-markdown .token.strike .token.content': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.strike .token.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.list.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.title.important > .token.punctuation': {\n 'color': '#3b82f6'\n },\n 'bold': {\n 'fontWeight': 'bold'\n },\n 'italic': {\n 'fontStyle': 'italic'\n },\n 'namespace': {\n 'Opacity': '0.8'\n },\n 'token.tab:not(:empty):before': {\n 'color': '#94a3b8'\n },\n 'token.cr:before': {\n 'color': '#94a3b8'\n },\n 'token.lf:before': {\n 'color': '#94a3b8'\n },\n 'token.space:before': {\n 'color': '#94a3b8'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item': {\n 'marginRight': '0.4em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button': {\n 'background': '#f1f5f9',\n 'color': '#475569',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a': {\n 'background': '#f1f5f9',\n 'color': '#475569',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span': {\n 'background': '#f1f5f9',\n 'color': '#475569',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n '.line-highlight.line-highlight': {\n 'background': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-highlight.line-highlight:before': {\n 'background': '#f1f5f9',\n 'color': '#1e293b',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.1)'\n },\n '.line-highlight.line-highlight[data-end]:after': {\n 'background': '#f1f5f9',\n 'color': '#1e293b',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.1)'\n },\n 'pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before': {\n 'backgroundColor': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-numbers.line-numbers .line-numbers-rows': {\n 'borderRightColor': '#e2e8f0'\n },\n '.command-line .command-line-prompt': {\n 'borderRightColor': '#e2e8f0'\n },\n '.line-numbers .line-numbers-rows > span:before': {\n 'color': '#94a3b8'\n },\n '.command-line .command-line-prompt > span:before': {\n 'color': '#94a3b8'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-1': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-5': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-9': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-2': {\n 'color': '#16a34a'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-6': {\n 'color': '#16a34a'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-10': {\n 'color': '#16a34a'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-3': {\n 'color': '#ea580c'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-7': {\n 'color': '#ea580c'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-11': {\n 'color': '#ea580c'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-4': {\n 'color': '#9333ea'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-8': {\n 'color': '#9333ea'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-12': {\n 'color': '#9333ea'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n '.prism-previewer.prism-previewer:before': {\n 'borderColor': '#fff'\n },\n '.prism-previewer-gradient.prism-previewer-gradient div': {\n 'borderColor': '#fff',\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-color.prism-previewer-color:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-easing.prism-previewer-easing:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer.prism-previewer:after': {\n 'borderTopColor': '#fff'\n },\n '.prism-previewer-flipped.prism-previewer-flipped.after': {\n 'borderBottomColor': '#fff'\n },\n '.prism-previewer-angle.prism-previewer-angle:before': {\n 'background': '#f1f5f9'\n },\n '.prism-previewer-time.prism-previewer-time:before': {\n 'background': '#f1f5f9'\n },\n '.prism-previewer-easing.prism-previewer-easing': {\n 'background': '#f1f5f9'\n },\n '.prism-previewer-angle.prism-previewer-angle circle': {\n 'stroke': '#1e293b',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-time.prism-previewer-time circle': {\n 'stroke': '#1e293b',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-easing.prism-previewer-easing circle': {\n 'stroke': '#1e293b',\n 'fill': 'transparent'\n },\n '.prism-previewer-easing.prism-previewer-easing path': {\n 'stroke': '#1e293b'\n },\n '.prism-previewer-easing.prism-previewer-easing line': {\n 'stroke': '#1e293b'\n }\n}\n","import { Button, cn } from 'reablocks';\nimport type { FC, PropsWithChildren, ReactElement } from 'react';\nimport React from 'react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\n\nimport CopyIcon from '@/assets/copy.svg?react';\n\nimport { dark } from './themes';\n\nexport interface CodeHighlighterProps extends PropsWithChildren {\n /**\n * The class name to apply to the code block.\n */\n className?: string;\n\n /**\n * The class name to apply to the inline code.\n */\n inlineClassName?: string;\n\n /**\n * The language of the code block.\n */\n language?: string;\n\n /**\n * The class name to apply to the copy button.\n */\n copyClassName?: string;\n\n /**\n * The class name to apply to the toolbar.\n */\n toolbarClassName?: string;\n\n /**\n * Icon to show for copy.\n */\n copyIcon?: ReactElement;\n\n /**\n * The theme to use for the code block.\n */\n theme?: Record<string, string>;\n}\n\nexport const CodeHighlighter: FC<CodeHighlighterProps> = ({\n className,\n children,\n inlineClassName,\n copyClassName,\n copyIcon = <CopyIcon />,\n language,\n toolbarClassName,\n theme = dark,\n ...props\n}) => {\n const match = language?.match(/language-(\\w+)/);\n const lang = match ? match[1] : 'text';\n // If we can't match a language type, its probably not a code block\n const isInline = !match;\n\n const handleCopy = (text: string) => {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n console.log('Text copied to clipboard');\n })\n .catch(err => {\n console.error('Could not copy text: ', err);\n });\n };\n\n if (isInline) {\n return (\n <code className={cn(inlineClassName)} {...props}>\n {children}\n </code>\n );\n }\n\n return (\n <div className={cn('relative', className)}>\n <div className={cn(toolbarClassName)}>\n <div>{lang}</div>\n {copyIcon && (\n <Button\n className={cn(copyClassName)}\n size=\"small\"\n variant=\"text\"\n title=\"Copy code\"\n onClick={() => handleCopy(children as string)}\n >\n {copyIcon}\n </Button>\n )}\n </div>\n <SyntaxHighlighter language={lang} style={theme}>\n {children}\n </SyntaxHighlighter>\n </div>\n );\n};\n","import React, { FC, PropsWithChildren } from 'react';\n\nexport const TableComponent: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableElement>>> = ({ children, ...props }) => (\n <table {...props}>\n {children}\n </table>\n);\n\nexport const TableHeaderCell: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableHeaderCellElement>>> = ({ children, ...props }) => (\n <th {...props}>\n {children}\n </th>\n);\n\nexport const TableDataCell: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableDataCellElement>>> = ({ children, ...props }) => (\n <td {...props}>\n {children}\n </td>\n);\n","import './Markdown.css';\n\nimport { cn, Redact } from 'reablocks';\nimport type { FC, PropsWithChildren } from 'react';\nimport { useContext, useMemo } from 'react';\nimport ReactMarkdown, { Components } from 'react-markdown';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport type { Plugin } from 'unified';\n\nimport { ChatContext } from '@/ChatContext';\nimport type { ChatTheme } from '@/theme';\n\nimport { CodeHighlighter } from './CodeHighlighter';\nimport { TableComponent, TableDataCell, TableHeaderCell } from './Table';\n\ninterface MarkdownWrapperProps extends PropsWithChildren {\n /**\n * Remark plugins to apply to the markdown content.\n */\n remarkPlugins?: Plugin[];\n\n /**\n * Rehype plugins to apply to the markdown content.\n */\n rehypePlugins?: Plugin[];\n\n /**\n * Theme to apply to the markdown content.\n */\n theme?: ChatTheme;\n\n /**\n * Custom components to override default markdown rendering.\n * These will be merged with the default components.\n */\n customComponents?: Components;\n}\n\nexport const Markdown: FC<MarkdownWrapperProps> = ({\n children,\n remarkPlugins,\n rehypePlugins = [rehypeRaw, rehypeKatex],\n theme: themeProp,\n customComponents\n}) => {\n const { theme: contextTheme, markdownComponents } = useContext(ChatContext);\n const theme = themeProp || contextTheme;\n\n const components = useMemo<Components>(() => {\n const defaultComponents: Record<string, any> = {\n code: ({ className, children, ...props }) => (\n <CodeHighlighter\n {...props}\n language={cn(className)}\n inlineClassName={cn(theme.messages.message.markdown.inlineCode)}\n className={cn(theme.messages.message.markdown.code, className)}\n copyClassName={cn(theme.messages.message.markdown.copy)}\n toolbarClassName={cn(theme.messages.message.markdown.toolbar)}\n >\n {children}\n </CodeHighlighter>\n ),\n table: props => (\n <TableComponent\n {...props}\n className={cn(theme.messages.message.markdown.table)}\n />\n ),\n th: props => (\n <TableHeaderCell\n {...props}\n className={cn(theme.messages.message.markdown.th)}\n />\n ),\n td: props => (\n <TableDataCell\n {...props}\n className={cn(theme.messages.message.markdown.td)}\n />\n ),\n a: props => (\n <a {...props} className={cn(theme.messages.message.markdown.a)} />\n ),\n hr: props => (\n <hr {...props} className={cn(theme.messages.message.markdown.hr)} />\n ),\n p: props => (\n <p {...props} className={cn(theme.messages.message.markdown.p)} />\n ),\n li: props => (\n <li {...props} className={cn(theme.messages.message.markdown.li)} />\n ),\n ul: props => (\n <ul {...props} className={cn(theme.messages.message.markdown.ul)} />\n ),\n ol: props => (\n <ol {...props} className={cn(theme.messages.message.markdown.ol)} />\n ),\n h1: props => (\n <h1 {...props} className={cn(theme.messages.message.markdown.h1)} />\n ),\n h2: props => (\n <h2 {...props} className={cn(theme.messages.message.markdown.h2)} />\n ),\n h3: props => (\n <h3 {...props} className={cn(theme.messages.message.markdown.h3)} />\n ),\n h4: props => (\n <h4 {...props} className={cn(theme.messages.message.markdown.h4)} />\n ),\n h5: props => (\n <h5 {...props} className={cn(theme.messages.message.markdown.h5)} />\n ),\n h6: props => (\n <h6 {...props} className={cn(theme.messages.message.markdown.h6)} />\n ),\n // 'redact' is a custom element created by remarkRedact, not a standard\n // HTML tag, so it falls outside react-markdown's Components type.\n redact: ((props: Record<string, unknown>) => (\n <Redact\n value={\n (props['data-redact-value'] as string) || (props.children as string)\n }\n allowToggle={true}\n tooltipText={`${(props['data-redact-name'] as string) || 'Sensitive'} information - Click to toggle`}\n />\n )) as unknown\n };\n\n // Merge: defaults < context components < prop components\n return {\n ...defaultComponents,\n ...markdownComponents,\n ...customComponents\n };\n }, [theme, markdownComponents, customComponents]);\n\n return (\n <ReactMarkdown\n remarkPlugins={remarkPlugins as Plugin[]}\n rehypePlugins={rehypePlugins as Plugin[]}\n components={components}\n >\n {children as string}\n </ReactMarkdown>\n );\n};\n","import React, { FC, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\n\nexport interface ComponentErrorProps {\n /**\n * The visual style variant of the error display.\n * Defaults to 'error'.\n */\n variant?: 'error' | 'warning';\n\n /**\n * The heading text displayed at the top of the error.\n */\n title?: string;\n\n /**\n * The descriptive message explaining the error or warning.\n */\n message?: string;\n\n /**\n * The raw code or data that caused the error, displayed in a code block.\n */\n code?: string;\n}\n\nexport const ComponentError: FC<ComponentErrorProps> = ({\n variant = 'error',\n title,\n message,\n code\n}) => {\n const { theme } = useContext(ChatContext);\n const styles =\n variant === 'warning' ? theme.chart.warning : theme.chart.error;\n\n return (\n <div className={styles.base}>\n {title && <div className={styles.title}>{title}</div>}\n {message && <div>{message}</div>}\n {code && 'code' in styles && (\n <pre className={styles.code as string}>\n <code>{code}</code>\n </pre>\n )}\n </div>\n );\n};\n","import React, { FC, useMemo, useContext } from 'react';\nimport {\n BarChart,\n BarSeries,\n LineChart,\n LineSeries,\n AreaChart,\n AreaSeries,\n PieChart,\n PieArcSeries,\n RadialBarChart,\n RadialBarSeries,\n RadialAreaChart,\n RadialAreaSeries,\n SparklineChart,\n ChartShallowDataShape,\n LinearXAxis,\n LinearYAxis\n} from 'reaviz';\nimport { cn } from 'reablocks';\nimport type { ChartConfig, ChartType } from './types';\nimport { ChatContext } from '@/ChatContext';\nimport { ComponentError } from './ComponentError';\n\nexport interface ChartRendererProps {\n /**\n * The chart configuration.\n */\n config: ChartConfig;\n\n /**\n * The class name to apply to the chart container.\n */\n className?: string;\n}\n\nexport const ChartRenderer: FC<ChartRendererProps> = ({\n config,\n className\n}) => {\n const { theme } = useContext(ChatContext);\n const { type, data, width = 400, height = 300, title } = config;\n\n const chartElement = useMemo(() => {\n const chartData: ChartShallowDataShape[] = data\n .filter(\n (d): d is { key: string; data: number } => typeof d.data === 'number'\n )\n .map(d => ({\n key: d.key,\n data: d.data\n }));\n\n if (!chartData || chartData.length === 0) {\n return (\n <ComponentError variant=\"warning\" message=\"No chart data available\" />\n );\n }\n\n for (const point of chartData) {\n if (typeof point.data !== 'number' || isNaN(point.data)) {\n return (\n <ComponentError\n message={`Invalid data point: ${JSON.stringify(point)}`}\n />\n );\n }\n }\n\n const chartProps = {\n width,\n height,\n data: chartData\n };\n\n try {\n switch (type as ChartType) {\n case 'bar':\n return <BarChart {...chartProps} series={<BarSeries />} />;\n\n case 'line':\n return (\n <LineChart\n {...chartProps}\n xAxis={<LinearXAxis type=\"category\" />}\n yAxis={<LinearYAxis type=\"value\" />}\n series={<LineSeries />}\n />\n );\n\n case 'area':\n return (\n <AreaChart\n {...chartProps}\n xAxis={<LinearXAxis type=\"category\" />}\n yAxis={<LinearYAxis type=\"value\" />}\n series={<AreaSeries />}\n />\n );\n\n case 'pie':\n return (\n <PieChart\n width={width}\n height={height}\n data={chartData}\n series={<PieArcSeries />}\n />\n );\n\n case 'radialBar':\n return (\n <RadialBarChart\n width={width}\n height={height}\n data={chartData}\n series={<RadialBarSeries />}\n />\n );\n\n case 'radialArea':\n return (\n <RadialAreaChart\n width={width}\n height={height}\n data={chartData}\n series={<RadialAreaSeries />}\n />\n );\n\n case 'sparkline':\n return (\n <SparklineChart width={width} height={height} data={chartData} />\n );\n\n default:\n return <ComponentError message={`Unknown chart type: ${type}`} />;\n }\n } catch (error) {\n return (\n <ComponentError message={`Chart render error: ${String(error)}`} />\n );\n }\n }, [type, data, width, height]);\n\n return (\n <div className={cn(theme.chart.base, className)}>\n {title && <div className={theme.chart.title}>{title}</div>}\n <div className={theme.chart.content}>{chartElement}</div>\n </div>\n );\n};\n","import { findAndReplace } from 'mdast-util-find-and-replace';\n\nconst CVE_REGEX = /(CVE-(19|20)\\d{2}-\\d{4,7})/gi;\n\nexport function remarkCve() {\n return (tree, _file) => {\n findAndReplace(tree, [[\n CVE_REGEX,\n replaceCve as unknown as any\n ]]);\n };\n\n function replaceCve(value, id) {\n return [\n {\n type: 'link',\n url: `https://cve.mitre.org/cgi-bin/cvename.cgi?name=${id}`,\n children: [\n { children: [{ type: 'text', value: value.trim() }] }\n ]\n }\n ];\n }\n}\n","import type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\n\n/**\n * Options for the remarkComponent plugin.\n */\nexport interface RemarkComponentOptions {\n /**\n * The fenced-code-block language tag to detect.\n * @default 'component'\n */\n language?: string;\n}\n\n/**\n * A remark plugin that acts as a pass-through for fenced code blocks with\n * the configured language tag (default: `component`).\n *\n * The actual rendering is handled entirely by `ComponentPre` which\n * intercepts `<pre>` elements with a matching `language-{tag}` class.\n * This plugin exists as an integration point so the catalog can expose\n * a standard `remarkPlugin` property; it does not transform the AST.\n *\n * Usage in markdown:\n * ```component\n * { \"type\": \"WeatherCard\", \"props\": { \"city\": \"SF\", \"temperature\": 72 } }\n * ```\n */\nexport const remarkComponent: Plugin<[RemarkComponentOptions?], Root> = (\n _options = {}\n) => {\n // Intentional no-op — ComponentPre handles rendering via markdownComponents.\n return () => {};\n};\n","import { findAndReplace } from 'mdast-util-find-and-replace';\nimport type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\n\n/**\n * Interface for defining a redaction matcher.\n */\nexport interface RedactMatcher {\n /**\n * Name of the matcher (e.g., \"SSN\", \"Credit Card\", \"Bitcoin\").\n */\n name: string;\n\n /**\n * Regular expression pattern to match sensitive data.\n */\n pattern: RegExp;\n\n /**\n * Optional validation function that receives the matched value.\n * Return true to redact, false to skip.\n */\n validate?: (match: string) => boolean;\n}\n\n/**\n * Creates a remark plugin that redacts sensitive data based on provided matchers.\n * The plugin replaces matched text with HTML elements that can be rendered\n * using the Redact component from reablocks.\n *\n * @param matchers - Array of RedactMatcher objects that define what to redact\n * @returns A remark plugin function\n *\n * @example\n * ```ts\n * const matchers = [\n * { name: 'SSN', pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g }\n * ];\n * remarkPlugins={[remarkRedact(matchers)]}\n * ```\n */\nexport function remarkRedact(matchers: RedactMatcher[]): Plugin<[], Root> {\n return () => (tree: Root) => {\n if (!tree || !matchers || matchers.length === 0) {\n return;\n }\n\n const patterns: Array<[RegExp, (...args: any[]) => any]> = [];\n\n for (const { name, pattern, validate } of matchers) {\n patterns.push([\n pattern,\n (value: string) => {\n // Apply optional validation\n if (validate && !validate(value)) {\n return false;\n }\n\n return {\n type: 'html',\n value: `<redact data-redact-name=\"${name}\" data-redact-value=\"${value.replace(/\"/g, '&quot;')}\">${value}</redact>`\n };\n }\n ]);\n }\n\n // Apply all patterns at once\n if (patterns.length > 0) {\n try {\n findAndReplace(tree, patterns as any);\n } catch (err) {\n console.warn('Redact plugin error:', err);\n }\n }\n };\n}\n","import type { RedactMatcher } from './remarkRedact';\n\n/**\n * Matcher for Social Security Numbers (SSN).\n * Matches patterns like: 123-45-6789\n */\nexport const ssnMatcher: RedactMatcher = {\n name: 'SSN',\n pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g\n};\n\n/**\n * Matcher for Credit Card numbers.\n * Matches patterns like: 1234-5678-9012-3456 or 1234 5678 9012 3456\n * Supports common formats with spaces, dashes, or no separators.\n */\nexport const creditCardMatcher: RedactMatcher = {\n name: 'Credit Card',\n pattern: /\\b(?:\\d[ -]*?){13,19}\\b/g,\n validate: (match: string) => {\n // Exclude numbers that are clearly not credit cards\n if (/(?:years?|year|yr|yrs|old|age|phone|tel|call)/.test(match)) {\n return false;\n }\n\n const cardNumber = match.replace(/[ -]/g, '');\n // Basic length check to reduce false positives\n return cardNumber.length >= 13 && cardNumber.length <= 19;\n }\n};\n\n/**\n * Matcher for Bitcoin addresses.\n * Matches Bitcoin addresses (starts with 1 or 3, 26-35 alphanumeric characters).\n */\nexport const bitcoinMatcher: RedactMatcher = {\n name: 'Bitcoin',\n pattern: /\\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\\b/g\n};\n\n/**\n * Common redaction matchers for sensitive data.\n */\nexport const commonRedactMatchers: RedactMatcher[] = [\n ssnMatcher,\n creditCardMatcher,\n bitcoinMatcher\n];\n","import * as React from \"react\";\nconst SvgFile = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"currentColor\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M2.7036 1.37034C3.04741 1.02653 3.51373 0.833374 3.99996 0.833374H9.33329H9.33331C9.47275 0.833374 9.59885 0.890449 9.68954 0.98251L13.6843 4.97722C13.7763 5.0679 13.8333 5.19398 13.8333 5.33337L13.8333 5.3379V13.3334C13.8333 13.8196 13.6401 14.2859 13.2963 14.6297C12.9525 14.9736 12.4862 15.1667 12 15.1667H3.99996C3.51373 15.1667 3.04741 14.9736 2.7036 14.6297C2.35978 14.2859 2.16663 13.8196 2.16663 13.3334V2.66671C2.16663 2.18048 2.35978 1.71416 2.7036 1.37034ZM3.99996 1.83337H8.83331V5.33337C8.83331 5.60952 9.05717 5.83337 9.33331 5.83337H12.8333V13.3334C12.8333 13.5544 12.7455 13.7663 12.5892 13.9226C12.4329 14.0789 12.221 14.1667 12 14.1667H3.99996C3.77895 14.1667 3.56698 14.0789 3.4107 13.9226C3.25442 13.7663 3.16663 13.5544 3.16663 13.3334V2.66671C3.16663 2.44569 3.25442 2.23373 3.4107 2.07745C3.56698 1.92117 3.77895 1.83337 3.99996 1.83337ZM9.83331 2.5405L12.1262 4.83337H9.83331V2.5405ZM5.33331 8.16663C5.05717 8.16663 4.83331 8.39048 4.83331 8.66663C4.83331 8.94277 5.05717 9.16663 5.33331 9.16663H10.6666C10.9428 9.16663 11.1666 8.94277 11.1666 8.66663C11.1666 8.39048 10.9428 8.16663 10.6666 8.16663H5.33331ZM4.83331 11.3334C4.83331 11.0572 5.05717 10.8334 5.33331 10.8334H10.6666C10.9428 10.8334 11.1666 11.0572 11.1666 11.3334C11.1666 11.6095 10.9428 11.8334 10.6666 11.8334H5.33331C5.05717 11.8334 4.83331 11.6095 4.83331 11.3334ZM5.33331 5.5C5.05717 5.5 4.83331 5.72386 4.83331 6C4.83331 6.27614 5.05717 6.5 5.33331 6.5H6.66665C6.94279 6.5 7.16665 6.27614 7.16665 6C7.16665 5.72386 6.94279 5.5 6.66665 5.5H5.33331Z\" }));\nexport default SvgFile;\n","import { FC, useContext, ReactElement, Suspense, lazy, useMemo } from 'react';\nimport { ConversationFile } from '@/types';\nimport { ChatContext } from '@/ChatContext';\nimport { cn } from 'reablocks';\nimport FileIcon from '@/assets/file.svg?react';\n\nconst DefaultFileRenderer = lazy(() => import('./renderers/DefaultFileRenderer'));\nconst CSVFileRenderer = lazy(() => import('./renderers/CSVFileRenderer'));\nconst ImageFileRenderer = lazy(() => import('./renderers/ImageFileRenderer'));\nconst PDFFileRenderer = lazy(() => import('./renderers/PDFFileRenderer'));\n\nconst FILE_TYPE_RENDERER_MAP: { [key: string]: FC<any> } = {\n 'image/': ImageFileRenderer,\n 'text/csv': CSVFileRenderer,\n 'application/pdf': PDFFileRenderer,\n};\n\nexport interface MessageFileProps extends ConversationFile {\n /**\n * Icon to show for delete.\n */\n fileIcon?: ReactElement;\n\n /**\n * Limit for the name.\n */\n limit?: number;\n}\n\n/**\n * Base MessageFile component that routes to specific file renderers based on file type.\n */\nexport const MessageFile: FC<MessageFileProps> = ({\n name,\n type,\n url,\n limit = 100,\n fileIcon = <FileIcon />,\n}) => {\n const { theme } = useContext(ChatContext);\n\n // Based on the file type, we will render a specific file renderer.\n const FileRenderer = useMemo(() => {\n const Renderer =\n Object.keys(FILE_TYPE_RENDERER_MAP).find((key) => type?.startsWith(key)) ??\n 'default';\n return FILE_TYPE_RENDERER_MAP[Renderer] || DefaultFileRenderer;\n }, [type]);\n\n return (\n <div\n className={cn(theme.messages.message.files.file.base)}\n >\n <Suspense fallback={<div>Loading...</div>}>\n <FileRenderer name={name} url={url} fileIcon={fileIcon} limit={limit} />\n </Suspense>\n </div>\n );\n};\n","import { FC, ReactElement } from 'react';\nimport FileIcon from '@/assets/file.svg?react';\nimport { Ellipsis, cn } from 'reablocks';\n\ninterface DefaultFileRendererProps {\n /**\n * Limit for the name.\n */\n limit?: number;\n\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Default renderer for unspecified file types.\n */\nconst DefaultFileRenderer: FC<DefaultFileRendererProps> = ({\n name,\n limit = 100,\n fileIcon = <FileIcon />,\n}) => (\n <figure className=\"flex items-center gap-2\">\n {fileIcon}\n {name && (\n <figcaption className={cn('file-name-class')}>\n <Ellipsis value={name} limit={limit} />\n </figcaption>\n )}\n </figure>\n);\n\nexport default DefaultFileRenderer;\n","\n/**\n * Sanitizes cell content to prevent CSV injection and other potential vulnerabilities.\n * Based on the documentation of OWASP for CSV Injection\n * https://owasp.org/www-community/attacks/CSV_Injection\n * @param cell The cell content to sanitize.\n * @returns The sanitized cell content.\n */\nexport const sanitizeSVGCell = (cell: string): string => {\n const trimmed = cell.trim();\n // Escape double quotes by doubling them\n const escaped = trimmed.replace(/\"/g, '\"\"');\n // Add single quote prefix only for potentially dangerous content\n const prefix = /^[=+\\-@]/.test(trimmed) ? '\\'' : '';\n // Only wrap in quotes if the content contains special characters\n const needsQuotes = /[\",\\n\\r]/.test(escaped) || prefix;\n\n return needsQuotes ? `\"${prefix}${escaped}\"` : escaped;\n};\n","import { sanitizeSVGCell } from './sanitize';\n\n/**\n * Parses a CSV string from a local file and returns an array of rows.\n * Sanitizes cell data to prevent injection attacks.\n * @param csvString The raw CSV string content to parse.\n * @returns The parsed CSV data as a 2D array of strings.\n */\nexport const parseCSV = (csvString: string): string[][] => {\n try {\n const rows = csvString.split('\\n');\n return rows.map((row) => row.split(',').map((cell) => sanitizeSVGCell(cell)));\n } catch (error) {\n console.error('Error parsing CSV:', error);\n throw new Error('Failed to parse CSV file.');\n }\n};\n","import * as React from \"react\";\nconst SvgDownload = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-cloud-download\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12 12v9\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"m8 17 4 4 4-4\" }));\nexport default SvgDownload;\n","import { FC, useEffect, useState, ReactElement, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { parseCSV } from '@/utils/parseCSV';\nimport DownloadIcon from '@/assets/download.svg?react';\nimport PlaceholderIcon from '@/assets/copy.svg?react';\nimport { IconButton } from 'reablocks';\n\ninterface CSVFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Renderer for CSV files that fetches and displays a snippet of the file data.\n */\nconst CSVFileRenderer: FC<CSVFileRendererProps> = ({ name, url, fileIcon }) => {\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [csvData, setCsvData] = useState<string[][]>([]);\n const [error, setError] = useState<string | null>(null);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const modalRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const fetchCsvData = async () => {\n try {\n setIsLoading(true);\n const response = await fetch(url);\n const data = parseCSV(await response.text());\n setCsvData(data);\n } catch {\n setError('Failed to load CSV file.');\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchCsvData();\n }, [url]);\n\n const toggleModal = () => {\n setIsModalOpen(prev => !prev);\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (modalRef.current && !modalRef.current.contains(event.target as Node)) {\n setIsModalOpen(false);\n }\n };\n\n useEffect(() => {\n if (isModalOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n } else {\n document.removeEventListener('mousedown', handleClickOutside);\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isModalOpen]);\n\n const downloadCSV = () => {\n if (csvData.length === 0) return;\n\n const csvContent = csvData.map(row => row.join(',')).join('\\n');\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', `${name || 'data'}`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n const renderTable = (data: string[][], maxRows?: number) => (\n <motion.table\n layout\n className=\"w-full\"\n transition={{ type: 'spring', stiffness: 100, damping: 20 }}\n >\n <thead className=\"sticky top-0 bg-gray-200 dark:bg-gray-800 z-10\">\n <tr>\n <th className=\"py-4 px-6\">#</th>\n {data[0].map((header, index) => (\n <th key={`header-${index}`} className=\"py-4 px-6\">\n {header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.slice(1, maxRows).map((row, rowIndex) => (\n <tr\n key={`row-${rowIndex}`}\n className=\"border-b border-panel-accent light:border-gray-700 hover:bg-panel-accent hover:light:bg-gray-700/40 transition-colors text-base\"\n >\n <td className=\"py-4 px-6\">{rowIndex + 1}</td>\n {row.map((cell, cellIndex) => (\n <td key={`cell-${rowIndex}-${cellIndex}`} className=\"py-4 px-6\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </motion.table>\n );\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center gap-4\">\n <div className=\"csv-icon flex items-center\">\n {fileIcon}\n {name && <figcaption className=\"ml-1\">{name}</figcaption>}\n </div>\n <div className=\"csv-icon flex items-center gap-6\">\n <IconButton size=\"small\" variant=\"text\" onClick={downloadCSV}>\n <DownloadIcon />\n </IconButton>\n <IconButton size=\"small\" variant=\"text\" onClick={toggleModal}>\n <PlaceholderIcon />\n </IconButton>\n </div>\n </div>\n\n {error && <div className=\"error-message\">{error}</div>}\n\n {isLoading && !csvData && (\n <div className=\"text-text-secondary\">Loading...</div>\n )}\n\n <div className=\"flex justify-between\">\n {!error && csvData.length > 0 && renderTable(csvData, 6)}\n </div>\n\n <AnimatePresence>\n {isModalOpen && (\n <motion.div\n className=\"fixed inset-0 bg-black/70 flex justify-center items-center z-50\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.3 }}\n >\n <motion.div\n ref={modalRef}\n className=\"bg-white dark:bg-gray-900 rounded-md w-11/12 h-5/6 overflow-auto\"\n initial={{ scale: 0.8 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0.8 }}\n transition={{ duration: 0.3 }}\n >\n {!error && csvData.length > 0 && renderTable(csvData)}\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n};\n\nexport default CSVFileRenderer;\n","import { FC } from 'react';\n\ninterface ImageFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n}\n\n/**\n * Renderer for image files.\n */\nconst ImageFileRenderer: FC<ImageFileRendererProps> = ({ url }) => (\n <img src={url} alt=\"Image\" className=\"size-10\" />\n);\n\nexport default ImageFileRenderer;\n","import { FC, ReactElement } from 'react';\n\ninterface PDFFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Renderer for PDF files.\n */\nconst PDFFileRenderer: FC<PDFFileRendererProps> = ({ name, url, fileIcon }) => (\n <figure className=\"csv-icon flex items-center gap-2\" onClick={() => window.open(url, '_blank')}>\n {fileIcon}\n {name && <figcaption className=\"file-name\">{name}</figcaption>}\n </figure>\n);\n\nexport default PDFFileRenderer;\n","import { ChatContext } from '@/ChatContext';\nimport { ConversationFile } from '@/types';\nimport { cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext, useMemo, useState } from 'react';\nimport { MessageFile } from './MessageFile';\nimport { Slot } from '@radix-ui/react-slot';\n\ninterface MessageFilesProps extends PropsWithChildren {\n /**\n * Files to render.\n */\n files: ConversationFile[];\n}\n\nexport const MessageFiles = memo<MessageFilesProps>(({ files, children }) => {\n const { theme } = useContext(ChatContext);\n const Comp = children ? Slot : MessageFile;\n const [expanded, setExpanded] = useState<boolean>(false);\n\n // Group image and other files\n const { imageFiles, otherFiles } = useMemo(() => {\n if (!files || files.length === 0) {\n return {\n imageFiles: [] as ConversationFile[],\n otherFiles: [] as ConversationFile[]\n };\n }\n return files.reduce(\n (acc, file) => {\n if (file.type?.startsWith('image/')) {\n acc.imageFiles.push(file);\n } else {\n acc.otherFiles.push(file);\n }\n return acc;\n },\n {\n imageFiles: [] as ConversationFile[],\n otherFiles: [] as ConversationFile[]\n }\n );\n }, [files]);\n\n if (!files || files.length === 0) {\n return null;\n }\n\n const maxImageLength = 3;\n const truncateImages = !expanded && imageFiles.length > maxImageLength;\n\n // Renders the image files based on the current expansion state\n const renderImageFiles = (images: ConversationFile[]) => {\n return truncateImages\n ? images.slice(0, maxImageLength).map((image, index) => (\n <figure\n key={index}\n className={index === 0 ? 'col-span-2 row-span-2' : 'relative'}\n >\n <img\n src={image.url}\n alt={image.name}\n className=\"relative w-full h-full object-cover rounded-lg\"\n />\n {index === maxImageLength - 1 && (\n <div\n className=\"absolute top-0 left-0 w-full h-full flex justify-center items-center bg-black bg-opacity-50 rounded-lg cursor-pointer\"\n onClick={() => setExpanded(true)}\n >\n +{(imageFiles.length - maxImageLength).toLocaleString()}\n </div>\n )}\n </figure>\n ))\n : images.map((image, index) => (\n <Comp key={index} {...image}>\n {children}\n </Comp>\n ));\n };\n\n return (\n <div\n className={cn(\n theme.messages.message.files.base,\n truncateImages ? 'grid grid-rows-2 grid-flow-col gap-2 w-1/3' : ''\n )}\n >\n {imageFiles.length > 0 && renderImageFiles(imageFiles)}\n\n {otherFiles.length > 0 &&\n otherFiles.map((file, index) => (\n <Comp key={index} {...file}>\n {children}\n </Comp>\n ))}\n </div>\n );\n});\n\nMessageFiles.displayName = 'MessageFiles';\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Button, cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext, useState } from 'react';\nimport { Markdown } from '@/Markdown';\nimport { Plugin } from 'unified';\nimport { MessageFiles } from './MessageFiles';\nimport { ConversationFile } from '@/types';\n\nexport interface MessageQuestionProps extends PropsWithChildren {\n /**\n * Question to render.\n */\n question: string;\n\n /**\n * Array of sources referenced in the conversation\n */\n files?: ConversationFile[];\n}\n\nexport const MessageQuestion = memo<MessageQuestionProps>(\n ({ children, ...props }) => {\n const { theme, remarkPlugins } = useContext(ChatContext);\n const { question, files } = props;\n const Comp = children ? Slot : 'div';\n const [expanded, setExpanded] = useState(false);\n const isLong = question.length > 500;\n\n return (\n <Comp\n className={cn(theme.messages.message.question, {\n [theme.messages.message.overlay]: isLong && !expanded\n })}\n {...props}\n >\n {children || (\n <>\n <MessageFiles files={files} />\n <Markdown remarkPlugins={remarkPlugins as Plugin[]} theme={theme}>\n {question}\n </Markdown>\n {isLong && !expanded && (\n <Button\n variant=\"link\"\n size=\"small\"\n className={theme.messages.message.expand}\n onClick={() => setExpanded(true)}\n >\n Show more\n </Button>\n )}\n </>\n )}\n </Comp>\n );\n }\n);\n\nMessageQuestion.displayName = 'MessageQuestion';\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { motion } from 'motion/react';\nimport { cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext } from 'react';\nimport { Markdown } from '@/Markdown';\nimport { Plugin } from 'unified';\n\nexport interface MessageResponseProps extends PropsWithChildren {\n /**\n * Response to render.\n */\n response: string;\n\n /**\n * Whether the response is loading.\n */\n isLoading?: boolean;\n}\n\nexport const MessageResponse = memo<MessageResponseProps>(\n ({ response, isLoading, children }) => {\n const { theme, isCompact, remarkPlugins } = useContext(ChatContext);\n const Comp = children ? Slot : 'div';\n return (\n <Comp\n data-compact={isCompact}\n className={cn(theme.messages.message.response)}\n >\n {children || (\n <>\n <Markdown remarkPlugins={remarkPlugins as Plugin[]} theme={theme}>\n {response}\n </Markdown>\n {isLoading && (\n <motion.div\n className={cn(theme.messages.message.cursor)}\n animate={{ opacity: [1, 0] }}\n transition={{\n duration: 0.7,\n repeat: Infinity,\n repeatType: 'reverse'\n }}\n />\n )}\n </>\n )}\n </Comp>\n );\n }\n);\n","import { FC, useContext } from 'react';\nimport { ConversationSource } from '@/types';\nimport { ChatContext } from '@/ChatContext';\nimport { Ellipsis, cn } from 'reablocks';\n\nexport interface MessageSourceProps extends ConversationSource {\n /**\n * Limit for the title.\n */\n limit?: number;\n}\n\nexport const MessageSource: FC<MessageSourceProps> = ({ title, url, image, limit = 50 }) => {\n const { theme, isCompact } = useContext(ChatContext);\n\n return (\n <figure\n className={cn(theme.messages.message.sources.source.base, {\n [theme.messages.message.sources.source.companion]: isCompact\n })}\n onClick={() => {\n if (url) {\n window.open(url, '_blank');\n }\n }}\n >\n {image && <img src={image} alt={title} className={cn(theme.messages.message.sources.source.image)} />}\n {(title || url) && (\n <figcaption>\n {title && (\n <span className={cn(theme.messages.message.sources.source.title)}>\n <Ellipsis value={title} limit={limit} />\n </span>\n )}\n {url && (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className={cn(theme.messages.message.sources.source.url)}>\n {url}\n </a>\n )}\n </figcaption>\n )}\n </figure>\n );\n};\n","import { ChatContext } from '@/ChatContext';\nimport { ConversationSource } from '@/types';\nimport { cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { MessageSource } from './MessageSource';\n\ninterface MessageSourcesProps extends PropsWithChildren {\n /**\n * Sources to render.\n */\n sources: ConversationSource[];\n}\n\nexport const MessageSources = memo<MessageSourcesProps>(\n ({ sources, children }) => {\n const { theme } = useContext(ChatContext);\n const Comp = children ? Slot : MessageSource;\n\n if (!sources || sources.length === 0) {\n return null;\n }\n\n return (\n <div className={cn(theme.messages.message.sources.base)}>\n {sources.map((source, index) => (\n <Comp key={index} {...source}>\n {children}\n </Comp>\n ))}\n </div>\n );\n }\n);\n\nMessageSources.displayName = 'MessageSources';\n","import * as React from \"react\";\nconst SvgThumbsDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-thumbs-down\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M17 14V2\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\" }));\nexport default SvgThumbsDown;\n","import * as React from \"react\";\nconst SvgThumbsUp = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-thumbs-up\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7 10v12\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\" }));\nexport default SvgThumbsUp;\n","import * as React from \"react\";\nconst SvgRefresh = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-refresh-ccw\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 3v5h5\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M16 16h5v5\" }));\nexport default SvgRefresh;\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn, IconButton } from 'reablocks';\nimport {\n memo,\n PropsWithChildren,\n ReactElement,\n ReactNode,\n useCallback,\n useContext\n} from 'react';\nimport CopyIcon from '@/assets/copy.svg?react';\nimport ThumbsDownIcon from '@/assets/thumbs-down.svg?react';\nimport ThumbUpIcon from '@/assets/thumbs-up.svg?react';\nimport RefreshIcon from '@/assets/refresh.svg?react';\n\nexport interface MessageActionsProps extends PropsWithChildren {\n /**\n * Question to be copied\n */\n question: string;\n\n /**\n * Response to be copied\n */\n response?: string;\n\n /**\n * Icon to show for copy.\n */\n copyIcon?: ReactElement;\n\n /**\n * Icon to show for thumbs up.\n */\n thumbsUpIcon?: ReactElement;\n\n /**\n * Icon to show for thumbs down.\n */\n thumbsDownIcon?: ReactElement;\n\n /**\n * Icon to show for refresh.\n */\n refreshIcon?: ReactElement;\n\n /**\n * Callback function to handle copying.\n */\n onCopy?: () => void;\n\n /**\n * Callback function to handle upvoting.\n */\n onUpvote?: () => void;\n\n /**\n * Callback function to handle downvoting.\n */\n onDownvote?: () => void;\n\n /**\n * Callback function to handle refreshing.\n */\n onRefresh?: () => void;\n}\n\nexport const MessageActions = memo<MessageActionsProps>(\n ({ children, ...props }) => {\n const { theme } = useContext(ChatContext);\n const {\n question,\n response,\n copyIcon = <CopyIcon />,\n thumbsUpIcon = <ThumbUpIcon />,\n thumbsDownIcon = <ThumbsDownIcon />,\n refreshIcon = <RefreshIcon />,\n onCopy,\n onUpvote,\n onDownvote,\n onRefresh\n } = props;\n const Comp = children ? Slot : 'div';\n\n const handleCopy = useCallback((text: string) => {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n console.log('Text copied to clipboard');\n })\n .catch(err => {\n console.error('Could not copy text: ', err);\n });\n }, []);\n\n const handleCopyClick = useCallback(() => {\n if (onCopy) {\n onCopy();\n } else {\n handleCopy(`${question}${response ? `\\n${response}` : ''}`);\n }\n }, [onCopy, handleCopy, question, response]);\n\n return (\n (copyIcon || thumbsDownIcon || thumbsUpIcon || refreshIcon) && (\n <Comp className={cn(theme.messages.message.footer.base)}>\n {children || (\n <>\n {copyIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Copy question and response\"\n className={cn(theme.messages.message.footer.copy)}\n onClick={handleCopyClick}\n >\n {copyIcon}\n </IconButton>\n )}\n {thumbsUpIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Upvote\"\n className={cn(theme.messages.message.footer.upvote)}\n onClick={onUpvote}\n >\n {thumbsUpIcon}\n </IconButton>\n )}\n {thumbsDownIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Downvote\"\n className={cn(theme.messages.message.footer.downvote)}\n onClick={onDownvote}\n >\n {thumbsDownIcon}\n </IconButton>\n )}\n {refreshIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Refresh\"\n className={cn(theme.messages.message.footer.refresh)}\n onClick={onRefresh}\n >\n {refreshIcon}\n </IconButton>\n )}\n </>\n )}\n </Comp>\n )\n );\n }\n);\n\nMessageActions.displayName = 'MessageActions';\n","import { memo, PropsWithChildren, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { Card, cn } from 'reablocks';\nimport { Conversation } from '@/types';\nimport { motion } from 'motion/react';\nimport { MessageQuestion } from './MessageQuestion';\nimport { MessageResponse } from './MessageResponse';\nimport { MessageSources } from './MessageSources';\nimport { MessageActions } from './MessageActions';\n\nconst messageVariants = {\n hidden: {\n opacity: 0,\n y: 20\n },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.3\n }\n }\n};\n\ninterface SessionMessageProps extends PropsWithChildren {\n /**\n * Class name to apply to the root element.\n */\n className?: string;\n\n /**\n * Conversation to render.\n */\n conversation: Conversation;\n\n /**\n * Whether the message is the last one in the list.\n * This let's the chat know when to show the loading cursor.\n */\n isLast?: boolean;\n}\n\nexport const SessionMessage = memo<SessionMessageProps>(\n ({ conversation, isLast, children, className }) => {\n const { theme, isLoading } = useContext(ChatContext);\n\n return (\n <motion.div key={conversation.id} variants={messageVariants}>\n <Card className={cn(theme.messages.message.base, className)}>\n {children || (\n <>\n <MessageQuestion\n question={conversation.question}\n files={conversation.files}\n />\n <MessageResponse\n response={conversation.response}\n isLoading={isLast && isLoading}\n />\n <MessageSources sources={conversation.sources} />\n <MessageActions\n question={conversation.question}\n response={conversation.response}\n />\n </>\n )}\n </Card>\n </motion.div>\n );\n }\n);\n\nSessionMessage.displayName = 'SessionMessage';\n","import * as React from \"react\";\nconst SvgArrowDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 20, viewBox: \"0 0 20 20\", fill: \"currentColor\", xmlns: \"http://www.w3.org/2000/svg\", className: \"shrink-0 mix-blend-luminosity\", \"aria-hidden\": \"true\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M10 3C10.2761 3.00006 10.5 3.2239 10.5 3.5V15.293L14.6465 11.1465C14.8418 10.9514 15.1583 10.9513 15.3536 11.1465C15.5487 11.3417 15.5486 11.6583 15.3536 11.8535L10.3535 16.8535C10.2598 16.9473 10.1326 17 10 17C9.90062 17 9.8042 16.9703 9.72268 16.916L9.64651 16.8535L4.6465 11.8535C4.45138 11.6582 4.45128 11.3417 4.6465 11.1465C4.84172 10.9513 5.15827 10.9514 5.35353 11.1465L9.50003 15.293V3.5C9.50003 3.22386 9.72389 3 10 3Z\" }));\nexport default SvgArrowDown;\n","import debounce from 'lodash/debounce.js';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { Button, cn, IconButton, useInfinityList } from 'reablocks';\nimport type { ReactNode, UIEventHandler } from 'react';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport ArrowDownIcon from '@/assets/arrow-down.svg?react';\nimport { ChatContext } from '@/ChatContext';\nimport type { Conversation } from '@/types';\n\nimport { SessionEmpty } from './SessionEmpty';\nimport { SessionMessage } from './SessionMessage/SessionMessage';\n\nconst containerVariants = {\n hidden: {},\n visible: {\n transition: {\n staggerChildren: 0.07,\n when: 'beforeChildren'\n }\n }\n};\n\ninterface SessionMessagesProps {\n /**\n * Class name to apply to the root element.\n */\n className?: string;\n\n /**\n * Content to display when there are no sessions selected or a new session is started.\n */\n newSessionContent?: string | ReactNode;\n\n /**\n * Limit the number of results returned. Clientside pagination.\n */\n limit?: number | null;\n\n /**\n * Text to display for the show more button.\n */\n showMoreText?: string;\n\n /**\n * Whether to automatically scroll to the bottom of the content.\n */\n autoScroll?: boolean;\n\n /**\n * Whether to display the scroll to bottom button.\n */\n showScrollBottomButton?: boolean;\n\n /**\n * Render function for the session messages.\n */\n children?: (conversations: Conversation[]) => ReactNode;\n\n /**\n * Whether to show the load more button.\n */\n showLoadMoreButton?: boolean;\n\n /**\n * Whether to disable the load more button.\n */\n loadMoreButtonDisabled?: boolean;\n\n /**\n * Scroll event handler.\n * @param e\n */\n onScroll?: UIEventHandler<HTMLDivElement>;\n\n /**\n * Load more event handler.\n */\n onLoadMore?: () => void;\n}\n\nexport const SessionMessages: React.FC<SessionMessagesProps> = ({\n children,\n newSessionContent,\n limit = 10,\n className,\n showMoreText = 'Show more',\n autoScroll = true,\n showLoadMoreButton = false,\n showScrollBottomButton,\n loadMoreButtonDisabled,\n onScroll,\n onLoadMore\n}) => {\n const { activeSession, theme } = useContext(ChatContext);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const messagesRef = useRef<HTMLDivElement | null>(null);\n const [isAnimating, setIsAnimating] = useState(true);\n const [iAtBottom, setIsAtBottom] = useState(true);\n\n useEffect(() => {\n if (!contentRef.current || !showScrollBottomButton) {\n return;\n }\n\n const handleScroll = debounce(() => {\n if (contentRef.current) {\n setIsAtBottom(\n contentRef.current.scrollHeight - contentRef.current.clientHeight ===\n contentRef.current.scrollTop\n );\n }\n }, 50);\n const currentRef = contentRef.current;\n currentRef.addEventListener('scroll', handleScroll);\n\n return () => currentRef.removeEventListener('scroll', handleScroll);\n }, [showScrollBottomButton]);\n\n useEffect(() => {\n if (contentRef.current && autoScroll) {\n // Scroll to the bottom of the content in animation queue\n requestAnimationFrame(\n () => (contentRef.current.scrollTop = contentRef.current.scrollHeight)\n );\n }\n // If we update the active session or load the page initially ( onAnimationComplete )\n // let's scroll to the bottom of the page.\n }, [activeSession, autoScroll, isAnimating]);\n\n const handleShowMore = () => {\n showNext(limit);\n requestAnimationFrame(() => (contentRef.current.scrollTop = 0));\n };\n\n const handleScrollToBottom = () => {\n if (contentRef.current) {\n contentRef.current.scrollTo({\n top: contentRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n };\n\n // Reverse the conversations so the last one is the first one\n const reversedConvos = useMemo(\n () => [...(activeSession?.conversations ?? [])].reverse(),\n [activeSession]\n );\n\n const { data, hasMore, showNext } = useInfinityList({\n items: reversedConvos,\n size: limit\n });\n\n // Reverse the data to the last one last now\n const reReversedConvo = useMemo(() => [...data].reverse(), [data]);\n\n // If we are not paging, just return the conversations\n const convosToRender = limit ? reReversedConvo : activeSession?.conversations;\n\n if (!activeSession) {\n return <SessionEmpty>{newSessionContent}</SessionEmpty>;\n }\n\n return (\n <div className={cn('relative flex-1 overflow-y-hidden', className)}>\n <div\n className={cn(theme.messages.content, className, 'h-full')}\n ref={contentRef}\n id={activeSession?.id}\n onScrollCapture={onScroll}\n >\n {(showLoadMoreButton || hasMore) && (\n <Button\n disabled={loadMoreButtonDisabled}\n variant=\"outline\"\n className={cn(theme.messages.showMore)}\n fullWidth\n onClick={onLoadMore ?? handleShowMore}\n >\n {showMoreText}\n </Button>\n )}\n <AnimatePresence>\n <motion.div\n ref={messagesRef}\n variants={containerVariants}\n key={activeSession?.id}\n initial=\"hidden\"\n animate=\"visible\"\n onAnimationComplete={() =>\n requestAnimationFrame(() => {\n setIsAnimating(false);\n if (contentRef.current && autoScroll) {\n contentRef.current.scrollTop =\n contentRef.current.scrollHeight;\n }\n })\n }\n >\n {children\n ? children(convosToRender)\n : convosToRender.map((conversation, index) => (\n <SessionMessage\n key={conversation.id}\n conversation={conversation}\n isLast={index === convosToRender.length - 1}\n />\n ))}\n </motion.div>\n </AnimatePresence>\n </div>\n <AnimatePresence>\n {!iAtBottom && showScrollBottomButton && (\n <motion.div\n initial={{ y: 100, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n exit={{ y: 100, opacity: 0 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className={theme.messages?.message?.scrollToBottom?.container}\n >\n <IconButton\n onClick={handleScrollToBottom}\n className={theme.messages?.message?.scrollToBottom?.button}\n size=\"small\"\n >\n <ArrowDownIcon />\n </IconButton>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport const useDimensions = () => {\n const [ref, setRef] = useState<HTMLElement | null>(null);\n const [width, setWidth] = useState<number | undefined>(undefined);\n const rafId = useRef<number | null>(null);\n\n const observe = useCallback((element: HTMLElement | null) => {\n if (element) setRef(element);\n }, []);\n\n useEffect(() => {\n if (!ref) return;\n\n const resizeObserver = new ResizeObserver(entries => {\n // Batch updates with requestAnimationFrame to avoid layout thrashing\n if (rafId.current !== null) {\n cancelAnimationFrame(rafId.current);\n }\n rafId.current = requestAnimationFrame(() => {\n for (const entry of entries) {\n setWidth(entry.contentRect.width);\n }\n rafId.current = null;\n });\n });\n\n resizeObserver.observe(ref);\n\n return () => {\n if (rafId.current !== null) {\n cancelAnimationFrame(rafId.current);\n rafId.current = null;\n }\n resizeObserver.disconnect();\n };\n }, [ref]);\n\n return { width, observe };\n};\n","import {\n CSSProperties,\n FC,\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport { useHotkeys } from 'reakeys';\nimport { cn, useComponentTheme } from 'reablocks';\nimport { Components } from 'react-markdown';\nimport { Session } from './types';\nimport { ChatTheme, chatTheme } from './theme';\nimport { ChatContext, ChatViewType } from './ChatContext';\nimport { Plugin } from 'unified';\nimport { AnimatePresence } from 'motion/react';\nimport { useDimensions } from './utils/useDimensions';\nimport remarkGfm from 'remark-gfm';\nimport remarkYoutube from 'remark-youtube';\nimport remarkMath from 'remark-math';\nimport type { ComponentCatalog } from './ComponentCatalog/types';\n\nconst defaultRemarkPlugins: Plugin[] = [remarkGfm, remarkYoutube, remarkMath];\n\nexport interface ChatProps extends PropsWithChildren {\n /**\n * The style to apply to the root element.\n */\n style?: CSSProperties;\n\n /**\n * The class name to apply to the root element.\n */\n className?: string;\n\n /**\n * The type of prompt to display.\n *\n * - Companion: Smaller prompt screen with session lists.\n * - Console: Full screen experience.\n * - Chat: Only chat, no sessions.\n */\n viewType?: ChatViewType;\n\n /**\n * The list of sessions to display.\n */\n sessions: Session[];\n\n /**\n * The ID of the currently active session.\n */\n activeSessionId?: string;\n\n /**\n * Custom theme for the chat.\n */\n theme?: ChatTheme;\n\n /**\n * Remark plugins to apply to the request/response.\n */\n remarkPlugins?: Plugin[];\n\n /**\n * Custom markdown components to override default rendering.\n * Use this to add support for custom elements like charts.\n */\n markdownComponents?: Components;\n\n /**\n * A component catalog created via `componentCatalog()`.\n * Enables dynamic component rendering from LLM responses using\n * fenced code blocks (e.g. ```component).\n *\n * This automatically wires in the necessary remark plugin and\n * markdown component overrides. For advanced control, use the\n * catalog's `remarkPlugin` and `components` properties directly\n * via the `remarkPlugins` and `markdownComponents` props instead.\n */\n components?: ComponentCatalog;\n\n /**\n * Whether to display a loading state.\n */\n isLoading?: boolean;\n\n /**\n * Whether to disable the chat.\n */\n disabled?: boolean;\n\n /**\n * Callback function to handle when a session is selected.\n */\n onSelectSession?: (sessionId: string) => void;\n\n /**\n * Callback function to handle when a session is deleted.\n */\n onDeleteSession?: (sessionId: string) => void;\n\n /**\n * Callback function to handle creating a new session.\n */\n onNewSession?: () => void;\n\n /**\n * Callback function to handle sending a new message.\n */\n onSendMessage?: (message: string) => void;\n\n /**\n * Callback function to handle stopping the current action.\n */\n onStopMessage?: () => void;\n\n /**\n * Callback function to handle file upload.\n */\n onFileUpload?: (file: File) => void;\n}\n\nexport const Chat: FC<ChatProps> = ({\n children,\n viewType = 'console',\n sessions,\n onSelectSession,\n onDeleteSession,\n onSendMessage,\n onStopMessage,\n onFileUpload,\n isLoading,\n activeSessionId,\n theme: customTheme = chatTheme,\n onNewSession,\n remarkPlugins = defaultRemarkPlugins,\n markdownComponents,\n components: componentCatalog,\n disabled,\n style,\n className\n}) => {\n const theme = useComponentTheme<ChatTheme>('chat', customTheme);\n const [internalActiveSessionID, setInternalActiveSessionID] = useState<\n string | null\n >(activeSessionId);\n\n const { width, observe } = useDimensions();\n const isCompact = viewType === 'companion' || (width && width < 767);\n\n useEffect(() => {\n setInternalActiveSessionID(activeSessionId);\n }, [activeSessionId]);\n\n const handleSelectSession = useCallback(\n (sessionId: string) => {\n setInternalActiveSessionID(sessionId);\n onSelectSession?.(sessionId);\n },\n [onSelectSession]\n );\n\n const handleDeleteSession = useCallback(\n (sessionId: string) => {\n setInternalActiveSessionID(undefined);\n onDeleteSession?.(sessionId);\n },\n [onDeleteSession]\n );\n\n const handleCreateNewSession = useCallback(() => {\n setInternalActiveSessionID(undefined);\n onNewSession?.();\n }, [onNewSession]);\n\n useHotkeys([\n {\n name: 'Create new session',\n category: 'Chat',\n keys: 'meta+shift+s',\n callback: event => {\n event.preventDefault();\n handleCreateNewSession();\n }\n }\n ]);\n\n const activeSession = useMemo(\n () => sessions.find(session => session.id === internalActiveSessionID),\n [sessions, internalActiveSessionID]\n );\n\n // Merge catalog plugin/components when a componentCatalog is provided\n const mergedRemarkPlugins = useMemo(() => {\n if (!componentCatalog) return remarkPlugins as Plugin[];\n return [...(remarkPlugins as Plugin[]), componentCatalog.remarkPlugin];\n }, [remarkPlugins, componentCatalog]);\n\n // User-provided markdownComponents spread last so they can override\n // catalog defaults (e.g. a custom `pre` handler).\n const mergedMarkdownComponents = useMemo(() => {\n if (!componentCatalog) return markdownComponents;\n return {\n ...componentCatalog.components,\n ...markdownComponents\n };\n }, [markdownComponents, componentCatalog]);\n\n const contextValue = useMemo(\n () => ({\n sessions,\n activeSession,\n remarkPlugins: mergedRemarkPlugins,\n markdownComponents: mergedMarkdownComponents,\n theme,\n disabled,\n isLoading,\n isCompact,\n viewType,\n activeSessionId: internalActiveSessionID,\n selectSession: handleSelectSession,\n deleteSession: handleDeleteSession,\n createSession: handleCreateNewSession,\n sendMessage: onSendMessage,\n stopMessage: onStopMessage,\n fileUpload: onFileUpload\n }),\n [\n isLoading,\n isCompact,\n viewType,\n disabled,\n theme,\n mergedRemarkPlugins,\n mergedMarkdownComponents,\n sessions,\n activeSession,\n internalActiveSessionID,\n handleSelectSession,\n handleDeleteSession,\n handleCreateNewSession,\n onSendMessage,\n onStopMessage,\n onFileUpload\n ]\n );\n\n return (\n <ChatContext.Provider value={contextValue}>\n <AnimatePresence initial={false}>\n <div\n ref={observe}\n className={cn(className, theme.base, {\n [theme.companion]: isCompact,\n [theme.console]: !isCompact\n })}\n style={style}\n >\n {children}\n </div>\n </AnimatePresence>\n </ChatContext.Provider>\n );\n};\n","import * as React from \"react\";\nconst SvgTrash = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Delete\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"Vector\", d: \"M5.97905 1.16666C5.90859 1.16576 5.83895 1.18189 5.77605 1.21368C5.71316 1.24547 5.65888 1.29199 5.61783 1.34926C5.57677 1.40654 5.55016 1.47288 5.54025 1.54265C5.53034 1.61242 5.53743 1.68355 5.56092 1.75H4.27007C3.7342 1.75 3.2324 2.01817 2.93535 2.46435L2.24492 3.5H2.18738C2.12941 3.49918 2.07185 3.50989 2.01805 3.5315C1.96425 3.55312 1.91529 3.58522 1.874 3.62593C1.83271 3.66663 1.79993 3.71514 1.77755 3.76863C1.75518 3.82211 1.74365 3.87952 1.74365 3.9375C1.74365 3.99548 1.75518 4.05288 1.77755 4.10636C1.79993 4.15985 1.83271 4.20836 1.874 4.24907C1.91529 4.28977 1.96425 4.32187 2.01805 4.34349C2.07185 4.3651 2.12941 4.37582 2.18738 4.375H2.41012C2.44765 4.38067 2.48576 4.38143 2.52348 4.37727L3.24468 11.1084C3.33169 11.9199 4.02367 12.5417 4.83973 12.5417H9.15947C9.97553 12.5417 10.6675 11.9199 10.7545 11.1084L11.4763 4.37727C11.5133 4.38124 11.5506 4.38047 11.5874 4.375H11.8124C11.8704 4.37582 11.9279 4.3651 11.9817 4.34349C12.0355 4.32187 12.0845 4.28977 12.1258 4.24907C12.1671 4.20836 12.1998 4.15985 12.2222 4.10636C12.2446 4.05288 12.2561 3.99548 12.2561 3.9375C12.2561 3.87952 12.2446 3.82211 12.2222 3.76863C12.1998 3.71514 12.1671 3.66663 12.1258 3.62593C12.0845 3.58522 12.0355 3.55312 11.9817 3.5315C11.9279 3.50989 11.8704 3.49918 11.8124 3.5H11.7548L11.0644 2.46435C10.7671 2.01841 10.2654 1.75 9.7297 1.75H8.43885C8.46234 1.68355 8.46943 1.61242 8.45952 1.54265C8.44961 1.47288 8.423 1.40654 8.38194 1.34926C8.34089 1.29199 8.2866 1.24547 8.22371 1.21368C8.16082 1.18189 8.09118 1.16576 8.02072 1.16666H5.97905ZM4.27007 2.625H9.7297C9.97394 2.625 10.2009 2.74639 10.3364 2.9497L10.7033 3.5H3.29651L3.66338 2.9497L3.66395 2.94913C3.79913 2.74608 4.02543 2.625 4.27007 2.625ZM3.40361 4.375H10.5962L9.88465 11.015C9.8445 11.3894 9.53575 11.6667 9.15947 11.6667H4.83973C4.46345 11.6667 4.15527 11.3894 4.11512 11.015L3.40361 4.375Z\", fill: \"currentColor\" })));\nexport default SvgTrash;\n","import * as React from \"react\";\nconst SvgChat = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 17, viewBox: \"0 0 16 17\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8 3C4.55375 3 1.75 5.23753 1.75 7.98828C1.75 9.70653 2.83659 11.2762 4.62109 12.188C4.11184 13.0465 3.62587 13.7378 3.62012 13.7461C3.50687 13.9071 3.49862 14.1196 3.59912 14.2891C3.69012 14.4418 3.8543 14.5342 4.0293 14.5342C4.0483 14.5342 4.06743 14.533 4.08643 14.5308C4.15168 14.5233 5.66214 14.3364 7.50439 12.9604C7.67239 12.9712 7.8385 12.9766 8 12.9766C11.4462 12.9766 14.25 10.739 14.25 7.98828C14.25 5.23753 11.4462 3 8 3ZM8 4C10.8948 4 13.25 5.78903 13.25 7.98828C13.25 10.1875 10.8948 11.9766 8 11.9766C7.8055 11.9766 7.60225 11.968 7.396 11.9497C7.271 11.9382 7.1454 11.9752 7.0459 12.0527C6.3589 12.5855 5.72033 12.9308 5.20508 13.1528C5.38383 12.8648 5.57691 12.5418 5.76416 12.2061C5.83416 12.0813 5.84705 11.9324 5.7998 11.7974C5.75255 11.6624 5.64983 11.5542 5.51758 11.5C3.81033 10.7993 2.75 9.45328 2.75 7.98828C2.75 5.78903 5.10525 4 8 4ZM5.5 7.25C5.08575 7.25 4.75 7.58575 4.75 8C4.75 8.41425 5.08575 8.75 5.5 8.75C5.91425 8.75 6.25 8.41425 6.25 8C6.25 7.58575 5.91425 7.25 5.5 7.25ZM8 7.25C7.58575 7.25 7.25 7.58575 7.25 8C7.25 8.41425 7.58575 8.75 8 8.75C8.41425 8.75 8.75 8.41425 8.75 8C8.75 7.58575 8.41425 7.25 8 7.25ZM10.5 7.25C10.0857 7.25 9.75 7.58575 9.75 8C9.75 8.41425 10.0857 8.75 10.5 8.75C10.9143 8.75 11.25 8.41425 11.25 8C11.25 7.58575 10.9143 7.25 10.5 7.25Z\", fill: \"currentColor\" }));\nexport default SvgChat;\n","import {\n memo,\n MouseEvent,\n PropsWithChildren,\n ReactElement,\n useCallback,\n useContext\n} from 'react';\nimport { ListItem, IconButton, cn, Ellipsis } from 'reablocks';\nimport { Session } from '@/types';\nimport TrashIcon from '@/assets/trash.svg?react';\nimport ChatIcon from '@/assets/chat.svg?react';\nimport { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\n\nexport interface SessionListItemProps extends PropsWithChildren {\n /**\n * Session to display.\n */\n session: Session;\n\n /**\n * Indicates whether the session is deletable.\n */\n deletable?: boolean;\n\n /**\n * Icon to show for delete.\n */\n deleteIcon?: ReactElement;\n\n /**\n * Icon to show for chat.\n */\n chatIcon?: ReactElement;\n\n /**\n * Limit for the ellipsis.\n */\n limit?: number;\n}\n\nexport const SessionListItem = memo<SessionListItemProps>(\n ({\n children,\n session,\n deletable = true,\n limit = 100,\n deleteIcon = <TrashIcon />,\n chatIcon = <ChatIcon className=\"mr-2\" />\n }) => {\n const { activeSessionId, selectSession, deleteSession, theme } =\n useContext(ChatContext);\n const Comp = children ? Slot : ListItem;\n\n const handleSelect = useCallback(() => {\n selectSession?.(session.id);\n }, [selectSession, session.id]);\n\n const handleDelete = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation();\n deleteSession(session.id);\n },\n [deleteSession, session.id]\n );\n\n return (\n <Comp\n dense\n disableGutters\n active={session.id === activeSessionId}\n className={cn(theme.sessions.session.base, {\n [theme.sessions.session.active]: session.id === activeSessionId\n })}\n onClick={handleSelect}\n start={chatIcon}\n end={\n <>\n {deletable && (\n <IconButton\n size=\"small\"\n variant=\"text\"\n onClick={handleDelete}\n className={cn(theme.sessions.session.delete)}\n >\n {deleteIcon}\n </IconButton>\n )}\n </>\n }\n >\n {children || <Ellipsis value={session.title} limit={limit} />}\n </Comp>\n );\n }\n);\n\nSessionListItem.displayName = 'SessionListItem';\n","import { FC, PropsWithChildren, useContext } from 'react';\nimport { List, cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { motion } from 'motion/react';\nimport { Template } from '@/types';\nimport { SessionListItem } from './SessionListItem';\n\nexport interface SessionsListProps extends PropsWithChildren {\n /**\n * Templates to show when no session is active\n */\n templates?: Template[];\n}\n\nexport const SessionsList: FC<SessionsListProps> = ({\n children,\n templates\n}) => {\n const { theme, isCompact, activeSessionId, createSession } =\n useContext(ChatContext);\n const isVisible = isCompact && !activeSessionId;\n\n return (\n (!isCompact || isVisible) && (\n <motion.div\n initial={{ translateX: '-100%' }}\n animate={{\n translateX: '0%',\n transition: {\n type: 'tween',\n ease: 'linear',\n duration: 0.2,\n when: 'beforeChildren'\n }\n }}\n exit={{ translateX: '-100%' }}\n className={cn(theme.sessions.base, {\n [theme.sessions.companion]: isCompact,\n [theme.sessions.console]: !isCompact\n })}\n >\n <List>{children}</List>\n {templates && !activeSessionId && (\n <div className=\"mt-4\">\n {templates.map(template => (\n <div key={template.id} onClick={() => createSession?.()}>\n <SessionListItem\n session={{\n id: template.id,\n title: template.title,\n conversations: []\n }}\n chatIcon={template.icon}\n deletable={false}\n />\n </div>\n ))}\n </div>\n )}\n </motion.div>\n )\n );\n};\n","import * as React from \"react\";\nconst SvgPlus = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 17, height: 17, viewBox: \"0 0 17 17\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"add\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"Vector\", d: \"M13.1667 9.16658H9.16671V13.1666H7.83337V9.16658H3.83337V7.83325H7.83337V3.83325H9.16671V7.83325H13.1667V9.16658Z\", fill: \"currentColor\" })));\nexport default SvgPlus;\n","import { Button, cn } from 'reablocks';\nimport { FC, PropsWithChildren, ReactNode, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport PlusIcon from '@/assets/plus.svg?react';\n\ninterface NewSessionButtonProps extends PropsWithChildren {\n /**\n * Text for the new session button.\n */\n newSessionText?: string | ReactNode;\n}\n\nexport const NewSessionButton: FC<NewSessionButtonProps> = ({\n children,\n newSessionText = 'New Session'\n}) => {\n const { theme, createSession, disabled } = useContext(ChatContext);\n const Comp = children ? Slot : Button;\n\n return (\n <>\n <Comp\n fullWidth\n disableMargins\n color=\"primary\"\n start={<PlusIcon />}\n className={cn(theme.sessions.create)}\n disabled={disabled}\n onClick={createSession}\n >\n {children || newSessionText}\n </Comp>\n </>\n );\n};\n","import {\n format,\n isToday,\n isYesterday,\n isThisWeek,\n differenceInYears\n} from 'date-fns';\nimport { Session } from '@/types';\n\nexport interface GroupedSessions {\n heading: string;\n sessions: Session[];\n}\n\nconst sortOrder = [\n 'Today',\n 'Yesterday',\n 'Last Week',\n 'Last Month',\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n 'Last Year'\n];\n\n// Pre-compute a Map for O(1) sort order lookup instead of O(n) indexOf\nconst sortOrderMap = new Map(sortOrder.map((v, i) => [v, i]));\n\nexport function groupSessionsByDate(sessions: Session[]): GroupedSessions[] {\n const grouped: Record<string, Session[]> = {};\n const now = new Date();\n\n sessions.forEach(session => {\n const createdAt = session.createdAt ? new Date(session.createdAt) : null;\n\n let group: string;\n if (!createdAt || isNaN(createdAt.getTime())) {\n group = 'Last Year';\n } else if (isToday(createdAt)) {\n group = 'Today';\n } else if (isYesterday(createdAt)) {\n group = 'Yesterday';\n } else if (isThisWeek(createdAt)) {\n group = 'Last Week';\n } else if (differenceInYears(now, createdAt) === 0) {\n const monthDiff = now.getMonth() - createdAt.getMonth();\n const yearDiff = now.getFullYear() - createdAt.getFullYear();\n const adjustedMonthDiff = yearDiff > 0 ? monthDiff + 12 : monthDiff;\n if (\n adjustedMonthDiff === 1 ||\n (adjustedMonthDiff === 0 && now.getDate() > createdAt.getDate())\n ) {\n group = 'Last Month';\n } else {\n group = format(createdAt, 'MMMM');\n }\n } else {\n group = 'Last Year';\n }\n\n if (!grouped[group]) grouped[group] = [];\n grouped[group].push(session);\n });\n\n // Sort groups using Map for O(1) lookup per comparison\n const sortedGroups = Object.keys(grouped).sort(\n (a, b) => (sortOrderMap.get(a) ?? 999) - (sortOrderMap.get(b) ?? 999)\n );\n\n return sortedGroups.map(heading => ({\n heading,\n sessions: grouped[heading].sort(\n (a, b) =>\n (b.createdAt ? new Date(b.createdAt).getTime() : 0) -\n (a.createdAt ? new Date(a.createdAt).getTime() : 0)\n )\n }));\n}\n","import { FC, PropsWithChildren, ReactNode, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { ListItem, cn } from 'reablocks';\n\ninterface SessionsGroupProps extends PropsWithChildren {\n /**\n * Heading for the session group.\n */\n heading?: string | ReactNode;\n}\n\nexport const SessionsGroup: FC<SessionsGroupProps> = ({\n heading,\n children,\n}) => {\n const { theme } = useContext(ChatContext);\n return (\n <>\n {heading && (\n <ListItem\n disableGutters\n disablePadding\n className={cn(theme.sessions.group)}\n >\n {heading}\n </ListItem>\n )}\n {children}\n </>\n );\n};\n","import { FC, ReactNode, useContext, useMemo } from 'react';\nimport { GroupedSessions, groupSessionsByDate } from '@/utils/grouping';\nimport { ChatContext } from '@/ChatContext';\nimport { SessionsGroup } from './SessionsGroup';\nimport { SessionListItem } from './SessionListItem';\n\nexport interface SessionGroupsProps {\n /**\n * Render function for the session groups.\n */\n children?: (groups: GroupedSessions[]) => ReactNode;\n}\n\nexport const SessionGroups: FC<SessionGroupsProps> = ({ children }) => {\n const { sessions } = useContext(ChatContext);\n const groups = useMemo(() => groupSessionsByDate(sessions), [sessions]);\n\n return (\n <>\n {children\n ? children(groups)\n : groups.map(({ heading, sessions }) => (\n <SessionsGroup key={heading} heading={heading}>\n {sessions.map(session => (\n <SessionListItem key={session.id} session={session} />\n ))}\n </SessionsGroup>\n ))}\n </>\n );\n};\n","import { ReactNode, FC } from 'react';\nimport { cn, useComponentTheme } from 'reablocks';\nimport { ChatTheme, chatTheme } from '../theme';\n\nexport interface AppBarProps {\n /**\n * Content to display in the header\n */\n content?: ReactNode;\n\n /**\n * Custom theme for the appbar\n */\n theme?: ChatTheme;\n}\n\nexport const AppBar: FC<AppBarProps> = ({\n content,\n theme: customTheme = chatTheme\n}) => {\n const theme = useComponentTheme<ChatTheme>('chat', customTheme);\n\n return <div className={cn(theme.appbar)}>{content}</div>;\n};\n","import { offset } from '@floating-ui/react';\nimport { ConnectedOverlay, Modifiers, Placement } from 'reablocks';\nimport { memo, ReactNode, useCallback, useRef, useState } from 'react';\n\nconst DEFAULT_MODIFIERS: Modifiers = [offset({ mainAxis: 0, crossAxis: -40 })];\n\nexport interface ChatBubbleProps {\n /**\n * The main content to be rendered.\n */\n children: ReactNode;\n\n /**\n * The content to be rendered in the trigger bubble.\n */\n bubbleContent: ReactNode;\n\n /**\n * The position of the chat bubble on the screen.\n * @default 'right-end'\n */\n position?: Placement;\n\n /**\n * Custom position modifiers.\n * @default [offset({ mainAxis: 0, crossAxis: -40 })]\n */\n modifiers?: Modifiers;\n\n /**\n * Additional CSS classes to apply to the chat bubble.\n */\n className?: string;\n}\n\nexport const ChatBubble = memo<ChatBubbleProps>(\n ({\n children,\n bubbleContent,\n position = 'right-end',\n modifiers = DEFAULT_MODIFIERS,\n className\n }) => {\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const ref = useRef<HTMLDivElement | null>(null);\n\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n const handleToggle = useCallback(() => setIsOpen(prev => !prev), []);\n const renderContent = useCallback(() => <>{children}</>, [children]);\n\n return (\n <>\n <ConnectedOverlay\n placement={position}\n modifiers={modifiers}\n reference={ref.current}\n open={isOpen}\n onOpen={handleOpen}\n onClose={handleClose}\n content={renderContent}\n />\n <div ref={ref} className={className} onClick={handleToggle}>\n {bubbleContent}\n </div>\n </>\n );\n }\n);\n","import { FC, useContext } from 'react';\nimport { Button, cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { Suggestion } from '@/types';\n\nexport interface ChatSuggestionProps extends Suggestion {\n /**\n * Callback when the suggestion is clicked.\n */\n onClick?: (suggestion: string) => void;\n}\n\nexport const ChatSuggestion: FC<ChatSuggestionProps> = ({\n content,\n onClick\n}) => {\n const { theme, disabled, isLoading } = useContext(ChatContext);\n\n const handleClick = () => {\n if (disabled || isLoading) return;\n onClick?.(content);\n };\n\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n disableMargins\n className={cn(theme.suggestions.item.base, {\n 'opacity-50 cursor-not-allowed': disabled || isLoading\n })}\n onClick={handleClick}\n disabled={disabled || isLoading}\n >\n <span className={cn(theme.suggestions.item.text)}>{content}</span>\n </Button>\n );\n};\n","import {\n FC,\n ReactElement,\n useContext,\n cloneElement,\n isValidElement\n} from 'react';\nimport { cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { Suggestion } from '@/types';\nimport { ChatSuggestion } from './ChatSuggestion';\n\nexport interface ChatSuggestionsProps {\n /**\n * Array of suggestions to display.\n */\n suggestions: Suggestion[];\n\n /**\n * Custom class name to apply to the container.\n */\n className?: string;\n\n /**\n * Callback when a suggestion is clicked.\n */\n onSuggestionClick?: (suggestion: string) => void;\n\n /**\n * Custom render function for each suggestion item.\n * Receives the suggestion data and onClick handler.\n */\n children?: ReactElement;\n}\n\nexport const ChatSuggestions: FC<ChatSuggestionsProps> = ({\n suggestions,\n className,\n onSuggestionClick,\n children\n}) => {\n const { theme } = useContext(ChatContext);\n\n if (!suggestions || suggestions.length === 0) {\n return null;\n }\n\n return (\n <div className={cn(theme.suggestions.base, className)}>\n {suggestions.map(suggestion => {\n if (children && isValidElement(children)) {\n return cloneElement(children as ReactElement<any>, {\n key: suggestion.id,\n ...suggestion,\n onClick: onSuggestionClick\n });\n }\n\n return (\n <ChatSuggestion\n key={suggestion.id}\n {...suggestion}\n onClick={onSuggestionClick}\n />\n );\n })}\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgSpinner = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\" }));\nexport default SvgSpinner;\n","import * as React from \"react\";\nconst SvgCheck = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", ...props }, /* @__PURE__ */ React.createElement(\"polyline\", { points: \"20 6 9 17 4 12\" }));\nexport default SvgCheck;\n","import * as React from \"react\";\nconst SvgError = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", ...props }, /* @__PURE__ */ React.createElement(\"circle\", { cx: 12, cy: 12, r: 10 }), /* @__PURE__ */ React.createElement(\"line\", { x1: 15, y1: 9, x2: 9, y2: 15 }), /* @__PURE__ */ React.createElement(\"line\", { x1: 9, y1: 9, x2: 15, y2: 15 }));\nexport default SvgError;\n","import { FC } from 'react';\nimport { motion } from 'motion/react';\nimport { cn } from 'reablocks';\nimport SpinnerIcon from '@/assets/spinner.svg?react';\nimport CheckIcon from '@/assets/check.svg?react';\nimport ErrorIcon from '@/assets/error.svg?react';\nimport { MessageStatusState } from './MessageStatus';\n\nexport interface StatusIconProps {\n /**\n * Current state of the status icon.\n */\n state: MessageStatusState;\n\n /**\n * Additional CSS class name for the icon container.\n */\n className?: string;\n\n /**\n * CSS class name for the icon color based on state.\n */\n colorClassName?: string;\n}\n\nexport const StatusIcon: FC<StatusIconProps> = ({\n state,\n className,\n colorClassName\n}) => {\n switch (state) {\n case 'loading':\n return (\n <motion.div\n animate={{ rotate: 360 }}\n transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\n className={cn(className, colorClassName)}\n >\n <SpinnerIcon className=\"w-full h-full\" />\n </motion.div>\n );\n case 'complete':\n return (\n <motion.div\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 500, damping: 25 }}\n className={cn(className, colorClassName)}\n >\n <CheckIcon className=\"w-full h-full\" />\n </motion.div>\n );\n case 'error':\n return (\n <motion.div\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 500, damping: 25 }}\n className={cn(className, colorClassName)}\n >\n <ErrorIcon className=\"w-full h-full\" />\n </motion.div>\n );\n }\n};\n","import { FC, useContext } from 'react';\nimport { motion } from 'motion/react';\nimport { cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { chatTheme as defaultTheme } from '@/theme';\nimport { StatusIcon } from './StatusIcon';\nimport { MessageStatusStep } from './MessageStatus';\n\nexport interface MessageStatusItemProps {\n /**\n * The step to display.\n */\n step: MessageStatusStep;\n}\n\nexport const MessageStatusItem: FC<MessageStatusItemProps> = ({ step }) => {\n const { theme: chatTheme } = useContext(ChatContext);\n const theme = (chatTheme ?? defaultTheme).status.steps.step;\n const stepStatus = step.status || 'loading';\n\n return (\n <motion.div\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ duration: 0.2 }}\n className={theme.base}\n >\n <StatusIcon\n state={stepStatus}\n className={theme.icon}\n colorClassName={theme[stepStatus]}\n />\n <span\n className={cn(\n theme.text,\n stepStatus === 'loading' && theme.loading,\n stepStatus === 'complete' && theme.complete,\n stepStatus === 'error' && theme.error\n )}\n >\n {step.text}\n </span>\n </motion.div>\n );\n};\n","import { FC, PropsWithChildren, ReactNode, useContext } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cn } from 'reablocks';\nimport { Slot } from '@radix-ui/react-slot';\nimport { ChatContext } from '@/ChatContext';\nimport { chatTheme as defaultTheme } from '@/theme';\nimport { StatusIcon } from './StatusIcon';\nimport { MessageStatusItem } from './MessageStatusItem';\n\nexport type MessageStatusState = 'loading' | 'complete' | 'error';\n\nexport interface MessageStatusStep {\n /**\n * Unique identifier for the step.\n */\n id: string;\n\n /**\n * Text to display for the step.\n */\n text: string;\n\n /**\n * Current state of the step.\n * @default 'loading'\n */\n status?: MessageStatusState;\n}\n\nexport interface MessageStatusProps extends PropsWithChildren {\n /**\n * Current status state.\n * @default 'loading'\n */\n status?: MessageStatusState;\n\n /**\n * Main status text to display.\n */\n text: string;\n\n /**\n * Optional sub-steps to display.\n */\n steps?: MessageStatusStep[];\n\n /**\n * Custom icon to display. If not provided, uses default icons based on status.\n */\n icon?: ReactNode;\n\n /**\n * Additional CSS class name.\n */\n className?: string;\n}\n\n/**\n * Displays status information with optional sub-steps, similar to Claude's tool status UI.\n */\nexport const MessageStatus: FC<MessageStatusProps> = ({\n status = 'loading',\n text,\n steps,\n icon,\n className,\n children\n}) => {\n const { theme: chatTheme } = useContext(ChatContext);\n const theme = (chatTheme ?? defaultTheme).status;\n const Comp = children ? Slot : 'div';\n\n return (\n <AnimatePresence mode=\"wait\">\n <motion.div\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.2 }}\n >\n <Comp className={cn(theme.base, className)}>\n {children || (\n <>\n <div className={theme.header}>\n {icon || (\n <StatusIcon\n state={status}\n className={theme.icon.base}\n colorClassName={theme.icon[status]}\n />\n )}\n <span\n className={cn(\n theme.text.base,\n status === 'loading' && theme.text.loading,\n status === 'complete' && theme.text.complete,\n status === 'error' && theme.text.error\n )}\n >\n {text}\n </span>\n </div>\n {steps && steps.length > 0 && (\n <div className={theme.steps.base}>\n {steps.map(step => (\n <MessageStatusItem key={step.id} step={step} />\n ))}\n </div>\n )}\n </>\n )}\n </Comp>\n </motion.div>\n </AnimatePresence>\n );\n};\n","/**\n * AG-UI Protocol event types and interfaces.\n *\n * These are self-contained type definitions for the AG-UI protocol,\n * so consumers don't need to install @ag-ui/core separately.\n * See: https://docs.ag-ui.com\n */\n\nexport enum AgUiEventType {\n // Lifecycle\n RUN_STARTED = 'RUN_STARTED',\n RUN_FINISHED = 'RUN_FINISHED',\n RUN_ERROR = 'RUN_ERROR',\n STEP_STARTED = 'STEP_STARTED',\n STEP_FINISHED = 'STEP_FINISHED',\n\n // Text messages\n TEXT_MESSAGE_START = 'TEXT_MESSAGE_START',\n TEXT_MESSAGE_CONTENT = 'TEXT_MESSAGE_CONTENT',\n TEXT_MESSAGE_END = 'TEXT_MESSAGE_END',\n TEXT_MESSAGE_CHUNK = 'TEXT_MESSAGE_CHUNK',\n\n // Tool calls\n TOOL_CALL_START = 'TOOL_CALL_START',\n TOOL_CALL_ARGS = 'TOOL_CALL_ARGS',\n TOOL_CALL_END = 'TOOL_CALL_END',\n TOOL_CALL_RESULT = 'TOOL_CALL_RESULT',\n TOOL_CALL_CHUNK = 'TOOL_CALL_CHUNK',\n\n // State\n STATE_SNAPSHOT = 'STATE_SNAPSHOT',\n STATE_DELTA = 'STATE_DELTA',\n MESSAGES_SNAPSHOT = 'MESSAGES_SNAPSHOT',\n\n // Special\n RAW = 'RAW',\n CUSTOM = 'CUSTOM'\n}\n\nexport interface AgUiBaseEvent {\n type: AgUiEventType;\n timestamp?: number;\n rawEvent?: unknown;\n}\n\n// Lifecycle events\nexport interface AgUiRunStartedEvent extends AgUiBaseEvent {\n type: AgUiEventType.RUN_STARTED;\n threadId: string;\n runId: string;\n}\n\nexport interface AgUiRunFinishedEvent extends AgUiBaseEvent {\n type: AgUiEventType.RUN_FINISHED;\n threadId: string;\n runId: string;\n}\n\nexport interface AgUiRunErrorEvent extends AgUiBaseEvent {\n type: AgUiEventType.RUN_ERROR;\n message: string;\n code?: string;\n}\n\nexport interface AgUiStepStartedEvent extends AgUiBaseEvent {\n type: AgUiEventType.STEP_STARTED;\n stepName: string;\n}\n\nexport interface AgUiStepFinishedEvent extends AgUiBaseEvent {\n type: AgUiEventType.STEP_FINISHED;\n stepName: string;\n}\n\n// Text message events\nexport interface AgUiTextMessageStartEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_START;\n messageId: string;\n role?: AgUiRole;\n}\n\nexport interface AgUiTextMessageContentEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_CONTENT;\n messageId: string;\n delta: string;\n}\n\nexport interface AgUiTextMessageEndEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_END;\n messageId: string;\n}\n\nexport interface AgUiTextMessageChunkEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_CHUNK;\n messageId?: string;\n role?: AgUiRole;\n delta?: string;\n}\n\n// Tool call events\nexport interface AgUiToolCallStartEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_START;\n toolCallId: string;\n toolCallName: string;\n parentMessageId?: string;\n}\n\nexport interface AgUiToolCallArgsEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_ARGS;\n toolCallId: string;\n delta: string;\n}\n\nexport interface AgUiToolCallEndEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_END;\n toolCallId: string;\n}\n\nexport interface AgUiToolCallResultEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_RESULT;\n toolCallId: string;\n content: string;\n}\n\nexport interface AgUiToolCallChunkEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_CHUNK;\n toolCallId?: string;\n toolCallName?: string;\n parentMessageId?: string;\n delta?: string;\n}\n\n// State events\nexport interface AgUiStateSnapshotEvent extends AgUiBaseEvent {\n type: AgUiEventType.STATE_SNAPSHOT;\n snapshot: unknown;\n}\n\nexport interface AgUiStateDeltaEvent extends AgUiBaseEvent {\n type: AgUiEventType.STATE_DELTA;\n delta: unknown[];\n}\n\nexport interface AgUiMessagesSnapshotEvent extends AgUiBaseEvent {\n type: AgUiEventType.MESSAGES_SNAPSHOT;\n messages: AgUiMessage[];\n}\n\n// Special events\nexport interface AgUiRawEvent extends AgUiBaseEvent {\n type: AgUiEventType.RAW;\n event: unknown;\n source?: string;\n}\n\nexport interface AgUiCustomEvent extends AgUiBaseEvent {\n type: AgUiEventType.CUSTOM;\n name: string;\n value: unknown;\n}\n\nexport type AgUiEvent =\n | AgUiRunStartedEvent\n | AgUiRunFinishedEvent\n | AgUiRunErrorEvent\n | AgUiStepStartedEvent\n | AgUiStepFinishedEvent\n | AgUiTextMessageStartEvent\n | AgUiTextMessageContentEvent\n | AgUiTextMessageEndEvent\n | AgUiTextMessageChunkEvent\n | AgUiToolCallStartEvent\n | AgUiToolCallArgsEvent\n | AgUiToolCallEndEvent\n | AgUiToolCallResultEvent\n | AgUiToolCallChunkEvent\n | AgUiStateSnapshotEvent\n | AgUiStateDeltaEvent\n | AgUiMessagesSnapshotEvent\n | AgUiRawEvent\n | AgUiCustomEvent;\n\n// AG-UI message types (used in RunAgentInput)\nexport type AgUiRole = 'developer' | 'system' | 'assistant' | 'user' | 'tool';\n\nexport interface AgUiMessage {\n id: string;\n role: AgUiRole;\n content?: string;\n name?: string;\n toolCallId?: string;\n}\n\nexport interface AgUiTool {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface AgUiContext {\n description: string;\n value: string;\n}\n\nexport interface AgUiRunAgentInput {\n threadId: string;\n runId: string;\n messages: AgUiMessage[];\n tools: AgUiTool[];\n context: AgUiContext[];\n state: unknown;\n forwardedProps: Record<string, unknown>;\n}\n\nexport interface AgUiToolCallInfo {\n toolCallId: string;\n toolCallName: string;\n args: string;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Session, Conversation } from '@/types';\nimport {\n AgUiEvent,\n AgUiEventType,\n AgUiContext,\n AgUiMessage,\n AgUiRunAgentInput,\n AgUiTool,\n AgUiToolCallInfo\n} from './types';\n\nexport interface UseAgUiOptions {\n /**\n * URL of the AG-UI compatible agent endpoint.\n */\n agent: string;\n\n /**\n * Initial sessions to populate the chat.\n */\n initialSessions?: Session[];\n\n /**\n * Initial active session ID.\n */\n initialActiveSessionId?: string;\n\n /**\n * Tools to expose to the agent.\n */\n tools?: AgUiTool[];\n\n /**\n * Context to send with each run.\n */\n context?: AgUiContext[];\n\n /**\n * Additional properties forwarded to the agent.\n */\n forwardedProps?: Record<string, unknown>;\n\n /**\n * Custom headers for the HTTP request.\n */\n headers?: Record<string, string>;\n\n /**\n * Called when a tool call is received from the agent.\n */\n onToolCall?: (toolCall: AgUiToolCallInfo) => Promise<void> | void;\n\n /**\n * Called when the agent run encounters an error.\n */\n onError?: (error: Error) => void;\n\n /**\n * Called when an AG-UI event is received (for debugging/logging).\n */\n onEvent?: (event: AgUiEvent) => void;\n}\n\nexport interface UseAgUiReturn {\n /**\n * All chat sessions.\n */\n sessions: Session[];\n\n /**\n * The currently active session ID.\n */\n activeSessionId: string | undefined;\n\n /**\n * Whether the agent is currently processing.\n */\n isLoading: boolean;\n\n /**\n * Select a session by ID.\n */\n selectSession: (sessionId: string) => void;\n\n /**\n * Delete a session by ID.\n */\n deleteSession: (sessionId: string) => void;\n\n /**\n * Create a new empty session.\n */\n createSession: () => void;\n\n /**\n * Send a message to the agent.\n */\n sendMessage: (message: string) => void;\n\n /**\n * Stop the current agent run.\n */\n stopMessage: () => void;\n}\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 11);\n}\n\nexport function addConversationToSession(\n sessions: Session[],\n sessionId: string,\n conversation: Conversation\n): Session[] {\n return sessions.map(s => {\n if (s.id !== sessionId) return s;\n return {\n ...s,\n updatedAt: conversation.createdAt,\n conversations: [...s.conversations, conversation]\n };\n });\n}\n\nexport function updateConversationInSession(\n sessions: Session[],\n sessionId: string,\n conversationId: string,\n response: string\n): Session[] {\n return sessions.map(s => {\n if (s.id !== sessionId) return s;\n return {\n ...s,\n updatedAt: new Date(),\n conversations: s.conversations.map(c => {\n if (c.id !== conversationId) return c;\n return { ...c, response, updatedAt: new Date() };\n })\n };\n });\n}\n\n/**\n * Converts reachat Session/Conversation history into AG-UI messages.\n */\nexport function sessionsToAgUiMessages(session: Session): AgUiMessage[] {\n const messages: AgUiMessage[] = [];\n for (const conv of session.conversations) {\n messages.push({\n id: `${conv.id}-q`,\n role: 'user',\n content: conv.question\n });\n if (conv.response) {\n messages.push({\n id: `${conv.id}-r`,\n role: 'assistant',\n content: conv.response\n });\n }\n }\n return messages;\n}\n\n/**\n * Parses a single SSE data line, returning the event or an Error\n * if the JSON is malformed.\n */\nexport function parseSSELine(line: string): AgUiEvent | Error | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) return null;\n\n if (trimmed.startsWith('data:')) {\n const data = trimmed.slice(5).trim();\n if (data === '[DONE]') return null;\n\n try {\n return JSON.parse(data) as AgUiEvent;\n } catch (err) {\n return new Error(\n `Failed to parse AG-UI event: ${err instanceof Error ? err.message : err}`\n );\n }\n }\n return null;\n}\n\n/**\n * Parses an SSE stream from a Response into AG-UI events.\n */\nexport async function* parseSSE(\n response: Response,\n signal: AbortSignal\n): AsyncGenerator<AgUiEvent | Error> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last incomplete line in the buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const result = parseSSELine(line);\n if (result !== null) yield result;\n }\n }\n\n // Process any remaining data in the buffer after stream ends\n if (buffer.trim()) {\n const result = parseSSELine(buffer);\n if (result !== null) yield result;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * React hook that connects to an AG-UI protocol endpoint and provides\n * all the props needed for the reachat `<Chat>` component.\n *\n * @example\n * ```tsx\n * const agui = useAgUi({ agent: 'https://my-agent.example.com/run' });\n *\n * <Chat\n * sessions={agui.sessions}\n * activeSessionId={agui.activeSessionId}\n * isLoading={agui.isLoading}\n * onSelectSession={agui.selectSession}\n * onDeleteSession={agui.deleteSession}\n * onNewSession={agui.createSession}\n * onSendMessage={agui.sendMessage}\n * onStopMessage={agui.stopMessage}\n * >\n * <SessionMessagePanel>\n * <SessionMessages />\n * <ChatInput />\n * </SessionMessagePanel>\n * </Chat>\n * ```\n */\nexport function useAgUi({\n agent,\n initialSessions = [],\n initialActiveSessionId,\n tools = [],\n context = [],\n forwardedProps = {},\n headers = {},\n onToolCall,\n onError,\n onEvent\n}: UseAgUiOptions): UseAgUiReturn {\n const [sessions, setSessions] = useState<Session[]>(initialSessions);\n const [activeSessionId, setActiveSessionId] = useState<string | undefined>(\n initialActiveSessionId\n );\n const [isLoading, setIsLoading] = useState(false);\n\n const abortRef = useRef<AbortController | null>(null);\n // Refs to keep stable references in the async generator loop\n const onToolCallRef = useRef(onToolCall);\n onToolCallRef.current = onToolCall;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onEventRef = useRef(onEvent);\n onEventRef.current = onEvent;\n\n // Abort in-flight requests on unmount\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const selectSession = useCallback((sessionId: string) => {\n setActiveSessionId(sessionId);\n }, []);\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n setSessions(prev => prev.filter(s => s.id !== sessionId));\n if (activeSessionId === sessionId) {\n setActiveSessionId(undefined);\n }\n },\n [activeSessionId]\n );\n\n const createSession = useCallback(() => {\n const id = generateId();\n const newSession: Session = {\n id,\n title: 'New Session',\n createdAt: new Date(),\n updatedAt: new Date(),\n conversations: []\n };\n setSessions(prev => [newSession, ...prev]);\n setActiveSessionId(id);\n }, []);\n\n const stopMessage = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n setIsLoading(false);\n }, []);\n\n const sendMessage = useCallback(\n async (message: string) => {\n // Abort any in-flight request\n abortRef.current?.abort();\n\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n // Determine the session to use\n let sessionId = activeSessionId;\n if (!sessionId) {\n sessionId = generateId();\n const newSession: Session = {\n id: sessionId,\n title: message.slice(0, 50),\n createdAt: new Date(),\n updatedAt: new Date(),\n conversations: []\n };\n setSessions(prev => [newSession, ...prev]);\n setActiveSessionId(sessionId);\n }\n\n const conversationId = generateId();\n const now = new Date();\n\n // Add the user's question immediately\n setSessions(prev =>\n addConversationToSession(prev, sessionId, {\n id: conversationId,\n question: message,\n createdAt: now\n })\n );\n\n setIsLoading(true);\n\n // Build the history for the agent\n const currentSession = [\n ...(sessions.find(s => s.id === sessionId)?.conversations ?? [])\n ];\n\n const historyMessages = sessionsToAgUiMessages({\n id: sessionId,\n conversations: currentSession\n });\n\n // Add the new message\n historyMessages.push({\n id: `${conversationId}-q`,\n role: 'user',\n content: message\n });\n\n const runId = generateId();\n const input: AgUiRunAgentInput = {\n threadId: sessionId,\n runId,\n messages: historyMessages,\n tools,\n context,\n state: null,\n forwardedProps\n };\n\n try {\n const response = await fetch(agent, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...headers\n },\n body: JSON.stringify(input),\n signal: abortController.signal\n });\n\n if (!response.ok) {\n throw new Error(\n `Agent returned ${response.status}: ${response.statusText}`\n );\n }\n\n // Track streaming response text and tool calls\n let responseText = '';\n const toolCalls = new Map<string, { name: string; args: string }>();\n\n // Helper to update the conversation response in-place\n const updateResponse = (text: string) => {\n setSessions(prev =>\n updateConversationInSession(prev, sessionId, conversationId, text)\n );\n };\n\n for await (const eventOrError of parseSSE(\n response,\n abortController.signal\n )) {\n if (eventOrError instanceof Error) {\n onErrorRef.current?.(eventOrError);\n continue;\n }\n\n const event = eventOrError;\n onEventRef.current?.(event);\n\n switch (event.type) {\n case AgUiEventType.TEXT_MESSAGE_CONTENT: {\n responseText += event.delta;\n updateResponse(responseText);\n break;\n }\n\n case AgUiEventType.TEXT_MESSAGE_CHUNK: {\n if (event.delta) {\n responseText += event.delta;\n updateResponse(responseText);\n }\n break;\n }\n\n case AgUiEventType.TOOL_CALL_START: {\n toolCalls.set(event.toolCallId, {\n name: event.toolCallName,\n args: ''\n });\n break;\n }\n\n case AgUiEventType.TOOL_CALL_ARGS: {\n const tc = toolCalls.get(event.toolCallId);\n if (tc) {\n tc.args += event.delta;\n }\n break;\n }\n\n case AgUiEventType.TOOL_CALL_END: {\n const tc = toolCalls.get(event.toolCallId);\n if (tc && onToolCallRef.current) {\n try {\n await onToolCallRef.current({\n toolCallId: event.toolCallId,\n toolCallName: tc.name,\n args: tc.args\n });\n } catch {\n // Tool call handler errors are non-fatal\n }\n }\n toolCalls.delete(event.toolCallId);\n break;\n }\n\n case AgUiEventType.RUN_ERROR: {\n const err = new Error(event.message);\n onErrorRef.current?.(err);\n break;\n }\n\n case AgUiEventType.RUN_FINISHED: {\n // Run completed successfully\n break;\n }\n }\n }\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n // User cancelled - not an error\n return;\n }\n const error = err instanceof Error ? err : new Error(String(err));\n onErrorRef.current?.(error);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = null;\n }\n setIsLoading(false);\n }\n },\n [activeSessionId, agent, context, forwardedProps, headers, sessions, tools]\n );\n\n return {\n sessions,\n activeSessionId,\n isLoading,\n selectSession,\n deleteSession,\n createSession,\n sendMessage,\n stopMessage\n };\n}\n","import type {\n ComponentSpec,\n ComponentDefinitions,\n ComponentCatalogError\n} from './types';\n\nexport type ValidateResult =\n | { ok: true; specs: ComponentSpec[]; error?: undefined }\n | { ok: false; error: ComponentCatalogError; specs?: undefined };\n\ntype SingleResult =\n | { ok: true; spec: ComponentSpec; error?: undefined }\n | { ok: false; error: ComponentCatalogError; spec?: undefined };\n\n/**\n * Attempts to parse a raw string (from a ```component code block)\n * into one or more ComponentSpec objects.\n *\n * Returns either a validated spec array or an error descriptor.\n */\nexport function validateSpec(\n raw: string,\n definitions: ComponentDefinitions\n): ValidateResult {\n // 1. Parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: 'Failed to parse component JSON',\n raw\n }\n };\n }\n\n // Normalise to array\n const specArray: unknown[] = Array.isArray(parsed) ? parsed : [parsed];\n\n const validated: ComponentSpec[] = [];\n\n for (const item of specArray) {\n const result = validateSingleSpec(item, raw, definitions);\n if (!result.ok) {\n return { ok: false as const, error: result.error };\n }\n validated.push(result.spec);\n }\n\n return { ok: true, specs: validated };\n}\n\nfunction validateSingleSpec(\n item: unknown,\n raw: string,\n definitions: ComponentDefinitions\n): SingleResult {\n if (!item || typeof item !== 'object' || !('type' in item)) {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: 'Component spec must be an object with a \"type\" field',\n raw\n }\n };\n }\n\n const spec = item as { type: unknown; props?: unknown; children?: unknown };\n\n if (typeof spec.type !== 'string') {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: '\"type\" must be a string',\n raw\n }\n };\n }\n\n const componentType = spec.type;\n\n // 2. Check component exists in catalog\n const definition = definitions[componentType];\n if (!definition) {\n return {\n ok: false,\n error: {\n type: 'unknown_component',\n message: `Unknown component \"${componentType}\". Available: ${Object.keys(definitions).join(', ')}`,\n raw,\n componentType\n }\n };\n }\n\n // 3. Validate props via Zod schema\n // Fall back to empty object for missing/non-object props — Zod will\n // reject if required fields are absent.\n const props =\n spec.props && typeof spec.props === 'object' && !Array.isArray(spec.props)\n ? spec.props\n : {};\n const parseResult = definition.props.safeParse(props);\n\n if (!parseResult.success) {\n return {\n ok: false,\n error: {\n type: 'invalid_props',\n message: `Invalid props for \"${componentType}\": ${parseResult.error.issues.map(i => i.message).join(', ')}`,\n raw,\n componentType,\n issues: parseResult.error.issues.map(i => ({\n message: i.message,\n path: i.path as (string | number)[]\n }))\n }\n };\n }\n\n // 4. Recursively validate children\n let validatedChildren: ComponentSpec[] | undefined;\n if (spec.children) {\n if (!Array.isArray(spec.children)) {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: '\"children\" must be an array',\n raw,\n componentType\n }\n };\n }\n\n validatedChildren = [];\n for (const child of spec.children) {\n const childResult = validateSingleSpec(child, raw, definitions);\n if (!childResult.ok) {\n return childResult;\n }\n validatedChildren.push(childResult.spec);\n }\n }\n\n return {\n ok: true,\n spec: {\n type: componentType,\n props: parseResult.data as Record<string, any>,\n ...(validatedChildren ? { children: validatedChildren } : {})\n }\n };\n}\n","import React, { Component, FC, ReactNode, useContext, useMemo } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { ComponentError } from './ComponentError';\nimport { validateSpec } from './validateSpec';\nimport type {\n ComponentDefinitions,\n ComponentSpec,\n ComponentCatalogOptions,\n ComponentCatalogError\n} from './types';\n\nexport interface ComponentRendererProps {\n /**\n * The raw JSON string from the ```component code block.\n */\n raw: string;\n\n /**\n * The component definitions from the catalog.\n */\n definitions: ComponentDefinitions;\n\n /**\n * Optional catalog options (for onError callback).\n */\n options?: ComponentCatalogOptions;\n}\n\nexport const ComponentRenderer: FC<ComponentRendererProps> = ({\n raw,\n definitions,\n options\n}) => {\n const { theme, sendMessage } = useContext(ChatContext);\n const result = useMemo(\n () => validateSpec(raw, definitions),\n [raw, definitions]\n );\n\n if (!result.ok) {\n const error = result.error;\n const custom = options?.onError?.(error);\n if (custom !== undefined) {\n return <>{custom}</>;\n }\n return (\n <ComponentError\n title={errorTitle(error.type)}\n message={error.message}\n code={error.raw}\n />\n );\n }\n\n const specs = result.specs;\n\n return (\n <div className={theme.component?.base}>\n {specs.map((spec, index) => (\n <SpecRenderer\n key={`${spec.type}-${index}-${stableKey(spec)}`}\n spec={spec}\n definitions={definitions}\n options={options}\n sendMessage={sendMessage}\n />\n ))}\n </div>\n );\n};\n\ninterface SpecRendererProps {\n spec: ComponentSpec;\n definitions: ComponentDefinitions;\n options?: ComponentCatalogOptions;\n sendMessage?: (message: string) => void;\n}\n\nconst SpecRenderer: FC<SpecRendererProps> = ({\n spec,\n definitions,\n options,\n sendMessage\n}) => {\n const definition = definitions[spec.type];\n\n // Defensive: validateSpec checks top-level specs, but SpecRenderer is also\n // called recursively for children and may be used standalone in the future.\n if (!definition) {\n const error: ComponentCatalogError = {\n type: 'unknown_component',\n message: `Unknown component \"${spec.type}\"`,\n raw: JSON.stringify(spec),\n componentType: spec.type\n };\n const custom = options?.onError?.(error);\n if (custom !== undefined) {\n return <>{custom}</>;\n }\n return (\n <ComponentError title={errorTitle(error.type)} message={error.message} />\n );\n }\n\n const RenderedComponent = definition.component;\n\n // Render children recursively\n const children = spec.children?.map((child, index) => (\n <SpecRenderer\n key={`${child.type}-${index}-${stableKey(child)}`}\n spec={child}\n definitions={definitions}\n options={options}\n sendMessage={sendMessage}\n />\n ));\n\n return (\n <SpecErrorBoundary spec={spec} options={options}>\n <RenderedComponent {...spec.props} sendMessage={sendMessage}>\n {children}\n </RenderedComponent>\n </SpecErrorBoundary>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Error boundary for catching render-time errors from dynamic components.\n// ---------------------------------------------------------------------------\n\ninterface SpecErrorBoundaryProps {\n spec: ComponentSpec;\n options?: ComponentCatalogOptions;\n children: ReactNode;\n}\n\ninterface SpecErrorBoundaryState {\n error: Error | null;\n}\n\nclass SpecErrorBoundary extends Component<\n SpecErrorBoundaryProps,\n SpecErrorBoundaryState\n> {\n state: SpecErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): SpecErrorBoundaryState {\n return { error };\n }\n\n render() {\n if (this.state.error) {\n const { spec, options } = this.props;\n const catalogError: ComponentCatalogError = {\n type: 'render_error',\n message: `Error rendering \"${spec.type}\": ${this.state.error.message}`,\n raw: JSON.stringify(spec),\n componentType: spec.type\n };\n const custom = options?.onError?.(catalogError);\n if (custom !== undefined) {\n return <>{custom}</>;\n }\n return (\n <ComponentError\n title={errorTitle(catalogError.type)}\n message={catalogError.message}\n />\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Simple string hash for a stable, content-based React key. */\nfunction stableKey(spec: ComponentSpec): string {\n const str = JSON.stringify({\n t: spec.type,\n p: spec.props,\n c: spec.children\n });\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = (h * 31 + str.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\nfunction errorTitle(type: ComponentCatalogError['type']): string {\n switch (type) {\n case 'unknown_component':\n return 'Unknown Component';\n case 'invalid_props':\n return 'Invalid Props';\n case 'render_error':\n return 'Render Error';\n default:\n return 'Invalid Component';\n }\n}\n","import React from 'react';\n\n/**\n * Recursively extracts text content from React children.\n * Handles strings, numbers, arrays, and React elements by traversing\n * their children props.\n *\n * @param children - The React children to extract text from\n * @returns The concatenated text content as a string\n */\nexport function getChildText(children: React.ReactNode): string {\n if (children === null || children === undefined) {\n return '';\n }\n if (typeof children === 'string') {\n return children;\n }\n if (typeof children === 'number') {\n return String(children);\n }\n if (Array.isArray(children)) {\n return children.map(getChildText).join('');\n }\n if (typeof children === 'object') {\n if (\n 'props' in children &&\n (children as React.ReactElement<{ children?: React.ReactNode }>).props\n ) {\n const element = children as React.ReactElement<{\n children?: React.ReactNode;\n }>;\n return getChildText(element.props.children);\n }\n }\n return '';\n}\n","import React, { FC } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport { getChildText } from '@/utils/getChildText';\nimport type { ComponentDefinitions, ComponentCatalogOptions } from './types';\n\nexport interface ComponentPreProps {\n children?: React.ReactNode;\n [key: string]: unknown;\n}\n\n/**\n * Creates a `pre` component override for react-markdown that intercepts\n * fenced code blocks with the configured language tag and renders them\n * via the ComponentRenderer.\n *\n * Checks for a `language-{tag}` className on the nested `<code>` element\n * and, if matched, extracts the text content and hands it off to the\n * renderer.\n *\n * Any non-matching `<pre>` blocks are passed through as-is.\n */\nexport function createComponentPre(\n definitions: ComponentDefinitions,\n options?: ComponentCatalogOptions\n): FC<ComponentPreProps> {\n const language = options?.language ?? 'component';\n const className = `language-${language}`;\n\n const ComponentPre: FC<ComponentPreProps> = ({ children, ...props }) => {\n if (children && typeof children === 'object' && 'props' in children) {\n const codeElement = children as React.ReactElement<{\n className?: string;\n children?: React.ReactNode;\n }>;\n\n if (codeElement.props?.className === className) {\n const codeContent = getChildText(codeElement.props?.children);\n\n if (codeContent) {\n return (\n <ComponentRenderer\n raw={codeContent}\n definitions={definitions}\n options={options}\n />\n );\n }\n }\n }\n\n return <pre {...props}>{children}</pre>;\n };\n\n ComponentPre.displayName = 'ComponentPre';\n return ComponentPre;\n}\n","import { z } from 'zod';\nimport type { ComponentDefinitions } from './types';\n\n/**\n * Converts a JSON Schema property into a concise, human-readable type string.\n * Handles objects, arrays, enums, nullable, primitives, and descriptions.\n */\nfunction describeJsonSchemaProperty(\n prop: Record<string, any>,\n indent = ''\n): string {\n const description = prop.description ? ` // ${prop.description}` : '';\n\n // Nullable (anyOf with null)\n if (prop.anyOf) {\n const nonNull = prop.anyOf.filter((s: any) => !(s.type === 'null'));\n const hasNull = prop.anyOf.some((s: any) => s.type === 'null');\n if (nonNull.length === 1 && hasNull) {\n return `${describeJsonSchemaProperty(nonNull[0], indent)} | null${description}`;\n }\n const parts = prop.anyOf.map((s: any) =>\n describeJsonSchemaProperty(s, indent)\n );\n return `${parts.join(' | ')}${description}`;\n }\n\n // Enum\n if (prop.enum) {\n return `${prop.enum.map((v: any) => `\"${v}\"`).join(' | ')}${description}`;\n }\n\n // Array\n if (prop.type === 'array') {\n const items = prop.items\n ? describeJsonSchemaProperty(prop.items, indent)\n : 'any';\n return `${items}[]${description}`;\n }\n\n // Object\n if (prop.type === 'object' && prop.properties) {\n const required = new Set(prop.required ?? []);\n const fields: string[] = [];\n for (const [key, value] of Object.entries(prop.properties)) {\n const opt = required.has(key) ? '' : '?';\n fields.push(\n `${indent} ${key}: ${describeJsonSchemaProperty(value as Record<string, any>, indent + ' ')}${opt}`\n );\n }\n return `{\\n${fields.join(',\\n')}\\n${indent}}${description}`;\n }\n\n // Primitives\n if (prop.type === 'string') return `string${description}`;\n if (prop.type === 'number' || prop.type === 'integer')\n return `number${description}`;\n if (prop.type === 'boolean') return `boolean${description}`;\n if (prop.type === 'null') return `null${description}`;\n\n return `any${description}`;\n}\n\n/**\n * Converts a Zod schema into a concise, human-readable props description\n * using Zod's public `z.toJSONSchema()` API.\n */\nfunction describeProps(schema: z.ZodType): string {\n try {\n const jsonSchema = z.toJSONSchema(schema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n return describeJsonSchemaProperty(jsonSchema);\n }\n return 'Record<string, any>';\n } catch {\n return 'Record<string, any>';\n }\n}\n\n/**\n * Generates an LLM-friendly system prompt describing all available\n * components, their descriptions, and their prop schemas.\n *\n * @param definitions The component definitions from the catalog.\n * @param language The code block language tag (default: 'component').\n */\nexport function generatePrompt(\n definitions: ComponentDefinitions,\n language = 'component'\n): string {\n const names = Object.keys(definitions);\n\n if (names.length === 0) {\n return '';\n }\n\n const componentDocs = names\n .map(name => {\n const def = definitions[name];\n const propsDesc = describeProps(def.props);\n return `- **${name}**: ${def.description}\\n Props: ${propsDesc}`;\n })\n .join('\\n\\n');\n\n return `When you need to render a dynamic UI component in your response, use a fenced code block with language \\`${language}\\` containing a JSON object:\n\n\\`\\`\\`${language}\n{ \"type\": \"ComponentName\", \"props\": { ... } }\n\\`\\`\\`\n\nFor multiple components, use a JSON array:\n\n\\`\\`\\`${language}\n[\n { \"type\": \"ComponentA\", \"props\": { ... } },\n { \"type\": \"ComponentB\", \"props\": { ... } }\n]\n\\`\\`\\`\n\nFor nested/composed layouts, use the \"children\" field:\n\n\\`\\`\\`${language}\n{\n \"type\": \"Parent\",\n \"props\": { ... },\n \"children\": [\n { \"type\": \"Child\", \"props\": { ... } }\n ]\n}\n\\`\\`\\`\n\nAvailable components:\n\n${componentDocs}`;\n}\n","import { remarkComponent } from '@/Markdown/plugins/remarkComponent';\nimport { createComponentPre } from './ComponentPre';\nimport { generatePrompt } from './generatePrompt';\nimport type {\n ComponentCatalog,\n ComponentCatalogOptions,\n ComponentDefinitions\n} from './types';\n\n/**\n * Creates a component catalog — the main entry point for the\n * dynamic component system.\n *\n * Returns an object with a remark plugin, markdown component overrides,\n * and a system-prompt generator, ready to plug into `<Chat>`.\n *\n * @example\n * ```tsx\n * import { componentCatalog } from 'reachat';\n * import { z } from 'zod';\n *\n * const catalog = componentCatalog({\n * WeatherCard: {\n * description: 'Displays weather for a city',\n * props: z.object({\n * city: z.string(),\n * temperature: z.number()\n * }),\n * component: ({ city, temperature }) => (\n * <div>{city}: {temperature}°F</div>\n * )\n * }\n * });\n *\n * // Simple — pass the whole catalog:\n * <Chat components={catalog} sessions={sessions}>\n * ...\n * </Chat>\n *\n * // Advanced — use individual pieces:\n * <Chat\n * remarkPlugins={[catalog.remarkPlugin]}\n * markdownComponents={catalog.components}\n * >\n * ...\n * </Chat>\n *\n * // Generate LLM instructions:\n * const prompt = catalog.systemPrompt();\n * ```\n */\nexport function componentCatalog(\n definitions: ComponentDefinitions,\n options?: ComponentCatalogOptions\n): ComponentCatalog {\n const language = options?.language ?? 'component';\n\n // remarkComponent is a pass-through plugin (rendering is handled by\n // ComponentPre). We cast to Plugin to satisfy unified's type system —\n // the plugin is a no-op that does not use the processor context.\n const plugin = remarkComponent.bind(undefined, {\n language\n }) as typeof remarkComponent;\n\n const Pre = createComponentPre(definitions, options);\n\n return {\n remarkPlugin: plugin,\n components: { pre: Pre },\n systemPrompt: () => generatePrompt(definitions, language),\n definitions\n };\n}\n","import React from 'react';\nimport { z } from 'zod';\nimport { ChartRenderer } from '@/Markdown/charts/ChartRenderer';\nimport type { ChartConfig } from '@/Markdown/charts/types';\nimport type { ComponentDefinition } from './types';\n\n/**\n * Wraps `ChartRenderer` as a component definition so charts can\n * be registered in a `componentCatalog()`.\n *\n * The adapter renders a `ChartRenderer` internally using the same\n * config-based API, with reaviz as the underlying chart library.\n *\n * Because reaviz is an optional peer dependency, this adapter is\n * fully tree-shakeable — it only loads reaviz code when imported.\n *\n * Both `zod` and `reaviz` are required when this helper is used.\n *\n * @example\n * ```tsx\n * import { componentCatalog, createChartComponentDef } from 'reachat';\n *\n * const catalog = componentCatalog({\n * Chart: createChartComponentDef(),\n * // ... other components\n * });\n * ```\n *\n * The LLM can then output:\n * ```component\n * {\n * \"type\": \"Chart\",\n * \"props\": {\n * \"type\": \"bar\",\n * \"data\": [{ \"key\": \"A\", \"data\": 10 }, { \"key\": \"B\", \"data\": 20 }],\n * \"title\": \"My Chart\"\n * }\n * }\n * ```\n */\nexport function createChartComponentDef(): ComponentDefinition {\n const chartPropsSchema = z.object({\n type: z\n .enum([\n 'bar',\n 'line',\n 'area',\n 'pie',\n 'radialBar',\n 'radialArea',\n 'sparkline'\n ])\n .describe('Chart type'),\n data: z\n .array(z.object({ key: z.string(), data: z.number() }))\n .describe('Array of { key, data } data points'),\n width: z.number().describe('Chart width in px').optional(),\n height: z.number().describe('Chart height in px').optional(),\n title: z.string().describe('Chart title').optional()\n });\n\n return {\n description:\n 'Renders a chart. Supported types: bar, line, area, pie, radialBar, radialArea, sparkline',\n props: chartPropsSchema,\n component: ({\n children: _children,\n sendMessage: _sendMessage,\n ...config\n }) => <ChartRenderer config={config as ChartConfig} />\n };\n}\n"],"names":["React","createContext","AttachIcon","useContext","useRef","jsxs","Fragment","jsx","Button","cn","forwardRef","useState","useEffect","useCallback","useImperativeHandle","List","ListItem","memo","posToDOMRect","computePosition","shift","flip","ReactRenderer","useMemo","useEditor","editor","EditorContent","SendIcon","StopIcon","Slot","Ellipsis","DateFormat","motion","BackIcon","CopyIcon","SyntaxHighlighter","children","Redact","BarChart","BarSeries","LineChart","LinearXAxis","LinearYAxis","LineSeries","AreaChart","AreaSeries","PieChart","PieArcSeries","RadialBarChart","RadialBarSeries","RadialAreaChart","RadialAreaSeries","SparklineChart","findAndReplace","DefaultFileRenderer","lazy","CSVFileRenderer","ImageFileRenderer","PDFFileRenderer","FileIcon","Suspense","url","IconButton","DownloadIcon","PlaceholderIcon","AnimatePresence","ThumbUpIcon","ThumbsDownIcon","RefreshIcon","Card","useInfinityList","ArrowDownIcon","componentCatalog","useComponentTheme","useHotkeys","TrashIcon","ChatIcon","PlusIcon","isToday","isYesterday","isThisWeek","differenceInYears","format","sessions","offset","ConnectedOverlay","isValidElement","cloneElement","SpinnerIcon","CheckIcon","ErrorIcon","chatTheme","defaultTheme","AgUiEventType","Component","z"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/assets/send.svg?react","../src/assets/stop.svg?react","../src/ChatContext.ts","../src/assets/paperclip.svg?react","../src/ChatInput/FileInput.tsx","../src/theme.ts","../src/ChatInput/MentionList.tsx","../src/ChatInput/RichTextInput.tsx","../src/ChatInput/ChatInput.tsx","../src/SessionMessages/SessionEmpty.tsx","../src/SessionMessages/SessionMessagesHeader.tsx","../src/assets/back.svg?react","../src/SessionMessages/SessionMessagePanel.tsx","../src/assets/copy.svg?react","../src/Markdown/themes/dark.ts","../src/Markdown/themes/light.ts","../src/Markdown/CodeHighlighter.tsx","../src/Markdown/Table.tsx","../src/Markdown/Markdown.tsx","../src/ComponentCatalog/ComponentError.tsx","../src/Markdown/charts/ChartRenderer.tsx","../src/Markdown/plugins/remarkCve.ts","../src/Markdown/plugins/remarkComponent.ts","../src/Markdown/plugins/remarkRedact.ts","../src/Markdown/plugins/redactMatchers.ts","../src/assets/file.svg?react","../src/SessionMessages/SessionMessage/MessageFile/MessageFile.tsx","../src/SessionMessages/SessionMessage/MessageFile/renderers/DefaultFileRenderer.tsx","../src/utils/sanitize.ts","../src/utils/parseCSV.ts","../src/assets/download.svg?react","../src/SessionMessages/SessionMessage/MessageFile/renderers/CSVFileRenderer.tsx","../src/SessionMessages/SessionMessage/MessageFile/renderers/ImageFileRenderer.tsx","../src/SessionMessages/SessionMessage/MessageFile/renderers/PDFFileRenderer.tsx","../src/SessionMessages/SessionMessage/MessageFiles.tsx","../src/SessionMessages/SessionMessage/MessageQuestion.tsx","../src/SessionMessages/SessionMessage/MessageResponse.tsx","../src/SessionMessages/SessionMessage/MessageSource.tsx","../src/SessionMessages/SessionMessage/MessageSources.tsx","../src/assets/thumbs-down.svg?react","../src/assets/thumbs-up.svg?react","../src/assets/refresh.svg?react","../src/SessionMessages/SessionMessage/MessageActions.tsx","../src/SessionMessages/SessionMessage/SessionMessage.tsx","../src/assets/arrow-down.svg?react","../src/SessionMessages/SessionMessages.tsx","../src/utils/useDimensions.ts","../src/Chat.tsx","../src/assets/trash.svg?react","../src/assets/chat.svg?react","../src/SessionsList/SessionListItem.tsx","../src/SessionsList/SessionsList.tsx","../src/assets/plus.svg?react","../src/SessionsList/NewSessionButton.tsx","../src/utils/grouping.ts","../src/SessionsList/SessionsGroup.tsx","../src/SessionsList/SessionGroups.tsx","../src/AppBar/AppBar.tsx","../src/ChatBubble/ChatBubble.tsx","../src/ChatSuggestions/ChatSuggestion.tsx","../src/ChatSuggestions/ChatSuggestions.tsx","../src/assets/spinner.svg?react","../src/assets/check.svg?react","../src/assets/error.svg?react","../src/MessageStatus/StatusIcon.tsx","../src/MessageStatus/MessageStatusItem.tsx","../src/MessageStatus/MessageStatus.tsx","../src/useAgUi/types.ts","../src/useAgUi/useAgUi.ts","../src/ComponentCatalog/validateSpec.ts","../src/ComponentCatalog/ComponentRenderer.tsx","../src/utils/getChildText.ts","../src/ComponentCatalog/ComponentPre.tsx","../src/ComponentCatalog/generatePrompt.ts","../src/ComponentCatalog/componentCatalog.ts","../src/ComponentCatalog/chartComponentDef.tsx"],"sourcesContent":["import * as React from \"react\";\nconst SvgSend = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 17, height: 17, viewBox: \"0 0 17 17\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"send\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"Vector\", d: \"M14.6111 2.33327C14.5349 2.3339 14.4598 2.35194 14.3917 2.386L2.39168 8.386C2.31456 8.42456 2.24872 8.4824 2.20055 8.55391C2.15238 8.62543 2.12352 8.70818 2.11677 8.79414C2.11002 8.88009 2.12561 8.96634 2.16203 9.04449C2.19845 9.12264 2.25446 9.19005 2.32462 9.24017L4.52514 10.8124L5.47371 13.6581C5.50257 13.7447 5.55457 13.8217 5.62406 13.8808C5.69355 13.9399 5.7779 13.9789 5.86796 13.9935C5.95802 14.0082 6.05036 13.9979 6.13499 13.9638C6.21962 13.9297 6.2933 13.873 6.34806 13.8001L7.05249 12.8606L10.3207 15.2376C10.3843 15.2839 10.4579 15.3146 10.5355 15.3271C10.6132 15.3396 10.6927 15.3336 10.7676 15.3097C10.8425 15.2857 10.9107 15.2444 10.9667 15.1891C11.0226 15.1338 11.0647 15.0661 11.0896 14.9915L15.0896 2.99147C15.1148 2.91597 15.1216 2.83555 15.1094 2.7569C15.0972 2.67825 15.0665 2.60363 15.0197 2.53926C14.9729 2.47488 14.9114 2.42261 14.8403 2.38678C14.7693 2.35096 14.6907 2.33261 14.6111 2.33327ZM13.2478 5.35345L10.3565 14.0266L7.67293 12.0755L13.2478 5.35345ZM10.684 5.35801L4.934 9.87559L3.58113 8.90879L10.684 5.35801ZM11.2784 6.16205L6.56746 11.843C6.56681 11.8437 6.56616 11.8443 6.56551 11.845L6.56355 11.8476C6.55841 11.8538 6.55342 11.8601 6.54858 11.8665C6.54319 11.8733 6.53798 11.8802 6.53295 11.8873L6.12085 12.4361L5.53426 10.6751L11.2784 6.16205Z\", fill: \"currentColor\" })));\nexport default SvgSend;\n","import * as React from \"react\";\nconst SvgStop = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-octagon-x\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m15 9-6 6\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"m9 9 6 6\" }));\nexport default SvgStop;\n","import { createContext } from 'react';\nimport { Components } from 'react-markdown';\nimport { Session } from './types';\nimport { ChatTheme } from './theme';\nimport { Plugin } from 'unified';\n\nexport type ChatViewType = 'chat' | 'companion' | 'console';\n\nexport interface ChatContextProps {\n sessions: Session[];\n disabled?: boolean;\n activeSessionId: string | null;\n theme?: ChatTheme;\n isLoading?: boolean;\n isCompact?: boolean;\n viewType?: ChatViewType;\n activeSession?: Session | null;\n remarkPlugins?: Plugin[];\n markdownComponents?: Components;\n selectSession?: (sessionId: string) => void;\n deleteSession?: (sessionId: string) => void;\n createSession?: () => void;\n sendMessage?: (message: string) => void;\n stopMessage?: () => void;\n fileUpload?: (file: File | File[]) => void;\n}\n\nexport const ChatContext = createContext<ChatContextProps>({\n sessions: [],\n activeSessionId: null\n});\n","import * as React from \"react\";\nconst SvgPaperclip = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-paperclip\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48\" }));\nexport default SvgPaperclip;\n","import { ChatContext } from '@/ChatContext';\nimport { Button, cn } from 'reablocks';\nimport { FC, ReactNode, useRef, ChangeEvent, useContext } from 'react';\nimport AttachIcon from '@/assets/paperclip.svg?react';\n\ninterface FileInputProps {\n /**\n * Array of allowed file extensions.\n */\n allowedFiles: string[];\n\n /**\n * Allow multiple file uploads.\n */\n multiple: boolean;\n\n /**\n * Indicates whether a file upload is in progress.\n */\n isLoading: boolean;\n\n /**\n * Disables the file input when true.\n */\n disabled: boolean;\n\n /**\n * Custom icon for the attach button.\n */\n attachIcon: ReactNode;\n\n /**\n * Callback function triggered when a file is selected.\n */\n onFileUpload: (event: ChangeEvent<HTMLInputElement>) => void;\n}\n\nexport const FileInput: FC<FileInputProps> = ({\n allowedFiles,\n multiple,\n onFileUpload,\n isLoading,\n disabled,\n attachIcon = <AttachIcon />\n}) => {\n const { theme } = useContext(ChatContext);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n return (\n <>\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept={allowedFiles.join(',')}\n multiple={multiple}\n onChange={e => {\n onFileUpload(e);\n // Cleanup field value after fire callback\n if (fileInputRef.current) {\n fileInputRef.current.value = '';\n }\n }}\n />\n <Button\n title=\"Upload\"\n variant=\"text\"\n disabled={isLoading || disabled}\n className={cn(theme.input.upload)}\n onClick={() => fileInputRef.current?.click()}\n >\n {attachIcon}\n </Button>\n </>\n );\n};\n","import { DeepPartial } from 'reablocks';\n\nexport interface ChatTheme {\n base: string;\n console: string;\n companion: string;\n empty: string;\n appbar: string;\n status: {\n base: string;\n header: string;\n icon: {\n base: string;\n loading: string;\n complete: string;\n error: string;\n };\n text: {\n base: string;\n loading: string;\n complete: string;\n error: string;\n };\n steps: {\n base: string;\n step: {\n base: string;\n icon: string;\n text: string;\n loading: string;\n complete: string;\n error: string;\n };\n };\n };\n sessions: {\n base: string;\n console: string;\n companion: string;\n create: string;\n group: string;\n session: {\n base: string;\n active: string;\n delete: string;\n };\n };\n messages: {\n base: string;\n console: string;\n companion: string;\n back: string;\n inner: string;\n title: string;\n date: string;\n content: string;\n header: string;\n showMore: string;\n message: {\n base: string;\n question: string;\n response: string;\n cursor: string;\n overlay: string;\n expand: string;\n scrollToBottom: {\n container: string;\n button: string;\n };\n files: {\n base: string;\n file: {\n base: string;\n name: string;\n };\n };\n sources: {\n base: string;\n source: {\n base: string;\n companion: string;\n image: string;\n title: string;\n url: string;\n };\n };\n markdown: {\n hr: string;\n p: string;\n a: string;\n table: string;\n th: string;\n td: string;\n code: string;\n inlineCode: string;\n toolbar: string;\n li: string;\n ul: string;\n ol: string;\n copy: string;\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n };\n footer: {\n base: string;\n copy: string;\n upvote: string;\n downvote: string;\n refresh: string;\n };\n };\n };\n input: {\n base: string;\n upload: string;\n input: string;\n actions: {\n base: string;\n send: string;\n stop: string;\n };\n popup: {\n base: string;\n content: string;\n item: string;\n itemHighlighted: string;\n itemIcon: string;\n itemContent: string;\n itemLabel: string;\n itemDescription: string;\n itemShortcut: string;\n empty: string;\n loading: string;\n };\n tag: {\n base: string;\n mention: string;\n command: string;\n };\n editor: {\n base: string;\n container: string;\n placeholder: string;\n };\n };\n suggestions: {\n base: string;\n item: {\n base: string;\n icon: string;\n text: string;\n };\n };\n chart: {\n base: string;\n title: string;\n content: string;\n error: {\n base: string;\n title: string;\n code: string;\n };\n warning: {\n base: string;\n title: string;\n };\n };\n component?: {\n base?: string;\n };\n}\n\nexport type PartialChatTheme = DeepPartial<ChatTheme>;\n\nexport const chatTheme: ChatTheme = {\n base: 'dark:text-white text-gray-500',\n console: 'flex w-full gap-4 h-full',\n companion: 'w-full h-full overflow-hidden',\n empty: 'text-center flex-1',\n appbar: 'flex p-5',\n status: {\n base: 'py-2 px-3 rounded-lg bg-gray-100/50 dark:bg-gray-800/30',\n header: 'flex items-center gap-2',\n icon: {\n base: 'flex-shrink-0 w-4 h-4',\n loading: 'text-blue-500 dark:text-blue-400',\n complete: 'text-green-500 dark:text-green-400',\n error: 'text-red-500 dark:text-red-400'\n },\n text: {\n base: 'text-sm',\n loading: 'text-gray-600 dark:text-gray-400',\n complete: 'text-gray-600 dark:text-gray-400',\n error: 'text-red-600 dark:text-red-400'\n },\n steps: {\n base: 'mt-1 ml-6 space-y-0.5',\n step: {\n base: 'flex items-center gap-2',\n icon: 'flex-shrink-0 w-3.5 h-3.5',\n text: 'text-sm',\n loading: 'text-gray-500 dark:text-gray-500',\n complete: 'text-gray-500 dark:text-gray-500',\n error: 'text-red-500 dark:text-red-400'\n }\n }\n },\n sessions: {\n base: 'overflow-auto',\n console:\n 'min-w-[150px] w-[30%] max-w-[300px] dark:bg-[#11111F] bg-[#F2F3F7] p-5 rounded-3xl',\n companion: 'w-full h-full',\n group:\n 'text-xs dart:text-gray-400 text-gray-700 mt-4 hover:bg-transparent mb-1',\n create: 'relative mb-4 rounded-[10px] text-white',\n session: {\n base: [\n 'group my-1 rounded-[10px] p-2 text-gray-500 border border-transparent hover:bg-gray-300 hover:border-gray-400 [&_svg]:text-gray-500',\n 'dark:text-typography dark:text-gray-400 dark:hover:bg-gray-800/50 dark:hover:border-gray-700/50 dark:[&_svg]:text-gray-200'\n ].join(' '),\n active: [\n 'border border-gray-300 hover:border-gray-400 text-gray-700 bg-gray-200 hover:bg-gray-300 ',\n 'dark:text-gray-500 dark:bg-gray-800/70 dark:border-gray-700/50 dark:text-white dark:border-gray-700/70 dark:hover:bg-gray-800/50',\n '[&_button]:opacity-100!'\n ].join(' '),\n delete: '[&>svg]:w-4 [&>svg]:h-4 opacity-0 group-hover:opacity-50!'\n }\n },\n messages: {\n base: '',\n console: 'flex flex-col mx-5 flex-1 min-h-0',\n companion: 'flex w-full h-full',\n back: 'self-start p-0 my-2',\n inner: 'flex-1 h-full flex flex-col',\n title: ['text-base font-bold text-gray-500', 'dark:text-gray-200'].join(\n ' '\n ),\n date: 'text-xs whitespace-nowrap text-gray-400',\n content: [\n 'mt-2 flex-1 overflow-auto [&_hr]:bg-gray-200',\n 'dark:[&_hr]:bg-gray-800/60'\n ].join(' '),\n header: 'flex justify-between items-center gap-2',\n showMore: 'mb-4',\n message: {\n base: 'mt-4 mb-4 flex flex-col p-0 rounded-sm border-none bg-transparent',\n question: [\n 'relative font-semibold mb-4 px-4 py-4 pb-2 rounded-3xl rounded-br-none text-typography border bg-gray-200 border-gray-300 text-gray-900',\n 'dark:bg-gray-900/60 dark:border-gray-700/50 dark:text-gray-100'\n ].join(' '),\n response: [\n 'relative data-[compact=false]:px-4 text-gray-900',\n 'dark:text-gray-100'\n ].join(' '),\n overlay:\n \"overflow-y-hidden max-h-[350px] after:content-[''] after:absolute after:inset-x-0 after:bottom-0 after:h-16 after:bg-linear-to-b after:from-transparent dark:after:to-gray-900 after:to-gray-200\",\n cursor: 'inline-block w-1 h-4 bg-current',\n expand: 'absolute bottom-1 right-1 z-10',\n scrollToBottom: {\n container: 'absolute bottom-2 left-1/2 transform -translate-x-1/2 z-10',\n button: 'rounded-full p-2 shadow-lg'\n },\n files: {\n base: 'mb-2 flex flex-wrap gap-3 ',\n file: {\n base: [\n 'flex items-center gap-2 border border-gray-300 px-3 py-2 rounded-lg cursor-pointer',\n 'dark:border-gray-700'\n ].join(' '),\n name: ['text-sm text-gray-500', 'dark:text-gray-200'].join(' ')\n }\n },\n sources: {\n base: 'my-4 flex flex-wrap gap-3',\n source: {\n base: [\n 'flex gap-2 border border-gray-200 px-4 py-2 rounded-lg cursor-pointer',\n 'dark:border-gray-700'\n ].join(' '),\n companion: 'flex-1 px-3 py-1.5',\n image: 'max-w-10 max-h-10 rounded-md w-full h-fit self-center',\n title: 'text-md block',\n url: 'text-sm text-blue-400 underline'\n }\n },\n markdown: {\n hr: 'my-4 border-t border-stroke-neutral-4',\n copy: 'sticky py-1 [&>svg]:w-4 [&>svg]:h-4 opacity-50',\n p: 'mb-2',\n a: 'text-buttons-colors-link-primary-text-resting underline',\n table: 'table-auto w-full m-2',\n th: 'px-4 py-2 text-left font-bold border-b border-stroke-neutral-4',\n td: 'px-4 py-2',\n code: 'm-2 rounded-b relative',\n inlineCode: 'bg-gradient-neutral-200 p-1 rounded',\n toolbar:\n 'text-xs flex items-center justify-between px-2 py-1 rounded-t sticky top-0 backdrop-blur-md bg-gradient-neutral-500/50',\n li: 'mb-2 ml-6',\n ul: 'mb-4 list-disc',\n ol: 'mb-4 list-decimal',\n h1: 'text-4xl font-bold mb-4 mt-6',\n h2: 'text-3xl font-bold mb-3 mt-5',\n h3: 'text-2xl font-bold mb-3 mt-4',\n h4: 'text-xl font-bold mb-2 mt-3',\n h5: 'text-lg font-bold mb-2 mt-2',\n h6: 'text-base font-bold mb-2 mt-2'\n },\n footer: {\n base: 'mt-3 flex gap-1.5',\n copy: [\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-200 hover:text-gray-500',\n 'dark:hover:bg-gray-800 dark:hover:text-white text-gray-400'\n ].join(' '),\n upvote:\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-700/40 hover:text-white text-gray-400',\n downvote:\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-700/40 hover:text-white text-gray-400',\n refresh:\n 'p-3 rounded-[10px] [&>svg]:w-4 [&>svg]:h-4 opacity-50 hover:opacity-100! hover:bg-gray-700/40 hover:text-white text-gray-400'\n }\n }\n },\n input: {\n base: 'flex mt-4 relative',\n upload: ['px-5 py-2 text-gray-400 size-10', 'dark:gray-500'].join(' '),\n input: [\n 'w-full border rounded-3xl px-3 py-2 pr-16 text-gray-500 border-gray-200 hover:bg-blue-100 hover:border-blue-500 after:hidden after:mx-10! bg-white [&>textarea]:w-full [&>textarea]:flex-none',\n 'dark:border-gray-700/50 dark:text-gray-200 dark:bg-gray-950 dark:hover:bg-blue-950/40'\n ].join(' '),\n actions: {\n base: 'absolute flex gap-2 items-center right-5 inset-y-1/2 -translate-y-1/2 z-10',\n send: [\n 'px-3 py-3 hover:bg-primary-hover rounded-full bg-gray-200 hover:bg-gray-300 text-gray-500',\n 'dark:text-white light:text-gray-500 dark:bg-gray-800 dark:hover:bg-gray-700'\n ].join(' '),\n stop: 'px-2 py-2 bg-red-500 text-white rounded-full hover:bg-red-700 '\n },\n popup: {\n base: [\n 'bg-white border border-gray-200 rounded-lg shadow-lg overflow-hidden min-w-[200px] max-w-[300px]',\n 'dark:bg-gray-900 dark:border-gray-700'\n ].join(' '),\n content: 'overflow-y-auto max-h-[250px]',\n item: [\n 'flex items-center gap-2 px-3 py-2 cursor-pointer transition-colors',\n 'hover:bg-gray-100 dark:hover:bg-gray-800'\n ].join(' '),\n itemHighlighted: 'bg-gray-100 dark:bg-gray-800',\n itemIcon: [\n 'flex-shrink-0 w-5 h-5 text-gray-500 [&>svg]:w-full [&>svg]:h-full',\n 'dark:text-gray-400'\n ].join(' '),\n itemContent: 'flex flex-col min-w-0 flex-1',\n itemLabel: [\n 'text-sm font-medium text-gray-900 truncate',\n 'dark:text-gray-100'\n ].join(' '),\n itemDescription: 'text-xs text-gray-500 dark:text-gray-400 truncate',\n itemShortcut: 'text-xs text-gray-400 dark:text-gray-500 ml-auto',\n empty: 'px-3 py-4 text-sm text-center text-gray-500 dark:text-gray-400',\n loading: [\n 'flex items-center justify-center gap-2 px-3 py-4 text-gray-500',\n 'dark:text-gray-400'\n ].join(' ')\n },\n tag: {\n base: [\n 'inline-flex items-center px-1.5 py-0.5 mx-0.5 rounded',\n 'font-medium text-sm leading-[1.2] relative top-[1px]'\n ].join(' '),\n mention: [\n 'bg-blue-100 dark:bg-blue-900/30',\n 'text-blue-700 dark:text-blue-300'\n ].join(' '),\n command: [\n 'bg-purple-100 dark:bg-purple-900/30',\n 'text-purple-700 dark:text-purple-300'\n ].join(' ')\n },\n editor: {\n base: [\n 'outline-none w-full overflow-y-auto',\n 'text-inherit font-inherit',\n '[&_.tiptap-paragraph]:m-0'\n ].join(' '),\n container: 'px-3 py-2 pr-16',\n placeholder: [\n '[&_.is-editor-empty]:before:content-[attr(data-placeholder)]',\n '[&_.is-editor-empty]:before:text-gray-400',\n '[&_.is-editor-empty]:before:dark:text-gray-500',\n '[&_.is-editor-empty]:before:float-left',\n '[&_.is-editor-empty]:before:h-0',\n '[&_.is-editor-empty]:before:pointer-events-none'\n ].join(' ')\n }\n },\n suggestions: {\n base: 'flex flex-wrap gap-2 mt-4',\n item: {\n base: [\n 'rounded-full! max-w-full py-2 px-4',\n 'bg-gray-100 border-gray-200 hover:bg-gray-200 hover:border-gray-300 text-gray-700',\n 'dark:bg-gray-800/50 dark:border-gray-700 dark:hover:bg-gray-700/70 dark:hover:border-gray-600 dark:text-gray-200',\n '[&>svg]:w-4 [&>svg]:h-4 [&>svg]:text-blue-500 [&>svg]:dark:text-blue-400 [&>svg]:flex-shrink-0'\n ].join(' '),\n icon: 'w-4 h-4 text-blue-500 dark:text-blue-400 flex-shrink-0',\n text: 'text-sm truncate'\n }\n },\n chart: {\n base: 'my-6',\n title: 'text-sm font-medium mb-2 text-gray-600 dark:text-gray-400',\n content: 'flex items-center justify-center',\n error: {\n base: [\n 'my-4 p-4 border rounded',\n 'border-red-300 bg-red-50 text-red-500',\n 'dark:border-red-700 dark:bg-red-900/20'\n ].join(' '),\n title: 'text-red-600 dark:text-red-400 text-sm font-medium mb-2',\n code: 'text-xs overflow-auto'\n },\n warning: {\n base: [\n 'my-4 p-4 border rounded',\n 'border-yellow-300 bg-yellow-50 text-yellow-600',\n 'dark:border-yellow-700 dark:bg-yellow-900/20 dark:text-yellow-400'\n ].join(' '),\n title: 'text-yellow-600 dark:text-yellow-400 text-sm font-medium mb-2'\n }\n },\n component: {\n base: 'my-4'\n }\n};\n","import {\n forwardRef,\n memo,\n useEffect,\n useImperativeHandle,\n useState,\n useCallback,\n useContext,\n useRef\n} from 'react';\nimport { cn, List, ListItem } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { chatTheme } from '@/theme';\nimport { SuggestionConfig, SuggestionItem } from './types';\n\nconst POPUP_STYLE = { zIndex: 9999 } as const;\n\nexport interface MentionListRef {\n onKeyDown: (props: { event: KeyboardEvent }) => boolean;\n}\n\nexport interface MentionListProps {\n /**\n * List of suggestion items to display\n */\n items: SuggestionItem[];\n\n /**\n * Callback to execute the selected suggestion command\n */\n command: (item: { id: string; label: string }) => void;\n\n /**\n * The trigger character (e.g., '@' or '/')\n */\n triggerChar: string;\n\n /**\n * Configuration for the suggestion popup\n */\n config: SuggestionConfig;\n\n /**\n * Current search query text\n */\n query?: string;\n}\n\nexport const MentionList = forwardRef<MentionListRef, MentionListProps>(\n ({ items, command, triggerChar, config, query }, ref) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const itemRefs = useRef<(HTMLDivElement | null)[]>([]);\n const { theme } = useContext(ChatContext);\n const popupTheme = theme?.input?.popup || chatTheme.input.popup;\n\n useEffect(() => {\n setSelectedIndex(0);\n }, [items]);\n\n useEffect(() => {\n if (itemRefs.current[selectedIndex]) {\n itemRefs.current[selectedIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth'\n });\n }\n }, [selectedIndex]);\n\n const selectItem = useCallback(\n (index: number) => {\n const item = items[index];\n if (!item) return;\n\n if (config.onSelect) {\n config.onSelect(item, (text: string) => {\n command({ id: item.id, label: text || item.label });\n });\n } else {\n command({ id: item.id, label: item.label });\n }\n },\n [items, command, config]\n );\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: KeyboardEvent }) => {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setSelectedIndex(prev => (prev <= 0 ? items.length - 1 : prev - 1));\n return true;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setSelectedIndex(prev => (prev >= items.length - 1 ? 0 : prev + 1));\n return true;\n }\n\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault();\n selectItem(selectedIndex);\n return true;\n }\n\n return false;\n }\n }));\n\n const popupId = `mention-list-${triggerChar}`;\n\n return (\n <List\n className={cn(popupTheme.base, popupTheme.content)}\n style={POPUP_STYLE}\n role=\"listbox\"\n id={popupId}\n aria-label={`${triggerChar === '@' ? 'Mentions' : 'Commands'} suggestions`}\n >\n {items.length === 0 ? (\n <ListItem className={cn(popupTheme.empty)} disabled dense>\n {config.renderEmpty\n ? config.renderEmpty(query || '')\n : query\n ? `No results for \"${query}\"`\n : 'No items available'}\n </ListItem>\n ) : (\n items.map((item, index) => (\n <div\n key={item.id}\n id={`${popupId}-option-${item.id}`}\n role=\"option\"\n aria-selected={index === selectedIndex}\n ref={el => {\n itemRefs.current[index] = el;\n }}\n onClick={() => selectItem(index)}\n onMouseEnter={() => setSelectedIndex(index)}\n className=\"cursor-pointer\"\n >\n {config.renderItem ? (\n config.renderItem(item, index === selectedIndex)\n ) : (\n <DefaultItemRenderer\n item={item}\n isHighlighted={index === selectedIndex}\n popupTheme={popupTheme}\n />\n )}\n </div>\n ))\n )}\n </List>\n );\n }\n);\n\ninterface DefaultItemRendererProps {\n /**\n * The suggestion item to render\n */\n item: SuggestionItem;\n\n /**\n * Whether this item is currently highlighted/selected\n */\n isHighlighted: boolean;\n\n /**\n * Theme styles for the popup\n */\n popupTheme: typeof chatTheme.input.popup;\n}\n\nconst DefaultItemRenderer = memo<DefaultItemRendererProps>(\n ({ item, isHighlighted, popupTheme }) => {\n const shortcut = 'shortcut' in item ? (item as any).shortcut : undefined;\n\n return (\n <ListItem\n className={cn(\n popupTheme.item,\n isHighlighted && popupTheme.itemHighlighted\n )}\n dense\n start={\n item.icon ? (\n <span className={cn(popupTheme.itemIcon)}>{item.icon}</span>\n ) : undefined\n }\n end={\n shortcut ? (\n <span className={cn(popupTheme.itemShortcut)}>{shortcut}</span>\n ) : undefined\n }\n >\n <div className={cn(popupTheme.itemContent)}>\n <span className={cn(popupTheme.itemLabel)}>{item.label}</span>\n {item.description && (\n <span className={cn(popupTheme.itemDescription)}>\n {item.description}\n </span>\n )}\n </div>\n </ListItem>\n );\n }\n);\n\nDefaultItemRenderer.displayName = 'DefaultItemRenderer';\n\nMentionList.displayName = 'MentionList';\n","import React, {\n forwardRef,\n useImperativeHandle,\n useContext,\n useRef,\n useEffect,\n useMemo\n} from 'react';\nimport {\n useEditor,\n EditorContent,\n ReactRenderer,\n posToDOMRect\n} from '@tiptap/react';\nimport { computePosition, flip, shift } from '@floating-ui/dom';\nimport Document from '@tiptap/extension-document';\nimport Paragraph from '@tiptap/extension-paragraph';\nimport Text from '@tiptap/extension-text';\nimport HardBreak from '@tiptap/extension-hard-break';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Mention from '@tiptap/extension-mention';\nimport { cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { MentionList, MentionListRef } from './MentionList';\nimport { SuggestionConfig, SuggestionItem } from './types';\n\nexport interface RichTextInputRef {\n focus: () => void;\n getValue: () => string;\n setValue: (value: string) => void;\n insertText: (text: string) => void;\n}\n\nexport interface RichTextInputProps {\n /**\n * Current value of the input\n */\n value?: string;\n\n /**\n * Placeholder text when empty\n */\n placeholder?: string;\n\n /**\n * Whether the input is disabled\n */\n disabled?: boolean;\n\n /**\n * Whether to auto-focus on mount (default: true)\n */\n autoFocus?: boolean;\n\n /**\n * Additional CSS classes\n */\n className?: string;\n\n /**\n * Minimum height in pixels (default: 24)\n */\n minHeight?: number;\n\n /**\n * Maximum height in pixels (default: 200)\n */\n maxHeight?: number;\n\n /**\n * Configuration for @ mentions\n */\n mentions?: SuggestionConfig;\n\n /**\n * Configuration for / slash commands\n */\n commands?: SuggestionConfig;\n\n /**\n * Callback when user submits (presses Enter)\n */\n onSubmit?: (value: string) => void;\n\n /**\n * Callback when input value changes\n */\n onChange?: (value: string) => void;\n}\n\n/**\n * Updates the position of the suggestion popup relative to the cursor.\n * Uses floating-ui to compute optimal placement with flip/shift middleware.\n */\nfunction updatePopupPosition(editor: any, element: HTMLElement) {\n const virtualElement = {\n getBoundingClientRect: () =>\n posToDOMRect(\n editor.view,\n editor.state.selection.from,\n editor.state.selection.to\n )\n };\n\n computePosition(virtualElement, element, {\n placement: 'bottom-start',\n strategy: 'absolute',\n middleware: [shift(), flip()]\n }).then(({ x, y, strategy }) => {\n element.style.width = 'max-content';\n element.style.position = strategy;\n element.style.left = `${x}px`;\n element.style.top = `${y}px`;\n });\n}\n\n/**\n * Creates a Tiptap suggestion configuration for mentions or slash commands.\n * Handles item filtering, popup rendering, positioning, and keyboard navigation.\n */\nfunction createSuggestionConfig<T extends SuggestionItem>(\n config: SuggestionConfig<T>,\n triggerChar: string,\n suggestionActiveRef: React.RefObject<boolean>\n) {\n return {\n char: triggerChar,\n allowSpaces: false,\n\n // Fetch and filter suggestion items based on query\n items: async ({ query }: { query: string }) => {\n if (config.onSearch) {\n return await config.onSearch(query);\n }\n if (!config.items) return [];\n if (!query) return config.items.slice(0, config.maxResults || 10);\n\n const lowerQuery = query.toLowerCase();\n return config.items\n .filter(\n item =>\n item.label.toLowerCase().includes(lowerQuery) ||\n item.description?.toLowerCase().includes(lowerQuery)\n )\n .slice(0, config.maxResults || 10);\n },\n\n // Render callbacks for managing the popup lifecycle\n render: () => {\n let component: ReactRenderer<MentionListRef> | null = null;\n\n return {\n // Called when suggestion is triggered\n onStart: (props: any) => {\n suggestionActiveRef.current = true;\n component = new ReactRenderer(MentionList, {\n props: {\n ...props,\n triggerChar,\n config\n },\n editor: props.editor\n });\n\n if (!props.clientRect) {\n return;\n }\n\n // Set position before appending to body (important for correct positioning)\n component.element.style.position = 'absolute';\n document.body.appendChild(component.element);\n updatePopupPosition(props.editor, component.element);\n },\n\n // Called when query or items change\n onUpdate: (props: any) => {\n component?.updateProps({\n ...props,\n triggerChar,\n config\n });\n\n if (!props.clientRect) {\n return;\n }\n\n if (component?.element) {\n updatePopupPosition(props.editor, component.element);\n }\n },\n\n // Handle keyboard navigation (Escape closes popup)\n onKeyDown: (props: any) => {\n if (props.event.key === 'Escape') {\n component?.destroy();\n return true;\n }\n return component?.ref?.onKeyDown(props) ?? false;\n },\n\n // Cleanup when suggestion is dismissed\n onExit: () => {\n suggestionActiveRef.current = false;\n component?.element?.remove();\n component?.destroy();\n }\n };\n }\n };\n}\n\nexport const RichTextInput = forwardRef<RichTextInputRef, RichTextInputProps>(\n (\n {\n value = '',\n placeholder = 'Type a message...',\n disabled = false,\n autoFocus = true,\n className,\n minHeight = 24,\n maxHeight = 200,\n mentions,\n commands,\n onSubmit,\n onChange\n },\n ref\n ) => {\n const { theme } = useContext(ChatContext);\n const containerRef = useRef<HTMLDivElement>(null);\n const suggestionActiveRef = useRef(false);\n\n const extensions = useMemo(() => {\n const exts = [\n Document,\n Paragraph.configure({\n HTMLAttributes: {\n class: 'tiptap-paragraph'\n }\n }),\n Text,\n HardBreak,\n Placeholder.configure({\n placeholder,\n emptyEditorClass: 'is-editor-empty'\n })\n ];\n\n if (mentions) {\n exts.push(\n Mention.configure({\n HTMLAttributes: {\n class: cn(theme?.input?.tag?.base, theme?.input?.tag?.mention)\n },\n suggestion: createSuggestionConfig(\n mentions,\n mentions.trigger || '@',\n suggestionActiveRef\n )\n }).extend({\n name: 'mention'\n })\n );\n }\n\n if (commands) {\n exts.push(\n Mention.configure({\n HTMLAttributes: {\n class: cn(theme?.input?.tag?.base, theme?.input?.tag?.command)\n },\n suggestion: createSuggestionConfig(\n commands,\n commands.trigger || '/',\n suggestionActiveRef\n )\n }).extend({\n name: 'command'\n })\n );\n }\n\n return exts;\n }, [placeholder, mentions, commands, theme]);\n\n const editor = useEditor({\n extensions,\n content: value ? `<p>${value}</p>` : '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor }) => {\n const text = editor.getText();\n onChange?.(text);\n },\n editorProps: {\n attributes: {\n class: cn(\n theme?.input?.editor?.base,\n theme?.input?.editor?.placeholder\n ),\n style: `min-height: ${minHeight}px; max-height: ${maxHeight}px;`,\n role: 'textbox',\n 'aria-multiline': 'true',\n 'aria-placeholder': placeholder,\n 'aria-disabled': disabled ? 'true' : 'false',\n tabindex: disabled ? '-1' : '0'\n },\n handleKeyDown: (view, event) => {\n // Don't submit when suggestion popup is active\n if (suggestionActiveRef.current) {\n return false;\n }\n if (event.key === 'Enter' && !event.shiftKey) {\n const text = view.state.doc.textContent;\n if (text.trim() && onSubmit) {\n event.preventDefault();\n onSubmit(text);\n editor?.commands.clearContent();\n return true;\n }\n }\n return false;\n }\n }\n });\n\n useEffect(() => {\n if (autoFocus && editor) {\n setTimeout(() => {\n editor.commands.focus('end');\n }, 0);\n }\n }, [editor, autoFocus]);\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n editor?.commands.focus();\n },\n getValue: () => {\n return editor?.getText() || '';\n },\n setValue: (newValue: string) => {\n editor?.commands.setContent(newValue ? `<p>${newValue}</p>` : '');\n },\n insertText: (text: string) => {\n editor?.commands.insertContent(text);\n }\n }));\n\n return (\n <div ref={containerRef} className={cn('relative w-full', className)}>\n <EditorContent editor={editor} />\n </div>\n );\n }\n);\n\nRichTextInput.displayName = 'RichTextInput';\n","import {\n useState,\n ReactElement,\n useRef,\n useMemo,\n ChangeEvent,\n useContext,\n forwardRef,\n useImperativeHandle,\n useEffect,\n useCallback\n} from 'react';\nimport { Button, cn } from 'reablocks';\nimport SendIcon from '@/assets/send.svg?react';\nimport StopIcon from '@/assets/stop.svg?react';\nimport { ChatContext } from '@/ChatContext';\nimport { FileInput } from './FileInput';\nimport { RichTextInput, RichTextInputRef } from './RichTextInput';\nimport { SuggestionConfig, MentionItem, SlashCommandItem } from './types';\n\nexport interface ChatInputProps {\n /**\n * Default value for the input field.\n */\n defaultValue?: string;\n\n /**\n * Allowed file types for upload.\n */\n allowedFiles?: string[];\n\n /**\n * Allow multiple file uploads.\n */\n allowMultipleFiles?: boolean;\n\n /**\n * Placeholder text for the input field.\n */\n placeholder?: string;\n\n /**\n * Icon to show for send.\n */\n sendIcon?: ReactElement;\n\n /**\n * Icon to show for stop.\n */\n stopIcon?: ReactElement;\n\n /**\n * Icon to show for attach.\n */\n attachIcon?: ReactElement;\n\n /**\n * Configuration for mentions (@user).\n * Provide items or an onSearch function to enable mentions.\n */\n mentions?: SuggestionConfig<MentionItem>;\n\n /**\n * Class name to apply to the container.\n */\n className?: string;\n\n /**\n * Configuration for commands (/command).\n * Provide items or an onSearch function to enable commands.\n */\n commands?: SuggestionConfig<SlashCommandItem>;\n\n /**\n * Minimum height for the input (default: 24px)\n */\n minHeight?: number;\n\n /**\n * Maximum height for the input (default: 200px)\n */\n maxHeight?: number;\n\n /**\n * Whether to auto-focus the input on mount (default: true)\n */\n autoFocus?: boolean;\n\n /**\n * Callback function to handle message change.\n */\n onMessageChange?: (message: string) => void;\n}\n\nexport interface ChatInputRef {\n /**\n * Focus the input.\n */\n focus: () => void;\n\n /**\n * Get the current input value.\n */\n getValue: () => string;\n\n /**\n * Set the input value.\n */\n setValue: (value: string) => void;\n\n /**\n * Insert text at the current cursor position.\n */\n insertText: (text: string) => void;\n}\n\nexport const ChatInput = forwardRef<ChatInputRef, ChatInputProps>(\n (\n {\n allowedFiles,\n placeholder = 'Type a message...',\n allowMultipleFiles = false,\n defaultValue,\n className,\n sendIcon = <SendIcon />,\n stopIcon = <StopIcon />,\n attachIcon,\n mentions,\n commands,\n minHeight = 24,\n maxHeight = 200,\n autoFocus = true,\n onMessageChange\n },\n ref\n ) => {\n const {\n theme,\n isLoading,\n disabled,\n sendMessage,\n stopMessage,\n fileUpload,\n activeSessionId\n } = useContext(ChatContext);\n\n const [message, setMessage] = useState<string>(defaultValue || '');\n const inputRef = useRef<RichTextInputRef | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (autoFocus) {\n inputRef.current?.focus();\n }\n }, [activeSessionId, autoFocus]);\n\n useImperativeHandle(ref, () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n getValue: () => {\n return inputRef.current?.getValue() || '';\n },\n setValue: (value: string) => {\n setMessage(value);\n inputRef.current?.setValue(value);\n onMessageChange?.(value);\n },\n insertText: (text: string) => {\n inputRef.current?.insertText(text);\n }\n }));\n\n const handleSendMessage = useCallback(() => {\n const currentMessage = inputRef.current?.getValue();\n if (currentMessage.trim()) {\n sendMessage?.(currentMessage);\n setMessage('');\n inputRef.current?.setValue('');\n }\n }, [sendMessage]);\n\n const handleSubmit = useCallback(\n (value: string) => {\n if (value.trim()) {\n sendMessage?.(value);\n setMessage('');\n }\n },\n [sendMessage]\n );\n\n const handleChange = useCallback(\n (value: string) => {\n setMessage(value);\n onMessageChange?.(value);\n },\n [onMessageChange]\n );\n\n const handleFileUpload = (event: ChangeEvent<HTMLInputElement>) => {\n const files = event.target.files;\n if (files?.length && fileUpload) {\n fileUpload(allowMultipleFiles ? Array.from(files) : files[0]);\n }\n };\n\n const mentionsConfig = useMemo(\n () =>\n mentions\n ? { ...mentions, trigger: mentions.trigger || '@' }\n : undefined,\n [mentions]\n );\n\n const commandsConfig = useMemo(\n () =>\n commands\n ? { ...commands, trigger: commands.trigger || '/' }\n : undefined,\n [commands]\n );\n\n return (\n <div ref={containerRef} className={cn(theme.input.base, className)}>\n <div className={cn('relative flex-1', theme.input.input)}>\n <RichTextInput\n ref={inputRef}\n value={message}\n onChange={handleChange}\n onSubmit={handleSubmit}\n placeholder={placeholder}\n disabled={isLoading || disabled}\n autoFocus={autoFocus}\n minHeight={minHeight}\n maxHeight={maxHeight}\n className={theme.input.editor.container}\n mentions={mentionsConfig}\n commands={commandsConfig}\n />\n\n <div className={cn(theme.input.actions.base)}>\n {allowedFiles?.length > 0 && (\n <FileInput\n allowedFiles={allowedFiles}\n multiple={allowMultipleFiles}\n onFileUpload={handleFileUpload}\n isLoading={isLoading}\n disabled={disabled}\n attachIcon={attachIcon}\n />\n )}\n {isLoading && (\n <Button\n title=\"Stop\"\n className={cn(theme.input.actions.stop)}\n onClick={stopMessage}\n disabled={disabled}\n >\n {stopIcon}\n </Button>\n )}\n <Button\n title=\"Send\"\n className={cn(theme.input.actions.send)}\n onClick={handleSendMessage}\n disabled={isLoading || disabled}\n >\n {sendIcon}\n </Button>\n </div>\n </div>\n </div>\n );\n }\n);\n","import { FC, PropsWithChildren, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { cn } from 'reablocks';\n\ninterface SessionEmptyProps extends PropsWithChildren {\n}\n\nexport const SessionEmpty: FC<SessionEmptyProps> = ({\n children\n}) => {\n const { theme } = useContext(ChatContext);\n return <div className={cn(theme.empty)}>{children}</div>;\n};\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn, Ellipsis, DateFormat } from 'reablocks';\nimport { FC, PropsWithChildren, useContext } from 'react';\n\nexport const SessionMessagesHeader: FC<PropsWithChildren> = ({ children }) => {\n const { activeSession, theme } = useContext(ChatContext);\n const Comp = children ? Slot : 'header';\n\n if (!activeSession) {\n return null;\n }\n\n return (\n <Comp className={cn(theme.messages.header)}>\n {children || (\n <>\n <h2 className={cn(theme.messages.title)}>\n <Ellipsis limit={125} value={activeSession.title} />\n </h2>\n <DateFormat\n className={cn(theme.messages.date)}\n date={activeSession.createdAt}\n />\n </>\n )}\n </Comp>\n );\n};\n","import * as React from \"react\";\nconst SvgBack = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-chevron-left\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"m15 18-6-6 6-6\" }));\nexport default SvgBack;\n","import { FC, PropsWithChildren, useContext } from 'react';\nimport { Button, cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { motion } from 'motion/react';\nimport BackIcon from '@/assets/back.svg?react';\n\ninterface SessionMessagePanelProps extends PropsWithChildren {\n allowBack?: boolean;\n}\n\nexport const SessionMessagePanel: FC<SessionMessagePanelProps> = ({\n children,\n allowBack = true\n}) => {\n const { activeSessionId, theme, isCompact, selectSession, viewType } =\n useContext(ChatContext);\n const isVisible =\n (isCompact && activeSessionId) || viewType === 'chat' || !isCompact;\n\n return (\n isVisible && (\n <motion.div\n initial={{ translateX: '200%' }}\n animate={{\n translateX: '0%',\n transition: {\n type: 'tween',\n ease: 'linear',\n duration: 0.2,\n when: 'beforeChildren'\n }\n }}\n exit={{ translateX: '200%' }}\n className={cn(theme.messages.base, {\n [theme.messages.companion]: isCompact,\n [theme.messages.console]: !isCompact\n })}\n >\n <div className={cn(theme.messages.inner)}>\n {allowBack && isCompact && viewType !== 'chat' && (\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => selectSession(null)}\n className={cn(theme.messages.back)}\n >\n <BackIcon />\n Back\n </Button>\n )}\n {children}\n </div>\n </motion.div>\n )\n );\n};\n","import * as React from \"react\";\nconst SvgCopy = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-copy\", ...props }, /* @__PURE__ */ React.createElement(\"rect\", { width: 14, height: 14, x: 8, y: 8, rx: 2, ry: 2 }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" }));\nexport default SvgCopy;\n","export const dark = {\n 'code[class*=\"language-\"]': {\n 'background': '#11111f',\n 'color': '#e2e8f0',\n 'textShadow': '0 1px rgba(0, 0, 0, 0.3)',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none'\n },\n 'pre[class*=\"language-\"]': {\n 'background': '#11111f',\n 'color': '#e2e8f0',\n 'textShadow': '0 1px rgba(0, 0, 0, 0.3)',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none',\n 'padding': '1em',\n 'margin': '0',\n 'overflow': 'auto'\n },\n 'code[class*=\"language-\"]::-moz-selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::-moz-selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::-moz-selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"]::selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::selection': {\n 'background': '#1e293b',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n ':not(pre) > code[class*=\"language-\"]': {\n 'padding': '0.2em 0.3em',\n 'borderRadius': '0.3em',\n 'whiteSpace': 'normal'\n },\n 'comment': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n 'prolog': {\n 'color': '#64748b'\n },\n 'cdata': {\n 'color': '#64748b'\n },\n 'doctype': {\n 'color': '#e2e8f0'\n },\n 'punctuation': {\n 'color': '#e2e8f0'\n },\n 'entity': {\n 'color': '#3b82f6',\n 'cursor': 'help'\n },\n 'attr-name': {\n 'color': '#f59e0b'\n },\n 'class-name': {\n 'color': '#f59e0b'\n },\n 'boolean': {\n 'color': '#3b82f6'\n },\n 'constant': {\n 'color': '#3b82f6'\n },\n 'number': {\n 'color': '#3b82f6'\n },\n 'atrule': {\n 'color': '#f59e0b'\n },\n 'keyword': {\n 'color': '#f472b6'\n },\n 'property': {\n 'color': '#3b82f6'\n },\n 'tag': {\n 'color': '#3b82f6'\n },\n 'symbol': {\n 'color': '#3b82f6'\n },\n 'deleted': {\n 'color': '#ef4444'\n },\n 'important': {\n 'color': '#f472b6'\n },\n 'selector': {\n 'color': '#10b981'\n },\n 'string': {\n 'color': '#10b981'\n },\n 'char': {\n 'color': '#10b981'\n },\n 'builtin': {\n 'color': '#10b981'\n },\n 'inserted': {\n 'color': '#10b981'\n },\n 'regex': {\n 'color': '#10b981'\n },\n 'attr-value': {\n 'color': '#10b981'\n },\n 'attr-value > .token.punctuation': {\n 'color': '#10b981'\n },\n 'variable': {\n 'color': '#60a5fa'\n },\n 'operator': {\n 'color': '#60a5fa'\n },\n 'function': {\n 'color': '#60a5fa'\n },\n 'url': {\n 'color': '#60a5fa'\n },\n 'attr-value > .token.punctuation.attr-equals': {\n 'color': '#e2e8f0'\n },\n 'special-attr > .token.attr-value > .token.value.css': {\n 'color': '#e2e8f0'\n },\n '.language-css .token.selector': {\n 'color': '#3b82f6'\n },\n '.language-css .token.property': {\n 'color': '#e2e8f0'\n },\n '.language-css .token.function': {\n 'color': '#60a5fa'\n },\n '.language-css .token.url > .token.function': {\n 'color': '#60a5fa'\n },\n '.language-css .token.url > .token.string.url': {\n 'color': '#10b981'\n },\n '.language-css .token.important': {\n 'color': '#f472b6'\n },\n '.language-css .token.atrule .token.rule': {\n 'color': '#f472b6'\n },\n '.language-javascript .token.operator': {\n 'color': '#f472b6'\n },\n '.language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation': {\n 'color': '#ef4444'\n },\n '.language-json .token.operator': {\n 'color': '#e2e8f0'\n },\n '.language-json .token.null.keyword': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url': {\n 'color': '#e2e8f0'\n },\n '.language-markdown .token.url > .token.operator': {\n 'color': '#e2e8f0'\n },\n '.language-markdown .token.url-reference.url > .token.string': {\n 'color': '#e2e8f0'\n },\n '.language-markdown .token.url > .token.content': {\n 'color': '#60a5fa'\n },\n '.language-markdown .token.url > .token.url': {\n 'color': '#60a5fa'\n },\n '.language-markdown .token.url-reference.url': {\n 'color': '#60a5fa'\n },\n '.language-markdown .token.blockquote.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.hr.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.code-snippet': {\n 'color': '#10b981'\n },\n '.language-markdown .token.bold .token.content': {\n 'color': '#f59e0b'\n },\n '.language-markdown .token.italic .token.content': {\n 'color': '#f472b6'\n },\n '.language-markdown .token.strike .token.content': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.strike .token.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.list.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.title.important > .token.punctuation': {\n 'color': '#3b82f6'\n },\n 'bold': {\n 'fontWeight': 'bold'\n },\n 'italic': {\n 'fontStyle': 'italic'\n },\n 'namespace': {\n 'Opacity': '0.8'\n },\n 'token.tab:not(:empty):before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'token.cr:before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'token.lf:before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'token.space:before': {\n 'color': '#64748b',\n 'textShadow': 'none'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item': {\n 'marginRight': '0.4em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button': {\n 'background': '#1e293b',\n 'color': '#94a3b8',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a': {\n 'background': '#1e293b',\n 'color': '#94a3b8',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span': {\n 'background': '#1e293b',\n 'color': '#94a3b8',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n '.line-highlight.line-highlight': {\n 'background': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-highlight.line-highlight:before': {\n 'background': '#1e293b',\n 'color': '#e2e8f0',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.2)'\n },\n '.line-highlight.line-highlight[data-end]:after': {\n 'background': '#1e293b',\n 'color': '#e2e8f0',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.2)'\n },\n 'pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before': {\n 'backgroundColor': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-numbers.line-numbers .line-numbers-rows': {\n 'borderRightColor': '#1e293b'\n },\n '.command-line .command-line-prompt': {\n 'borderRightColor': '#1e293b'\n },\n '.line-numbers .line-numbers-rows > span:before': {\n 'color': '#64748b'\n },\n '.command-line .command-line-prompt > span:before': {\n 'color': '#64748b'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-1': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-5': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-9': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-2': {\n 'color': '#10b981'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-6': {\n 'color': '#10b981'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-10': {\n 'color': '#10b981'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-3': {\n 'color': '#60a5fa'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-7': {\n 'color': '#60a5fa'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-11': {\n 'color': '#60a5fa'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-4': {\n 'color': '#f472b6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-8': {\n 'color': '#f472b6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-12': {\n 'color': '#f472b6'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(239, 68, 68, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(16, 185, 129, 0.25)'\n },\n '.prism-previewer.prism-previewer:before': {\n 'borderColor': '#11111f'\n },\n '.prism-previewer-gradient.prism-previewer-gradient div': {\n 'borderColor': '#11111f',\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-color.prism-previewer-color:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-easing.prism-previewer-easing:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer.prism-previewer:after': {\n 'borderTopColor': '#11111f'\n },\n '.prism-previewer-flipped.prism-previewer-flipped.after': {\n 'borderBottomColor': '#11111f'\n },\n '.prism-previewer-angle.prism-previewer-angle:before': {\n 'background': '#1e293b'\n },\n '.prism-previewer-time.prism-previewer-time:before': {\n 'background': '#1e293b'\n },\n '.prism-previewer-easing.prism-previewer-easing': {\n 'background': '#1e293b'\n },\n '.prism-previewer-angle.prism-previewer-angle circle': {\n 'stroke': '#e2e8f0',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-time.prism-previewer-time circle': {\n 'stroke': '#e2e8f0',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-easing.prism-previewer-easing circle': {\n 'stroke': '#e2e8f0',\n 'fill': 'transparent'\n },\n '.prism-previewer-easing.prism-previewer-easing path': {\n 'stroke': '#e2e8f0'\n },\n '.prism-previewer-easing.prism-previewer-easing line': {\n 'stroke': '#e2e8f0'\n }\n}\n","export const light = {\n 'code[class*=\"language-\"]': {\n 'background': '#fff',\n 'color': '#1e293b',\n 'textShadow': 'none',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none'\n },\n 'pre[class*=\"language-\"]': {\n 'background': '#fff',\n 'color': '#1e293b',\n 'textShadow': 'none',\n 'fontFamily': '\"Fira Code\", \"Fira Mono\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace',\n 'direction': 'ltr',\n 'textAlign': 'left',\n 'whiteSpace': 'pre',\n 'wordSpacing': 'normal',\n 'wordBreak': 'normal',\n 'lineHeight': '1.5',\n 'MozTabSize': '2',\n 'OTabSize': '2',\n 'tabSize': '2',\n 'WebkitHyphens': 'none',\n 'MozHyphens': 'none',\n 'msHyphens': 'none',\n 'hyphens': 'none',\n 'padding': '1em',\n 'margin': '0.5em 0',\n 'overflow': 'auto',\n 'borderRadius': '0.3em',\n 'border': '1px solid #e2e8f0'\n },\n 'code[class*=\"language-\"]::-moz-selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::-moz-selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::-moz-selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"]::selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'code[class*=\"language-\"] *::selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n 'pre[class*=\"language-\"] *::selection': {\n 'background': '#e2e8f0',\n 'color': 'inherit',\n 'textShadow': 'none'\n },\n ':not(pre) > code[class*=\"language-\"]': {\n 'padding': '0.2em 0.3em',\n 'borderRadius': '0.3em',\n 'whiteSpace': 'normal',\n 'background': '#f1f5f9'\n },\n 'comment': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n 'prolog': {\n 'color': '#64748b'\n },\n 'cdata': {\n 'color': '#64748b'\n },\n 'doctype': {\n 'color': '#1e293b'\n },\n 'punctuation': {\n 'color': '#64748b'\n },\n 'entity': {\n 'color': '#3b82f6',\n 'cursor': 'help'\n },\n 'attr-name': {\n 'color': '#ea580c'\n },\n 'class-name': {\n 'color': '#ea580c'\n },\n 'boolean': {\n 'color': '#3b82f6'\n },\n 'constant': {\n 'color': '#3b82f6'\n },\n 'number': {\n 'color': '#3b82f6'\n },\n 'atrule': {\n 'color': '#ea580c'\n },\n 'keyword': {\n 'color': '#9333ea'\n },\n 'property': {\n 'color': '#3b82f6'\n },\n 'tag': {\n 'color': '#3b82f6'\n },\n 'symbol': {\n 'color': '#3b82f6'\n },\n 'deleted': {\n 'color': '#dc2626'\n },\n 'important': {\n 'color': '#9333ea'\n },\n 'selector': {\n 'color': '#16a34a'\n },\n 'string': {\n 'color': '#16a34a'\n },\n 'char': {\n 'color': '#16a34a'\n },\n 'builtin': {\n 'color': '#16a34a'\n },\n 'inserted': {\n 'color': '#16a34a'\n },\n 'regex': {\n 'color': '#16a34a'\n },\n 'attr-value': {\n 'color': '#16a34a'\n },\n 'attr-value > .token.punctuation': {\n 'color': '#16a34a'\n },\n 'variable': {\n 'color': '#3b82f6'\n },\n 'operator': {\n 'color': '#3b82f6'\n },\n 'function': {\n 'color': '#3b82f6'\n },\n 'url': {\n 'color': '#3b82f6'\n },\n 'attr-value > .token.punctuation.attr-equals': {\n 'color': '#64748b'\n },\n 'special-attr > .token.attr-value > .token.value.css': {\n 'color': '#1e293b'\n },\n '.language-css .token.selector': {\n 'color': '#3b82f6'\n },\n '.language-css .token.property': {\n 'color': '#1e293b'\n },\n '.language-css .token.function': {\n 'color': '#3b82f6'\n },\n '.language-css .token.url > .token.function': {\n 'color': '#3b82f6'\n },\n '.language-css .token.url > .token.string.url': {\n 'color': '#16a34a'\n },\n '.language-css .token.important': {\n 'color': '#9333ea'\n },\n '.language-css .token.atrule .token.rule': {\n 'color': '#9333ea'\n },\n '.language-javascript .token.operator': {\n 'color': '#9333ea'\n },\n '.language-javascript .token.template-string > .token.interpolation > .token.interpolation-punctuation.punctuation': {\n 'color': '#dc2626'\n },\n '.language-json .token.operator': {\n 'color': '#1e293b'\n },\n '.language-json .token.null.keyword': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url': {\n 'color': '#1e293b'\n },\n '.language-markdown .token.url > .token.operator': {\n 'color': '#1e293b'\n },\n '.language-markdown .token.url-reference.url > .token.string': {\n 'color': '#1e293b'\n },\n '.language-markdown .token.url > .token.content': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url > .token.url': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.url-reference.url': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.blockquote.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.hr.punctuation': {\n 'color': '#64748b',\n 'fontStyle': 'italic'\n },\n '.language-markdown .token.code-snippet': {\n 'color': '#16a34a'\n },\n '.language-markdown .token.bold .token.content': {\n 'color': '#ea580c'\n },\n '.language-markdown .token.italic .token.content': {\n 'color': '#9333ea'\n },\n '.language-markdown .token.strike .token.content': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.strike .token.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.list.punctuation': {\n 'color': '#3b82f6'\n },\n '.language-markdown .token.title.important > .token.punctuation': {\n 'color': '#3b82f6'\n },\n 'bold': {\n 'fontWeight': 'bold'\n },\n 'italic': {\n 'fontStyle': 'italic'\n },\n 'namespace': {\n 'Opacity': '0.8'\n },\n 'token.tab:not(:empty):before': {\n 'color': '#94a3b8'\n },\n 'token.cr:before': {\n 'color': '#94a3b8'\n },\n 'token.lf:before': {\n 'color': '#94a3b8'\n },\n 'token.space:before': {\n 'color': '#94a3b8'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item': {\n 'marginRight': '0.4em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button': {\n 'background': '#f1f5f9',\n 'color': '#475569',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a': {\n 'background': '#f1f5f9',\n 'color': '#475569',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span': {\n 'background': '#f1f5f9',\n 'color': '#475569',\n 'padding': '0.1em 0.4em',\n 'borderRadius': '0.3em'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > button:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > a:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:hover': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n 'div.code-toolbar > .toolbar.toolbar > .toolbar-item > span:focus': {\n 'background': '#3b82f6',\n 'color': '#ffffff'\n },\n '.line-highlight.line-highlight': {\n 'background': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-highlight.line-highlight:before': {\n 'background': '#f1f5f9',\n 'color': '#1e293b',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.1)'\n },\n '.line-highlight.line-highlight[data-end]:after': {\n 'background': '#f1f5f9',\n 'color': '#1e293b',\n 'padding': '0.1em 0.6em',\n 'borderRadius': '0.3em',\n 'boxShadow': '0 2px 0 0 rgba(0, 0, 0, 0.1)'\n },\n 'pre[id].linkable-line-numbers.linkable-line-numbers span.line-numbers-rows > span:hover:before': {\n 'backgroundColor': 'rgba(59, 130, 246, 0.08)'\n },\n '.line-numbers.line-numbers .line-numbers-rows': {\n 'borderRightColor': '#e2e8f0'\n },\n '.command-line .command-line-prompt': {\n 'borderRightColor': '#e2e8f0'\n },\n '.line-numbers .line-numbers-rows > span:before': {\n 'color': '#94a3b8'\n },\n '.command-line .command-line-prompt > span:before': {\n 'color': '#94a3b8'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-1': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-5': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-9': {\n 'color': '#3b82f6'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-2': {\n 'color': '#16a34a'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-6': {\n 'color': '#16a34a'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-10': {\n 'color': '#16a34a'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-3': {\n 'color': '#ea580c'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-7': {\n 'color': '#ea580c'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-11': {\n 'color': '#ea580c'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-4': {\n 'color': '#9333ea'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-8': {\n 'color': '#9333ea'\n },\n '.rainbow-braces .token.token.punctuation.brace-level-12': {\n 'color': '#9333ea'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.deleted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(220, 38, 38, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.15)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.15)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::-moz-selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre.diff-highlight > code .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix)::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n 'pre > code.diff-highlight .token.token.inserted:not(.prefix) *::selection': {\n 'backgroundColor': 'rgba(22, 163, 74, 0.25)'\n },\n '.prism-previewer.prism-previewer:before': {\n 'borderColor': '#fff'\n },\n '.prism-previewer-gradient.prism-previewer-gradient div': {\n 'borderColor': '#fff',\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-color.prism-previewer-color:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer-easing.prism-previewer-easing:before': {\n 'borderRadius': '0.3em'\n },\n '.prism-previewer.prism-previewer:after': {\n 'borderTopColor': '#fff'\n },\n '.prism-previewer-flipped.prism-previewer-flipped.after': {\n 'borderBottomColor': '#fff'\n },\n '.prism-previewer-angle.prism-previewer-angle:before': {\n 'background': '#f1f5f9'\n },\n '.prism-previewer-time.prism-previewer-time:before': {\n 'background': '#f1f5f9'\n },\n '.prism-previewer-easing.prism-previewer-easing': {\n 'background': '#f1f5f9'\n },\n '.prism-previewer-angle.prism-previewer-angle circle': {\n 'stroke': '#1e293b',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-time.prism-previewer-time circle': {\n 'stroke': '#1e293b',\n 'strokeOpacity': '1'\n },\n '.prism-previewer-easing.prism-previewer-easing circle': {\n 'stroke': '#1e293b',\n 'fill': 'transparent'\n },\n '.prism-previewer-easing.prism-previewer-easing path': {\n 'stroke': '#1e293b'\n },\n '.prism-previewer-easing.prism-previewer-easing line': {\n 'stroke': '#1e293b'\n }\n}\n","import { Button, cn } from 'reablocks';\nimport type { FC, PropsWithChildren, ReactElement } from 'react';\nimport React from 'react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\n\nimport CopyIcon from '@/assets/copy.svg?react';\n\nimport { dark } from './themes';\n\nexport interface CodeHighlighterProps extends PropsWithChildren {\n /**\n * The class name to apply to the code block.\n */\n className?: string;\n\n /**\n * The class name to apply to the inline code.\n */\n inlineClassName?: string;\n\n /**\n * The language of the code block.\n */\n language?: string;\n\n /**\n * The class name to apply to the copy button.\n */\n copyClassName?: string;\n\n /**\n * The class name to apply to the toolbar.\n */\n toolbarClassName?: string;\n\n /**\n * Icon to show for copy.\n */\n copyIcon?: ReactElement;\n\n /**\n * The theme to use for the code block.\n */\n theme?: Record<string, string>;\n}\n\nexport const CodeHighlighter: FC<CodeHighlighterProps> = ({\n className,\n children,\n inlineClassName,\n copyClassName,\n copyIcon = <CopyIcon />,\n language,\n toolbarClassName,\n theme = dark,\n ...props\n}) => {\n const match = language?.match(/language-(\\w+)/);\n const lang = match ? match[1] : 'text';\n // If we can't match a language type, its probably not a code block\n const isInline = !match;\n\n const handleCopy = (text: string) => {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n console.log('Text copied to clipboard');\n })\n .catch(err => {\n console.error('Could not copy text: ', err);\n });\n };\n\n if (isInline) {\n return (\n <code className={cn(inlineClassName)} {...props}>\n {children}\n </code>\n );\n }\n\n return (\n <div className={cn('relative', className)}>\n <div className={cn(toolbarClassName)}>\n <div>{lang}</div>\n {copyIcon && (\n <Button\n className={cn(copyClassName)}\n size=\"small\"\n variant=\"text\"\n title=\"Copy code\"\n onClick={() => handleCopy(children as string)}\n >\n {copyIcon}\n </Button>\n )}\n </div>\n <SyntaxHighlighter language={lang} style={theme}>\n {children}\n </SyntaxHighlighter>\n </div>\n );\n};\n","import React, { FC, PropsWithChildren } from 'react';\n\nexport const TableComponent: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableElement>>> = ({ children, ...props }) => (\n <table {...props}>\n {children}\n </table>\n);\n\nexport const TableHeaderCell: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableHeaderCellElement>>> = ({ children, ...props }) => (\n <th {...props}>\n {children}\n </th>\n);\n\nexport const TableDataCell: FC<PropsWithChildren<React.HTMLAttributes<HTMLTableDataCellElement>>> = ({ children, ...props }) => (\n <td {...props}>\n {children}\n </td>\n);\n","import './Markdown.css';\n\nimport { cn, Redact } from 'reablocks';\nimport type { FC, PropsWithChildren } from 'react';\nimport { useContext, useMemo } from 'react';\nimport ReactMarkdown, { Components } from 'react-markdown';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport type { Plugin } from 'unified';\n\nimport { ChatContext } from '@/ChatContext';\nimport type { ChatTheme } from '@/theme';\n\nimport { CodeHighlighter } from './CodeHighlighter';\nimport { TableComponent, TableDataCell, TableHeaderCell } from './Table';\n\ninterface MarkdownWrapperProps extends PropsWithChildren {\n /**\n * Remark plugins to apply to the markdown content.\n */\n remarkPlugins?: Plugin[];\n\n /**\n * Rehype plugins to apply to the markdown content.\n */\n rehypePlugins?: Plugin[];\n\n /**\n * Theme to apply to the markdown content.\n */\n theme?: ChatTheme;\n\n /**\n * Custom components to override default markdown rendering.\n * These will be merged with the default components.\n */\n customComponents?: Components;\n}\n\nexport const Markdown: FC<MarkdownWrapperProps> = ({\n children,\n remarkPlugins,\n rehypePlugins = [rehypeRaw, rehypeKatex],\n theme: themeProp,\n customComponents\n}) => {\n const { theme: contextTheme, markdownComponents } = useContext(ChatContext);\n const theme = themeProp || contextTheme;\n\n const components = useMemo<Components>(() => {\n const defaultComponents: Record<string, any> = {\n code: ({ className, children, ...props }) => (\n <CodeHighlighter\n {...props}\n language={cn(className)}\n inlineClassName={cn(theme.messages.message.markdown.inlineCode)}\n className={cn(theme.messages.message.markdown.code, className)}\n copyClassName={cn(theme.messages.message.markdown.copy)}\n toolbarClassName={cn(theme.messages.message.markdown.toolbar)}\n >\n {children}\n </CodeHighlighter>\n ),\n table: props => (\n <TableComponent\n {...props}\n className={cn(theme.messages.message.markdown.table)}\n />\n ),\n th: props => (\n <TableHeaderCell\n {...props}\n className={cn(theme.messages.message.markdown.th)}\n />\n ),\n td: props => (\n <TableDataCell\n {...props}\n className={cn(theme.messages.message.markdown.td)}\n />\n ),\n a: props => (\n <a {...props} className={cn(theme.messages.message.markdown.a)} />\n ),\n hr: props => (\n <hr {...props} className={cn(theme.messages.message.markdown.hr)} />\n ),\n p: props => (\n <p {...props} className={cn(theme.messages.message.markdown.p)} />\n ),\n li: props => (\n <li {...props} className={cn(theme.messages.message.markdown.li)} />\n ),\n ul: props => (\n <ul {...props} className={cn(theme.messages.message.markdown.ul)} />\n ),\n ol: props => (\n <ol {...props} className={cn(theme.messages.message.markdown.ol)} />\n ),\n h1: props => (\n <h1 {...props} className={cn(theme.messages.message.markdown.h1)} />\n ),\n h2: props => (\n <h2 {...props} className={cn(theme.messages.message.markdown.h2)} />\n ),\n h3: props => (\n <h3 {...props} className={cn(theme.messages.message.markdown.h3)} />\n ),\n h4: props => (\n <h4 {...props} className={cn(theme.messages.message.markdown.h4)} />\n ),\n h5: props => (\n <h5 {...props} className={cn(theme.messages.message.markdown.h5)} />\n ),\n h6: props => (\n <h6 {...props} className={cn(theme.messages.message.markdown.h6)} />\n ),\n // 'redact' is a custom element created by remarkRedact, not a standard\n // HTML tag, so it falls outside react-markdown's Components type.\n redact: ((props: Record<string, unknown>) => (\n <Redact\n value={\n (props['data-redact-value'] as string) || (props.children as string)\n }\n allowToggle={true}\n tooltipText={`${(props['data-redact-name'] as string) || 'Sensitive'} information - Click to toggle`}\n />\n )) as unknown\n };\n\n // Merge: defaults < context components < prop components\n return {\n ...defaultComponents,\n ...markdownComponents,\n ...customComponents\n };\n }, [theme, markdownComponents, customComponents]);\n\n return (\n <ReactMarkdown\n remarkPlugins={remarkPlugins as Plugin[]}\n rehypePlugins={rehypePlugins as Plugin[]}\n components={components}\n >\n {children as string}\n </ReactMarkdown>\n );\n};\n","import React, { FC, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\n\nexport interface ComponentErrorProps {\n /**\n * The visual style variant of the error display.\n * Defaults to 'error'.\n */\n variant?: 'error' | 'warning';\n\n /**\n * The heading text displayed at the top of the error.\n */\n title?: string;\n\n /**\n * The descriptive message explaining the error or warning.\n */\n message?: string;\n\n /**\n * The raw code or data that caused the error, displayed in a code block.\n */\n code?: string;\n}\n\nexport const ComponentError: FC<ComponentErrorProps> = ({\n variant = 'error',\n title,\n message,\n code\n}) => {\n const { theme } = useContext(ChatContext);\n const styles =\n variant === 'warning' ? theme.chart.warning : theme.chart.error;\n\n return (\n <div className={styles.base}>\n {title && <div className={styles.title}>{title}</div>}\n {message && <div>{message}</div>}\n {code && 'code' in styles && (\n <pre className={styles.code as string}>\n <code>{code}</code>\n </pre>\n )}\n </div>\n );\n};\n","import React, { FC, useMemo, useContext } from 'react';\nimport {\n BarChart,\n BarSeries,\n LineChart,\n LineSeries,\n AreaChart,\n AreaSeries,\n PieChart,\n PieArcSeries,\n RadialBarChart,\n RadialBarSeries,\n RadialAreaChart,\n RadialAreaSeries,\n SparklineChart,\n ChartShallowDataShape,\n LinearXAxis,\n LinearYAxis\n} from 'reaviz';\nimport { cn } from 'reablocks';\nimport type { ChartConfig, ChartType } from './types';\nimport { ChatContext } from '@/ChatContext';\nimport { ComponentError } from './ComponentError';\n\nexport interface ChartRendererProps {\n /**\n * The chart configuration.\n */\n config: ChartConfig;\n\n /**\n * The class name to apply to the chart container.\n */\n className?: string;\n}\n\nexport const ChartRenderer: FC<ChartRendererProps> = ({\n config,\n className\n}) => {\n const { theme } = useContext(ChatContext);\n const { type, data, width = 400, height = 300, title } = config;\n\n const chartElement = useMemo(() => {\n const chartData: ChartShallowDataShape[] = data\n .filter(\n (d): d is { key: string; data: number } => typeof d.data === 'number'\n )\n .map(d => ({\n key: d.key,\n data: d.data\n }));\n\n if (!chartData || chartData.length === 0) {\n return (\n <ComponentError variant=\"warning\" message=\"No chart data available\" />\n );\n }\n\n for (const point of chartData) {\n if (typeof point.data !== 'number' || isNaN(point.data)) {\n return (\n <ComponentError\n message={`Invalid data point: ${JSON.stringify(point)}`}\n />\n );\n }\n }\n\n const chartProps = {\n width,\n height,\n data: chartData\n };\n\n try {\n switch (type as ChartType) {\n case 'bar':\n return <BarChart {...chartProps} series={<BarSeries />} />;\n\n case 'line':\n return (\n <LineChart\n {...chartProps}\n xAxis={<LinearXAxis type=\"category\" />}\n yAxis={<LinearYAxis type=\"value\" />}\n series={<LineSeries />}\n />\n );\n\n case 'area':\n return (\n <AreaChart\n {...chartProps}\n xAxis={<LinearXAxis type=\"category\" />}\n yAxis={<LinearYAxis type=\"value\" />}\n series={<AreaSeries />}\n />\n );\n\n case 'pie':\n return (\n <PieChart\n width={width}\n height={height}\n data={chartData}\n series={<PieArcSeries />}\n />\n );\n\n case 'radialBar':\n return (\n <RadialBarChart\n width={width}\n height={height}\n data={chartData}\n series={<RadialBarSeries />}\n />\n );\n\n case 'radialArea':\n return (\n <RadialAreaChart\n width={width}\n height={height}\n data={chartData}\n series={<RadialAreaSeries />}\n />\n );\n\n case 'sparkline':\n return (\n <SparklineChart width={width} height={height} data={chartData} />\n );\n\n default:\n return <ComponentError message={`Unknown chart type: ${type}`} />;\n }\n } catch (error) {\n return (\n <ComponentError message={`Chart render error: ${String(error)}`} />\n );\n }\n }, [type, data, width, height]);\n\n return (\n <div className={cn(theme.chart.base, className)}>\n {title && <div className={theme.chart.title}>{title}</div>}\n <div className={theme.chart.content}>{chartElement}</div>\n </div>\n );\n};\n","import { findAndReplace } from 'mdast-util-find-and-replace';\nimport type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\n\nconst CVE_REGEX = /(CVE-(19|20)\\d{2}-\\d{4,7})/gi;\n\nexport const remarkCve: Plugin = () => tree => {\n findAndReplace(tree as Root, [\n [\n CVE_REGEX,\n (value: string) => ({\n type: 'link',\n url: `https://cve.mitre.org/cgi-bin/cvename.cgi?name=${value.trim()}`,\n children: [{ type: 'text', value: value.trim() }]\n })\n ]\n ]);\n};\n","import type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\n\n/**\n * Options for the remarkComponent plugin.\n */\nexport interface RemarkComponentOptions {\n /**\n * The fenced-code-block language tag to detect.\n * @default 'component'\n */\n language?: string;\n}\n\n/**\n * A remark plugin that acts as a pass-through for fenced code blocks with\n * the configured language tag (default: `component`).\n *\n * The actual rendering is handled entirely by `ComponentPre` which\n * intercepts `<pre>` elements with a matching `language-{tag}` class.\n * This plugin exists as an integration point so the catalog can expose\n * a standard `remarkPlugin` property; it does not transform the AST.\n *\n * Usage in markdown:\n * ```component\n * { \"type\": \"WeatherCard\", \"props\": { \"city\": \"SF\", \"temperature\": 72 } }\n * ```\n */\nexport const remarkComponent: Plugin<[RemarkComponentOptions?], Root> = (\n _options = {}\n) => {\n // Intentional no-op — ComponentPre handles rendering via markdownComponents.\n return () => {};\n};\n","import { findAndReplace } from 'mdast-util-find-and-replace';\nimport type { Plugin } from 'unified';\nimport type { Root } from 'mdast';\n\n/**\n * Interface for defining a redaction matcher.\n */\nexport interface RedactMatcher {\n /**\n * Name of the matcher (e.g., \"SSN\", \"Credit Card\", \"Bitcoin\").\n */\n name: string;\n\n /**\n * Regular expression pattern to match sensitive data.\n */\n pattern: RegExp;\n\n /**\n * Optional validation function that receives the matched value.\n * Return true to redact, false to skip.\n */\n validate?: (match: string) => boolean;\n}\n\n/**\n * Creates a remark plugin that redacts sensitive data based on provided matchers.\n * The plugin replaces matched text with HTML elements that can be rendered\n * using the Redact component from reablocks.\n *\n * @param matchers - Array of RedactMatcher objects that define what to redact\n * @returns A remark plugin function\n *\n * @example\n * ```ts\n * const matchers = [\n * { name: 'SSN', pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g }\n * ];\n * remarkPlugins={[remarkRedact(matchers)]}\n * ```\n */\nexport function remarkRedact(matchers: RedactMatcher[]): Plugin<[], Root> {\n return () => (tree: Root) => {\n if (!tree || !matchers || matchers.length === 0) {\n return;\n }\n\n const patterns: Array<[RegExp, (...args: any[]) => any]> = [];\n\n for (const { name, pattern, validate } of matchers) {\n patterns.push([\n pattern,\n (value: string) => {\n // Apply optional validation\n if (validate && !validate(value)) {\n return false;\n }\n\n return {\n type: 'html',\n value: `<redact data-redact-name=\"${name}\" data-redact-value=\"${value.replace(/\"/g, '&quot;')}\">${value}</redact>`\n };\n }\n ]);\n }\n\n // Apply all patterns at once\n if (patterns.length > 0) {\n try {\n findAndReplace(tree, patterns as any);\n } catch (err) {\n console.warn('Redact plugin error:', err);\n }\n }\n };\n}\n","import type { RedactMatcher } from './remarkRedact';\n\n/**\n * Matcher for Social Security Numbers (SSN).\n * Matches patterns like: 123-45-6789\n */\nexport const ssnMatcher: RedactMatcher = {\n name: 'SSN',\n pattern: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g\n};\n\n/**\n * Matcher for Credit Card numbers.\n * Matches patterns like: 1234-5678-9012-3456 or 1234 5678 9012 3456\n * Supports common formats with spaces, dashes, or no separators.\n */\nexport const creditCardMatcher: RedactMatcher = {\n name: 'Credit Card',\n pattern: /\\b(?:\\d[ -]*?){13,19}\\b/g,\n validate: (match: string) => {\n // Exclude numbers that are clearly not credit cards\n if (/(?:years?|year|yr|yrs|old|age|phone|tel|call)/.test(match)) {\n return false;\n }\n\n const cardNumber = match.replace(/[ -]/g, '');\n // Basic length check to reduce false positives\n return cardNumber.length >= 13 && cardNumber.length <= 19;\n }\n};\n\n/**\n * Matcher for Bitcoin addresses.\n * Matches Bitcoin addresses (starts with 1 or 3, 26-35 alphanumeric characters).\n */\nexport const bitcoinMatcher: RedactMatcher = {\n name: 'Bitcoin',\n pattern: /\\b[13][a-km-zA-HJ-NP-Z1-9]{25,34}\\b/g\n};\n\n/**\n * Common redaction matchers for sensitive data.\n */\nexport const commonRedactMatchers: RedactMatcher[] = [\n ssnMatcher,\n creditCardMatcher,\n bitcoinMatcher\n];\n","import * as React from \"react\";\nconst SvgFile = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 16, height: 16, viewBox: \"0 0 16 16\", fill: \"currentColor\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { fillRule: \"evenodd\", clipRule: \"evenodd\", d: \"M2.7036 1.37034C3.04741 1.02653 3.51373 0.833374 3.99996 0.833374H9.33329H9.33331C9.47275 0.833374 9.59885 0.890449 9.68954 0.98251L13.6843 4.97722C13.7763 5.0679 13.8333 5.19398 13.8333 5.33337L13.8333 5.3379V13.3334C13.8333 13.8196 13.6401 14.2859 13.2963 14.6297C12.9525 14.9736 12.4862 15.1667 12 15.1667H3.99996C3.51373 15.1667 3.04741 14.9736 2.7036 14.6297C2.35978 14.2859 2.16663 13.8196 2.16663 13.3334V2.66671C2.16663 2.18048 2.35978 1.71416 2.7036 1.37034ZM3.99996 1.83337H8.83331V5.33337C8.83331 5.60952 9.05717 5.83337 9.33331 5.83337H12.8333V13.3334C12.8333 13.5544 12.7455 13.7663 12.5892 13.9226C12.4329 14.0789 12.221 14.1667 12 14.1667H3.99996C3.77895 14.1667 3.56698 14.0789 3.4107 13.9226C3.25442 13.7663 3.16663 13.5544 3.16663 13.3334V2.66671C3.16663 2.44569 3.25442 2.23373 3.4107 2.07745C3.56698 1.92117 3.77895 1.83337 3.99996 1.83337ZM9.83331 2.5405L12.1262 4.83337H9.83331V2.5405ZM5.33331 8.16663C5.05717 8.16663 4.83331 8.39048 4.83331 8.66663C4.83331 8.94277 5.05717 9.16663 5.33331 9.16663H10.6666C10.9428 9.16663 11.1666 8.94277 11.1666 8.66663C11.1666 8.39048 10.9428 8.16663 10.6666 8.16663H5.33331ZM4.83331 11.3334C4.83331 11.0572 5.05717 10.8334 5.33331 10.8334H10.6666C10.9428 10.8334 11.1666 11.0572 11.1666 11.3334C11.1666 11.6095 10.9428 11.8334 10.6666 11.8334H5.33331C5.05717 11.8334 4.83331 11.6095 4.83331 11.3334ZM5.33331 5.5C5.05717 5.5 4.83331 5.72386 4.83331 6C4.83331 6.27614 5.05717 6.5 5.33331 6.5H6.66665C6.94279 6.5 7.16665 6.27614 7.16665 6C7.16665 5.72386 6.94279 5.5 6.66665 5.5H5.33331Z\" }));\nexport default SvgFile;\n","import { FC, useContext, ReactElement, Suspense, lazy, useMemo } from 'react';\nimport { ConversationFile } from '@/types';\nimport { ChatContext } from '@/ChatContext';\nimport { cn } from 'reablocks';\nimport FileIcon from '@/assets/file.svg?react';\n\nconst DefaultFileRenderer = lazy(() => import('./renderers/DefaultFileRenderer'));\nconst CSVFileRenderer = lazy(() => import('./renderers/CSVFileRenderer'));\nconst ImageFileRenderer = lazy(() => import('./renderers/ImageFileRenderer'));\nconst PDFFileRenderer = lazy(() => import('./renderers/PDFFileRenderer'));\n\nconst FILE_TYPE_RENDERER_MAP: { [key: string]: FC<any> } = {\n 'image/': ImageFileRenderer,\n 'text/csv': CSVFileRenderer,\n 'application/pdf': PDFFileRenderer,\n};\n\nexport interface MessageFileProps extends ConversationFile {\n /**\n * Icon to show for delete.\n */\n fileIcon?: ReactElement;\n\n /**\n * Limit for the name.\n */\n limit?: number;\n}\n\n/**\n * Base MessageFile component that routes to specific file renderers based on file type.\n */\nexport const MessageFile: FC<MessageFileProps> = ({\n name,\n type,\n url,\n limit = 100,\n fileIcon = <FileIcon />,\n}) => {\n const { theme } = useContext(ChatContext);\n\n // Based on the file type, we will render a specific file renderer.\n const FileRenderer = useMemo(() => {\n const Renderer =\n Object.keys(FILE_TYPE_RENDERER_MAP).find((key) => type?.startsWith(key)) ??\n 'default';\n return FILE_TYPE_RENDERER_MAP[Renderer] || DefaultFileRenderer;\n }, [type]);\n\n return (\n <div\n className={cn(theme.messages.message.files.file.base)}\n >\n <Suspense fallback={<div>Loading...</div>}>\n <FileRenderer name={name} url={url} fileIcon={fileIcon} limit={limit} />\n </Suspense>\n </div>\n );\n};\n","import { FC, ReactElement } from 'react';\nimport FileIcon from '@/assets/file.svg?react';\nimport { Ellipsis, cn } from 'reablocks';\n\ninterface DefaultFileRendererProps {\n /**\n * Limit for the name.\n */\n limit?: number;\n\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Default renderer for unspecified file types.\n */\nconst DefaultFileRenderer: FC<DefaultFileRendererProps> = ({\n name,\n limit = 100,\n fileIcon = <FileIcon />,\n}) => (\n <figure className=\"flex items-center gap-2\">\n {fileIcon}\n {name && (\n <figcaption className={cn('file-name-class')}>\n <Ellipsis value={name} limit={limit} />\n </figcaption>\n )}\n </figure>\n);\n\nexport default DefaultFileRenderer;\n","\n/**\n * Sanitizes cell content to prevent CSV injection and other potential vulnerabilities.\n * Based on the documentation of OWASP for CSV Injection\n * https://owasp.org/www-community/attacks/CSV_Injection\n * @param cell The cell content to sanitize.\n * @returns The sanitized cell content.\n */\nexport const sanitizeSVGCell = (cell: string): string => {\n const trimmed = cell.trim();\n // Escape double quotes by doubling them\n const escaped = trimmed.replace(/\"/g, '\"\"');\n // Add single quote prefix only for potentially dangerous content\n const prefix = /^[=+\\-@]/.test(trimmed) ? '\\'' : '';\n // Only wrap in quotes if the content contains special characters\n const needsQuotes = /[\",\\n\\r]/.test(escaped) || prefix;\n\n return needsQuotes ? `\"${prefix}${escaped}\"` : escaped;\n};\n","import { sanitizeSVGCell } from './sanitize';\n\n/**\n * Parses a CSV string from a local file and returns an array of rows.\n * Sanitizes cell data to prevent injection attacks.\n * @param csvString The raw CSV string content to parse.\n * @returns The parsed CSV data as a 2D array of strings.\n */\nexport const parseCSV = (csvString: string): string[][] => {\n try {\n const rows = csvString.split('\\n');\n return rows.map((row) => row.split(',').map((cell) => sanitizeSVGCell(cell)));\n } catch (error) {\n console.error('Error parsing CSV:', error);\n throw new Error('Failed to parse CSV file.');\n }\n};\n","import * as React from \"react\";\nconst SvgDownload = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-cloud-download\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M12 12v9\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"m8 17 4 4 4-4\" }));\nexport default SvgDownload;\n","import { FC, useEffect, useState, ReactElement, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { parseCSV } from '@/utils/parseCSV';\nimport DownloadIcon from '@/assets/download.svg?react';\nimport PlaceholderIcon from '@/assets/copy.svg?react';\nimport { IconButton } from 'reablocks';\n\ninterface CSVFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Renderer for CSV files that fetches and displays a snippet of the file data.\n */\nconst CSVFileRenderer: FC<CSVFileRendererProps> = ({ name, url, fileIcon }) => {\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [csvData, setCsvData] = useState<string[][]>([]);\n const [error, setError] = useState<string | null>(null);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const modalRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const fetchCsvData = async () => {\n try {\n setIsLoading(true);\n const response = await fetch(url);\n const data = parseCSV(await response.text());\n setCsvData(data);\n } catch {\n setError('Failed to load CSV file.');\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchCsvData();\n }, [url]);\n\n const toggleModal = () => {\n setIsModalOpen(prev => !prev);\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (modalRef.current && !modalRef.current.contains(event.target as Node)) {\n setIsModalOpen(false);\n }\n };\n\n useEffect(() => {\n if (isModalOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n } else {\n document.removeEventListener('mousedown', handleClickOutside);\n }\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isModalOpen]);\n\n const downloadCSV = () => {\n if (csvData.length === 0) return;\n\n const csvContent = csvData.map(row => row.join(',')).join('\\n');\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', `${name || 'data'}`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n const renderTable = (data: string[][], maxRows?: number) => (\n <motion.table\n layout\n className=\"w-full\"\n transition={{ type: 'spring', stiffness: 100, damping: 20 }}\n >\n <thead className=\"sticky top-0 bg-gray-200 dark:bg-gray-800 z-10\">\n <tr>\n <th className=\"py-4 px-6\">#</th>\n {data[0].map((header, index) => (\n <th key={`header-${index}`} className=\"py-4 px-6\">\n {header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.slice(1, maxRows).map((row, rowIndex) => (\n <tr\n key={`row-${rowIndex}`}\n className=\"border-b border-panel-accent light:border-gray-700 hover:bg-panel-accent hover:light:bg-gray-700/40 transition-colors text-base\"\n >\n <td className=\"py-4 px-6\">{rowIndex + 1}</td>\n {row.map((cell, cellIndex) => (\n <td key={`cell-${rowIndex}-${cellIndex}`} className=\"py-4 px-6\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </motion.table>\n );\n\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex justify-between items-center gap-4\">\n <div className=\"csv-icon flex items-center\">\n {fileIcon}\n {name && <figcaption className=\"ml-1\">{name}</figcaption>}\n </div>\n <div className=\"csv-icon flex items-center gap-6\">\n <IconButton size=\"small\" variant=\"text\" onClick={downloadCSV}>\n <DownloadIcon />\n </IconButton>\n <IconButton size=\"small\" variant=\"text\" onClick={toggleModal}>\n <PlaceholderIcon />\n </IconButton>\n </div>\n </div>\n\n {error && <div className=\"error-message\">{error}</div>}\n\n {isLoading && !csvData && (\n <div className=\"text-text-secondary\">Loading...</div>\n )}\n\n <div className=\"flex justify-between\">\n {!error && csvData.length > 0 && renderTable(csvData, 6)}\n </div>\n\n <AnimatePresence>\n {isModalOpen && (\n <motion.div\n className=\"fixed inset-0 bg-black/70 flex justify-center items-center z-50\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.3 }}\n >\n <motion.div\n ref={modalRef}\n className=\"bg-white dark:bg-gray-900 rounded-md w-11/12 h-5/6 overflow-auto\"\n initial={{ scale: 0.8 }}\n animate={{ scale: 1 }}\n exit={{ scale: 0.8 }}\n transition={{ duration: 0.3 }}\n >\n {!error && csvData.length > 0 && renderTable(csvData)}\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n};\n\nexport default CSVFileRenderer;\n","import { FC } from 'react';\n\ninterface ImageFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n}\n\n/**\n * Renderer for image files.\n */\nconst ImageFileRenderer: FC<ImageFileRendererProps> = ({ url }) => (\n <img src={url} alt=\"Image\" className=\"size-10\" />\n);\n\nexport default ImageFileRenderer;\n","import { FC, ReactElement } from 'react';\n\ninterface PDFFileRendererProps {\n /**\n * Name of the file.\n */\n name?: string;\n\n /**\n * URL of the file.\n */\n url: string;\n\n /**\n * Icon to for file type.\n */\n fileIcon?: ReactElement;\n}\n\n/**\n * Renderer for PDF files.\n */\nconst PDFFileRenderer: FC<PDFFileRendererProps> = ({ name, url, fileIcon }) => (\n <figure className=\"csv-icon flex items-center gap-2\" onClick={() => window.open(url, '_blank')}>\n {fileIcon}\n {name && <figcaption className=\"file-name\">{name}</figcaption>}\n </figure>\n);\n\nexport default PDFFileRenderer;\n","import { ChatContext } from '@/ChatContext';\nimport { ConversationFile } from '@/types';\nimport { cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext, useMemo, useState } from 'react';\nimport { MessageFile } from './MessageFile';\nimport { Slot } from '@radix-ui/react-slot';\n\ninterface MessageFilesProps extends PropsWithChildren {\n /**\n * Files to render.\n */\n files: ConversationFile[];\n}\n\nexport const MessageFiles = memo<MessageFilesProps>(({ files, children }) => {\n const { theme } = useContext(ChatContext);\n const Comp = children ? Slot : MessageFile;\n const [expanded, setExpanded] = useState<boolean>(false);\n\n // Group image and other files\n const { imageFiles, otherFiles } = useMemo(() => {\n if (!files || files.length === 0) {\n return {\n imageFiles: [] as ConversationFile[],\n otherFiles: [] as ConversationFile[]\n };\n }\n return files.reduce(\n (acc, file) => {\n if (file.type?.startsWith('image/')) {\n acc.imageFiles.push(file);\n } else {\n acc.otherFiles.push(file);\n }\n return acc;\n },\n {\n imageFiles: [] as ConversationFile[],\n otherFiles: [] as ConversationFile[]\n }\n );\n }, [files]);\n\n if (!files || files.length === 0) {\n return null;\n }\n\n const maxImageLength = 3;\n const truncateImages = !expanded && imageFiles.length > maxImageLength;\n\n // Renders the image files based on the current expansion state\n const renderImageFiles = (images: ConversationFile[]) => {\n return truncateImages\n ? images.slice(0, maxImageLength).map((image, index) => (\n <figure\n key={index}\n className={index === 0 ? 'col-span-2 row-span-2' : 'relative'}\n >\n <img\n src={image.url}\n alt={image.name}\n className=\"relative w-full h-full object-cover rounded-lg\"\n />\n {index === maxImageLength - 1 && (\n <div\n className=\"absolute top-0 left-0 w-full h-full flex justify-center items-center bg-black bg-opacity-50 rounded-lg cursor-pointer\"\n onClick={() => setExpanded(true)}\n >\n +{(imageFiles.length - maxImageLength).toLocaleString()}\n </div>\n )}\n </figure>\n ))\n : images.map((image, index) => (\n <Comp key={index} {...image}>\n {children}\n </Comp>\n ));\n };\n\n return (\n <div\n className={cn(\n theme.messages.message.files.base,\n truncateImages ? 'grid grid-rows-2 grid-flow-col gap-2 w-1/3' : ''\n )}\n >\n {imageFiles.length > 0 && renderImageFiles(imageFiles)}\n\n {otherFiles.length > 0 &&\n otherFiles.map((file, index) => (\n <Comp key={index} {...file}>\n {children}\n </Comp>\n ))}\n </div>\n );\n});\n\nMessageFiles.displayName = 'MessageFiles';\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Button, cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext, useState } from 'react';\nimport { Markdown } from '@/Markdown';\nimport { Plugin } from 'unified';\nimport { MessageFiles } from './MessageFiles';\nimport { ConversationFile } from '@/types';\n\nexport interface MessageQuestionProps extends PropsWithChildren {\n /**\n * Question to render.\n */\n question: string;\n\n /**\n * Array of sources referenced in the conversation\n */\n files?: ConversationFile[];\n}\n\nexport const MessageQuestion = memo<MessageQuestionProps>(\n ({ children, ...props }) => {\n const { theme, remarkPlugins } = useContext(ChatContext);\n const { question, files } = props;\n const Comp = children ? Slot : 'div';\n const [expanded, setExpanded] = useState(false);\n const isLong = question.length > 500;\n\n return (\n <Comp\n className={cn(theme.messages.message.question, {\n [theme.messages.message.overlay]: isLong && !expanded\n })}\n {...props}\n >\n {children || (\n <>\n <MessageFiles files={files} />\n <Markdown remarkPlugins={remarkPlugins as Plugin[]} theme={theme}>\n {question}\n </Markdown>\n {isLong && !expanded && (\n <Button\n variant=\"link\"\n size=\"small\"\n className={theme.messages.message.expand}\n onClick={() => setExpanded(true)}\n >\n Show more\n </Button>\n )}\n </>\n )}\n </Comp>\n );\n }\n);\n\nMessageQuestion.displayName = 'MessageQuestion';\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { motion } from 'motion/react';\nimport { cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext } from 'react';\nimport { Markdown } from '@/Markdown';\nimport { Plugin } from 'unified';\n\nexport interface MessageResponseProps extends PropsWithChildren {\n /**\n * Response to render.\n */\n response: string;\n\n /**\n * Whether the response is loading.\n */\n isLoading?: boolean;\n}\n\nexport const MessageResponse = memo<MessageResponseProps>(\n ({ response, isLoading, children }) => {\n const { theme, isCompact, remarkPlugins } = useContext(ChatContext);\n const Comp = children ? Slot : 'div';\n return (\n <Comp\n data-compact={isCompact}\n className={cn(theme.messages.message.response)}\n >\n {children || (\n <>\n <Markdown remarkPlugins={remarkPlugins as Plugin[]} theme={theme}>\n {response}\n </Markdown>\n {isLoading && (\n <motion.div\n className={cn(theme.messages.message.cursor)}\n animate={{ opacity: [1, 0] }}\n transition={{\n duration: 0.7,\n repeat: Infinity,\n repeatType: 'reverse'\n }}\n />\n )}\n </>\n )}\n </Comp>\n );\n }\n);\n","import { FC, useContext } from 'react';\nimport { ConversationSource } from '@/types';\nimport { ChatContext } from '@/ChatContext';\nimport { Ellipsis, cn } from 'reablocks';\n\nexport interface MessageSourceProps extends ConversationSource {\n /**\n * Limit for the title.\n */\n limit?: number;\n}\n\nexport const MessageSource: FC<MessageSourceProps> = ({ title, url, image, limit = 50 }) => {\n const { theme, isCompact } = useContext(ChatContext);\n\n return (\n <figure\n className={cn(theme.messages.message.sources.source.base, {\n [theme.messages.message.sources.source.companion]: isCompact\n })}\n onClick={() => {\n if (url) {\n window.open(url, '_blank');\n }\n }}\n >\n {image && <img src={image} alt={title} className={cn(theme.messages.message.sources.source.image)} />}\n {(title || url) && (\n <figcaption>\n {title && (\n <span className={cn(theme.messages.message.sources.source.title)}>\n <Ellipsis value={title} limit={limit} />\n </span>\n )}\n {url && (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className={cn(theme.messages.message.sources.source.url)}>\n {url}\n </a>\n )}\n </figcaption>\n )}\n </figure>\n );\n};\n","import { ChatContext } from '@/ChatContext';\nimport { ConversationSource } from '@/types';\nimport { cn } from 'reablocks';\nimport { memo, PropsWithChildren, useContext } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { MessageSource } from './MessageSource';\n\ninterface MessageSourcesProps extends PropsWithChildren {\n /**\n * Sources to render.\n */\n sources: ConversationSource[];\n}\n\nexport const MessageSources = memo<MessageSourcesProps>(\n ({ sources, children }) => {\n const { theme } = useContext(ChatContext);\n const Comp = children ? Slot : MessageSource;\n\n if (!sources || sources.length === 0) {\n return null;\n }\n\n return (\n <div className={cn(theme.messages.message.sources.base)}>\n {sources.map((source, index) => (\n <Comp key={index} {...source}>\n {children}\n </Comp>\n ))}\n </div>\n );\n }\n);\n\nMessageSources.displayName = 'MessageSources';\n","import * as React from \"react\";\nconst SvgThumbsDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-thumbs-down\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M17 14V2\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M9 18.12 10 14H4.17a2 2 0 0 1-1.92-2.56l2.33-8A2 2 0 0 1 6.5 2H20a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-2.76a2 2 0 0 0-1.79 1.11L12 22a3.13 3.13 0 0 1-3-3.88Z\" }));\nexport default SvgThumbsDown;\n","import * as React from \"react\";\nconst SvgThumbsUp = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-thumbs-up\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M7 10v12\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M15 5.88 14 10h5.83a2 2 0 0 1 1.92 2.56l-2.33 8A2 2 0 0 1 17.5 22H4a2 2 0 0 1-2-2v-8a2 2 0 0 1 2-2h2.76a2 2 0 0 0 1.79-1.11L12 2a3.13 3.13 0 0 1 3 3.88Z\" }));\nexport default SvgThumbsUp;\n","import * as React from \"react\";\nconst SvgRefresh = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 1, strokeLinecap: \"round\", strokeLinejoin: \"round\", className: \"lucide lucide-refresh-ccw\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 3v5h5\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16\" }), /* @__PURE__ */ React.createElement(\"path\", { d: \"M16 16h5v5\" }));\nexport default SvgRefresh;\n","import { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn, IconButton } from 'reablocks';\nimport {\n memo,\n PropsWithChildren,\n ReactElement,\n ReactNode,\n useCallback,\n useContext\n} from 'react';\nimport CopyIcon from '@/assets/copy.svg?react';\nimport ThumbsDownIcon from '@/assets/thumbs-down.svg?react';\nimport ThumbUpIcon from '@/assets/thumbs-up.svg?react';\nimport RefreshIcon from '@/assets/refresh.svg?react';\n\nexport interface MessageActionsProps extends PropsWithChildren {\n /**\n * Question to be copied\n */\n question: string;\n\n /**\n * Response to be copied\n */\n response?: string;\n\n /**\n * Icon to show for copy.\n */\n copyIcon?: ReactElement;\n\n /**\n * Icon to show for thumbs up.\n */\n thumbsUpIcon?: ReactElement;\n\n /**\n * Icon to show for thumbs down.\n */\n thumbsDownIcon?: ReactElement;\n\n /**\n * Icon to show for refresh.\n */\n refreshIcon?: ReactElement;\n\n /**\n * Callback function to handle copying.\n */\n onCopy?: () => void;\n\n /**\n * Callback function to handle upvoting.\n */\n onUpvote?: () => void;\n\n /**\n * Callback function to handle downvoting.\n */\n onDownvote?: () => void;\n\n /**\n * Callback function to handle refreshing.\n */\n onRefresh?: () => void;\n}\n\nexport const MessageActions = memo<MessageActionsProps>(\n ({ children, ...props }) => {\n const { theme } = useContext(ChatContext);\n const {\n question,\n response,\n copyIcon = <CopyIcon />,\n thumbsUpIcon = <ThumbUpIcon />,\n thumbsDownIcon = <ThumbsDownIcon />,\n refreshIcon = <RefreshIcon />,\n onCopy,\n onUpvote,\n onDownvote,\n onRefresh\n } = props;\n const Comp = children ? Slot : 'div';\n\n const handleCopy = useCallback((text: string) => {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n console.log('Text copied to clipboard');\n })\n .catch(err => {\n console.error('Could not copy text: ', err);\n });\n }, []);\n\n const handleCopyClick = useCallback(() => {\n if (onCopy) {\n onCopy();\n } else {\n handleCopy(`${question}${response ? `\\n${response}` : ''}`);\n }\n }, [onCopy, handleCopy, question, response]);\n\n return (\n (copyIcon || thumbsDownIcon || thumbsUpIcon || refreshIcon) && (\n <Comp className={cn(theme.messages.message.footer.base)}>\n {children || (\n <>\n {copyIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Copy question and response\"\n className={cn(theme.messages.message.footer.copy)}\n onClick={handleCopyClick}\n >\n {copyIcon}\n </IconButton>\n )}\n {thumbsUpIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Upvote\"\n className={cn(theme.messages.message.footer.upvote)}\n onClick={onUpvote}\n >\n {thumbsUpIcon}\n </IconButton>\n )}\n {thumbsDownIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Downvote\"\n className={cn(theme.messages.message.footer.downvote)}\n onClick={onDownvote}\n >\n {thumbsDownIcon}\n </IconButton>\n )}\n {refreshIcon && (\n <IconButton\n variant=\"text\"\n disablePadding\n title=\"Refresh\"\n className={cn(theme.messages.message.footer.refresh)}\n onClick={onRefresh}\n >\n {refreshIcon}\n </IconButton>\n )}\n </>\n )}\n </Comp>\n )\n );\n }\n);\n\nMessageActions.displayName = 'MessageActions';\n","import { memo, PropsWithChildren, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { Card, cn } from 'reablocks';\nimport { Conversation } from '@/types';\nimport { motion } from 'motion/react';\nimport { MessageQuestion } from './MessageQuestion';\nimport { MessageResponse } from './MessageResponse';\nimport { MessageSources } from './MessageSources';\nimport { MessageActions } from './MessageActions';\n\nconst messageVariants = {\n hidden: {\n opacity: 0,\n y: 20\n },\n visible: {\n opacity: 1,\n y: 0,\n transition: {\n duration: 0.3\n }\n }\n};\n\ninterface SessionMessageProps extends PropsWithChildren {\n /**\n * Class name to apply to the root element.\n */\n className?: string;\n\n /**\n * Conversation to render.\n */\n conversation: Conversation;\n\n /**\n * Whether the message is the last one in the list.\n * This let's the chat know when to show the loading cursor.\n */\n isLast?: boolean;\n}\n\nexport const SessionMessage = memo<SessionMessageProps>(\n ({ conversation, isLast, children, className }) => {\n const { theme, isLoading } = useContext(ChatContext);\n\n return (\n <motion.div key={conversation.id} variants={messageVariants}>\n <Card className={cn(theme.messages.message.base, className)}>\n {children || (\n <>\n <MessageQuestion\n question={conversation.question}\n files={conversation.files}\n />\n <MessageResponse\n response={conversation.response}\n isLoading={isLast && isLoading}\n />\n <MessageSources sources={conversation.sources} />\n <MessageActions\n question={conversation.question}\n response={conversation.response}\n />\n </>\n )}\n </Card>\n </motion.div>\n );\n }\n);\n\nSessionMessage.displayName = 'SessionMessage';\n","import * as React from \"react\";\nconst SvgArrowDown = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 20, height: 20, viewBox: \"0 0 20 20\", fill: \"currentColor\", xmlns: \"http://www.w3.org/2000/svg\", className: \"shrink-0 mix-blend-luminosity\", \"aria-hidden\": \"true\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M10 3C10.2761 3.00006 10.5 3.2239 10.5 3.5V15.293L14.6465 11.1465C14.8418 10.9514 15.1583 10.9513 15.3536 11.1465C15.5487 11.3417 15.5486 11.6583 15.3536 11.8535L10.3535 16.8535C10.2598 16.9473 10.1326 17 10 17C9.90062 17 9.8042 16.9703 9.72268 16.916L9.64651 16.8535L4.6465 11.8535C4.45138 11.6582 4.45128 11.3417 4.6465 11.1465C4.84172 10.9513 5.15827 10.9514 5.35353 11.1465L9.50003 15.293V3.5C9.50003 3.22386 9.72389 3 10 3Z\" }));\nexport default SvgArrowDown;\n","import debounce from 'lodash/debounce.js';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { Button, cn, IconButton, useInfinityList } from 'reablocks';\nimport type { ReactNode, UIEventHandler } from 'react';\nimport React, { useContext, useEffect, useMemo, useRef, useState } from 'react';\n\nimport ArrowDownIcon from '@/assets/arrow-down.svg?react';\nimport { ChatContext } from '@/ChatContext';\nimport type { Conversation } from '@/types';\n\nimport { SessionEmpty } from './SessionEmpty';\nimport { SessionMessage } from './SessionMessage/SessionMessage';\n\nconst containerVariants = {\n hidden: {},\n visible: {\n transition: {\n staggerChildren: 0.07,\n when: 'beforeChildren'\n }\n }\n};\n\ninterface SessionMessagesProps {\n /**\n * Class name to apply to the root element.\n */\n className?: string;\n\n /**\n * Content to display when there are no sessions selected or a new session is started.\n */\n newSessionContent?: string | ReactNode;\n\n /**\n * Limit the number of results returned. Clientside pagination.\n */\n limit?: number | null;\n\n /**\n * Text to display for the show more button.\n */\n showMoreText?: string;\n\n /**\n * Whether to automatically scroll to the bottom of the content.\n */\n autoScroll?: boolean;\n\n /**\n * Whether to display the scroll to bottom button.\n */\n showScrollBottomButton?: boolean;\n\n /**\n * Render function for the session messages.\n */\n children?: (conversations: Conversation[]) => ReactNode;\n\n /**\n * Whether to show the load more button.\n */\n showLoadMoreButton?: boolean;\n\n /**\n * Whether to disable the load more button.\n */\n loadMoreButtonDisabled?: boolean;\n\n /**\n * Scroll event handler.\n * @param e\n */\n onScroll?: UIEventHandler<HTMLDivElement>;\n\n /**\n * Load more event handler.\n */\n onLoadMore?: () => void;\n}\n\nexport const SessionMessages: React.FC<SessionMessagesProps> = ({\n children,\n newSessionContent,\n limit = 10,\n className,\n showMoreText = 'Show more',\n autoScroll = true,\n showLoadMoreButton = false,\n showScrollBottomButton,\n loadMoreButtonDisabled,\n onScroll,\n onLoadMore\n}) => {\n const { activeSession, theme } = useContext(ChatContext);\n const contentRef = useRef<HTMLDivElement | null>(null);\n const messagesRef = useRef<HTMLDivElement | null>(null);\n const [isAnimating, setIsAnimating] = useState(true);\n const [iAtBottom, setIsAtBottom] = useState(true);\n\n useEffect(() => {\n if (!contentRef.current || !showScrollBottomButton) {\n return;\n }\n\n const handleScroll = debounce(() => {\n if (contentRef.current) {\n setIsAtBottom(\n contentRef.current.scrollHeight - contentRef.current.clientHeight ===\n contentRef.current.scrollTop\n );\n }\n }, 50);\n const currentRef = contentRef.current;\n currentRef.addEventListener('scroll', handleScroll);\n\n return () => currentRef.removeEventListener('scroll', handleScroll);\n }, [showScrollBottomButton]);\n\n useEffect(() => {\n if (contentRef.current && autoScroll) {\n // Scroll to the bottom of the content in animation queue\n requestAnimationFrame(\n () => (contentRef.current.scrollTop = contentRef.current.scrollHeight)\n );\n }\n // If we update the active session or load the page initially ( onAnimationComplete )\n // let's scroll to the bottom of the page.\n }, [activeSession, autoScroll, isAnimating]);\n\n const handleShowMore = () => {\n showNext(limit);\n requestAnimationFrame(() => (contentRef.current.scrollTop = 0));\n };\n\n const handleScrollToBottom = () => {\n if (contentRef.current) {\n contentRef.current.scrollTo({\n top: contentRef.current.scrollHeight,\n behavior: 'smooth'\n });\n }\n };\n\n // Reverse the conversations so the last one is the first one\n const reversedConvos = useMemo(\n () => [...(activeSession?.conversations ?? [])].reverse(),\n [activeSession]\n );\n\n const { data, hasMore, showNext } = useInfinityList({\n items: reversedConvos,\n size: limit\n });\n\n // Reverse the data to the last one last now\n const reReversedConvo = useMemo(() => [...data].reverse(), [data]);\n\n // If we are not paging, just return the conversations\n const convosToRender = limit ? reReversedConvo : activeSession?.conversations;\n\n if (!activeSession) {\n return <SessionEmpty>{newSessionContent}</SessionEmpty>;\n }\n\n return (\n <div className={cn('relative flex-1 overflow-y-hidden', className)}>\n <div\n className={cn(theme.messages.content, className, 'h-full')}\n ref={contentRef}\n id={activeSession?.id}\n onScrollCapture={onScroll}\n >\n {(showLoadMoreButton || hasMore) && (\n <Button\n disabled={loadMoreButtonDisabled}\n variant=\"outline\"\n className={cn(theme.messages.showMore)}\n fullWidth\n onClick={onLoadMore ?? handleShowMore}\n >\n {showMoreText}\n </Button>\n )}\n <AnimatePresence>\n <motion.div\n ref={messagesRef}\n variants={containerVariants}\n key={activeSession?.id}\n initial=\"hidden\"\n animate=\"visible\"\n onAnimationComplete={() =>\n requestAnimationFrame(() => {\n setIsAnimating(false);\n if (contentRef.current && autoScroll) {\n contentRef.current.scrollTop =\n contentRef.current.scrollHeight;\n }\n })\n }\n >\n {children\n ? children(convosToRender)\n : convosToRender.map((conversation, index) => (\n <SessionMessage\n key={conversation.id}\n conversation={conversation}\n isLast={index === convosToRender.length - 1}\n />\n ))}\n </motion.div>\n </AnimatePresence>\n </div>\n <AnimatePresence>\n {!iAtBottom && showScrollBottomButton && (\n <motion.div\n initial={{ y: 100, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n exit={{ y: 100, opacity: 0 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className={theme.messages?.message?.scrollToBottom?.container}\n >\n <IconButton\n onClick={handleScrollToBottom}\n className={theme.messages?.message?.scrollToBottom?.button}\n size=\"small\"\n >\n <ArrowDownIcon />\n </IconButton>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport const useDimensions = () => {\n const [ref, setRef] = useState<HTMLElement | null>(null);\n const [width, setWidth] = useState<number | undefined>(undefined);\n const rafId = useRef<number | null>(null);\n\n const observe = useCallback((element: HTMLElement | null) => {\n if (element) setRef(element);\n }, []);\n\n useEffect(() => {\n if (!ref) return;\n\n const resizeObserver = new ResizeObserver(entries => {\n // Batch updates with requestAnimationFrame to avoid layout thrashing\n if (rafId.current !== null) {\n cancelAnimationFrame(rafId.current);\n }\n rafId.current = requestAnimationFrame(() => {\n for (const entry of entries) {\n setWidth(entry.contentRect.width);\n }\n rafId.current = null;\n });\n });\n\n resizeObserver.observe(ref);\n\n return () => {\n if (rafId.current !== null) {\n cancelAnimationFrame(rafId.current);\n rafId.current = null;\n }\n resizeObserver.disconnect();\n };\n }, [ref]);\n\n return { width, observe };\n};\n","import {\n CSSProperties,\n FC,\n PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useState\n} from 'react';\nimport { useHotkeys } from 'reakeys';\nimport { cn, useComponentTheme } from 'reablocks';\nimport { Components } from 'react-markdown';\nimport { Session } from './types';\nimport { ChatTheme, chatTheme } from './theme';\nimport { ChatContext, ChatViewType } from './ChatContext';\nimport { Plugin } from 'unified';\nimport { AnimatePresence } from 'motion/react';\nimport { useDimensions } from './utils/useDimensions';\nimport remarkGfm from 'remark-gfm';\nimport remarkYoutube from 'remark-youtube';\nimport remarkMath from 'remark-math';\nimport type { ComponentCatalog } from './ComponentCatalog/types';\n\nconst defaultRemarkPlugins: Plugin[] = [remarkGfm, remarkYoutube, remarkMath];\n\nexport interface ChatProps extends PropsWithChildren {\n /**\n * The style to apply to the root element.\n */\n style?: CSSProperties;\n\n /**\n * The class name to apply to the root element.\n */\n className?: string;\n\n /**\n * The type of prompt to display.\n *\n * - Companion: Smaller prompt screen with session lists.\n * - Console: Full screen experience.\n * - Chat: Only chat, no sessions.\n */\n viewType?: ChatViewType;\n\n /**\n * The list of sessions to display.\n */\n sessions: Session[];\n\n /**\n * The ID of the currently active session.\n */\n activeSessionId?: string;\n\n /**\n * Custom theme for the chat.\n */\n theme?: ChatTheme;\n\n /**\n * Remark plugins to apply to the request/response.\n */\n remarkPlugins?: Plugin[];\n\n /**\n * Custom markdown components to override default rendering.\n * Use this to add support for custom elements like charts.\n */\n markdownComponents?: Components;\n\n /**\n * A component catalog created via `componentCatalog()`.\n * Enables dynamic component rendering from LLM responses using\n * fenced code blocks (e.g. ```component).\n *\n * This automatically wires in the necessary remark plugin and\n * markdown component overrides. For advanced control, use the\n * catalog's `remarkPlugin` and `components` properties directly\n * via the `remarkPlugins` and `markdownComponents` props instead.\n */\n components?: ComponentCatalog;\n\n /**\n * Whether to display a loading state.\n */\n isLoading?: boolean;\n\n /**\n * Whether to disable the chat.\n */\n disabled?: boolean;\n\n /**\n * Callback function to handle when a session is selected.\n */\n onSelectSession?: (sessionId: string) => void;\n\n /**\n * Callback function to handle when a session is deleted.\n */\n onDeleteSession?: (sessionId: string) => void;\n\n /**\n * Callback function to handle creating a new session.\n */\n onNewSession?: () => void;\n\n /**\n * Callback function to handle sending a new message.\n */\n onSendMessage?: (message: string) => void;\n\n /**\n * Callback function to handle stopping the current action.\n */\n onStopMessage?: () => void;\n\n /**\n * Callback function to handle file upload.\n */\n onFileUpload?: (file: File) => void;\n}\n\nexport const Chat: FC<ChatProps> = ({\n children,\n viewType = 'console',\n sessions,\n onSelectSession,\n onDeleteSession,\n onSendMessage,\n onStopMessage,\n onFileUpload,\n isLoading,\n activeSessionId,\n theme: customTheme = chatTheme,\n onNewSession,\n remarkPlugins = defaultRemarkPlugins,\n markdownComponents,\n components: componentCatalog,\n disabled,\n style,\n className\n}) => {\n const theme = useComponentTheme<ChatTheme>('chat', customTheme);\n const [internalActiveSessionID, setInternalActiveSessionID] = useState<\n string | null\n >(activeSessionId);\n\n const { width, observe } = useDimensions();\n const isCompact = viewType === 'companion' || (width && width < 767);\n\n useEffect(() => {\n setInternalActiveSessionID(activeSessionId);\n }, [activeSessionId]);\n\n const handleSelectSession = useCallback(\n (sessionId: string) => {\n setInternalActiveSessionID(sessionId);\n onSelectSession?.(sessionId);\n },\n [onSelectSession]\n );\n\n const handleDeleteSession = useCallback(\n (sessionId: string) => {\n setInternalActiveSessionID(undefined);\n onDeleteSession?.(sessionId);\n },\n [onDeleteSession]\n );\n\n const handleCreateNewSession = useCallback(() => {\n setInternalActiveSessionID(undefined);\n onNewSession?.();\n }, [onNewSession]);\n\n useHotkeys([\n {\n name: 'Create new session',\n category: 'Chat',\n keys: 'meta+shift+s',\n callback: event => {\n event.preventDefault();\n handleCreateNewSession();\n }\n }\n ]);\n\n const activeSession = useMemo(\n () => sessions.find(session => session.id === internalActiveSessionID),\n [sessions, internalActiveSessionID]\n );\n\n // Merge catalog plugin/components when a componentCatalog is provided\n const mergedRemarkPlugins = useMemo(() => {\n if (!componentCatalog) return remarkPlugins as Plugin[];\n return [...(remarkPlugins as Plugin[]), componentCatalog.remarkPlugin];\n }, [remarkPlugins, componentCatalog]);\n\n // User-provided markdownComponents spread last so they can override\n // catalog defaults (e.g. a custom `pre` handler).\n const mergedMarkdownComponents = useMemo(() => {\n if (!componentCatalog) return markdownComponents;\n return {\n ...componentCatalog.components,\n ...markdownComponents\n };\n }, [markdownComponents, componentCatalog]);\n\n const contextValue = useMemo(\n () => ({\n sessions,\n activeSession,\n remarkPlugins: mergedRemarkPlugins,\n markdownComponents: mergedMarkdownComponents,\n theme,\n disabled,\n isLoading,\n isCompact,\n viewType,\n activeSessionId: internalActiveSessionID,\n selectSession: handleSelectSession,\n deleteSession: handleDeleteSession,\n createSession: handleCreateNewSession,\n sendMessage: onSendMessage,\n stopMessage: onStopMessage,\n fileUpload: onFileUpload\n }),\n [\n isLoading,\n isCompact,\n viewType,\n disabled,\n theme,\n mergedRemarkPlugins,\n mergedMarkdownComponents,\n sessions,\n activeSession,\n internalActiveSessionID,\n handleSelectSession,\n handleDeleteSession,\n handleCreateNewSession,\n onSendMessage,\n onStopMessage,\n onFileUpload\n ]\n );\n\n return (\n <ChatContext.Provider value={contextValue}>\n <AnimatePresence initial={false}>\n <div\n ref={observe}\n className={cn(className, theme.base, {\n [theme.companion]: isCompact,\n [theme.console]: !isCompact\n })}\n style={style}\n >\n {children}\n </div>\n </AnimatePresence>\n </ChatContext.Provider>\n );\n};\n","import * as React from \"react\";\nconst SvgTrash = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 14, height: 14, viewBox: \"0 0 14 14\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"Delete\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"Vector\", d: \"M5.97905 1.16666C5.90859 1.16576 5.83895 1.18189 5.77605 1.21368C5.71316 1.24547 5.65888 1.29199 5.61783 1.34926C5.57677 1.40654 5.55016 1.47288 5.54025 1.54265C5.53034 1.61242 5.53743 1.68355 5.56092 1.75H4.27007C3.7342 1.75 3.2324 2.01817 2.93535 2.46435L2.24492 3.5H2.18738C2.12941 3.49918 2.07185 3.50989 2.01805 3.5315C1.96425 3.55312 1.91529 3.58522 1.874 3.62593C1.83271 3.66663 1.79993 3.71514 1.77755 3.76863C1.75518 3.82211 1.74365 3.87952 1.74365 3.9375C1.74365 3.99548 1.75518 4.05288 1.77755 4.10636C1.79993 4.15985 1.83271 4.20836 1.874 4.24907C1.91529 4.28977 1.96425 4.32187 2.01805 4.34349C2.07185 4.3651 2.12941 4.37582 2.18738 4.375H2.41012C2.44765 4.38067 2.48576 4.38143 2.52348 4.37727L3.24468 11.1084C3.33169 11.9199 4.02367 12.5417 4.83973 12.5417H9.15947C9.97553 12.5417 10.6675 11.9199 10.7545 11.1084L11.4763 4.37727C11.5133 4.38124 11.5506 4.38047 11.5874 4.375H11.8124C11.8704 4.37582 11.9279 4.3651 11.9817 4.34349C12.0355 4.32187 12.0845 4.28977 12.1258 4.24907C12.1671 4.20836 12.1998 4.15985 12.2222 4.10636C12.2446 4.05288 12.2561 3.99548 12.2561 3.9375C12.2561 3.87952 12.2446 3.82211 12.2222 3.76863C12.1998 3.71514 12.1671 3.66663 12.1258 3.62593C12.0845 3.58522 12.0355 3.55312 11.9817 3.5315C11.9279 3.50989 11.8704 3.49918 11.8124 3.5H11.7548L11.0644 2.46435C10.7671 2.01841 10.2654 1.75 9.7297 1.75H8.43885C8.46234 1.68355 8.46943 1.61242 8.45952 1.54265C8.44961 1.47288 8.423 1.40654 8.38194 1.34926C8.34089 1.29199 8.2866 1.24547 8.22371 1.21368C8.16082 1.18189 8.09118 1.16576 8.02072 1.16666H5.97905ZM4.27007 2.625H9.7297C9.97394 2.625 10.2009 2.74639 10.3364 2.9497L10.7033 3.5H3.29651L3.66338 2.9497L3.66395 2.94913C3.79913 2.74608 4.02543 2.625 4.27007 2.625ZM3.40361 4.375H10.5962L9.88465 11.015C9.8445 11.3894 9.53575 11.6667 9.15947 11.6667H4.83973C4.46345 11.6667 4.15527 11.3894 4.11512 11.015L3.40361 4.375Z\", fill: \"currentColor\" })));\nexport default SvgTrash;\n","import * as React from \"react\";\nconst SvgChat = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 16, height: 17, viewBox: \"0 0 16 17\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M8 3C4.55375 3 1.75 5.23753 1.75 7.98828C1.75 9.70653 2.83659 11.2762 4.62109 12.188C4.11184 13.0465 3.62587 13.7378 3.62012 13.7461C3.50687 13.9071 3.49862 14.1196 3.59912 14.2891C3.69012 14.4418 3.8543 14.5342 4.0293 14.5342C4.0483 14.5342 4.06743 14.533 4.08643 14.5308C4.15168 14.5233 5.66214 14.3364 7.50439 12.9604C7.67239 12.9712 7.8385 12.9766 8 12.9766C11.4462 12.9766 14.25 10.739 14.25 7.98828C14.25 5.23753 11.4462 3 8 3ZM8 4C10.8948 4 13.25 5.78903 13.25 7.98828C13.25 10.1875 10.8948 11.9766 8 11.9766C7.8055 11.9766 7.60225 11.968 7.396 11.9497C7.271 11.9382 7.1454 11.9752 7.0459 12.0527C6.3589 12.5855 5.72033 12.9308 5.20508 13.1528C5.38383 12.8648 5.57691 12.5418 5.76416 12.2061C5.83416 12.0813 5.84705 11.9324 5.7998 11.7974C5.75255 11.6624 5.64983 11.5542 5.51758 11.5C3.81033 10.7993 2.75 9.45328 2.75 7.98828C2.75 5.78903 5.10525 4 8 4ZM5.5 7.25C5.08575 7.25 4.75 7.58575 4.75 8C4.75 8.41425 5.08575 8.75 5.5 8.75C5.91425 8.75 6.25 8.41425 6.25 8C6.25 7.58575 5.91425 7.25 5.5 7.25ZM8 7.25C7.58575 7.25 7.25 7.58575 7.25 8C7.25 8.41425 7.58575 8.75 8 8.75C8.41425 8.75 8.75 8.41425 8.75 8C8.75 7.58575 8.41425 7.25 8 7.25ZM10.5 7.25C10.0857 7.25 9.75 7.58575 9.75 8C9.75 8.41425 10.0857 8.75 10.5 8.75C10.9143 8.75 11.25 8.41425 11.25 8C11.25 7.58575 10.9143 7.25 10.5 7.25Z\", fill: \"currentColor\" }));\nexport default SvgChat;\n","import {\n memo,\n MouseEvent,\n PropsWithChildren,\n ReactElement,\n useCallback,\n useContext\n} from 'react';\nimport { ListItem, IconButton, cn, Ellipsis } from 'reablocks';\nimport { Session } from '@/types';\nimport TrashIcon from '@/assets/trash.svg?react';\nimport ChatIcon from '@/assets/chat.svg?react';\nimport { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\n\nexport interface SessionListItemProps extends PropsWithChildren {\n /**\n * Session to display.\n */\n session: Session;\n\n /**\n * Indicates whether the session is deletable.\n */\n deletable?: boolean;\n\n /**\n * Icon to show for delete.\n */\n deleteIcon?: ReactElement;\n\n /**\n * Icon to show for chat.\n */\n chatIcon?: ReactElement;\n\n /**\n * Limit for the ellipsis.\n */\n limit?: number;\n}\n\nexport const SessionListItem = memo<SessionListItemProps>(\n ({\n children,\n session,\n deletable = true,\n limit = 100,\n deleteIcon = <TrashIcon />,\n chatIcon = <ChatIcon className=\"mr-2\" />\n }) => {\n const { activeSessionId, selectSession, deleteSession, theme } =\n useContext(ChatContext);\n const Comp = children ? Slot : ListItem;\n\n const handleSelect = useCallback(() => {\n selectSession?.(session.id);\n }, [selectSession, session.id]);\n\n const handleDelete = useCallback(\n (e: MouseEvent) => {\n e.stopPropagation();\n deleteSession(session.id);\n },\n [deleteSession, session.id]\n );\n\n return (\n <Comp\n dense\n disableGutters\n active={session.id === activeSessionId}\n className={cn(theme.sessions.session.base, {\n [theme.sessions.session.active]: session.id === activeSessionId\n })}\n onClick={handleSelect}\n start={chatIcon}\n end={\n <>\n {deletable && (\n <IconButton\n size=\"small\"\n variant=\"text\"\n onClick={handleDelete}\n className={cn(theme.sessions.session.delete)}\n >\n {deleteIcon}\n </IconButton>\n )}\n </>\n }\n >\n {children || <Ellipsis value={session.title} limit={limit} />}\n </Comp>\n );\n }\n);\n\nSessionListItem.displayName = 'SessionListItem';\n","import { FC, PropsWithChildren, useContext } from 'react';\nimport { List, cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { motion } from 'motion/react';\nimport { Template } from '@/types';\nimport { SessionListItem } from './SessionListItem';\n\nexport interface SessionsListProps extends PropsWithChildren {\n /**\n * Templates to show when no session is active\n */\n templates?: Template[];\n}\n\nexport const SessionsList: FC<SessionsListProps> = ({\n children,\n templates\n}) => {\n const { theme, isCompact, activeSessionId, createSession } =\n useContext(ChatContext);\n const isVisible = isCompact && !activeSessionId;\n\n return (\n (!isCompact || isVisible) && (\n <motion.div\n initial={{ translateX: '-100%' }}\n animate={{\n translateX: '0%',\n transition: {\n type: 'tween',\n ease: 'linear',\n duration: 0.2,\n when: 'beforeChildren'\n }\n }}\n exit={{ translateX: '-100%' }}\n className={cn(theme.sessions.base, {\n [theme.sessions.companion]: isCompact,\n [theme.sessions.console]: !isCompact\n })}\n >\n <List>{children}</List>\n {templates && !activeSessionId && (\n <div className=\"mt-4\">\n {templates.map(template => (\n <div key={template.id} onClick={() => createSession?.()}>\n <SessionListItem\n session={{\n id: template.id,\n title: template.title,\n conversations: []\n }}\n chatIcon={template.icon}\n deletable={false}\n />\n </div>\n ))}\n </div>\n )}\n </motion.div>\n )\n );\n};\n","import * as React from \"react\";\nconst SvgPlus = (props) => /* @__PURE__ */ React.createElement(\"svg\", { width: 17, height: 17, viewBox: \"0 0 17 17\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\", ...props }, /* @__PURE__ */ React.createElement(\"g\", { id: \"add\" }, /* @__PURE__ */ React.createElement(\"path\", { id: \"Vector\", d: \"M13.1667 9.16658H9.16671V13.1666H7.83337V9.16658H3.83337V7.83325H7.83337V3.83325H9.16671V7.83325H13.1667V9.16658Z\", fill: \"currentColor\" })));\nexport default SvgPlus;\n","import { Button, cn } from 'reablocks';\nimport { FC, PropsWithChildren, ReactNode, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport PlusIcon from '@/assets/plus.svg?react';\n\ninterface NewSessionButtonProps extends PropsWithChildren {\n /**\n * Text for the new session button.\n */\n newSessionText?: string | ReactNode;\n}\n\nexport const NewSessionButton: FC<NewSessionButtonProps> = ({\n children,\n newSessionText = 'New Session'\n}) => {\n const { theme, createSession, disabled } = useContext(ChatContext);\n const Comp = children ? Slot : Button;\n\n return (\n <>\n <Comp\n fullWidth\n disableMargins\n color=\"primary\"\n start={<PlusIcon />}\n className={cn(theme.sessions.create)}\n disabled={disabled}\n onClick={createSession}\n >\n {children || newSessionText}\n </Comp>\n </>\n );\n};\n","import {\n format,\n isToday,\n isYesterday,\n isThisWeek,\n differenceInYears\n} from 'date-fns';\nimport { Session } from '@/types';\n\nexport interface GroupedSessions {\n heading: string;\n sessions: Session[];\n}\n\nconst sortOrder = [\n 'Today',\n 'Yesterday',\n 'Last Week',\n 'Last Month',\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n 'Last Year'\n];\n\n// Pre-compute a Map for O(1) sort order lookup instead of O(n) indexOf\nconst sortOrderMap = new Map(sortOrder.map((v, i) => [v, i]));\n\nexport function groupSessionsByDate(sessions: Session[]): GroupedSessions[] {\n const grouped: Record<string, Session[]> = {};\n const now = new Date();\n\n sessions.forEach(session => {\n const createdAt = session.createdAt ? new Date(session.createdAt) : null;\n\n let group: string;\n if (!createdAt || isNaN(createdAt.getTime())) {\n group = 'Last Year';\n } else if (isToday(createdAt)) {\n group = 'Today';\n } else if (isYesterday(createdAt)) {\n group = 'Yesterday';\n } else if (isThisWeek(createdAt)) {\n group = 'Last Week';\n } else if (differenceInYears(now, createdAt) === 0) {\n const monthDiff = now.getMonth() - createdAt.getMonth();\n const yearDiff = now.getFullYear() - createdAt.getFullYear();\n const adjustedMonthDiff = yearDiff > 0 ? monthDiff + 12 : monthDiff;\n if (\n adjustedMonthDiff === 1 ||\n (adjustedMonthDiff === 0 && now.getDate() > createdAt.getDate())\n ) {\n group = 'Last Month';\n } else {\n group = format(createdAt, 'MMMM');\n }\n } else {\n group = 'Last Year';\n }\n\n if (!grouped[group]) grouped[group] = [];\n grouped[group].push(session);\n });\n\n // Sort groups using Map for O(1) lookup per comparison\n const sortedGroups = Object.keys(grouped).sort(\n (a, b) => (sortOrderMap.get(a) ?? 999) - (sortOrderMap.get(b) ?? 999)\n );\n\n return sortedGroups.map(heading => ({\n heading,\n sessions: grouped[heading].sort(\n (a, b) =>\n (b.createdAt ? new Date(b.createdAt).getTime() : 0) -\n (a.createdAt ? new Date(a.createdAt).getTime() : 0)\n )\n }));\n}\n","import { FC, PropsWithChildren, ReactNode, useContext } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { ListItem, cn } from 'reablocks';\n\ninterface SessionsGroupProps extends PropsWithChildren {\n /**\n * Heading for the session group.\n */\n heading?: string | ReactNode;\n}\n\nexport const SessionsGroup: FC<SessionsGroupProps> = ({\n heading,\n children,\n}) => {\n const { theme } = useContext(ChatContext);\n return (\n <>\n {heading && (\n <ListItem\n disableGutters\n disablePadding\n className={cn(theme.sessions.group)}\n >\n {heading}\n </ListItem>\n )}\n {children}\n </>\n );\n};\n","import { FC, ReactNode, useContext, useMemo } from 'react';\nimport { GroupedSessions, groupSessionsByDate } from '@/utils/grouping';\nimport { ChatContext } from '@/ChatContext';\nimport { SessionsGroup } from './SessionsGroup';\nimport { SessionListItem } from './SessionListItem';\n\nexport interface SessionGroupsProps {\n /**\n * Render function for the session groups.\n */\n children?: (groups: GroupedSessions[]) => ReactNode;\n}\n\nexport const SessionGroups: FC<SessionGroupsProps> = ({ children }) => {\n const { sessions } = useContext(ChatContext);\n const groups = useMemo(() => groupSessionsByDate(sessions), [sessions]);\n\n return (\n <>\n {children\n ? children(groups)\n : groups.map(({ heading, sessions }) => (\n <SessionsGroup key={heading} heading={heading}>\n {sessions.map(session => (\n <SessionListItem key={session.id} session={session} />\n ))}\n </SessionsGroup>\n ))}\n </>\n );\n};\n","import { ReactNode, FC } from 'react';\nimport { cn, useComponentTheme } from 'reablocks';\nimport { ChatTheme, chatTheme } from '../theme';\n\nexport interface AppBarProps {\n /**\n * Content to display in the header\n */\n content?: ReactNode;\n\n /**\n * Custom theme for the appbar\n */\n theme?: ChatTheme;\n}\n\nexport const AppBar: FC<AppBarProps> = ({\n content,\n theme: customTheme = chatTheme\n}) => {\n const theme = useComponentTheme<ChatTheme>('chat', customTheme);\n\n return <div className={cn(theme.appbar)}>{content}</div>;\n};\n","import { offset } from '@floating-ui/react';\nimport { ConnectedOverlay, Modifiers, Placement } from 'reablocks';\nimport { memo, ReactNode, useCallback, useRef, useState } from 'react';\n\nconst DEFAULT_MODIFIERS: Modifiers = [offset({ mainAxis: 0, crossAxis: -40 })];\n\nexport interface ChatBubbleProps {\n /**\n * The main content to be rendered.\n */\n children: ReactNode;\n\n /**\n * The content to be rendered in the trigger bubble.\n */\n bubbleContent: ReactNode;\n\n /**\n * The position of the chat bubble on the screen.\n * @default 'right-end'\n */\n position?: Placement;\n\n /**\n * Custom position modifiers.\n * @default [offset({ mainAxis: 0, crossAxis: -40 })]\n */\n modifiers?: Modifiers;\n\n /**\n * Additional CSS classes to apply to the chat bubble.\n */\n className?: string;\n}\n\nexport const ChatBubble = memo<ChatBubbleProps>(\n ({\n children,\n bubbleContent,\n position = 'right-end',\n modifiers = DEFAULT_MODIFIERS,\n className\n }) => {\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const ref = useRef<HTMLDivElement | null>(null);\n\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n const handleToggle = useCallback(() => setIsOpen(prev => !prev), []);\n const renderContent = useCallback(() => <>{children}</>, [children]);\n\n return (\n <>\n <ConnectedOverlay\n placement={position}\n modifiers={modifiers}\n reference={ref.current}\n open={isOpen}\n onOpen={handleOpen}\n onClose={handleClose}\n content={renderContent}\n />\n <div ref={ref} className={className} onClick={handleToggle}>\n {bubbleContent}\n </div>\n </>\n );\n }\n);\n","import { FC, useContext } from 'react';\nimport { Button, cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { Suggestion } from '@/types';\n\nexport interface ChatSuggestionProps extends Suggestion {\n /**\n * Callback when the suggestion is clicked.\n */\n onClick?: (suggestion: string) => void;\n}\n\nexport const ChatSuggestion: FC<ChatSuggestionProps> = ({\n content,\n onClick\n}) => {\n const { theme, disabled, isLoading } = useContext(ChatContext);\n\n const handleClick = () => {\n if (disabled || isLoading) return;\n onClick?.(content);\n };\n\n return (\n <Button\n type=\"button\"\n variant=\"outline\"\n disableMargins\n className={cn(theme.suggestions.item.base, {\n 'opacity-50 cursor-not-allowed': disabled || isLoading\n })}\n onClick={handleClick}\n disabled={disabled || isLoading}\n >\n <span className={cn(theme.suggestions.item.text)}>{content}</span>\n </Button>\n );\n};\n","import {\n FC,\n ReactElement,\n useContext,\n cloneElement,\n isValidElement\n} from 'react';\nimport { cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { Suggestion } from '@/types';\nimport { ChatSuggestion } from './ChatSuggestion';\n\nexport interface ChatSuggestionsProps {\n /**\n * Array of suggestions to display.\n */\n suggestions: Suggestion[];\n\n /**\n * Custom class name to apply to the container.\n */\n className?: string;\n\n /**\n * Callback when a suggestion is clicked.\n */\n onSuggestionClick?: (suggestion: string) => void;\n\n /**\n * Custom render function for each suggestion item.\n * Receives the suggestion data and onClick handler.\n */\n children?: ReactElement;\n}\n\nexport const ChatSuggestions: FC<ChatSuggestionsProps> = ({\n suggestions,\n className,\n onSuggestionClick,\n children\n}) => {\n const { theme } = useContext(ChatContext);\n\n if (!suggestions || suggestions.length === 0) {\n return null;\n }\n\n return (\n <div className={cn(theme.suggestions.base, className)}>\n {suggestions.map(suggestion => {\n if (children && isValidElement(children)) {\n return cloneElement(children as ReactElement<any>, {\n key: suggestion.id,\n ...suggestion,\n onClick: onSuggestionClick\n });\n }\n\n return (\n <ChatSuggestion\n key={suggestion.id}\n {...suggestion}\n onClick={onSuggestionClick}\n />\n );\n })}\n </div>\n );\n};\n","import * as React from \"react\";\nconst SvgSpinner = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", ...props }, /* @__PURE__ */ React.createElement(\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\" }));\nexport default SvgSpinner;\n","import * as React from \"react\";\nconst SvgCheck = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", ...props }, /* @__PURE__ */ React.createElement(\"polyline\", { points: \"20 6 9 17 4 12\" }));\nexport default SvgCheck;\n","import * as React from \"react\";\nconst SvgError = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", width: 24, height: 24, viewBox: \"0 0 24 24\", fill: \"none\", stroke: \"currentColor\", strokeWidth: 2, strokeLinecap: \"round\", strokeLinejoin: \"round\", ...props }, /* @__PURE__ */ React.createElement(\"circle\", { cx: 12, cy: 12, r: 10 }), /* @__PURE__ */ React.createElement(\"line\", { x1: 15, y1: 9, x2: 9, y2: 15 }), /* @__PURE__ */ React.createElement(\"line\", { x1: 9, y1: 9, x2: 15, y2: 15 }));\nexport default SvgError;\n","import { FC } from 'react';\nimport { motion } from 'motion/react';\nimport { cn } from 'reablocks';\nimport SpinnerIcon from '@/assets/spinner.svg?react';\nimport CheckIcon from '@/assets/check.svg?react';\nimport ErrorIcon from '@/assets/error.svg?react';\nimport { MessageStatusState } from './MessageStatus';\n\nexport interface StatusIconProps {\n /**\n * Current state of the status icon.\n */\n state: MessageStatusState;\n\n /**\n * Additional CSS class name for the icon container.\n */\n className?: string;\n\n /**\n * CSS class name for the icon color based on state.\n */\n colorClassName?: string;\n}\n\nexport const StatusIcon: FC<StatusIconProps> = ({\n state,\n className,\n colorClassName\n}) => {\n switch (state) {\n case 'loading':\n return (\n <motion.div\n animate={{ rotate: 360 }}\n transition={{ duration: 1, repeat: Infinity, ease: 'linear' }}\n className={cn(className, colorClassName)}\n >\n <SpinnerIcon className=\"w-full h-full\" />\n </motion.div>\n );\n case 'complete':\n return (\n <motion.div\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 500, damping: 25 }}\n className={cn(className, colorClassName)}\n >\n <CheckIcon className=\"w-full h-full\" />\n </motion.div>\n );\n case 'error':\n return (\n <motion.div\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n transition={{ type: 'spring', stiffness: 500, damping: 25 }}\n className={cn(className, colorClassName)}\n >\n <ErrorIcon className=\"w-full h-full\" />\n </motion.div>\n );\n }\n};\n","import { FC, useContext } from 'react';\nimport { motion } from 'motion/react';\nimport { cn } from 'reablocks';\nimport { ChatContext } from '@/ChatContext';\nimport { chatTheme as defaultTheme } from '@/theme';\nimport { StatusIcon } from './StatusIcon';\nimport { MessageStatusStep } from './MessageStatus';\n\nexport interface MessageStatusItemProps {\n /**\n * The step to display.\n */\n step: MessageStatusStep;\n}\n\nexport const MessageStatusItem: FC<MessageStatusItemProps> = ({ step }) => {\n const { theme: chatTheme } = useContext(ChatContext);\n const theme = (chatTheme ?? defaultTheme).status.steps.step;\n const stepStatus = step.status || 'loading';\n\n return (\n <motion.div\n initial={{ opacity: 0, x: -10 }}\n animate={{ opacity: 1, x: 0 }}\n transition={{ duration: 0.2 }}\n className={theme.base}\n >\n <StatusIcon\n state={stepStatus}\n className={theme.icon}\n colorClassName={theme[stepStatus]}\n />\n <span\n className={cn(\n theme.text,\n stepStatus === 'loading' && theme.loading,\n stepStatus === 'complete' && theme.complete,\n stepStatus === 'error' && theme.error\n )}\n >\n {step.text}\n </span>\n </motion.div>\n );\n};\n","import { FC, PropsWithChildren, ReactNode, useContext } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cn } from 'reablocks';\nimport { Slot } from '@radix-ui/react-slot';\nimport { ChatContext } from '@/ChatContext';\nimport { chatTheme as defaultTheme } from '@/theme';\nimport { StatusIcon } from './StatusIcon';\nimport { MessageStatusItem } from './MessageStatusItem';\n\nexport type MessageStatusState = 'loading' | 'complete' | 'error';\n\nexport interface MessageStatusStep {\n /**\n * Unique identifier for the step.\n */\n id: string;\n\n /**\n * Text to display for the step.\n */\n text: string;\n\n /**\n * Current state of the step.\n * @default 'loading'\n */\n status?: MessageStatusState;\n}\n\nexport interface MessageStatusProps extends PropsWithChildren {\n /**\n * Current status state.\n * @default 'loading'\n */\n status?: MessageStatusState;\n\n /**\n * Main status text to display.\n */\n text: string;\n\n /**\n * Optional sub-steps to display.\n */\n steps?: MessageStatusStep[];\n\n /**\n * Custom icon to display. If not provided, uses default icons based on status.\n */\n icon?: ReactNode;\n\n /**\n * Additional CSS class name.\n */\n className?: string;\n}\n\n/**\n * Displays status information with optional sub-steps, similar to Claude's tool status UI.\n */\nexport const MessageStatus: FC<MessageStatusProps> = ({\n status = 'loading',\n text,\n steps,\n icon,\n className,\n children\n}) => {\n const { theme: chatTheme } = useContext(ChatContext);\n const theme = (chatTheme ?? defaultTheme).status;\n const Comp = children ? Slot : 'div';\n\n return (\n <AnimatePresence mode=\"wait\">\n <motion.div\n initial={{ opacity: 0, y: -10 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -10 }}\n transition={{ duration: 0.2 }}\n >\n <Comp className={cn(theme.base, className)}>\n {children || (\n <>\n <div className={theme.header}>\n {icon || (\n <StatusIcon\n state={status}\n className={theme.icon.base}\n colorClassName={theme.icon[status]}\n />\n )}\n <span\n className={cn(\n theme.text.base,\n status === 'loading' && theme.text.loading,\n status === 'complete' && theme.text.complete,\n status === 'error' && theme.text.error\n )}\n >\n {text}\n </span>\n </div>\n {steps && steps.length > 0 && (\n <div className={theme.steps.base}>\n {steps.map(step => (\n <MessageStatusItem key={step.id} step={step} />\n ))}\n </div>\n )}\n </>\n )}\n </Comp>\n </motion.div>\n </AnimatePresence>\n );\n};\n","/**\n * AG-UI Protocol event types and interfaces.\n *\n * These are self-contained type definitions for the AG-UI protocol,\n * so consumers don't need to install @ag-ui/core separately.\n * See: https://docs.ag-ui.com\n */\n\nexport enum AgUiEventType {\n // Lifecycle\n RUN_STARTED = 'RUN_STARTED',\n RUN_FINISHED = 'RUN_FINISHED',\n RUN_ERROR = 'RUN_ERROR',\n STEP_STARTED = 'STEP_STARTED',\n STEP_FINISHED = 'STEP_FINISHED',\n\n // Text messages\n TEXT_MESSAGE_START = 'TEXT_MESSAGE_START',\n TEXT_MESSAGE_CONTENT = 'TEXT_MESSAGE_CONTENT',\n TEXT_MESSAGE_END = 'TEXT_MESSAGE_END',\n TEXT_MESSAGE_CHUNK = 'TEXT_MESSAGE_CHUNK',\n\n // Tool calls\n TOOL_CALL_START = 'TOOL_CALL_START',\n TOOL_CALL_ARGS = 'TOOL_CALL_ARGS',\n TOOL_CALL_END = 'TOOL_CALL_END',\n TOOL_CALL_RESULT = 'TOOL_CALL_RESULT',\n TOOL_CALL_CHUNK = 'TOOL_CALL_CHUNK',\n\n // State\n STATE_SNAPSHOT = 'STATE_SNAPSHOT',\n STATE_DELTA = 'STATE_DELTA',\n MESSAGES_SNAPSHOT = 'MESSAGES_SNAPSHOT',\n\n // Special\n RAW = 'RAW',\n CUSTOM = 'CUSTOM'\n}\n\nexport interface AgUiBaseEvent {\n type: AgUiEventType;\n timestamp?: number;\n rawEvent?: unknown;\n}\n\n// Lifecycle events\nexport interface AgUiRunStartedEvent extends AgUiBaseEvent {\n type: AgUiEventType.RUN_STARTED;\n threadId: string;\n runId: string;\n}\n\nexport interface AgUiRunFinishedEvent extends AgUiBaseEvent {\n type: AgUiEventType.RUN_FINISHED;\n threadId: string;\n runId: string;\n}\n\nexport interface AgUiRunErrorEvent extends AgUiBaseEvent {\n type: AgUiEventType.RUN_ERROR;\n message: string;\n code?: string;\n}\n\nexport interface AgUiStepStartedEvent extends AgUiBaseEvent {\n type: AgUiEventType.STEP_STARTED;\n stepName: string;\n}\n\nexport interface AgUiStepFinishedEvent extends AgUiBaseEvent {\n type: AgUiEventType.STEP_FINISHED;\n stepName: string;\n}\n\n// Text message events\nexport interface AgUiTextMessageStartEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_START;\n messageId: string;\n role?: AgUiRole;\n}\n\nexport interface AgUiTextMessageContentEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_CONTENT;\n messageId: string;\n delta: string;\n}\n\nexport interface AgUiTextMessageEndEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_END;\n messageId: string;\n}\n\nexport interface AgUiTextMessageChunkEvent extends AgUiBaseEvent {\n type: AgUiEventType.TEXT_MESSAGE_CHUNK;\n messageId?: string;\n role?: AgUiRole;\n delta?: string;\n}\n\n// Tool call events\nexport interface AgUiToolCallStartEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_START;\n toolCallId: string;\n toolCallName: string;\n parentMessageId?: string;\n}\n\nexport interface AgUiToolCallArgsEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_ARGS;\n toolCallId: string;\n delta: string;\n}\n\nexport interface AgUiToolCallEndEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_END;\n toolCallId: string;\n}\n\nexport interface AgUiToolCallResultEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_RESULT;\n toolCallId: string;\n content: string;\n}\n\nexport interface AgUiToolCallChunkEvent extends AgUiBaseEvent {\n type: AgUiEventType.TOOL_CALL_CHUNK;\n toolCallId?: string;\n toolCallName?: string;\n parentMessageId?: string;\n delta?: string;\n}\n\n// State events\nexport interface AgUiStateSnapshotEvent extends AgUiBaseEvent {\n type: AgUiEventType.STATE_SNAPSHOT;\n snapshot: unknown;\n}\n\nexport interface AgUiStateDeltaEvent extends AgUiBaseEvent {\n type: AgUiEventType.STATE_DELTA;\n delta: unknown[];\n}\n\nexport interface AgUiMessagesSnapshotEvent extends AgUiBaseEvent {\n type: AgUiEventType.MESSAGES_SNAPSHOT;\n messages: AgUiMessage[];\n}\n\n// Special events\nexport interface AgUiRawEvent extends AgUiBaseEvent {\n type: AgUiEventType.RAW;\n event: unknown;\n source?: string;\n}\n\nexport interface AgUiCustomEvent extends AgUiBaseEvent {\n type: AgUiEventType.CUSTOM;\n name: string;\n value: unknown;\n}\n\nexport type AgUiEvent =\n | AgUiRunStartedEvent\n | AgUiRunFinishedEvent\n | AgUiRunErrorEvent\n | AgUiStepStartedEvent\n | AgUiStepFinishedEvent\n | AgUiTextMessageStartEvent\n | AgUiTextMessageContentEvent\n | AgUiTextMessageEndEvent\n | AgUiTextMessageChunkEvent\n | AgUiToolCallStartEvent\n | AgUiToolCallArgsEvent\n | AgUiToolCallEndEvent\n | AgUiToolCallResultEvent\n | AgUiToolCallChunkEvent\n | AgUiStateSnapshotEvent\n | AgUiStateDeltaEvent\n | AgUiMessagesSnapshotEvent\n | AgUiRawEvent\n | AgUiCustomEvent;\n\n// AG-UI message types (used in RunAgentInput)\nexport type AgUiRole = 'developer' | 'system' | 'assistant' | 'user' | 'tool';\n\nexport interface AgUiMessage {\n id: string;\n role: AgUiRole;\n content?: string;\n name?: string;\n toolCallId?: string;\n}\n\nexport interface AgUiTool {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n}\n\nexport interface AgUiContext {\n description: string;\n value: string;\n}\n\nexport interface AgUiRunAgentInput {\n threadId: string;\n runId: string;\n messages: AgUiMessage[];\n tools: AgUiTool[];\n context: AgUiContext[];\n state: unknown;\n forwardedProps: Record<string, unknown>;\n}\n\nexport interface AgUiToolCallInfo {\n toolCallId: string;\n toolCallName: string;\n args: string;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { Session, Conversation } from '@/types';\nimport {\n AgUiEvent,\n AgUiEventType,\n AgUiContext,\n AgUiMessage,\n AgUiRunAgentInput,\n AgUiTool,\n AgUiToolCallInfo\n} from './types';\n\nexport interface UseAgUiOptions {\n /**\n * URL of the AG-UI compatible agent endpoint.\n */\n agent: string;\n\n /**\n * Initial sessions to populate the chat.\n */\n initialSessions?: Session[];\n\n /**\n * Initial active session ID.\n */\n initialActiveSessionId?: string;\n\n /**\n * Tools to expose to the agent.\n */\n tools?: AgUiTool[];\n\n /**\n * Context to send with each run.\n */\n context?: AgUiContext[];\n\n /**\n * Additional properties forwarded to the agent.\n */\n forwardedProps?: Record<string, unknown>;\n\n /**\n * Custom headers for the HTTP request.\n */\n headers?: Record<string, string>;\n\n /**\n * Called when a tool call is received from the agent.\n */\n onToolCall?: (toolCall: AgUiToolCallInfo) => Promise<void> | void;\n\n /**\n * Called when the agent run encounters an error.\n */\n onError?: (error: Error) => void;\n\n /**\n * Called when an AG-UI event is received (for debugging/logging).\n */\n onEvent?: (event: AgUiEvent) => void;\n}\n\nexport interface UseAgUiReturn {\n /**\n * All chat sessions.\n */\n sessions: Session[];\n\n /**\n * The currently active session ID.\n */\n activeSessionId: string | undefined;\n\n /**\n * Whether the agent is currently processing.\n */\n isLoading: boolean;\n\n /**\n * Select a session by ID.\n */\n selectSession: (sessionId: string) => void;\n\n /**\n * Delete a session by ID.\n */\n deleteSession: (sessionId: string) => void;\n\n /**\n * Create a new empty session.\n */\n createSession: () => void;\n\n /**\n * Send a message to the agent.\n */\n sendMessage: (message: string) => void;\n\n /**\n * Stop the current agent run.\n */\n stopMessage: () => void;\n}\n\nfunction generateId(): string {\n return Math.random().toString(36).substring(2, 11);\n}\n\nexport function addConversationToSession(\n sessions: Session[],\n sessionId: string,\n conversation: Conversation\n): Session[] {\n return sessions.map(s => {\n if (s.id !== sessionId) return s;\n return {\n ...s,\n updatedAt: conversation.createdAt,\n conversations: [...s.conversations, conversation]\n };\n });\n}\n\nexport function updateConversationInSession(\n sessions: Session[],\n sessionId: string,\n conversationId: string,\n response: string\n): Session[] {\n return sessions.map(s => {\n if (s.id !== sessionId) return s;\n return {\n ...s,\n updatedAt: new Date(),\n conversations: s.conversations.map(c => {\n if (c.id !== conversationId) return c;\n return { ...c, response, updatedAt: new Date() };\n })\n };\n });\n}\n\n/**\n * Converts reachat Session/Conversation history into AG-UI messages.\n */\nexport function sessionsToAgUiMessages(session: Session): AgUiMessage[] {\n const messages: AgUiMessage[] = [];\n for (const conv of session.conversations) {\n messages.push({\n id: `${conv.id}-q`,\n role: 'user',\n content: conv.question\n });\n if (conv.response) {\n messages.push({\n id: `${conv.id}-r`,\n role: 'assistant',\n content: conv.response\n });\n }\n }\n return messages;\n}\n\n/**\n * Parses a single SSE data line, returning the event or an Error\n * if the JSON is malformed.\n */\nexport function parseSSELine(line: string): AgUiEvent | Error | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) return null;\n\n if (trimmed.startsWith('data:')) {\n const data = trimmed.slice(5).trim();\n if (data === '[DONE]') return null;\n\n try {\n return JSON.parse(data) as AgUiEvent;\n } catch (err) {\n return new Error(\n `Failed to parse AG-UI event: ${err instanceof Error ? err.message : err}`\n );\n }\n }\n return null;\n}\n\n/**\n * Parses an SSE stream from a Response into AG-UI events.\n */\nexport async function* parseSSE(\n response: Response,\n signal: AbortSignal\n): AsyncGenerator<AgUiEvent | Error> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Keep the last incomplete line in the buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const result = parseSSELine(line);\n if (result !== null) yield result;\n }\n }\n\n // Process any remaining data in the buffer after stream ends\n if (buffer.trim()) {\n const result = parseSSELine(buffer);\n if (result !== null) yield result;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * React hook that connects to an AG-UI protocol endpoint and provides\n * all the props needed for the reachat `<Chat>` component.\n *\n * @example\n * ```tsx\n * const agui = useAgUi({ agent: 'https://my-agent.example.com/run' });\n *\n * <Chat\n * sessions={agui.sessions}\n * activeSessionId={agui.activeSessionId}\n * isLoading={agui.isLoading}\n * onSelectSession={agui.selectSession}\n * onDeleteSession={agui.deleteSession}\n * onNewSession={agui.createSession}\n * onSendMessage={agui.sendMessage}\n * onStopMessage={agui.stopMessage}\n * >\n * <SessionMessagePanel>\n * <SessionMessages />\n * <ChatInput />\n * </SessionMessagePanel>\n * </Chat>\n * ```\n */\nexport function useAgUi({\n agent,\n initialSessions = [],\n initialActiveSessionId,\n tools = [],\n context = [],\n forwardedProps = {},\n headers = {},\n onToolCall,\n onError,\n onEvent\n}: UseAgUiOptions): UseAgUiReturn {\n const [sessions, setSessions] = useState<Session[]>(initialSessions);\n const [activeSessionId, setActiveSessionId] = useState<string | undefined>(\n initialActiveSessionId\n );\n const [isLoading, setIsLoading] = useState(false);\n\n const abortRef = useRef<AbortController | null>(null);\n // Refs to keep stable references in the async generator loop\n const onToolCallRef = useRef(onToolCall);\n onToolCallRef.current = onToolCall;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onEventRef = useRef(onEvent);\n onEventRef.current = onEvent;\n\n // Abort in-flight requests on unmount\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const selectSession = useCallback((sessionId: string) => {\n setActiveSessionId(sessionId);\n }, []);\n\n const deleteSession = useCallback(\n (sessionId: string) => {\n setSessions(prev => prev.filter(s => s.id !== sessionId));\n if (activeSessionId === sessionId) {\n setActiveSessionId(undefined);\n }\n },\n [activeSessionId]\n );\n\n const createSession = useCallback(() => {\n const id = generateId();\n const newSession: Session = {\n id,\n title: 'New Session',\n createdAt: new Date(),\n updatedAt: new Date(),\n conversations: []\n };\n setSessions(prev => [newSession, ...prev]);\n setActiveSessionId(id);\n }, []);\n\n const stopMessage = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n setIsLoading(false);\n }, []);\n\n const sendMessage = useCallback(\n async (message: string) => {\n // Abort any in-flight request\n abortRef.current?.abort();\n\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n // Determine the session to use\n let sessionId = activeSessionId;\n if (!sessionId) {\n sessionId = generateId();\n const newSession: Session = {\n id: sessionId,\n title: message.slice(0, 50),\n createdAt: new Date(),\n updatedAt: new Date(),\n conversations: []\n };\n setSessions(prev => [newSession, ...prev]);\n setActiveSessionId(sessionId);\n }\n\n const conversationId = generateId();\n const now = new Date();\n\n // Add the user's question immediately\n setSessions(prev =>\n addConversationToSession(prev, sessionId, {\n id: conversationId,\n question: message,\n createdAt: now\n })\n );\n\n setIsLoading(true);\n\n // Build the history for the agent\n const currentSession = [\n ...(sessions.find(s => s.id === sessionId)?.conversations ?? [])\n ];\n\n const historyMessages = sessionsToAgUiMessages({\n id: sessionId,\n conversations: currentSession\n });\n\n // Add the new message\n historyMessages.push({\n id: `${conversationId}-q`,\n role: 'user',\n content: message\n });\n\n const runId = generateId();\n const input: AgUiRunAgentInput = {\n threadId: sessionId,\n runId,\n messages: historyMessages,\n tools,\n context,\n state: null,\n forwardedProps\n };\n\n try {\n const response = await fetch(agent, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n ...headers\n },\n body: JSON.stringify(input),\n signal: abortController.signal\n });\n\n if (!response.ok) {\n throw new Error(\n `Agent returned ${response.status}: ${response.statusText}`\n );\n }\n\n // Track streaming response text and tool calls\n let responseText = '';\n const toolCalls = new Map<string, { name: string; args: string }>();\n\n // Helper to update the conversation response in-place\n const updateResponse = (text: string) => {\n setSessions(prev =>\n updateConversationInSession(prev, sessionId, conversationId, text)\n );\n };\n\n for await (const eventOrError of parseSSE(\n response,\n abortController.signal\n )) {\n if (eventOrError instanceof Error) {\n onErrorRef.current?.(eventOrError);\n continue;\n }\n\n const event = eventOrError;\n onEventRef.current?.(event);\n\n switch (event.type) {\n case AgUiEventType.TEXT_MESSAGE_CONTENT: {\n responseText += event.delta;\n updateResponse(responseText);\n break;\n }\n\n case AgUiEventType.TEXT_MESSAGE_CHUNK: {\n if (event.delta) {\n responseText += event.delta;\n updateResponse(responseText);\n }\n break;\n }\n\n case AgUiEventType.TOOL_CALL_START: {\n toolCalls.set(event.toolCallId, {\n name: event.toolCallName,\n args: ''\n });\n break;\n }\n\n case AgUiEventType.TOOL_CALL_ARGS: {\n const tc = toolCalls.get(event.toolCallId);\n if (tc) {\n tc.args += event.delta;\n }\n break;\n }\n\n case AgUiEventType.TOOL_CALL_END: {\n const tc = toolCalls.get(event.toolCallId);\n if (tc && onToolCallRef.current) {\n try {\n await onToolCallRef.current({\n toolCallId: event.toolCallId,\n toolCallName: tc.name,\n args: tc.args\n });\n } catch {\n // Tool call handler errors are non-fatal\n }\n }\n toolCalls.delete(event.toolCallId);\n break;\n }\n\n case AgUiEventType.RUN_ERROR: {\n const err = new Error(event.message);\n onErrorRef.current?.(err);\n break;\n }\n\n case AgUiEventType.RUN_FINISHED: {\n // Run completed successfully\n break;\n }\n }\n }\n } catch (err: unknown) {\n if (err instanceof DOMException && err.name === 'AbortError') {\n // User cancelled - not an error\n return;\n }\n const error = err instanceof Error ? err : new Error(String(err));\n onErrorRef.current?.(error);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = null;\n }\n setIsLoading(false);\n }\n },\n [activeSessionId, agent, context, forwardedProps, headers, sessions, tools]\n );\n\n return {\n sessions,\n activeSessionId,\n isLoading,\n selectSession,\n deleteSession,\n createSession,\n sendMessage,\n stopMessage\n };\n}\n","import type {\n ComponentSpec,\n ComponentDefinitions,\n ComponentCatalogError\n} from './types';\n\nexport type ValidateResult =\n | { ok: true; specs: ComponentSpec[]; error?: undefined }\n | { ok: false; error: ComponentCatalogError; specs?: undefined };\n\ntype SingleResult =\n | { ok: true; spec: ComponentSpec; error?: undefined }\n | { ok: false; error: ComponentCatalogError; spec?: undefined };\n\n/**\n * Attempts to parse a raw string (from a ```component code block)\n * into one or more ComponentSpec objects.\n *\n * Returns either a validated spec array or an error descriptor.\n */\nexport function validateSpec(\n raw: string,\n definitions: ComponentDefinitions\n): ValidateResult {\n // 1. Parse JSON\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: 'Failed to parse component JSON',\n raw\n }\n };\n }\n\n // Normalise to array\n const specArray: unknown[] = Array.isArray(parsed) ? parsed : [parsed];\n\n const validated: ComponentSpec[] = [];\n\n for (const item of specArray) {\n const result = validateSingleSpec(item, raw, definitions);\n if (!result.ok) {\n return { ok: false as const, error: result.error };\n }\n validated.push(result.spec);\n }\n\n return { ok: true, specs: validated };\n}\n\nfunction validateSingleSpec(\n item: unknown,\n raw: string,\n definitions: ComponentDefinitions\n): SingleResult {\n if (!item || typeof item !== 'object' || !('type' in item)) {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: 'Component spec must be an object with a \"type\" field',\n raw\n }\n };\n }\n\n const spec = item as { type: unknown; props?: unknown; children?: unknown };\n\n if (typeof spec.type !== 'string') {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: '\"type\" must be a string',\n raw\n }\n };\n }\n\n const componentType = spec.type;\n\n // 2. Check component exists in catalog\n const definition = definitions[componentType];\n if (!definition) {\n return {\n ok: false,\n error: {\n type: 'unknown_component',\n message: `Unknown component \"${componentType}\". Available: ${Object.keys(definitions).join(', ')}`,\n raw,\n componentType\n }\n };\n }\n\n // 3. Validate props via Zod schema\n // Fall back to empty object for missing/non-object props — Zod will\n // reject if required fields are absent.\n const props =\n spec.props && typeof spec.props === 'object' && !Array.isArray(spec.props)\n ? spec.props\n : {};\n const parseResult = definition.props.safeParse(props);\n\n if (!parseResult.success) {\n return {\n ok: false,\n error: {\n type: 'invalid_props',\n message: `Invalid props for \"${componentType}\": ${parseResult.error.issues.map(i => i.message).join(', ')}`,\n raw,\n componentType,\n issues: parseResult.error.issues.map(i => ({\n message: i.message,\n path: i.path as (string | number)[]\n }))\n }\n };\n }\n\n // 4. Recursively validate children\n let validatedChildren: ComponentSpec[] | undefined;\n if (spec.children) {\n if (!Array.isArray(spec.children)) {\n return {\n ok: false,\n error: {\n type: 'invalid_json',\n message: '\"children\" must be an array',\n raw,\n componentType\n }\n };\n }\n\n validatedChildren = [];\n for (const child of spec.children) {\n const childResult = validateSingleSpec(child, raw, definitions);\n if (!childResult.ok) {\n return childResult;\n }\n validatedChildren.push(childResult.spec);\n }\n }\n\n return {\n ok: true,\n spec: {\n type: componentType,\n props: parseResult.data as Record<string, any>,\n ...(validatedChildren ? { children: validatedChildren } : {})\n }\n };\n}\n","import React, { Component, FC, ReactNode, useContext, useMemo } from 'react';\nimport { ChatContext } from '@/ChatContext';\nimport { ComponentError } from './ComponentError';\nimport { validateSpec } from './validateSpec';\nimport type {\n ComponentDefinitions,\n ComponentSpec,\n ComponentCatalogOptions,\n ComponentCatalogError\n} from './types';\n\nexport interface ComponentRendererProps {\n /**\n * The raw JSON string from the ```component code block.\n */\n raw: string;\n\n /**\n * The component definitions from the catalog.\n */\n definitions: ComponentDefinitions;\n\n /**\n * Optional catalog options (for onError callback).\n */\n options?: ComponentCatalogOptions;\n}\n\nexport const ComponentRenderer: FC<ComponentRendererProps> = ({\n raw,\n definitions,\n options\n}) => {\n const { theme, sendMessage } = useContext(ChatContext);\n const result = useMemo(\n () => validateSpec(raw, definitions),\n [raw, definitions]\n );\n\n if (!result.ok) {\n const error = result.error;\n const custom = options?.onError?.(error);\n if (custom !== undefined) {\n return <>{custom}</>;\n }\n return (\n <ComponentError\n title={errorTitle(error.type)}\n message={error.message}\n code={error.raw}\n />\n );\n }\n\n const specs = result.specs;\n\n return (\n <div className={theme.component?.base}>\n {specs.map((spec, index) => (\n <SpecRenderer\n key={`${spec.type}-${index}-${stableKey(spec)}`}\n spec={spec}\n definitions={definitions}\n options={options}\n sendMessage={sendMessage}\n />\n ))}\n </div>\n );\n};\n\ninterface SpecRendererProps {\n spec: ComponentSpec;\n definitions: ComponentDefinitions;\n options?: ComponentCatalogOptions;\n sendMessage?: (message: string) => void;\n}\n\nconst SpecRenderer: FC<SpecRendererProps> = ({\n spec,\n definitions,\n options,\n sendMessage\n}) => {\n const definition = definitions[spec.type];\n\n // Defensive: validateSpec checks top-level specs, but SpecRenderer is also\n // called recursively for children and may be used standalone in the future.\n if (!definition) {\n const error: ComponentCatalogError = {\n type: 'unknown_component',\n message: `Unknown component \"${spec.type}\"`,\n raw: JSON.stringify(spec),\n componentType: spec.type\n };\n const custom = options?.onError?.(error);\n if (custom !== undefined) {\n return <>{custom}</>;\n }\n return (\n <ComponentError title={errorTitle(error.type)} message={error.message} />\n );\n }\n\n const RenderedComponent = definition.component;\n\n // Render children recursively\n const children = spec.children?.map((child, index) => (\n <SpecRenderer\n key={`${child.type}-${index}-${stableKey(child)}`}\n spec={child}\n definitions={definitions}\n options={options}\n sendMessage={sendMessage}\n />\n ));\n\n return (\n <SpecErrorBoundary spec={spec} options={options}>\n <RenderedComponent {...spec.props} sendMessage={sendMessage}>\n {children}\n </RenderedComponent>\n </SpecErrorBoundary>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Error boundary for catching render-time errors from dynamic components.\n// ---------------------------------------------------------------------------\n\ninterface SpecErrorBoundaryProps {\n spec: ComponentSpec;\n options?: ComponentCatalogOptions;\n children: ReactNode;\n}\n\ninterface SpecErrorBoundaryState {\n error: Error | null;\n}\n\nclass SpecErrorBoundary extends Component<\n SpecErrorBoundaryProps,\n SpecErrorBoundaryState\n> {\n state: SpecErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error): SpecErrorBoundaryState {\n return { error };\n }\n\n render() {\n if (this.state.error) {\n const { spec, options } = this.props;\n const catalogError: ComponentCatalogError = {\n type: 'render_error',\n message: `Error rendering \"${spec.type}\": ${this.state.error.message}`,\n raw: JSON.stringify(spec),\n componentType: spec.type\n };\n const custom = options?.onError?.(catalogError);\n if (custom !== undefined) {\n return <>{custom}</>;\n }\n return (\n <ComponentError\n title={errorTitle(catalogError.type)}\n message={catalogError.message}\n />\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Simple string hash for a stable, content-based React key. */\nfunction stableKey(spec: ComponentSpec): string {\n const str = JSON.stringify({\n t: spec.type,\n p: spec.props,\n c: spec.children\n });\n let h = 0;\n for (let i = 0; i < str.length; i++) {\n h = (h * 31 + str.charCodeAt(i)) | 0;\n }\n return (h >>> 0).toString(36);\n}\n\nfunction errorTitle(type: ComponentCatalogError['type']): string {\n switch (type) {\n case 'unknown_component':\n return 'Unknown Component';\n case 'invalid_props':\n return 'Invalid Props';\n case 'render_error':\n return 'Render Error';\n default:\n return 'Invalid Component';\n }\n}\n","import React from 'react';\n\n/**\n * Recursively extracts text content from React children.\n * Handles strings, numbers, arrays, and React elements by traversing\n * their children props.\n *\n * @param children - The React children to extract text from\n * @returns The concatenated text content as a string\n */\nexport function getChildText(children: React.ReactNode): string {\n if (children === null || children === undefined) {\n return '';\n }\n if (typeof children === 'string') {\n return children;\n }\n if (typeof children === 'number') {\n return String(children);\n }\n if (Array.isArray(children)) {\n return children.map(getChildText).join('');\n }\n if (typeof children === 'object') {\n if (\n 'props' in children &&\n (children as React.ReactElement<{ children?: React.ReactNode }>).props\n ) {\n const element = children as React.ReactElement<{\n children?: React.ReactNode;\n }>;\n return getChildText(element.props.children);\n }\n }\n return '';\n}\n","import React, { FC } from 'react';\nimport { ComponentRenderer } from './ComponentRenderer';\nimport { getChildText } from '@/utils/getChildText';\nimport type { ComponentDefinitions, ComponentCatalogOptions } from './types';\n\nexport interface ComponentPreProps {\n children?: React.ReactNode;\n [key: string]: unknown;\n}\n\n/**\n * Creates a `pre` component override for react-markdown that intercepts\n * fenced code blocks with the configured language tag and renders them\n * via the ComponentRenderer.\n *\n * Checks for a `language-{tag}` className on the nested `<code>` element\n * and, if matched, extracts the text content and hands it off to the\n * renderer.\n *\n * Any non-matching `<pre>` blocks are passed through as-is.\n */\nexport function createComponentPre(\n definitions: ComponentDefinitions,\n options?: ComponentCatalogOptions\n): FC<ComponentPreProps> {\n const language = options?.language ?? 'component';\n const className = `language-${language}`;\n\n const ComponentPre: FC<ComponentPreProps> = ({ children, ...props }) => {\n if (children && typeof children === 'object' && 'props' in children) {\n const codeElement = children as React.ReactElement<{\n className?: string;\n children?: React.ReactNode;\n }>;\n\n if (codeElement.props?.className === className) {\n const codeContent = getChildText(codeElement.props?.children);\n\n if (codeContent) {\n return (\n <ComponentRenderer\n raw={codeContent}\n definitions={definitions}\n options={options}\n />\n );\n }\n }\n }\n\n return <pre {...props}>{children}</pre>;\n };\n\n ComponentPre.displayName = 'ComponentPre';\n return ComponentPre;\n}\n","import { z } from 'zod';\nimport type { ComponentDefinitions } from './types';\n\n/**\n * Converts a JSON Schema property into a concise, human-readable type string.\n * Handles objects, arrays, enums, nullable, primitives, and descriptions.\n */\nfunction describeJsonSchemaProperty(\n prop: Record<string, any>,\n indent = ''\n): string {\n const description = prop.description ? ` // ${prop.description}` : '';\n\n // Nullable (anyOf with null)\n if (prop.anyOf) {\n const nonNull = prop.anyOf.filter((s: any) => !(s.type === 'null'));\n const hasNull = prop.anyOf.some((s: any) => s.type === 'null');\n if (nonNull.length === 1 && hasNull) {\n return `${describeJsonSchemaProperty(nonNull[0], indent)} | null${description}`;\n }\n const parts = prop.anyOf.map((s: any) =>\n describeJsonSchemaProperty(s, indent)\n );\n return `${parts.join(' | ')}${description}`;\n }\n\n // Enum\n if (prop.enum) {\n return `${prop.enum.map((v: any) => `\"${v}\"`).join(' | ')}${description}`;\n }\n\n // Array\n if (prop.type === 'array') {\n const items = prop.items\n ? describeJsonSchemaProperty(prop.items, indent)\n : 'any';\n return `${items}[]${description}`;\n }\n\n // Object\n if (prop.type === 'object' && prop.properties) {\n const required = new Set(prop.required ?? []);\n const fields: string[] = [];\n for (const [key, value] of Object.entries(prop.properties)) {\n const opt = required.has(key) ? '' : '?';\n fields.push(\n `${indent} ${key}: ${describeJsonSchemaProperty(value as Record<string, any>, indent + ' ')}${opt}`\n );\n }\n return `{\\n${fields.join(',\\n')}\\n${indent}}${description}`;\n }\n\n // Primitives\n if (prop.type === 'string') return `string${description}`;\n if (prop.type === 'number' || prop.type === 'integer')\n return `number${description}`;\n if (prop.type === 'boolean') return `boolean${description}`;\n if (prop.type === 'null') return `null${description}`;\n\n return `any${description}`;\n}\n\n/**\n * Converts a Zod schema into a concise, human-readable props description\n * using Zod's public `z.toJSONSchema()` API.\n */\nfunction describeProps(schema: z.ZodType): string {\n try {\n const jsonSchema = z.toJSONSchema(schema) as Record<string, any>;\n if (jsonSchema.type === 'object' && jsonSchema.properties) {\n return describeJsonSchemaProperty(jsonSchema);\n }\n return 'Record<string, any>';\n } catch {\n return 'Record<string, any>';\n }\n}\n\n/**\n * Generates an LLM-friendly system prompt describing all available\n * components, their descriptions, and their prop schemas.\n *\n * @param definitions The component definitions from the catalog.\n * @param language The code block language tag (default: 'component').\n */\nexport function generatePrompt(\n definitions: ComponentDefinitions,\n language = 'component'\n): string {\n const names = Object.keys(definitions);\n\n if (names.length === 0) {\n return '';\n }\n\n const componentDocs = names\n .map(name => {\n const def = definitions[name];\n const propsDesc = describeProps(def.props);\n return `- **${name}**: ${def.description}\\n Props: ${propsDesc}`;\n })\n .join('\\n\\n');\n\n return `When you need to render a dynamic UI component in your response, use a fenced code block with language \\`${language}\\` containing a JSON object:\n\n\\`\\`\\`${language}\n{ \"type\": \"ComponentName\", \"props\": { ... } }\n\\`\\`\\`\n\nFor multiple components, use a JSON array:\n\n\\`\\`\\`${language}\n[\n { \"type\": \"ComponentA\", \"props\": { ... } },\n { \"type\": \"ComponentB\", \"props\": { ... } }\n]\n\\`\\`\\`\n\nFor nested/composed layouts, use the \"children\" field:\n\n\\`\\`\\`${language}\n{\n \"type\": \"Parent\",\n \"props\": { ... },\n \"children\": [\n { \"type\": \"Child\", \"props\": { ... } }\n ]\n}\n\\`\\`\\`\n\nAvailable components:\n\n${componentDocs}`;\n}\n","import { remarkComponent } from '@/Markdown/plugins/remarkComponent';\nimport { createComponentPre } from './ComponentPre';\nimport { generatePrompt } from './generatePrompt';\nimport type {\n ComponentCatalog,\n ComponentCatalogOptions,\n ComponentDefinitions\n} from './types';\n\n/**\n * Creates a component catalog — the main entry point for the\n * dynamic component system.\n *\n * Returns an object with a remark plugin, markdown component overrides,\n * and a system-prompt generator, ready to plug into `<Chat>`.\n *\n * @example\n * ```tsx\n * import { componentCatalog } from 'reachat';\n * import { z } from 'zod';\n *\n * const catalog = componentCatalog({\n * WeatherCard: {\n * description: 'Displays weather for a city',\n * props: z.object({\n * city: z.string(),\n * temperature: z.number()\n * }),\n * component: ({ city, temperature }) => (\n * <div>{city}: {temperature}°F</div>\n * )\n * }\n * });\n *\n * // Simple — pass the whole catalog:\n * <Chat components={catalog} sessions={sessions}>\n * ...\n * </Chat>\n *\n * // Advanced — use individual pieces:\n * <Chat\n * remarkPlugins={[catalog.remarkPlugin]}\n * markdownComponents={catalog.components}\n * >\n * ...\n * </Chat>\n *\n * // Generate LLM instructions:\n * const prompt = catalog.systemPrompt();\n * ```\n */\nexport function componentCatalog(\n definitions: ComponentDefinitions,\n options?: ComponentCatalogOptions\n): ComponentCatalog {\n const language = options?.language ?? 'component';\n\n // remarkComponent is a pass-through plugin (rendering is handled by\n // ComponentPre). We cast to Plugin to satisfy unified's type system —\n // the plugin is a no-op that does not use the processor context.\n const plugin = remarkComponent.bind(undefined, {\n language\n }) as typeof remarkComponent;\n\n const Pre = createComponentPre(definitions, options);\n\n return {\n remarkPlugin: plugin,\n components: { pre: Pre },\n systemPrompt: () => generatePrompt(definitions, language),\n definitions\n };\n}\n","import React from 'react';\nimport { z } from 'zod';\nimport { ChartRenderer } from '@/Markdown/charts/ChartRenderer';\nimport type { ChartConfig } from '@/Markdown/charts/types';\nimport type { ComponentDefinition } from './types';\n\n/**\n * Wraps `ChartRenderer` as a component definition so charts can\n * be registered in a `componentCatalog()`.\n *\n * The adapter renders a `ChartRenderer` internally using the same\n * config-based API, with reaviz as the underlying chart library.\n *\n * Because reaviz is an optional peer dependency, this adapter is\n * fully tree-shakeable — it only loads reaviz code when imported.\n *\n * Both `zod` and `reaviz` are required when this helper is used.\n *\n * @example\n * ```tsx\n * import { componentCatalog, createChartComponentDef } from 'reachat';\n *\n * const catalog = componentCatalog({\n * Chart: createChartComponentDef(),\n * // ... other components\n * });\n * ```\n *\n * The LLM can then output:\n * ```component\n * {\n * \"type\": \"Chart\",\n * \"props\": {\n * \"type\": \"bar\",\n * \"data\": [{ \"key\": \"A\", \"data\": 10 }, { \"key\": \"B\", \"data\": 20 }],\n * \"title\": \"My Chart\"\n * }\n * }\n * ```\n */\nexport function createChartComponentDef(): ComponentDefinition {\n const chartPropsSchema = z.object({\n type: z\n .enum([\n 'bar',\n 'line',\n 'area',\n 'pie',\n 'radialBar',\n 'radialArea',\n 'sparkline'\n ])\n .describe('Chart type'),\n data: z\n .array(z.object({ key: z.string(), data: z.number() }))\n .describe('Array of { key, data } data points'),\n width: z.number().describe('Chart width in px').optional(),\n height: z.number().describe('Chart height in px').optional(),\n title: z.string().describe('Chart title').optional()\n });\n\n return {\n description:\n 'Renders a chart. Supported types: bar, line, area, pie, radialBar, radialArea, sparkline',\n props: chartPropsSchema,\n component: ({\n children: _children,\n sendMessage: _sendMessage,\n ...config\n }) => <ChartRenderer config={config as ChartConfig} />\n };\n}\n"],"names":["React","createContext","AttachIcon","useContext","useRef","jsxs","Fragment","jsx","Button","cn","forwardRef","useState","useEffect","useCallback","useImperativeHandle","List","ListItem","memo","posToDOMRect","computePosition","shift","flip","ReactRenderer","useMemo","useEditor","editor","EditorContent","SendIcon","StopIcon","Slot","Ellipsis","DateFormat","motion","BackIcon","CopyIcon","SyntaxHighlighter","children","Redact","BarChart","BarSeries","LineChart","LinearXAxis","LinearYAxis","LineSeries","AreaChart","AreaSeries","PieChart","PieArcSeries","RadialBarChart","RadialBarSeries","RadialAreaChart","RadialAreaSeries","SparklineChart","findAndReplace","DefaultFileRenderer","lazy","CSVFileRenderer","ImageFileRenderer","PDFFileRenderer","FileIcon","Suspense","url","IconButton","DownloadIcon","PlaceholderIcon","AnimatePresence","ThumbUpIcon","ThumbsDownIcon","RefreshIcon","Card","useInfinityList","ArrowDownIcon","componentCatalog","useComponentTheme","useHotkeys","TrashIcon","ChatIcon","PlusIcon","isToday","isYesterday","isThisWeek","differenceInYears","format","sessions","offset","ConnectedOverlay","isValidElement","cloneElement","SpinnerIcon","CheckIcon","ErrorIcon","chatTheme","defaultTheme","AgUiEventType","Component","z"],"mappings":"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"}