1 line
198 KiB
Plaintext
1 line
198 KiB
Plaintext
{"version":3,"file":"index.mjs","names":["CloseIcon","CheckIcon","DefaultIcons.OpenIcon","DefaultIcons.CloseIcon","DefaultIcons.HeaderCloseIcon","DefaultIcons.SendIcon","DefaultIcons.ActivityIcon","DefaultIcons.SpinnerIcon","DefaultIcons.StopIcon","DefaultIcons.RegenerateIcon","DefaultIcons.MicrophoneIcon","DefaultIcons.CopyIcon","DefaultIcons.ThumbsUpIcon","DefaultIcons.ThumbsDownIcon","DefaultIcons.UploadIcon","React","CheckIcon","DefaultUserMessage","DefaultAssistantMessage","DefaultImageRenderer","UserMessage","ImageRenderer","AssistantMessage","DefaultRenderMessage","DefaultMessages","DefaultRenderMessage","DefaultRenderSuggestionsList","DefaultInput","DefaultAssistantMessage","DefaultUserMessage","DefaultImageRenderer","Messages","AssistantMessage","UserMessage","RenderMessage","ImageRenderer","Input","DefaultWindow","DefaultButton","DefaultHeader","DefaultMessages","DefaultInput","DefaultAssistantMessage","DefaultUserMessage","Window","Button","Header","Messages","Input","AssistantMessage","UserMessage"],"sources":["../src/components/chat/Icons.tsx","../src/components/chat/ChatContext.tsx","../src/components/chat/Window.tsx","../src/components/chat/Button.tsx","../src/components/dev-console/utils.ts","../src/components/dev-console/icons.tsx","../src/components/help-modal/icons.tsx","../src/components/help-modal/modal.tsx","../src/components/dev-console/console.tsx","../src/components/chat/Header.tsx","../src/components/chat/messages/UserMessage.tsx","../src/hooks/use-copy-to-clipboard.tsx","../src/components/chat/CodeBlock.tsx","../src/components/chat/Markdown.tsx","../src/components/chat/messages/AssistantMessage.tsx","../src/components/chat/messages/ImageRenderer.tsx","../src/components/chat/messages/RenderMessage.tsx","../src/components/chat/messages/LegacyRenderMessage.tsx","../src/components/chat/Messages.tsx","../src/components/chat/Textarea.tsx","../src/hooks/use-push-to-talk.tsx","../src/hooks/use-dark-mode.ts","../src/components/chat/PoweredByTag.tsx","../src/components/chat/Input.tsx","../src/components/chat/ImageUploadQueue.tsx","../src/components/chat/Suggestion.tsx","../src/components/chat/Suggestions.tsx","../src/components/chat/Chat.tsx","../src/components/chat/Modal.tsx","../src/components/chat/Popup.tsx","../src/components/chat/Sidebar.tsx","../src/hooks/use-copilot-chat-suggestions.tsx"],"sourcesContent":["import React from \"react\";\n\nexport const OpenIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"24\"\n height=\"24\"\n >\n <g transform=\"translate(24, 0) scale(-1, 1)\">\n <path\n fillRule=\"evenodd\"\n d=\"M5.337 21.718a6.707 6.707 0 01-.533-.074.75.75 0 01-.44-1.223 3.73 3.73 0 00.814-1.686c.023-.115-.022-.317-.254-.543C3.274 16.587 2.25 14.41 2.25 12c0-5.03 4.428-9 9.75-9s9.75 3.97 9.75 9c0 5.03-4.428 9-9.75 9-.833 0-1.643-.097-2.417-.279a6.721 6.721 0 01-4.246.997z\"\n clipRule=\"evenodd\"\n />\n </g>\n </svg>\n);\n\nexport const CloseIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n width=\"24\"\n height=\"24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 8.25l-7.5 7.5-7.5-7.5\"\n />\n </svg>\n);\n\nexport const HeaderCloseIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n width=\"24\"\n height=\"24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n);\n\nexport const SendIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n width=\"24\"\n height=\"24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 19V5m0 0l-7 7m7-7l7 7\"\n />\n </svg>\n);\n\nexport const MicrophoneIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n width=\"24\"\n height=\"24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 18.75a6 6 0 006-6v-1.5m-6 7.5a6 6 0 01-6-6v-1.5m6 7.5v3.75m-3.75 0h7.5M12 15.75a3 3 0 01-3-3V4.5a3 3 0 116 0v8.25a3 3 0 01-3 3z\"\n />\n </svg>\n);\n\nexport const StopIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n width=\"24\"\n height=\"24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5.25 7.5A2.25 2.25 0 017.5 5.25h9a2.25 2.25 0 012.25 2.25v9a2.25 2.25 0 01-2.25 2.25h-9a2.25 2.25 0 01-2.25-2.25v-9z\"\n />\n </svg>\n);\n\nexport const RegenerateIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n width=\"16\"\n height=\"16\"\n style={{ minWidth: \"16px\", minHeight: \"16px\" }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n);\n\nexport const CopyIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n width=\"16\"\n height=\"16\"\n style={{ minWidth: \"16px\", minHeight: \"16px\" }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 01-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 011.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 00-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 01-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 00-3.375-3.375h-1.5a1.125 1.125 0 01-1.125-1.125v-1.5a3.375 3.375 0 00-3.375-3.375H9.75\"\n />\n </svg>\n);\n\nexport const SmallSpinnerIcon = (\n <span\n className=\"copilotKitSpinner\"\n style={{ width: \"13px\", height: \"13px\" }}\n ></span>\n);\n\nexport const SpinnerIcon = (\n <span\n className=\"copilotKitSpinner\"\n style={{ width: \"24px\", height: \"24px\" }}\n ></span>\n);\n\nexport const ActivityIcon = (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"4px\" }}>\n <span\n className=\"copilotKitActivityDot\"\n style={{ animationDelay: \"0s\" }}\n ></span>\n <span\n className=\"copilotKitActivityDot\"\n style={{ animationDelay: \"0.2s\" }}\n ></span>\n <span\n className=\"copilotKitActivityDot\"\n style={{ animationDelay: \"0.4s\" }}\n ></span>\n </div>\n);\n\nexport const ThumbsUpIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n width=\"16\"\n height=\"16\"\n style={{ minWidth: \"16px\", minHeight: \"16px\" }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.633 10.5c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75A2.25 2.25 0 0116.5 4.5c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H13.48c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23H5.904M14.25 9h2.25M5.904 18.75c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 01-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 10.203 4.167 9.75 5 9.75h1.053c.472 0 .745.556.5.96a8.958 8.958 0 00-1.302 4.665c0 1.194.232 2.333.654 3.375z\"\n />\n </svg>\n);\n\nexport const ThumbsDownIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n width=\"16\"\n height=\"16\"\n style={{ minWidth: \"16px\", minHeight: \"16px\" }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M7.5 15h2.25m8.024-9.75c.011.05.028.1.052.148.591 1.2.924 2.55.924 3.977a8.96 8.96 0 01-.999 4.125m.023-8.25c-.076-.365.183-.75.575-.75h.908c.889 0 1.713.518 1.972 1.368.339 1.11.521 2.287.521 3.507 0 1.553-.295 3.036-.831 4.398C20.613 14.547 19.833 15 19 15h-1.053c-.472 0-.745-.556-.5-.96a8.95 8.95 0 00.303-.54m.023-8.25H16.48a4.5 4.5 0 01-1.423-.23l-3.114-1.04a4.5 4.5 0 00-1.423-.23H6.504c-.618 0-1.217.247-1.605.729A11.95 11.95 0 002.25 12c0 .434.023.863.068 1.285C2.427 14.306 3.346 15 4.372 15h3.126c.618 0 .991.724.725 1.282A7.471 7.471 0 007.5 19.5a2.25 2.25 0 002.25 2.25.75.75 0 00.75-.75v-.633c0-.573.11-1.14.322-1.672.304-.76.93-1.33 1.653-1.715a9.04 9.04 0 002.86-2.4c.498-.634 1.226-1.08 2.032-1.08h.384\"\n />\n </svg>\n);\n\nexport const DownloadIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n width=\"16\"\n height=\"16\"\n style={{ minWidth: \"16px\", minHeight: \"16px\" }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\"\n />\n </svg>\n);\n\nexport const UploadIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n width=\"24\"\n height=\"24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 4.5v15m7.5-7.5h-15\"\n />\n </svg>\n);\n\nexport const CheckIcon = (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n width=\"16\"\n height=\"16\"\n style={{ minWidth: \"16px\", minHeight: \"16px\" }}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.5 12.75l6 6 9-13.5\"\n />\n </svg>\n);\n","import React, { useMemo, useState } from \"react\";\nimport * as DefaultIcons from \"./Icons\";\nimport { ThumbsDownIcon, ThumbsUpIcon } from \"./Icons\";\n\n/**\n * Icons for CopilotChat component.\n */\nexport interface CopilotChatIcons {\n /**\n * The icon to use for the open chat button.\n * @default <OpenIcon />\n */\n openIcon?: React.ReactNode;\n\n /**\n * The icon to use for the close chat button.\n * @default <CloseIcon />\n */\n closeIcon?: React.ReactNode;\n\n /**\n * The icon to use for the close chat button in the header.\n * @default <HeaderCloseIcon />\n */\n headerCloseIcon?: React.ReactNode;\n\n /**\n * The icon to use for the send button.\n * @default <SendIcon />\n */\n sendIcon?: React.ReactNode;\n\n /**\n * The icon to use for the activity indicator.\n * @default <ActivityIcon />\n */\n activityIcon?: React.ReactNode;\n\n /**\n * The icon to use for the spinner.\n * @default <SpinnerIcon />\n */\n spinnerIcon?: React.ReactNode;\n\n /**\n * The icon to use for the stop button.\n * @default <StopIcon />\n */\n stopIcon?: React.ReactNode;\n\n /**\n * The icon to use for the regenerate button.\n * @default <RegenerateIcon />\n */\n regenerateIcon?: React.ReactNode;\n\n /**\n * The icons to use for push to talk.\n * @default <PushToTalkIcon />\n */\n\n pushToTalkIcon?: React.ReactNode;\n\n /**\n * The icons to use for copy assistant response\n * @default <CopyIcon />\n */\n\n copyIcon?: React.ReactNode;\n\n /**\n * The icon to use for thumbs up/response approval.\n * @default <ThumbsUpIcon />\n */\n\n thumbsUpIcon?: React.ReactNode;\n\n /**\n * The icon to use for thumbs down/response rejection.\n * @default <ThumbsDownIcon />\n */\n\n thumbsDownIcon?: React.ReactNode;\n\n /**\n * The icon to use for the upload button.\n * @default <UploadIcon />\n */\n uploadIcon?: React.ReactNode;\n}\n\n/**\n * Labels for CopilotChat component.\n */\nexport interface CopilotChatLabels {\n /**\n * The initial message(s) to display in the chat window.\n */\n initial?: string | string[];\n\n /**\n * The title to display in the header.\n * @default \"CopilotKit\"\n */\n title?: string;\n\n /**\n * The placeholder to display in the input.\n * @default \"Type a message...\"\n */\n placeholder?: string;\n\n /**\n * The message to display when an error occurs.\n * @default \"❌ An error occurred. Please try again.\"\n */\n error?: string;\n\n /**\n * The label to display on the stop button.\n * @default \"Stop generating\"\n */\n stopGenerating?: string;\n\n /**\n * The label to display on the regenerate button.\n * @default \"Regenerate response\"\n */\n regenerateResponse?: string;\n\n /**\n * The label for the copy button.\n * @default \"Copy to clipboard\"\n */\n copyToClipboard?: string;\n\n /**\n * The label for the thumbs up button.\n * @default \"Thumbs up\"\n */\n thumbsUp?: string;\n\n /**\n * The label for the thumbs down button.\n * @default \"Thumbs down\"\n */\n thumbsDown?: string;\n\n /**\n * The text to display when content is copied.\n * @default \"Copied!\"\n */\n copied?: string;\n}\n\ninterface ChatContext {\n labels: Required<CopilotChatLabels>;\n icons: Required<CopilotChatIcons>;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nexport const ChatContext = React.createContext<ChatContext | undefined>(\n undefined,\n);\n\nexport function useChatContext(): ChatContext {\n const context = React.useContext(ChatContext);\n if (context === undefined) {\n throw new Error(\n \"Context not found. Did you forget to wrap your app in a <ChatContextProvider> component?\",\n );\n }\n return context;\n}\n\ninterface ChatContextProps {\n // temperature?: number;\n // instructions?: string;\n // maxFeedback?: number;\n labels?: CopilotChatLabels;\n icons?: CopilotChatIcons;\n children?: React.ReactNode;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nexport const ChatContextProvider = ({\n // temperature,\n // instructions,\n // maxFeedback,\n labels,\n icons,\n children,\n open,\n setOpen,\n}: ChatContextProps) => {\n const memoizedLabels = useMemo(\n () => ({\n ...{\n initial: \"\",\n title: \"CopilotKit\",\n placeholder: \"Type a message...\",\n error: \"❌ An error occurred. Please try again.\",\n stopGenerating: \"Stop generating\",\n regenerateResponse: \"Regenerate response\",\n copyToClipboard: \"Copy to clipboard\",\n thumbsUp: \"Thumbs up\",\n thumbsDown: \"Thumbs down\",\n copied: \"Copied!\",\n },\n ...labels,\n }),\n [labels],\n );\n\n const memoizedIcons = useMemo(\n () => ({\n ...{\n openIcon: DefaultIcons.OpenIcon,\n closeIcon: DefaultIcons.CloseIcon,\n headerCloseIcon: DefaultIcons.HeaderCloseIcon,\n sendIcon: DefaultIcons.SendIcon,\n activityIcon: DefaultIcons.ActivityIcon,\n spinnerIcon: DefaultIcons.SpinnerIcon,\n stopIcon: DefaultIcons.StopIcon,\n regenerateIcon: DefaultIcons.RegenerateIcon,\n pushToTalkIcon: DefaultIcons.MicrophoneIcon,\n copyIcon: DefaultIcons.CopyIcon,\n thumbsUpIcon: DefaultIcons.ThumbsUpIcon,\n thumbsDownIcon: DefaultIcons.ThumbsDownIcon,\n uploadIcon: DefaultIcons.UploadIcon,\n },\n ...icons,\n }),\n [icons],\n );\n\n const context = useMemo(\n () => ({\n labels: memoizedLabels,\n icons: memoizedIcons,\n open,\n setOpen,\n }),\n [memoizedLabels, memoizedIcons, open, setOpen],\n );\n\n return (\n <ChatContext.Provider value={context}>{children}</ChatContext.Provider>\n );\n};\n","import React, { useCallback, useEffect } from \"react\";\nimport { WindowProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\nimport { useCopilotContext } from \"@copilotkit/react-core\";\nimport { isMacOS } from \"@copilotkit/shared\";\n\nexport const Window = ({\n children,\n clickOutsideToClose,\n shortcut,\n hitEscapeToClose,\n}: WindowProps) => {\n const windowRef = React.useRef<HTMLDivElement>(null);\n const context = useCopilotContext();\n\n const { open, setOpen } = useChatContext();\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!clickOutsideToClose) {\n return;\n }\n\n const parentElement = windowRef.current?.parentElement;\n\n let className = \"\";\n if (event.target instanceof HTMLElement) {\n className = event.target.className;\n }\n\n if (\n open &&\n parentElement &&\n !parentElement.contains(event.target as any) &&\n // prevent closing the window when clicking on the debug menu\n !className.includes(\"copilotKitDebugMenu\")\n ) {\n setOpen(false);\n }\n },\n [clickOutsideToClose, open, setOpen],\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n const target = event.target as HTMLElement;\n const isInput =\n target.tagName === \"INPUT\" ||\n target.tagName === \"SELECT\" ||\n target.tagName === \"TEXTAREA\" ||\n target.isContentEditable;\n\n const isDescendantOfWrapper = windowRef.current?.contains(target);\n\n if (\n open &&\n event.key === \"Escape\" &&\n (!isInput || isDescendantOfWrapper) &&\n hitEscapeToClose\n ) {\n setOpen(false);\n } else if (\n event.key === shortcut &&\n ((isMacOS() && event.metaKey) || (!isMacOS() && event.ctrlKey)) &&\n (!isInput || isDescendantOfWrapper)\n ) {\n setOpen(!open);\n }\n },\n [hitEscapeToClose, shortcut, open, setOpen],\n );\n\n const adjustForMobile = useCallback(() => {\n const copilotKitWindow = windowRef.current;\n const vv = window.visualViewport;\n if (!copilotKitWindow || !vv) {\n return;\n }\n\n if (window.innerWidth < 640 && open) {\n copilotKitWindow.style.height = `${vv.height}px`;\n copilotKitWindow.style.left = `${vv.offsetLeft}px`;\n copilotKitWindow.style.top = `${vv.offsetTop}px`;\n\n document.body.style.position = \"fixed\";\n document.body.style.width = \"100%\";\n document.body.style.height = `${window.innerHeight}px`;\n document.body.style.overflow = \"hidden\";\n document.body.style.touchAction = \"none\";\n\n // Prevent scrolling on iOS\n document.body.addEventListener(\"touchmove\", preventScroll, {\n passive: false,\n });\n } else {\n copilotKitWindow.style.height = \"\";\n copilotKitWindow.style.left = \"\";\n copilotKitWindow.style.top = \"\";\n document.body.style.position = \"\";\n document.body.style.height = \"\";\n document.body.style.width = \"\";\n document.body.style.overflow = \"\";\n document.body.style.top = \"\";\n document.body.style.touchAction = \"\";\n\n document.body.removeEventListener(\"touchmove\", preventScroll);\n }\n }, [open]);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleKeyDown);\n if (window.visualViewport) {\n window.visualViewport.addEventListener(\"resize\", adjustForMobile);\n adjustForMobile();\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleKeyDown);\n if (window.visualViewport) {\n window.visualViewport.removeEventListener(\"resize\", adjustForMobile);\n }\n };\n }, [adjustForMobile, handleClickOutside, handleKeyDown]);\n\n return (\n <div className={`copilotKitWindow ${open ? \" open\" : \"\"}`} ref={windowRef}>\n {children}\n </div>\n );\n};\n\nconst preventScroll = (event: TouchEvent): void => {\n let targetElement = event.target as Element;\n\n // Function to check if the target has the parent with a given class\n const hasParentWithClass = (element: Element, className: string): boolean => {\n while (element && element !== document.body) {\n if (element.classList.contains(className)) {\n return true;\n }\n element = element.parentElement!;\n }\n return false;\n };\n\n // Check if the target of the touch event is inside an element with the 'copilotKitMessages' class\n if (!hasParentWithClass(targetElement, \"copilotKitMessages\")) {\n event.preventDefault();\n }\n};\n","import { ButtonProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\n\nexport const Button = ({}: ButtonProps) => {\n const { open, setOpen, icons } = useChatContext();\n\n return (\n <div onClick={() => setOpen(!open)}>\n <button\n className={`copilotKitButton ${open ? \"open\" : \"\"}`}\n aria-label={open ? \"Close Chat\" : \"Open Chat\"}\n >\n <div className=\"copilotKitButtonIcon copilotKitButtonIconOpen\">\n {icons.openIcon}\n </div>\n <div className=\"copilotKitButtonIcon copilotKitButtonIconClose\">\n {icons.closeIcon}\n </div>\n </button>\n </div>\n );\n};\n","import {\n CopilotContextParams,\n CopilotMessagesContextParams,\n defaultCopilotContextCategories,\n} from \"@copilotkit/react-core\";\nimport { CopilotKitVersion } from \"./types\";\nexport { shouldShowDevConsole } from \"@copilotkit/react-core\";\n\nexport async function getPublishedCopilotKitVersion(\n current: string,\n forceCheck: boolean = false,\n): Promise<CopilotKitVersion> {\n const LOCAL_STORAGE_KEY = \"__copilotkit_version_check__\";\n const serializedVersion = localStorage.getItem(LOCAL_STORAGE_KEY);\n if (serializedVersion && !forceCheck) {\n try {\n const parsedVersion: CopilotKitVersion = JSON.parse(serializedVersion);\n const oneHour = 60 * 60 * 1000;\n const now = new Date().getTime();\n\n if (\n parsedVersion.current === current &&\n now - new Date(parsedVersion.lastChecked).getTime() < oneHour\n ) {\n return parsedVersion;\n }\n } catch (error) {\n console.error(\n \"Failed to parse CopilotKitVersion from localStorage\",\n error,\n );\n }\n }\n\n try {\n const response = await fetch(\n \"https://api.cloud.copilotkit.ai/check-for-updates\",\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n packages: [\n {\n packageName: \"@copilotkit/shared\",\n packageVersion: current,\n },\n ],\n }),\n },\n );\n\n const data = await response.json();\n\n const version: CopilotKitVersion = {\n current,\n lastChecked: new Date().getTime(),\n latest: data.packages[0].latestVersion,\n severity: data.packages[0].severity,\n advisory: data.packages[0].advisory || null,\n };\n\n localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(version));\n return version;\n } catch (error) {\n console.error(\"Failed to check for updates\", error);\n throw error;\n }\n}\n\nexport function logReadables(context: CopilotContextParams) {\n console.log(\"%cCurrent Readables:\", \"font-size: 16px; font-weight: bold;\");\n\n const readables = context\n .getContextString([], defaultCopilotContextCategories)\n .trim();\n if (readables.length === 0) {\n console.log(\"No readables found\");\n return;\n }\n console.log(readables);\n}\n\nexport function logActions(context: CopilotContextParams) {\n console.log(\"%cCurrent Actions:\", \"font-size: 16px; font-weight: bold;\");\n\n if (Object.values(context.actions).length === 0) {\n console.log(\"No actions found\");\n return;\n }\n for (const action of Object.values(context.actions)) {\n console.group(action.name);\n console.log(\"name\", action.name);\n console.log(\"description\", action.description);\n console.log(\"parameters\", action.parameters);\n\n console.groupEnd();\n }\n}\n\nexport function logMessages(context: CopilotMessagesContextParams) {\n console.log(\"%cCurrent Messages:\", \"font-size: 16px; font-weight: bold;\");\n\n if (context.messages.length === 0) {\n console.log(\"No messages found\");\n return;\n }\n\n const tableData = context.messages.map((message) => {\n if (message.isTextMessage()) {\n return {\n id: message.id,\n type: \"TextMessage\",\n role: message.role,\n name: undefined,\n scope: undefined,\n content: message.content,\n };\n } else if (message.isActionExecutionMessage()) {\n return {\n id: message.id,\n type: \"ActionExecutionMessage\",\n role: undefined,\n name: message.name,\n scope: message.parentMessageId,\n content: message.arguments,\n };\n } else if (message.isResultMessage()) {\n return {\n id: message.id,\n type: \"ResultMessage\",\n role: undefined,\n name: message.actionName,\n scope: message.actionExecutionId,\n content: message.result,\n };\n } else if (message.isAgentStateMessage()) {\n return {\n id: message.id,\n type: `AgentStateMessage (running: ${message.running})`,\n role: message.role,\n name: undefined,\n scope: message.threadId,\n content: message.state,\n };\n }\n });\n console.table(tableData);\n}\n","export const ExclamationMarkTriangleIcon = (\n <svg\n width=\"13.3967723px\"\n height=\"12px\"\n viewBox=\"0 0 13.3967723 12\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g id=\"exclamation-triangle\" fill=\"#CD2121\">\n <path\n d=\"M5.39935802,0.75 C5.97670802,-0.25 7.42007802,-0.25 7.99742802,0.75 L13.193588,9.75 C13.770888,10.75 13.049288,12 11.894588,12 L1.50223802,12 C0.34753802,12 -0.37414898,10.75 0.20319802,9.75 L5.39935802,0.75 Z M6.69838802,2.5 C7.11260802,2.5 7.44838802,2.83579 7.44838802,3.25 L7.44838802,6.25 C7.44838802,6.66421 7.11260802,7 6.69838802,7 C6.28417802,7 5.94838802,6.66421 5.94838802,6.25 L5.94838802,3.25 C5.94838802,2.83579 6.28417802,2.5 6.69838802,2.5 Z M6.69838802,10.5 C7.25067802,10.5 7.69838802,10.0523 7.69838802,9.5 C7.69838802,8.9477 7.25067802,8.5 6.69838802,8.5 C6.14610802,8.5 5.69838802,8.9477 5.69838802,9.5 C5.69838802,10.0523 6.14610802,10.5 6.69838802,10.5 Z\"\n id=\"Shape\"\n ></path>\n </g>\n </g>\n </svg>\n);\n\nexport const ExclamationMarkIcon = (\n <svg\n width=\"14px\"\n height=\"14px\"\n viewBox=\"0 0 14 14\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g id=\"exclamation-circle\" fill=\"#EC662C\">\n <path\n d=\"M7,14 C10.866,14 14,10.866 14,7 C14,3.13401 10.866,0 7,0 C3.13401,0 0,3.13401 0,7 C0,10.866 3.13401,14 7,14 Z M7,3 C7.41421,3 7.75,3.33579 7.75,3.75 L7.75,6.75 C7.75,7.16421 7.41421,7.5 7,7.5 C6.58579,7.5 6.25,7.16421 6.25,6.75 L6.25,3.75 C6.25,3.33579 6.58579,3 7,3 Z M7,11 C7.55228,11 8,10.5523 8,10 C8,9.4477 7.55228,9 7,9 C6.44772,9 6,9.4477 6,10 C6,10.5523 6.44772,11 7,11 Z\"\n id=\"Shape\"\n ></path>\n </g>\n </g>\n </svg>\n);\n\nexport const ChevronDownIcon = (\n <svg\n width=\"7px\"\n height=\"4px\"\n viewBox=\"0 0 7 4\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"currentColor\"\n >\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g id=\"Group\" fill=\"currentColor\" fillRule=\"nonzero\">\n <path\n d=\"M3.71690723,3.90271086 C3.59268176,4.03242971 3.39143629,4.03242971 3.26721082,3.90271086 L0.0853966595,0.57605615 C-0.0314221035,0.444981627 -0.0279751448,0.240725043 0.0931934622,0.114040675 C0.214362069,-0.0126436935 0.409725445,-0.0162475626 0.535093061,0.105888951 L3.49205902,3.19746006 L6.44902499,0.105888951 C6.52834574,0.0168884389 6.64780588,-0.0197473458 6.7605411,0.0103538404 C6.87327633,0.0404550266 6.96130636,0.132492308 6.99009696,0.250359396 C7.01888756,0.368226483 6.98384687,0.493124608 6.89872139,0.57605615 L3.71690723,3.90271086 Z\"\n id=\"Path\"\n ></path>\n </g>\n </g>\n </svg>\n);\n\nexport const CheckIcon = (\n <svg\n width=\"14px\"\n height=\"14px\"\n viewBox=\"0 0 14 14\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <g\n id=\"Group-2\"\n transform=\"translate(-118, 0)\"\n fill=\"#1BC030\"\n fillRule=\"nonzero\"\n >\n <g id=\"Group\" transform=\"translate(118, 0)\">\n <path\n d=\"M0,7 C0,3.13384615 3.13384615,0 7,0 C10.8661538,0 14,3.13384615 14,7 C14,10.8661538 10.8661538,14 7,14 C3.13384615,14 0,10.8661538 0,7 Z M9.59179487,5.69764103 C9.70905818,5.54139023 9.73249341,5.33388318 9.65303227,5.15541491 C9.57357113,4.97694665 9.40367989,4.85551619 9.20909814,4.83811118 C9.01451638,4.82070616 8.82577109,4.91005717 8.71589744,5.07158974 L6.39261538,8.32389744 L5.22666667,7.15794872 C5.01450582,6.96025518 4.68389046,6.9660885 4.47883563,7.17114332 C4.27378081,7.37619815 4.26794748,7.70681351 4.46564103,7.91897436 L6.08102564,9.53435897 C6.19289944,9.64614839 6.3482622,9.70310251 6.50588106,9.69010587 C6.66349993,9.67710922 6.80743532,9.59547613 6.89948718,9.46687179 L9.59179487,5.69764103 L9.59179487,5.69764103 Z\"\n id=\"Shape\"\n ></path>\n </g>\n </g>\n </g>\n </svg>\n);\n\nexport const CopilotKitIcon = (\n <svg\n width=\"33px\"\n height=\"35px\"\n viewBox=\"0 0 33 35\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <title>bd5c9079-929b-4d55-bdc9-16d1c8181b71</title>\n <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n <image\n x=\"0\"\n y=\"0\"\n width=\"33\"\n height=\"35\"\n xlinkHref=\"data:image/png;base64,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\"\n ></image>\n </g>\n </svg>\n);\n","import React from \"react\";\n\nexport const LifeBuoyIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"icon icon-tabler icons-tabler-outline icon-tabler-lifebuoy\"\n >\n <g transform=\"translate(0, -1)\">\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M12 12m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0\" />\n <path d=\"M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0\" />\n <path d=\"M15 15l3.35 3.35\" />\n <path d=\"M9 15l-3.35 3.35\" />\n <path d=\"M5.65 5.65l3.35 3.35\" />\n <path d=\"M18.35 5.65l-3.35 3.35\" />\n </g>\n </svg>\n);\n\nexport const CloseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"1.5\"\n stroke=\"currentColor\"\n width=\"20\"\n height=\"20\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n);\n\nexport const LoadingSpinnerIcon = ({\n color = \"rgb(107 114 128)\",\n}: {\n color?: string;\n}) => (\n <svg\n style={{\n animation: \"copilotKitSpinAnimation 1s linear infinite\",\n color,\n }}\n width=\"24\"\n height=\"24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n style={{ opacity: 0.25 }}\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n ></circle>\n <path\n style={{ opacity: 0.75 }}\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n);\n","import React, { useMemo, useState, useRef, useEffect } from \"react\";\nimport { CloseIcon } from \"./icons\";\n\nexport function CopilotKitHelpModal() {\n const [showHelpModal, setShowHelpModal] = useState(false);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n // Close popover when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n popoverRef.current &&\n !popoverRef.current.contains(event.target as Node) &&\n buttonRef.current &&\n !buttonRef.current.contains(event.target as Node)\n ) {\n setShowHelpModal(false);\n }\n };\n\n if (showHelpModal) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [showHelpModal]);\n\n const HelpButton = () => (\n <button\n ref={buttonRef}\n onClick={() => setShowHelpModal(!showHelpModal)}\n className=\"copilotKitDebugMenuTriggerButton relative\"\n aria-label=\"Open Help\"\n >\n Help\n </button>\n );\n\n return (\n <div className=\"relative\">\n <HelpButton />\n {showHelpModal && (\n <div\n ref={popoverRef}\n className=\"absolute mt-2 z-50\"\n style={{\n top: \"100%\",\n right: \"-120px\",\n width: \"380px\",\n }}\n >\n <div className=\"copilotKitHelpModal rounded-lg shadow-xl w-full p-4 flex-col relative\">\n <button\n className=\"copilotKitHelpModalCloseButton absolute text-gray-400 hover:text-gray-600 focus:outline-none\"\n style={{ top: \"10px\", right: \"10px\" }}\n onClick={() => setShowHelpModal(false)}\n aria-label=\"Close\"\n >\n <CloseIcon />\n </button>\n <div className=\"w-full flex mb-6 justify-center\">\n <h2 className=\"text-2xl font-bold\">Help Options</h2>\n </div>\n <div className=\"space-y-4 mb-4\">\n <div className=\"copilotKitHelpItemButton\">\n <a\n href=\"https://docs.copilotkit.ai/coagents/troubleshooting/common-issues\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Visit the Troubleshooting and FAQ section in the docs\n </a>\n </div>\n <div className=\"copilotKitHelpItemButton\">\n <a\n href=\"https://go.copilotkit.ai/dev-console-support-discord\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Go to Discord Support Channel (Community Support)\n </a>\n </div>\n <div className=\"copilotKitHelpItemButton\">\n <a\n href=\"https://go.copilotkit.ai/dev-console-support-slack\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n Apply for Priority Direct Slack Support\n </a>\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n useCopilotContext,\n useCopilotMessagesContext,\n} from \"@copilotkit/react-core\";\nimport {\n getPublishedCopilotKitVersion,\n logActions,\n logMessages,\n logReadables,\n shouldShowDevConsole,\n} from \"./utils\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport {\n CheckIcon,\n ChevronDownIcon,\n CopilotKitIcon,\n ExclamationMarkIcon,\n ExclamationMarkTriangleIcon,\n} from \"./icons\";\nimport { Menu, MenuButton, MenuItem, MenuItems } from \"@headlessui/react\";\nimport { COPILOTKIT_VERSION } from \"@copilotkit/shared\";\nimport { SmallSpinnerIcon } from \"../chat/Icons\";\nimport { CopilotKitHelpModal } from \"../help-modal\";\n\ntype VersionStatus =\n | \"unknown\"\n | \"checking\"\n | \"latest\"\n | \"update-available\"\n | \"outdated\";\n\nexport function CopilotDevConsole() {\n const currentVersion = COPILOTKIT_VERSION;\n const context = useCopilotContext();\n\n // to prevent hydration errors, ensure that the component renders the same content\n // server-side as it does during the initial client-side render to prevent a hydration\n // mismatch\n // see: https://nextjs.org/docs/messages/react-hydration-error#solution-1-using-useeffect-to-run-on-the-client-only\n\n const [showDevConsole, setShowDevConsole] = useState(false);\n\n useEffect(() => {\n setShowDevConsole(shouldShowDevConsole(context.showDevConsole));\n }, [context.showDevConsole]);\n\n const dontRunTwiceInDevMode = useRef(false);\n const [versionStatus, setVersionStatus] = useState<VersionStatus>(\"unknown\");\n const [latestVersion, setLatestVersion] = useState<string>(\"\");\n const consoleRef = useRef<HTMLDivElement>(null);\n const [debugButtonMode, setDebugButtonMode] = useState<\"full\" | \"compact\">(\n \"full\",\n );\n\n const checkForUpdates = (force: boolean = false) => {\n setVersionStatus(\"checking\");\n\n getPublishedCopilotKitVersion(currentVersion, force)\n .then((v) => {\n setLatestVersion(v.latest);\n let versionOk = false;\n\n // match exact version or a version with a letter (e.g. 1.0.0-alpha.1)\n if (v.current === v.latest) {\n versionOk = true;\n } else if (/[a-zA-Z]/.test(v.current)) {\n versionOk = true;\n }\n\n if (versionOk) {\n setVersionStatus(\"latest\");\n } else if (v.severity !== \"low\") {\n setVersionStatus(\"outdated\");\n } else {\n setVersionStatus(\"update-available\");\n }\n })\n .catch((e) => {\n console.error(e);\n setVersionStatus(\"unknown\");\n });\n };\n\n useEffect(() => {\n if (dontRunTwiceInDevMode.current === true) {\n return;\n }\n dontRunTwiceInDevMode.current = true;\n\n checkForUpdates();\n }, []);\n\n if (!showDevConsole) {\n return null;\n }\n return (\n <div\n ref={consoleRef}\n className={\n \"copilotKitDevConsole \" +\n (versionStatus === \"update-available\"\n ? \"copilotKitDevConsoleUpgrade\"\n : \"\") +\n (versionStatus === \"outdated\" ? \"copilotKitDevConsoleWarnOutdated\" : \"\")\n }\n >\n <VersionInfo\n showDevConsole={context.showDevConsole}\n versionStatus={versionStatus}\n currentVersion={currentVersion}\n latestVersion={latestVersion}\n />\n\n <CopilotKitHelpModal />\n\n <DebugMenuButton\n setShowDevConsole={setShowDevConsole}\n checkForUpdates={checkForUpdates}\n mode={debugButtonMode}\n />\n </div>\n );\n}\n\nfunction VersionInfo({\n showDevConsole,\n versionStatus,\n currentVersion,\n latestVersion,\n}: {\n showDevConsole: boolean;\n versionStatus: VersionStatus;\n currentVersion: string;\n latestVersion: string;\n}) {\n const [copyStatus, setCopyStatus] = useState<string>(\"\");\n\n let versionLabel = \"\";\n let versionIcon: any = \"\";\n let currentVersionLabel = currentVersion;\n\n if (versionStatus === \"latest\") {\n versionLabel = \"latest\";\n versionIcon = CheckIcon;\n } else if (versionStatus === \"checking\") {\n versionLabel = \"checking\";\n versionIcon = SmallSpinnerIcon;\n } else if (versionStatus === \"update-available\") {\n versionLabel = \"update available\";\n versionIcon = ExclamationMarkIcon;\n currentVersionLabel = `${currentVersion} → ${latestVersion}`;\n } else if (versionStatus === \"outdated\") {\n versionLabel = \"outdated\";\n versionIcon = ExclamationMarkTriangleIcon;\n currentVersionLabel = `${currentVersion} → ${latestVersion}`;\n }\n\n let asideLabel = \"\";\n if (showDevConsole === true) {\n asideLabel = \"(enabled)\";\n }\n\n const installCommand = [\n `npm install`,\n `@copilotkit/react-core@${latestVersion}`,\n `@copilotkit/react-ui@${latestVersion}`,\n `@copilotkit/react-textarea@${latestVersion}`,\n `&& npm install @copilotkit/runtime@${latestVersion}`,\n ].join(\" \");\n\n const handleCopyClick = () => {\n navigator.clipboard.writeText(installCommand.trim()).then(() => {\n setCopyStatus(\"Command copied to clipboard!\");\n setTimeout(() => setCopyStatus(\"\"), 1000);\n });\n };\n\n if (versionStatus === \"update-available\" || versionStatus === \"outdated\") {\n return (\n <div className=\"copilotKitVersionInfo\">\n <p>\n {currentVersionLabel} {versionIcon}\n </p>\n <button onClick={handleCopyClick}>\n {copyStatus || installCommand}\n </button>\n </div>\n );\n }\n\n return null;\n}\n\nexport default function DebugMenuButton({\n setShowDevConsole,\n checkForUpdates,\n mode,\n}: {\n setShowDevConsole: (show: boolean) => void;\n checkForUpdates: (force: boolean) => void;\n mode: \"full\" | \"compact\";\n}) {\n const context = useCopilotContext();\n const messagesContext = useCopilotMessagesContext();\n\n return (\n <>\n <Menu>\n <MenuButton\n className={`copilotKitDebugMenuTriggerButton ${mode === \"compact\" ? \"compact\" : \"\"}`}\n >\n {mode == \"compact\" ? \"Debug\" : <>Debug {ChevronDownIcon}</>}\n </MenuButton>\n\n <MenuItems\n transition\n anchor=\"bottom end\"\n className=\"copilotKitDebugMenu\"\n style={{ zIndex: 40 }}\n >\n <MenuItem>\n <button\n className=\"copilotKitDebugMenuItem\"\n onClick={() => logReadables(context)}\n >\n Log Readables\n </button>\n </MenuItem>\n <MenuItem>\n <button\n className=\"copilotKitDebugMenuItem\"\n onClick={() => logActions(context)}\n >\n Log Actions\n </button>\n </MenuItem>\n <MenuItem>\n <button\n className=\"copilotKitDebugMenuItem\"\n onClick={() => logMessages(messagesContext)}\n >\n Log Messages\n </button>\n </MenuItem>\n <MenuItem>\n <button\n className=\"copilotKitDebugMenuItem\"\n onClick={() => checkForUpdates(true)}\n >\n Check for Updates\n </button>\n </MenuItem>\n <hr />\n <MenuItem>\n <button\n className=\"copilotKitDebugMenuItem\"\n onClick={() => setShowDevConsole(false)}\n >\n Hide Dev Console\n </button>\n </MenuItem>\n </MenuItems>\n </Menu>\n </>\n );\n}\n","import { HeaderProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\nimport { CopilotDevConsole } from \"../dev-console\";\nimport React from \"react\";\n\nexport const Header = ({}: HeaderProps) => {\n const { setOpen, icons, labels } = useChatContext();\n\n return (\n <div className=\"copilotKitHeader\">\n <div>{labels.title}</div>\n <div className=\"copilotKitHeaderControls\">\n <CopilotDevConsole />\n <button\n onClick={() => setOpen(false)}\n aria-label=\"Close\"\n className=\"copilotKitHeaderCloseButton\"\n >\n {icons.headerCloseIcon}\n </button>\n </div>\n </div>\n );\n};\n","import { UserMessageProps } from \"../props\";\n\ntype UserMessageContent = NonNullable<UserMessageProps[\"message\"]>[\"content\"];\n\nconst getTextContent = (\n content: UserMessageContent | undefined,\n): string | undefined => {\n if (typeof content === \"undefined\") {\n return undefined;\n }\n\n if (typeof content === \"string\") {\n return content;\n }\n\n return (\n content\n .map((part) => {\n if (part.type === \"text\") {\n return part.text;\n }\n return undefined;\n })\n .filter(\n (value): value is string =>\n typeof value === \"string\" && value.length > 0,\n )\n .join(\" \")\n .trim() || undefined\n );\n};\n\nexport const UserMessage = (props: UserMessageProps) => {\n const { message, ImageRenderer } = props;\n const isImageMessage =\n message && \"image\" in message && Boolean(message.image);\n\n if (isImageMessage) {\n const imageMessage = message!;\n const content = getTextContent(imageMessage?.content);\n\n return (\n <div className=\"copilotKitMessage copilotKitUserMessage\">\n <ImageRenderer image={imageMessage.image!} content={content} />\n </div>\n );\n }\n\n const content = getTextContent(message?.content);\n\n return (\n <div className=\"copilotKitMessage copilotKitUserMessage\">{content}</div>\n );\n};\n","import * as React from \"react\";\n\nexport interface useCopyToClipboardProps {\n timeout?: number;\n}\n\nexport function useCopyToClipboard({\n timeout = 2000,\n}: useCopyToClipboardProps) {\n const [isCopied, setIsCopied] = React.useState<Boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (typeof window === \"undefined\" || !navigator.clipboard?.writeText) {\n return;\n }\n\n if (!value) {\n return;\n }\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n\n setTimeout(() => {\n setIsCopied(false);\n }, timeout);\n });\n };\n\n return { isCopied, copyToClipboard };\n}\n","import { FC, memo, useEffect, useState } from \"react\";\nimport { Prism, Light } from \"react-syntax-highlighter\";\nimport { useCopyToClipboard } from \"../../hooks/use-copy-to-clipboard\";\nimport { CheckIcon, CopyIcon, DownloadIcon } from \"./Icons\";\n\ninterface CodeActionButtonProps {\n onClick: () => void;\n children: React.ReactNode;\n}\n\ninterface Props {\n language: string;\n value: string;\n}\n\ninterface languageMap {\n [key: string]: string | undefined;\n}\n\nexport const programmingLanguages: languageMap = {\n javascript: \".js\",\n python: \".py\",\n java: \".java\",\n c: \".c\",\n cpp: \".cpp\",\n \"c++\": \".cpp\",\n \"c#\": \".cs\",\n ruby: \".rb\",\n php: \".php\",\n swift: \".swift\",\n \"objective-c\": \".m\",\n kotlin: \".kt\",\n typescript: \".ts\",\n go: \".go\",\n perl: \".pl\",\n rust: \".rs\",\n scala: \".scala\",\n haskell: \".hs\",\n lua: \".lua\",\n shell: \".sh\",\n sql: \".sql\",\n html: \".html\",\n css: \".css\",\n // add more file extensions here, make sure the key is same as language prop in CodeBlock.tsx component\n};\n\nexport const generateRandomString = (length: number, lowercase = false) => {\n const chars = \"ABCDEFGHJKLMNPQRSTUVWXY3456789\"; // excluding similar looking characters like Z, 2, I, 1, O, 0\n let result = \"\";\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return lowercase ? result.toLowerCase() : result;\n};\n\nconst CodeBlock: FC<Props> = memo(({ language, value }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard({ timeout: 2000 });\n const [SyntaxHighlighter, setSyntaxHighlighter] = useState<\n typeof Light | typeof Prism\n >(() => Light);\n\n useEffect(() => {\n try {\n new RegExp(\"(?<=#)\\\\w+\");\n setSyntaxHighlighter(() => Prism);\n } catch {\n setSyntaxHighlighter(() => Light);\n }\n }, []);\n\n const downloadAsFile = () => {\n if (typeof window === \"undefined\") {\n return;\n }\n const fileExtension = programmingLanguages[language] || \".file\";\n const suggestedFileName = `file-${generateRandomString(3, true)}${fileExtension}`;\n const fileName = window.prompt(\"Enter file name\", suggestedFileName);\n\n if (!fileName) {\n // User pressed cancel on prompt.\n return;\n }\n\n const blob = new Blob([value], { type: \"text/plain\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.download = fileName;\n link.href = url;\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n };\n\n const onCopy = () => {\n if (isCopied) return;\n copyToClipboard(value);\n };\n\n return (\n <div className=\"copilotKitCodeBlock\">\n <div className=\"copilotKitCodeBlockToolbar\">\n <span className=\"copilotKitCodeBlockToolbarLanguage\">{language}</span>\n <div className=\"copilotKitCodeBlockToolbarButtons\">\n <button\n className=\"copilotKitCodeBlockToolbarButton\"\n onClick={downloadAsFile}\n >\n {DownloadIcon}\n </button>\n <button className=\"copilotKitCodeBlockToolbarButton\" onClick={onCopy}>\n {isCopied ? CheckIcon : CopyIcon}\n </button>\n </div>\n </div>\n <SyntaxHighlighter\n language={language}\n style={highlightStyle}\n PreTag=\"div\"\n customStyle={{\n margin: 0,\n borderBottomLeftRadius: \"0.375rem\",\n borderBottomRightRadius: \"0.375rem\",\n }}\n >\n {value}\n </SyntaxHighlighter>\n </div>\n );\n});\nCodeBlock.displayName = \"CodeBlock\";\n\nexport { CodeBlock };\n\n// import { vscDarkPlus as highlightStyle } from \"react-syntax-highlighter/dist/esm/styles/prism\";\n// As a workaround, we inline the vscDarkPlus from react-syntax-highlighter.\n// Importing it as recommended in the documentation leads to build errors in the non app router\n// (Next.js classic) setup.\nconst highlightStyle: any = {\n 'pre[class*=\"language-\"]': {\n color: \"#d4d4d4\",\n fontSize: \"13px\",\n textShadow: \"none\",\n fontFamily:\n 'Menlo, Monaco, Consolas, \"Andale Mono\", \"Ubuntu Mono\", \"Courier New\", monospace',\n direction: \"ltr\",\n textAlign: \"left\",\n whiteSpace: \"pre\",\n wordSpacing: \"normal\",\n wordBreak: \"normal\",\n lineHeight: \"1.5\",\n MozTabSize: \"4\",\n OTabSize: \"4\",\n tabSize: \"4\",\n WebkitHyphens: \"none\",\n MozHyphens: \"none\",\n msHyphens: \"none\",\n hyphens: \"none\",\n padding: \"1em\",\n margin: \".5em 0\",\n overflow: \"auto\",\n background: \"#1e1e1e\",\n },\n 'code[class*=\"language-\"]': {\n color: \"#d4d4d4\",\n fontSize: \"13px\",\n textShadow: \"none\",\n fontFamily:\n 'Menlo, Monaco, Consolas, \"Andale Mono\", \"Ubuntu Mono\", \"Courier New\", monospace',\n direction: \"ltr\",\n textAlign: \"left\",\n whiteSpace: \"pre\",\n wordSpacing: \"normal\",\n wordBreak: \"normal\",\n lineHeight: \"1.5\",\n MozTabSize: \"4\",\n OTabSize: \"4\",\n tabSize: \"4\",\n WebkitHyphens: \"none\",\n MozHyphens: \"none\",\n msHyphens: \"none\",\n hyphens: \"none\",\n },\n 'pre[class*=\"language-\"]::selection': {\n textShadow: \"none\",\n background: \"#264F78\",\n },\n 'code[class*=\"language-\"]::selection': {\n textShadow: \"none\",\n background: \"#264F78\",\n },\n 'pre[class*=\"language-\"] *::selection': {\n textShadow: \"none\",\n background: \"#264F78\",\n },\n 'code[class*=\"language-\"] *::selection': {\n textShadow: \"none\",\n background: \"#264F78\",\n },\n ':not(pre) > code[class*=\"language-\"]': {\n padding: \".1em .3em\",\n borderRadius: \".3em\",\n color: \"#db4c69\",\n background: \"#1e1e1e\",\n },\n \".namespace\": {\n Opacity: \".7\",\n },\n \"doctype.doctype-tag\": {\n color: \"#569CD6\",\n },\n \"doctype.name\": {\n color: \"#9cdcfe\",\n },\n comment: {\n color: \"#6a9955\",\n },\n prolog: {\n color: \"#6a9955\",\n },\n punctuation: {\n color: \"#d4d4d4\",\n },\n \".language-html .language-css .token.punctuation\": {\n color: \"#d4d4d4\",\n },\n \".language-html .language-javascript .token.punctuation\": {\n color: \"#d4d4d4\",\n },\n property: {\n color: \"#9cdcfe\",\n },\n tag: {\n color: \"#569cd6\",\n },\n boolean: {\n color: \"#569cd6\",\n },\n number: {\n color: \"#b5cea8\",\n },\n constant: {\n color: \"#9cdcfe\",\n },\n symbol: {\n color: \"#b5cea8\",\n },\n inserted: {\n color: \"#b5cea8\",\n },\n unit: {\n color: \"#b5cea8\",\n },\n selector: {\n color: \"#d7ba7d\",\n },\n \"attr-name\": {\n color: \"#9cdcfe\",\n },\n string: {\n color: \"#ce9178\",\n },\n char: {\n color: \"#ce9178\",\n },\n builtin: {\n color: \"#ce9178\",\n },\n deleted: {\n color: \"#ce9178\",\n },\n \".language-css .token.string.url\": {\n textDecoration: \"underline\",\n },\n operator: {\n color: \"#d4d4d4\",\n },\n entity: {\n color: \"#569cd6\",\n },\n \"operator.arrow\": {\n color: \"#569CD6\",\n },\n atrule: {\n color: \"#ce9178\",\n },\n \"atrule.rule\": {\n color: \"#c586c0\",\n },\n \"atrule.url\": {\n color: \"#9cdcfe\",\n },\n \"atrule.url.function\": {\n color: \"#dcdcaa\",\n },\n \"atrule.url.punctuation\": {\n color: \"#d4d4d4\",\n },\n keyword: {\n color: \"#569CD6\",\n },\n \"keyword.module\": {\n color: \"#c586c0\",\n },\n \"keyword.control-flow\": {\n color: \"#c586c0\",\n },\n function: {\n color: \"#dcdcaa\",\n },\n \"function.maybe-class-name\": {\n color: \"#dcdcaa\",\n },\n regex: {\n color: \"#d16969\",\n },\n important: {\n color: \"#569cd6\",\n },\n italic: {\n fontStyle: \"italic\",\n },\n \"class-name\": {\n color: \"#4ec9b0\",\n },\n \"maybe-class-name\": {\n color: \"#4ec9b0\",\n },\n console: {\n color: \"#9cdcfe\",\n },\n parameter: {\n color: \"#9cdcfe\",\n },\n interpolation: {\n color: \"#9cdcfe\",\n },\n \"punctuation.interpolation-punctuation\": {\n color: \"#569cd6\",\n },\n variable: {\n color: \"#9cdcfe\",\n },\n \"imports.maybe-class-name\": {\n color: \"#9cdcfe\",\n },\n \"exports.maybe-class-name\": {\n color: \"#9cdcfe\",\n },\n escape: {\n color: \"#d7ba7d\",\n },\n \"tag.punctuation\": {\n color: \"#808080\",\n },\n cdata: {\n color: \"#808080\",\n },\n \"attr-value\": {\n color: \"#ce9178\",\n },\n \"attr-value.punctuation\": {\n color: \"#ce9178\",\n },\n \"attr-value.punctuation.attr-equals\": {\n color: \"#d4d4d4\",\n },\n namespace: {\n color: \"#4ec9b0\",\n },\n 'pre[class*=\"language-javascript\"]': {\n color: \"#9cdcfe\",\n },\n 'code[class*=\"language-javascript\"]': {\n color: \"#9cdcfe\",\n },\n 'pre[class*=\"language-jsx\"]': {\n color: \"#9cdcfe\",\n },\n 'code[class*=\"language-jsx\"]': {\n color: \"#9cdcfe\",\n },\n 'pre[class*=\"language-typescript\"]': {\n color: \"#9cdcfe\",\n },\n 'code[class*=\"language-typescript\"]': {\n color: \"#9cdcfe\",\n },\n 'pre[class*=\"language-tsx\"]': {\n color: \"#9cdcfe\",\n },\n 'code[class*=\"language-tsx\"]': {\n color: \"#9cdcfe\",\n },\n 'pre[class*=\"language-css\"]': {\n color: \"#ce9178\",\n },\n 'code[class*=\"language-css\"]': {\n color: \"#ce9178\",\n },\n 'pre[class*=\"language-html\"]': {\n color: \"#d4d4d4\",\n },\n 'code[class*=\"language-html\"]': {\n color: \"#d4d4d4\",\n },\n \".language-regex .token.anchor\": {\n color: \"#dcdcaa\",\n },\n \".language-html .token.punctuation\": {\n color: \"#808080\",\n },\n 'pre[class*=\"language-\"] > code[class*=\"language-\"]': {\n position: \"relative\",\n zIndex: \"1\",\n },\n \".line-highlight.line-highlight\": {\n background: \"#f7ebc6\",\n boxShadow: \"inset 5px 0 0 #f7d87c\",\n zIndex: \"0\",\n },\n};\n","import { FC, memo } from \"react\";\nimport ReactMarkdown, { Options, Components } from \"react-markdown\";\nimport { CodeBlock } from \"./CodeBlock\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport rehypeRaw from \"rehype-raw\";\n\nconst defaultComponents: Components = {\n a({ children, ...props }) {\n return (\n <a\n className=\"copilotKitMarkdownElement\"\n {...props}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </a>\n );\n },\n // @ts-expect-error -- inline\n code({ children, className, inline, ...props }) {\n if (Array.isArray(children) && children.length) {\n if (children[0] == \"▍\") {\n return (\n <span\n style={{\n animation: \"pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite\",\n marginTop: \"0.25rem\",\n }}\n >\n ▍\n </span>\n );\n }\n\n children[0] = (children?.[0] as string).replace(\"`▍`\", \"▍\");\n }\n\n const match = /language-(\\w+)/.exec(className || \"\");\n\n // Detect inline code: if it has a language class or contains newlines, it's likely a code block\n // Otherwise, treat it as inline code\n const hasLanguage = match && match[1];\n const content = String(children);\n const hasNewlines = content.includes(\"\\n\");\n const isInline = !hasLanguage && !hasNewlines;\n\n if (isInline) {\n return (\n <code\n className={`copilotKitMarkdownElement copilotKitInlineCode ${className || \"\"}`}\n {...props}\n >\n {children}\n </code>\n );\n }\n\n return (\n <CodeBlock\n key={Math.random()}\n language={(match && match[1]) || \"\"}\n value={String(children).replace(/\\n$/, \"\")}\n {...props}\n />\n );\n },\n h1: ({ children, ...props }) => (\n <h1 className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </h1>\n ),\n h2: ({ children, ...props }) => (\n <h2 className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </h2>\n ),\n h3: ({ children, ...props }) => (\n <h3 className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </h3>\n ),\n h4: ({ children, ...props }) => (\n <h4 className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </h4>\n ),\n h5: ({ children, ...props }) => (\n <h5 className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </h5>\n ),\n h6: ({ children, ...props }) => (\n <h6 className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </h6>\n ),\n p: ({ children, ...props }) => (\n <p className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </p>\n ),\n pre: ({ children, ...props }) => (\n <pre className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </pre>\n ),\n blockquote: ({ children, ...props }) => (\n <blockquote className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </blockquote>\n ),\n ul: ({ children, ...props }) => (\n <ul className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </ul>\n ),\n li: ({ children, ...props }) => (\n <li className=\"copilotKitMarkdownElement\" {...props}>\n {children}\n </li>\n ),\n};\n\nconst MemoizedReactMarkdown: FC<Options> = memo(\n ReactMarkdown,\n (prevProps, nextProps) =>\n prevProps.children === nextProps.children &&\n prevProps.components === nextProps.components,\n);\n\ntype MarkdownProps = {\n content: string;\n components?: Components;\n};\n\nexport const Markdown = ({ content, components }: MarkdownProps) => {\n return (\n <div className=\"copilotKitMarkdown\">\n <MemoizedReactMarkdown\n components={{ ...defaultComponents, ...components }}\n remarkPlugins={[\n remarkGfm,\n [remarkMath, { singleDollarTextMath: false }],\n ]}\n rehypePlugins={[rehypeRaw]}\n >\n {content}\n </MemoizedReactMarkdown>\n </div>\n );\n};\n","import { AssistantMessageProps } from \"../props\";\nimport { useChatContext } from \"../ChatContext\";\nimport { Markdown } from \"../Markdown\";\nimport { useState } from \"react\";\nimport React from \"react\";\n\nexport const AssistantMessage = (props: AssistantMessageProps) => {\n const { icons, labels } = useChatContext();\n const {\n message,\n isLoading,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n isCurrentMessage,\n feedback,\n markdownTagRenderers,\n } = props;\n const [copied, setCopied] = useState(false);\n\n const handleCopy = () => {\n const content = message?.content || \"\";\n if (content && onCopy) {\n navigator.clipboard.writeText(content);\n setCopied(true);\n onCopy(content);\n setTimeout(() => setCopied(false), 2000);\n } else if (content) {\n navigator.clipboard.writeText(content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n const handleRegenerate = () => {\n if (onRegenerate) onRegenerate();\n };\n\n const handleThumbsUp = () => {\n if (onThumbsUp && message) {\n onThumbsUp(message);\n }\n };\n\n const handleThumbsDown = () => {\n if (onThumbsDown && message) {\n onThumbsDown(message);\n }\n };\n\n const LoadingIcon = () => <span>{icons.activityIcon}</span>;\n const content = message?.content || \"\";\n const subComponent = message?.generativeUI?.() ?? props.subComponent;\n const subComponentPosition = message?.generativeUIPosition ?? \"after\";\n const renderBefore = subComponent && subComponentPosition === \"before\";\n const renderAfter = subComponent && subComponentPosition !== \"before\";\n\n return (\n <>\n {renderBefore ? (\n <div style={{ marginBottom: \"0.5rem\" }}>{subComponent}</div>\n ) : null}\n {content && (\n <div className=\"copilotKitMessage copilotKitAssistantMessage\">\n {content && (\n <Markdown content={content} components={markdownTagRenderers} />\n )}\n\n {content && !isLoading && (\n <div\n className={`copilotKitMessageControls ${isCurrentMessage ? \"currentMessage\" : \"\"}`}\n >\n <button\n className=\"copilotKitMessageControlButton\"\n onClick={handleRegenerate}\n aria-label={labels.regenerateResponse}\n title={labels.regenerateResponse}\n >\n {icons.regenerateIcon}\n </button>\n <button\n className=\"copilotKitMessageControlButton\"\n onClick={handleCopy}\n aria-label={labels.copyToClipboard}\n title={labels.copyToClipboard}\n >\n {copied ? (\n <span style={{ fontSize: \"10px\", fontWeight: \"bold\" }}>\n ✓\n </span>\n ) : (\n icons.copyIcon\n )}\n </button>\n {onThumbsUp && (\n <button\n className={`copilotKitMessageControlButton ${\n feedback === \"thumbsUp\" ? \"active\" : \"\"\n }`}\n onClick={handleThumbsUp}\n aria-label={labels.thumbsUp}\n title={labels.thumbsUp}\n >\n {icons.thumbsUpIcon}\n </button>\n )}\n {onThumbsDown && (\n <button\n className={`copilotKitMessageControlButton ${\n feedback === \"thumbsDown\" ? \"active\" : \"\"\n }`}\n onClick={handleThumbsDown}\n aria-label={labels.thumbsDown}\n title={labels.thumbsDown}\n >\n {icons.thumbsDownIcon}\n </button>\n )}\n </div>\n )}\n </div>\n )}\n {renderAfter ? (\n <div style={{ marginBottom: \"0.5rem\" }}>{subComponent}</div>\n ) : null}\n {isLoading && <LoadingIcon />}\n </>\n );\n};\n","import React, { useState } from \"react\";\nimport { ImageRendererProps } from \"../props\";\n\n/**\n * Default image rendering component that can be customized by users.\n * Uses CSS classes for styling so users can override styles.\n */\nexport const ImageRenderer: React.FC<ImageRendererProps> = ({\n image,\n content,\n className = \"\",\n}) => {\n const [imageError, setImageError] = useState(false);\n const imageSrc = `data:image/${image.format};base64,${image.bytes}`;\n const altText = content || \"User uploaded image\";\n\n const handleImageError = () => {\n setImageError(true);\n };\n\n if (imageError) {\n return (\n <div\n className={`copilotKitImageRendering copilotKitImageRenderingError ${className}`}\n >\n <div className=\"copilotKitImageRenderingErrorMessage\">\n Failed to load image\n </div>\n {content && (\n <div className=\"copilotKitImageRenderingContent\">{content}</div>\n )}\n </div>\n );\n }\n\n return (\n <div className={`copilotKitImageRendering ${className}`}>\n <img\n src={imageSrc}\n alt={altText}\n className=\"copilotKitImageRenderingImage\"\n onError={handleImageError}\n />\n {content && (\n <div className=\"copilotKitImageRenderingContent\">{content}</div>\n )}\n </div>\n );\n};\n","import { RenderMessageProps } from \"../props\";\nimport { UserMessage as DefaultUserMessage } from \"./UserMessage\";\nimport { AssistantMessage as DefaultAssistantMessage } from \"./AssistantMessage\";\nimport { ImageRenderer as DefaultImageRenderer } from \"./ImageRenderer\";\n\nexport function RenderMessage({\n UserMessage = DefaultUserMessage,\n AssistantMessage = DefaultAssistantMessage,\n ImageRenderer = DefaultImageRenderer,\n ...props\n}: RenderMessageProps) {\n const {\n message,\n messages,\n inProgress,\n index,\n isCurrentMessage,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n messageFeedback,\n markdownTagRenderers,\n } = props;\n\n switch (message.role) {\n case \"user\":\n return (\n <UserMessage\n key={index}\n rawData={message}\n data-message-role=\"user\"\n message={message}\n ImageRenderer={ImageRenderer}\n />\n );\n case \"assistant\":\n return (\n <AssistantMessage\n key={index}\n data-message-role=\"assistant\"\n subComponent={message.generativeUI?.()}\n rawData={message}\n message={message}\n messages={messages}\n isLoading={inProgress && isCurrentMessage && !message.content}\n isGenerating={inProgress && isCurrentMessage && !!message.content}\n isCurrentMessage={isCurrentMessage}\n onRegenerate={() => onRegenerate?.(message.id)}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n feedback={messageFeedback?.[message.id] || null}\n markdownTagRenderers={markdownTagRenderers}\n ImageRenderer={ImageRenderer}\n />\n );\n default:\n return null;\n }\n}\n","import React from \"react\";\nimport { RenderMessageProps } from \"../props\";\nimport { RenderMessage as DefaultRenderMessage } from \"./RenderMessage\";\nimport { aguiToGQL } from \"@copilotkit/runtime-client-gql\";\n\n/**\n * Legacy message render props interface for backwards compatibility\n */\nexport interface LegacyRenderProps {\n RenderTextMessage?: React.ComponentType<RenderMessageProps>;\n RenderActionExecutionMessage?: React.ComponentType<RenderMessageProps>;\n RenderAgentStateMessage?: React.ComponentType<RenderMessageProps>;\n RenderResultMessage?: React.ComponentType<RenderMessageProps>;\n RenderImageMessage?: React.ComponentType<RenderMessageProps>;\n}\n\n/**\n * Props for the LegacyRenderMessage component\n */\nexport interface LegacyRenderMessageProps extends RenderMessageProps {\n legacyProps: LegacyRenderProps;\n}\n\n/**\n * Legacy message adapter component that maps old render props to new message types.\n * This component provides backwards compatibility for the deprecated render props.\n */\nexport const LegacyRenderMessage: React.FC<LegacyRenderMessageProps> = ({\n message,\n messages,\n inProgress,\n index,\n isCurrentMessage,\n actionResult,\n AssistantMessage,\n UserMessage,\n ImageRenderer,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n markdownTagRenderers,\n legacyProps,\n}) => {\n const {\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n } = legacyProps;\n\n const deprecatedMessage = aguiToGQL(message)[0] ?? undefined;\n\n // Route to appropriate legacy renderer based on message type\n if (deprecatedMessage.isTextMessage() && RenderTextMessage) {\n return (\n <RenderTextMessage\n message={message}\n messages={messages}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n markdownTagRenderers={markdownTagRenderers}\n />\n );\n }\n\n if (\n deprecatedMessage.isActionExecutionMessage() &&\n RenderActionExecutionMessage\n ) {\n return (\n <RenderActionExecutionMessage\n messages={messages}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n actionResult={actionResult}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n }\n\n if (deprecatedMessage.isAgentStateMessage() && RenderAgentStateMessage) {\n return (\n <RenderAgentStateMessage\n messages={messages}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n }\n\n if (deprecatedMessage.isResultMessage() && RenderResultMessage) {\n return (\n <RenderResultMessage\n messages={messages}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n }\n\n if (deprecatedMessage.isImageMessage() && RenderImageMessage) {\n return (\n <RenderImageMessage\n messages={messages}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n />\n );\n }\n\n // Fallback to default RenderMessage for any unhandled cases\n return (\n <DefaultRenderMessage\n messages={messages}\n message={message}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n ImageRenderer={ImageRenderer}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n markdownTagRenderers={markdownTagRenderers}\n />\n );\n};\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport { MessagesProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\nimport { Message } from \"@copilotkit/shared\";\nimport { useCopilotChatInternal } from \"@copilotkit/react-core\";\nimport {\n LegacyRenderMessage,\n LegacyRenderProps,\n} from \"./messages/LegacyRenderMessage\";\n\nexport const Messages = ({\n inProgress,\n children,\n RenderMessage,\n AssistantMessage,\n UserMessage,\n ErrorMessage,\n ImageRenderer,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n messageFeedback,\n markdownTagRenderers,\n chatError,\n\n // Legacy props\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n}: MessagesProps) => {\n const { labels, icons } = useChatContext();\n const { messages: visibleMessages, interrupt } = useCopilotChatInternal();\n const initialMessages = useMemo(\n () => makeInitialMessages(labels.initial),\n [labels.initial],\n );\n const messages = [...initialMessages, ...visibleMessages];\n const { messagesContainerRef, messagesEndRef } = useScrollToBottom(messages);\n\n // Check if any legacy props are provided\n const hasLegacyProps = !!(\n RenderTextMessage ||\n RenderActionExecutionMessage ||\n RenderAgentStateMessage ||\n RenderResultMessage ||\n RenderImageMessage\n );\n\n // Show deprecation warning if legacy props are used\n useEffect(() => {\n if (hasLegacyProps) {\n console.warn(\n \"[CopilotKit] Legacy message render props (RenderTextMessage, RenderActionExecutionMessage, etc.) are deprecated. \" +\n \"Please use the unified 'RenderMessage' prop instead. \" +\n \"See migration guide: https://docs.copilotkit.ai/migration/render-message\",\n );\n }\n }, [hasLegacyProps]);\n\n // Create legacy props object for the adapter\n const legacyProps: LegacyRenderProps = useMemo(\n () => ({\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n }),\n [\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n ],\n );\n\n // Determine which render component to use\n const MessageRenderer = hasLegacyProps\n ? (props: any) => (\n <LegacyRenderMessage {...props} legacyProps={legacyProps} />\n )\n : RenderMessage;\n\n const LoadingIcon = () => <span>{icons.activityIcon}</span>;\n\n return (\n <div className=\"copilotKitMessages\" ref={messagesContainerRef}>\n <div className=\"copilotKitMessagesContainer\">\n {messages.map((message, index) => {\n const isCurrentMessage = index === messages.length - 1;\n return (\n <MessageRenderer\n key={index}\n message={message}\n messages={messages}\n inProgress={inProgress}\n index={index}\n isCurrentMessage={isCurrentMessage}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n ImageRenderer={ImageRenderer}\n onRegenerate={onRegenerate}\n onCopy={onCopy}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n messageFeedback={messageFeedback}\n markdownTagRenderers={markdownTagRenderers}\n />\n );\n })}\n {messages[messages.length - 1]?.role === \"user\" && inProgress && (\n <LoadingIcon />\n )}\n {interrupt}\n {chatError && ErrorMessage && (\n <ErrorMessage error={chatError} isCurrentMessage />\n )}\n </div>\n <footer className=\"copilotKitMessagesFooter\" ref={messagesEndRef}>\n {children}\n </footer>\n </div>\n );\n};\n\nfunction makeInitialMessages(\n initial: string | string[] | undefined,\n): Message[] {\n if (!initial) return [];\n\n if (Array.isArray(initial)) {\n return initial.map((message) => {\n return {\n id: message,\n role: \"assistant\",\n content: message,\n };\n });\n }\n\n return [\n {\n id: initial,\n role: \"assistant\",\n content: initial,\n },\n ];\n}\n\nexport function useScrollToBottom(messages: Message[]) {\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const messagesContainerRef = useRef<HTMLDivElement | null>(null);\n const isProgrammaticScrollRef = useRef(false);\n const isUserScrollUpRef = useRef(false);\n\n const scrollToBottom = () => {\n if (messagesContainerRef.current && messagesEndRef.current) {\n isProgrammaticScrollRef.current = true;\n messagesContainerRef.current.scrollTop =\n messagesContainerRef.current.scrollHeight;\n }\n };\n\n const handleScroll = () => {\n if (isProgrammaticScrollRef.current) {\n isProgrammaticScrollRef.current = false;\n return;\n }\n\n if (messagesContainerRef.current) {\n const { scrollTop, scrollHeight, clientHeight } =\n messagesContainerRef.current;\n isUserScrollUpRef.current = scrollTop + clientHeight < scrollHeight;\n }\n };\n\n useEffect(() => {\n const container = messagesContainerRef.current;\n if (container) {\n container.addEventListener(\"scroll\", handleScroll);\n }\n return () => {\n if (container) {\n container.removeEventListener(\"scroll\", handleScroll);\n }\n };\n }, []);\n\n useEffect(() => {\n const container = messagesContainerRef.current;\n if (!container) {\n return;\n }\n\n const mutationObserver = new MutationObserver(() => {\n if (!isUserScrollUpRef.current) {\n scrollToBottom();\n }\n });\n\n mutationObserver.observe(container, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n\n return () => {\n mutationObserver.disconnect();\n };\n }, []);\n\n useEffect(() => {\n isUserScrollUpRef.current = false;\n scrollToBottom();\n }, [messages.filter((m) => m.role === \"user\").length]);\n\n return { messagesEndRef, messagesContainerRef };\n}\n","import React, {\n useState,\n useRef,\n useEffect,\n forwardRef,\n useImperativeHandle,\n} from \"react\";\n\ninterface AutoResizingTextareaProps {\n maxRows?: number;\n placeholder?: string;\n value: string;\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onKeyDown?: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n onCompositionStart?: () => void;\n onCompositionEnd?: () => void;\n autoFocus?: boolean;\n}\n\nconst AutoResizingTextarea = forwardRef<\n HTMLTextAreaElement,\n AutoResizingTextareaProps\n>(\n (\n {\n maxRows = 1,\n placeholder,\n value,\n onChange,\n onKeyDown,\n onCompositionStart,\n onCompositionEnd,\n autoFocus,\n },\n ref,\n ) => {\n const internalTextareaRef = useRef<HTMLTextAreaElement>(null);\n const [maxHeight, setMaxHeight] = useState<number>(0);\n\n useImperativeHandle(\n ref,\n () => internalTextareaRef.current as HTMLTextAreaElement,\n );\n\n useEffect(() => {\n const calculateMaxHeight = () => {\n const textarea = internalTextareaRef.current;\n if (textarea) {\n textarea.style.height = \"auto\";\n const singleRowHeight = textarea.scrollHeight;\n setMaxHeight(singleRowHeight * maxRows);\n if (autoFocus) {\n textarea.focus();\n }\n }\n };\n\n calculateMaxHeight();\n }, [maxRows]);\n\n useEffect(() => {\n const textarea = internalTextareaRef.current;\n if (textarea) {\n textarea.style.height = \"auto\";\n textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;\n }\n }, [value, maxHeight]);\n\n return (\n <textarea\n ref={internalTextareaRef}\n value={value}\n onChange={onChange}\n onKeyDown={onKeyDown}\n onCompositionStart={onCompositionStart}\n onCompositionEnd={onCompositionEnd}\n placeholder={placeholder}\n style={{\n overflow: \"auto\",\n resize: \"none\",\n maxHeight: `${maxHeight}px`,\n }}\n rows={1}\n />\n );\n },\n);\n\nexport default AutoResizingTextarea;\n","import {\n useCopilotContext,\n useCopilotMessagesContext,\n} from \"@copilotkit/react-core\";\nimport { gqlToAGUI } from \"@copilotkit/runtime-client-gql\";\nimport { Message } from \"@copilotkit/shared\";\nimport { MutableRefObject, useEffect, useRef, useState } from \"react\";\n\nexport const checkMicrophonePermission = async () => {\n try {\n const permissionStatus = await navigator.permissions.query({\n name: \"microphone\" as PermissionName,\n });\n if (permissionStatus.state === \"granted\") {\n return true;\n } else {\n return false;\n }\n } catch (err) {\n console.error(\"Error checking microphone permission\", err);\n }\n};\n\nexport const requestMicAndPlaybackPermission = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const audioContext = new window.AudioContext();\n await audioContext.resume();\n return { stream, audioContext };\n } catch (err) {\n console.error(\"Error requesting microphone and playback permissions\", err);\n return null;\n }\n};\n\nconst startRecording = async (\n mediaStreamRef: MutableRefObject<MediaStream | null>,\n mediaRecorderRef: MutableRefObject<MediaRecorder | null>,\n audioContextRef: MutableRefObject<AudioContext | null>,\n recordedChunks: Blob[],\n onStop: () => void,\n) => {\n if (!mediaStreamRef.current || !audioContextRef.current) {\n mediaStreamRef.current = await navigator.mediaDevices.getUserMedia({\n audio: true,\n });\n audioContextRef.current = new window.AudioContext();\n await audioContextRef.current.resume();\n }\n\n mediaRecorderRef.current = new MediaRecorder(mediaStreamRef.current!);\n mediaRecorderRef.current.start(1000);\n mediaRecorderRef.current.ondataavailable = (event) => {\n recordedChunks.push(event.data);\n };\n mediaRecorderRef.current.onstop = onStop;\n};\n\nconst stopRecording = (\n mediaRecorderRef: MutableRefObject<MediaRecorder | null>,\n) => {\n if (\n mediaRecorderRef.current &&\n mediaRecorderRef.current.state !== \"inactive\"\n ) {\n mediaRecorderRef.current.stop();\n }\n};\n\nconst transcribeAudio = async (\n recordedChunks: Blob[],\n transcribeAudioUrl: string,\n) => {\n const completeBlob = new Blob(recordedChunks, { type: \"audio/mp4\" });\n const formData = new FormData();\n formData.append(\"file\", completeBlob, \"recording.mp4\");\n\n const response = await fetch(transcribeAudioUrl, {\n method: \"POST\",\n body: formData,\n });\n\n if (!response.ok) {\n throw new Error(`Error: ${response.statusText}`);\n }\n\n const transcription = await response.json();\n return transcription.text;\n};\n\nconst playAudioResponse = (\n text: string,\n textToSpeechUrl: string,\n audioContext: AudioContext,\n) => {\n const encodedText = encodeURIComponent(text);\n const url = `${textToSpeechUrl}?text=${encodedText}`;\n\n fetch(url)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer))\n .then((audioBuffer) => {\n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(audioContext.destination);\n source.start(0);\n })\n .catch((error) => {\n console.error(\"Error with decoding audio data\", error);\n });\n};\n\nexport type PushToTalkState = \"idle\" | \"recording\" | \"transcribing\";\n\nexport type SendFunction = (text: string) => Promise<Message>;\n\nexport const usePushToTalk = ({\n sendFunction,\n inProgress,\n}: {\n sendFunction: SendFunction;\n inProgress: boolean;\n}) => {\n const [pushToTalkState, setPushToTalkState] =\n useState<PushToTalkState>(\"idle\");\n const mediaStreamRef = useRef<MediaStream | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const recordedChunks = useRef<Blob[]>([]);\n const generalContext = useCopilotContext();\n const messagesContext = useCopilotMessagesContext();\n const context = { ...generalContext, ...messagesContext };\n const [startReadingFromMessageId, setStartReadingFromMessageId] = useState<\n string | null\n >(null);\n\n useEffect(() => {\n if (pushToTalkState === \"recording\") {\n startRecording(\n mediaStreamRef,\n mediaRecorderRef,\n audioContextRef,\n recordedChunks.current,\n () => {\n setPushToTalkState(\"transcribing\");\n },\n );\n } else {\n stopRecording(mediaRecorderRef);\n if (pushToTalkState === \"transcribing\") {\n transcribeAudio(\n recordedChunks.current,\n context.copilotApiConfig.transcribeAudioUrl!,\n ).then(async (transcription) => {\n recordedChunks.current = [];\n setPushToTalkState(\"idle\");\n const message = await sendFunction(transcription);\n setStartReadingFromMessageId(message.id);\n });\n }\n }\n\n return () => {\n stopRecording(mediaRecorderRef);\n };\n }, [pushToTalkState]);\n\n useEffect(() => {\n if (inProgress === false && startReadingFromMessageId) {\n const lastMessageIndex = context.messages.findIndex(\n (message) => message.id === startReadingFromMessageId,\n );\n\n const aguiMessages = gqlToAGUI(context.messages);\n\n const messagesAfterLast = aguiMessages\n .slice(lastMessageIndex + 1)\n .filter((message) => message.role === \"assistant\");\n\n const text = messagesAfterLast\n .map((message) => message.content)\n .join(\"\\n\");\n playAudioResponse(\n text,\n context.copilotApiConfig.textToSpeechUrl!,\n audioContextRef.current!,\n );\n\n setStartReadingFromMessageId(null);\n }\n }, [startReadingFromMessageId, inProgress]);\n\n return { pushToTalkState, setPushToTalkState };\n};\n","export const useDarkMode = () => {\n if (typeof window === \"undefined\") return false;\n return (\n document.documentElement.classList.contains(\"dark\") ||\n document.body.classList.contains(\"dark\") ||\n document.documentElement.getAttribute(\"data-theme\") === \"dark\" ||\n document.body.getAttribute(\"data-theme\") === \"dark\" ||\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n );\n};\n","import React, { useState, useEffect } from \"react\";\nimport { useDarkMode } from \"../../hooks/use-dark-mode\";\n\nexport function PoweredByTag({\n showPoweredBy = true,\n}: {\n showPoweredBy?: boolean;\n}) {\n const [mounted, setMounted] = useState(false);\n const isDark = useDarkMode();\n\n /*\n note(tylerslaton):\n\n Ensure we only use the isDark computed value after client-side mount.\n This prevents hydration mismatches by using a default color on the\n server and initial client render, then updating to the correct\n dark mode color after hydration is complete.\n */\n useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!showPoweredBy) {\n return null;\n }\n\n const poweredByStyle = {\n visibility: \"visible\",\n display: \"block\",\n position: \"static\",\n textAlign: \"center\",\n fontSize: \"12px\",\n padding: \"3px 0\",\n color: mounted && isDark ? \"rgb(69, 69, 69)\" : \"rgb(214, 214, 214)\",\n };\n\n return (\n <div>\n {/*@ts-expect-error -- expecting position not to be a string, but it can be.*/}\n <p className=\"poweredBy\" style={poweredByStyle}>\n Powered by CopilotKit\n </p>\n </div>\n );\n}\n","import React, { useMemo, useRef, useState } from \"react\";\nimport { InputProps } from \"./props\";\nimport { useChatContext } from \"./ChatContext\";\nimport AutoResizingTextarea from \"./Textarea\";\nimport { usePushToTalk } from \"../../hooks/use-push-to-talk\";\nimport {\n useCopilotContext,\n useCopilotChatInternal,\n} from \"@copilotkit/react-core\";\nimport { PoweredByTag } from \"./PoweredByTag\";\n\nconst MAX_NEWLINES = 6;\n\nexport const Input = ({\n inProgress,\n onSend,\n chatReady = false,\n onStop,\n onUpload,\n hideStopButton = false,\n}: InputProps) => {\n const context = useChatContext();\n const copilotContext = useCopilotContext();\n\n const showPoweredBy = !copilotContext.copilotApiConfig?.publicApiKey;\n\n const pushToTalkConfigured =\n copilotContext.copilotApiConfig.textToSpeechUrl !== undefined &&\n copilotContext.copilotApiConfig.transcribeAudioUrl !== undefined;\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [isComposing, setIsComposing] = useState(false);\n\n const handleDivClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n\n // If the user clicked a button or inside a button, don't focus the textarea\n if (target.closest(\"button\")) return;\n\n // If the user clicked the textarea, do nothing (it's already focused)\n if (target.tagName === \"TEXTAREA\") return;\n\n // Otherwise, focus the textarea\n textareaRef.current?.focus();\n };\n\n const [text, setText] = useState(\"\");\n const send = () => {\n if (inProgress) return;\n onSend(text);\n setText(\"\");\n\n textareaRef.current?.focus();\n };\n\n // tylerslaton:\n //\n // This scrolls CopilotKit into view always. Reading the commit history, it was likely\n // added to fix a bug but it is causing issues now.\n //\n // For the future, if we want this behavior again, we will need to find a way to do it without\n // forcing CopilotKit to always be in view. This code causes this because focusing an element\n // in most browsers will scroll that element into view.\n //\n // useEffect(() => {\n // if (isVisible) {\n // textareaRef.current?.focus();\n // }\n // }, [isVisible]);\n\n const { pushToTalkState, setPushToTalkState } = usePushToTalk({\n sendFunction: onSend,\n inProgress,\n });\n\n const isInProgress = inProgress || pushToTalkState === \"transcribing\";\n const { buttonIcon, buttonAlt } = useMemo(() => {\n if (!chatReady)\n return { buttonIcon: context.icons.spinnerIcon, buttonAlt: \"Loading\" };\n return isInProgress && !hideStopButton && chatReady\n ? { buttonIcon: context.icons.stopIcon, buttonAlt: \"Stop\" }\n : { buttonIcon: context.icons.sendIcon, buttonAlt: \"Send\" };\n }, [\n isInProgress,\n chatReady,\n hideStopButton,\n context.icons.stopIcon,\n context.icons.sendIcon,\n ]);\n const showPushToTalk =\n pushToTalkConfigured &&\n (pushToTalkState === \"idle\" || pushToTalkState === \"recording\") &&\n !inProgress;\n\n const { interrupt } = useCopilotChatInternal();\n\n const canSend = useMemo(() => {\n return (\n !isInProgress &&\n text.trim().length > 0 &&\n pushToTalkState === \"idle\" &&\n !interrupt\n );\n }, [interrupt, isInProgress, text, pushToTalkState]);\n\n const canStop = useMemo(() => {\n return isInProgress && !hideStopButton;\n }, [isInProgress, hideStopButton]);\n\n const sendDisabled = !canSend && !canStop;\n\n return (\n <div\n className={`copilotKitInputContainer ${showPoweredBy ? \"poweredByContainer\" : \"\"}`}\n >\n <div className=\"copilotKitInput\" onClick={handleDivClick}>\n <AutoResizingTextarea\n ref={textareaRef}\n placeholder={context.labels.placeholder}\n autoFocus={false}\n maxRows={MAX_NEWLINES}\n value={text}\n onChange={(event) => setText(event.target.value)}\n onCompositionStart={() => setIsComposing(true)}\n onCompositionEnd={() => setIsComposing(false)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" && !event.shiftKey && !isComposing) {\n event.preventDefault();\n if (canSend) {\n send();\n }\n }\n }}\n />\n <div className=\"copilotKitInputControls\">\n {onUpload && (\n <button onClick={onUpload} className=\"copilotKitInputControlButton\">\n {context.icons.uploadIcon}\n </button>\n )}\n\n <div style={{ flexGrow: 1 }} />\n\n {showPushToTalk && (\n <button\n onClick={() =>\n setPushToTalkState(\n pushToTalkState === \"idle\" ? \"recording\" : \"transcribing\",\n )\n }\n className={\n pushToTalkState === \"recording\"\n ? \"copilotKitInputControlButton copilotKitPushToTalkRecording\"\n : \"copilotKitInputControlButton\"\n }\n >\n {context.icons.pushToTalkIcon}\n </button>\n )}\n <button\n disabled={sendDisabled}\n onClick={isInProgress && !hideStopButton ? onStop : send}\n data-copilotkit-in-progress={inProgress}\n data-test-id={\n inProgress\n ? \"copilot-chat-request-in-progress\"\n : \"copilot-chat-ready\"\n }\n className=\"copilotKitInputControlButton\"\n aria-label={buttonAlt}\n >\n {buttonIcon}\n </button>\n </div>\n </div>\n <PoweredByTag showPoweredBy={showPoweredBy} />\n </div>\n );\n};\n","import React from \"react\";\n\ninterface ImageUploadQueueProps {\n images: Array<{ contentType: string; bytes: string }>;\n onRemoveImage: (index: number) => void;\n className?: string;\n}\n\nexport const ImageUploadQueue: React.FC<ImageUploadQueueProps> = ({\n images,\n onRemoveImage,\n className = \"\",\n}) => {\n if (images.length === 0) return null;\n\n return (\n <div\n className={`copilotKitImageUploadQueue ${className}`}\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n margin: \"8px\",\n padding: \"8px\",\n }}\n >\n {images.map((image, index) => (\n <div\n key={index}\n className=\"copilotKitImageUploadQueueItem\"\n style={{\n position: \"relative\",\n display: \"inline-block\",\n width: \"60px\",\n height: \"60px\",\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={`data:${image.contentType};base64,${image.bytes}`}\n alt={`Selected image ${index + 1}`}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n }}\n />\n <button\n onClick={() => onRemoveImage(index)}\n className=\"copilotKitImageUploadQueueRemoveButton\"\n style={{\n position: \"absolute\",\n top: \"2px\",\n right: \"2px\",\n background: \"rgba(0,0,0,0.6)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"50%\",\n width: \"18px\",\n height: \"18px\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n fontSize: \"10px\",\n padding: 0,\n }}\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n );\n};\n","import { useCopilotChatInternal } from \"@copilotkit/react-core\";\nimport { SmallSpinnerIcon } from \"./Icons\";\n\ninterface SuggestionsProps {\n title: string;\n message: string;\n partial?: boolean;\n className?: string;\n onClick: () => void;\n}\n\nexport function Suggestion({\n title,\n onClick,\n partial,\n className,\n}: SuggestionsProps) {\n const { isLoading } = useCopilotChatInternal();\n if (!title) return null;\n\n return (\n <button\n disabled={partial || isLoading}\n onClick={(e) => {\n e.preventDefault();\n onClick();\n }}\n className={`suggestion ${className ?? \"\"} ${partial ? \"loading\" : \"\"}`}\n data-test-id=\"suggestion\"\n type=\"button\"\n >\n {partial ? SmallSpinnerIcon : <span>{title}</span>}\n </button>\n );\n}\n","import { Suggestion } from \"./Suggestion\";\nimport { RenderSuggestionsListProps } from \"./props\";\n\nexport function Suggestions({\n suggestions,\n onSuggestionClick,\n isLoading,\n}: RenderSuggestionsListProps) {\n return (\n <div className=\"suggestions\">\n {suggestions.map((suggestion, index) => (\n <Suggestion\n key={index}\n title={suggestion.title}\n message={suggestion.message}\n partial={suggestion.isLoading ?? suggestion.partial ?? isLoading}\n className={suggestion.className}\n onClick={() => onSuggestionClick(suggestion.message)}\n />\n ))}\n </div>\n );\n}\n","/**\n * <br/>\n * <img src=\"https://cdn.copilotkit.ai/docs/copilotkit/images/CopilotChat.gif\" width=\"500\" />\n *\n * A chatbot panel component for the CopilotKit framework. The component allows for a high degree\n * of customization through various props and custom CSS.\n *\n * ## Install Dependencies\n *\n * This component is part of the [@copilotkit/react-ui](https://npmjs.com/package/@copilotkit/react-ui) package.\n *\n * ```shell npm2yarn \\\"@copilotkit/react-ui\"\\\n * npm install @copilotkit/react-core @copilotkit/react-ui\n * ```\n *\n * ## Usage\n *\n * ```tsx\n * import { CopilotChat } from \"@copilotkit/react-ui\";\n * import \"@copilotkit/react-ui/styles.css\";\n *\n * <CopilotChat\n * labels={{\n * title: \"Your Assistant\",\n * initial: \"Hi! 👋 How can I assist you today?\",\n * }}\n * />\n * ```\n *\n * ### With Observability Hooks\n *\n * To monitor user interactions, provide the `observabilityHooks` prop.\n * **Note:** This requires a `publicApiKey` in the `<CopilotKit>` provider.\n *\n * ```tsx\n * <CopilotKit publicApiKey=\"YOUR_PUBLIC_API_KEY\">\n * <CopilotChat\n * observabilityHooks={{\n * onMessageSent: (message) => {\n * console.log(\"Message sent:\", message);\n * },\n * }}\n * />\n * </CopilotKit>\n * ```\n *\n * ### Look & Feel\n *\n * By default, CopilotKit components do not have any styles. You can import CopilotKit's stylesheet at the root of your project:\n * ```tsx title=\"YourRootComponent.tsx\"\n * ...\n * import \"@copilotkit/react-ui/styles.css\"; // [!code highlight]\n *\n * export function YourRootComponent() {\n * return (\n * <CopilotKit>\n * ...\n * </CopilotKit>\n * );\n * }\n * ```\n * For more information about how to customize the styles, check out the [Customize Look & Feel](/guides/custom-look-and-feel/customize-built-in-ui-components) guide.\n */\n\nimport {\n ChatContext,\n ChatContextProvider,\n CopilotChatIcons,\n CopilotChatLabels,\n} from \"./ChatContext\";\nimport { Messages as DefaultMessages } from \"./Messages\";\nimport { Input as DefaultInput } from \"./Input\";\nimport { RenderMessage as DefaultRenderMessage } from \"./messages/RenderMessage\";\nimport { AssistantMessage as DefaultAssistantMessage } from \"./messages/AssistantMessage\";\nimport { UserMessage as DefaultUserMessage } from \"./messages/UserMessage\";\nimport { ImageRenderer as DefaultImageRenderer } from \"./messages/ImageRenderer\";\nimport React, { useEffect, useRef, useState, useCallback } from \"react\";\nimport {\n SystemMessageFunction,\n useCopilotContext,\n useCopilotChatInternal,\n type OnStopGeneration,\n type OnReloadMessages,\n type ChatSuggestions,\n} from \"@copilotkit/react-core\";\nimport {\n CopilotKitError,\n CopilotKitErrorCode,\n CopilotErrorEvent,\n Message,\n Severity,\n ErrorVisibility,\n styledConsole,\n CopilotErrorHandler,\n randomUUID,\n} from \"@copilotkit/shared\";\nimport {\n AssistantMessageProps,\n ChatError,\n ComponentsMap,\n CopilotObservabilityHooks,\n ErrorMessageProps,\n ImageRendererProps,\n InputProps,\n MessagesProps,\n RenderMessageProps,\n RenderSuggestionsListProps,\n UserMessageProps,\n} from \"./props\";\n\nimport { ImageUploadQueue } from \"./ImageUploadQueue\";\nimport { Suggestions as DefaultRenderSuggestionsList } from \"./Suggestions\";\n\n/**\n * Props for CopilotChat component.\n */\nexport interface CopilotChatProps {\n /**\n * Custom instructions to be added to the system message. Use this property to\n * provide additional context or guidance to the language model, influencing\n * its responses. These instructions can include specific directions,\n * preferences, or criteria that the model should consider when generating\n * its output, thereby tailoring the conversation more precisely to the\n * user's needs or the application's requirements.\n */\n instructions?: string;\n\n /**\n * Controls the behavior of suggestions in the chat interface.\n *\n * `auto` (default) - Suggestions are generated automatically:\n * - When the chat is first opened (empty state)\n * - After each message exchange completes\n * - Uses configuration from `useCopilotChatSuggestions` hooks\n *\n * `manual` - Suggestions are controlled programmatically:\n * - Use `setSuggestions()` to set custom suggestions\n * - Use `generateSuggestions()` to trigger AI generation\n * - Access via `useCopilotChat` hook\n *\n * `SuggestionItem[]` - Static suggestions array:\n * - Always shows the same suggestions\n * - No AI generation involved\n */\n suggestions?: ChatSuggestions;\n\n /**\n * A callback that gets called when the in progress state changes.\n */\n onInProgress?: (inProgress: boolean) => void;\n\n /**\n * A callback that gets called when a new message it submitted.\n */\n onSubmitMessage?: (message: string) => void | Promise<void>;\n\n /**\n * A custom stop generation function.\n */\n onStopGeneration?: OnStopGeneration;\n\n /**\n * A custom reload messages function.\n */\n onReloadMessages?: OnReloadMessages;\n\n /**\n * A callback function to regenerate the assistant's response\n */\n onRegenerate?: (messageId: string) => void;\n\n /**\n * A callback function when the message is copied\n */\n onCopy?: (message: string) => void;\n\n /**\n * A callback function for thumbs up feedback\n */\n onThumbsUp?: (message: Message) => void;\n\n /**\n * A callback function for thumbs down feedback\n */\n onThumbsDown?: (message: Message) => void;\n\n /**\n * A list of markdown components to render in assistant message.\n * Useful when you want to render custom elements in the message (e.g a reference tag element)\n */\n markdownTagRenderers?: ComponentsMap;\n\n /**\n * Icons can be used to set custom icons for the chat window.\n */\n icons?: CopilotChatIcons;\n\n /**\n * Labels can be used to set custom labels for the chat window.\n */\n labels?: CopilotChatLabels;\n\n /**\n * Enable image upload button (image inputs only supported on some models)\n */\n imageUploadsEnabled?: boolean;\n\n /**\n * The 'accept' attribute for the file input used for image uploads.\n * Defaults to \"image/*\".\n */\n inputFileAccept?: string;\n\n /**\n * A function that takes in context string and instructions and returns\n * the system message to include in the chat request.\n * Use this to completely override the system message, when providing\n * instructions is not enough.\n */\n makeSystemMessage?: SystemMessageFunction;\n\n /**\n * Disables inclusion of CopilotKit’s default system message. When true, no system message is sent (this also suppresses any custom message from <code>makeSystemMessage</code>).\n */\n disableSystemMessage?: boolean;\n\n /**\n * A custom assistant message component to use instead of the default.\n */\n AssistantMessage?: React.ComponentType<AssistantMessageProps>;\n\n /**\n * A custom user message component to use instead of the default.\n */\n UserMessage?: React.ComponentType<UserMessageProps>;\n\n /**\n * A custom error message component to use instead of the default.\n */\n ErrorMessage?: React.ComponentType<ErrorMessageProps>;\n\n /**\n * A custom Messages component to use instead of the default.\n */\n Messages?: React.ComponentType<MessagesProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderTextMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderActionExecutionMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderAgentStateMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderResultMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * @deprecated - use RenderMessage instead\n */\n RenderImageMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * A custom RenderMessage component to use instead of the default.\n *\n * **Warning**: This is a break-glass solution to allow for custom\n * rendering of messages. You are most likely looking to swap out\n * the AssistantMessage and UserMessage components instead which\n * are also props.\n */\n RenderMessage?: React.ComponentType<RenderMessageProps>;\n\n /**\n * A custom suggestions list component to use instead of the default.\n */\n RenderSuggestionsList?: React.ComponentType<RenderSuggestionsListProps>;\n\n /**\n * A custom Input component to use instead of the default.\n */\n Input?: React.ComponentType<InputProps>;\n\n /**\n * A custom image rendering component to use instead of the default.\n */\n ImageRenderer?: React.ComponentType<ImageRendererProps>;\n\n /**\n * A class name to apply to the root element.\n */\n className?: string;\n\n /**\n * Children to render.\n */\n children?: React.ReactNode;\n\n hideStopButton?: boolean;\n\n /**\n * Event hooks for CopilotKit chat events.\n * These hooks only work when publicApiKey is provided.\n */\n observabilityHooks?: CopilotObservabilityHooks;\n\n /**\n * Custom error renderer for chat-specific errors.\n * When provided, errors will be displayed inline within the chat interface.\n */\n renderError?: (error: {\n message: string;\n operation?: string;\n timestamp: number;\n onDismiss: () => void;\n onRetry?: () => void;\n }) => React.ReactNode;\n\n /**\n * Optional handler for comprehensive debugging and observability.\n */\n onError?: CopilotErrorHandler;\n}\n\nexport type ImageUpload = {\n contentType: string;\n bytes: string;\n};\n\nexport function CopilotChat({\n instructions,\n suggestions = \"auto\",\n onSubmitMessage,\n makeSystemMessage,\n disableSystemMessage,\n onInProgress,\n onStopGeneration,\n onReloadMessages,\n onRegenerate,\n onCopy,\n onThumbsUp,\n onThumbsDown,\n markdownTagRenderers,\n Messages = DefaultMessages,\n RenderMessage = DefaultRenderMessage,\n RenderSuggestionsList = DefaultRenderSuggestionsList,\n Input = DefaultInput,\n className,\n icons,\n labels,\n AssistantMessage = DefaultAssistantMessage,\n UserMessage = DefaultUserMessage,\n ImageRenderer = DefaultImageRenderer,\n ErrorMessage,\n imageUploadsEnabled,\n inputFileAccept = \"image/*\",\n hideStopButton,\n observabilityHooks,\n renderError,\n onError,\n // Legacy props - deprecated\n RenderTextMessage,\n RenderActionExecutionMessage,\n RenderAgentStateMessage,\n RenderResultMessage,\n RenderImageMessage,\n}: CopilotChatProps) {\n const {\n additionalInstructions,\n setChatInstructions,\n copilotApiConfig,\n setBannerError,\n setInternalErrorHandler,\n removeInternalErrorHandler,\n } = useCopilotContext();\n\n // Destructure stable values to avoid object reference changes\n const { publicApiKey, chatApiEndpoint } = copilotApiConfig;\n const [selectedImages, setSelectedImages] = useState<Array<ImageUpload>>([]);\n const [chatError, setChatError] = useState<ChatError | null>(null);\n const [messageFeedback, setMessageFeedback] = useState<\n Record<string, \"thumbsUp\" | \"thumbsDown\">\n >({});\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n // Helper function to trigger event hooks only if publicApiKey is provided\n const triggerObservabilityHook = useCallback(\n (hookName: keyof CopilotObservabilityHooks, ...args: any[]) => {\n if (publicApiKey && observabilityHooks?.[hookName]) {\n (observabilityHooks[hookName] as any)(...args);\n }\n if (observabilityHooks?.[hookName] && !publicApiKey) {\n setBannerError(\n new CopilotKitError({\n message: \"observabilityHooks requires a publicApiKey to function.\",\n code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n severity: Severity.CRITICAL,\n visibility: ErrorVisibility.BANNER,\n }),\n );\n styledConsole.publicApiKeyRequired(\"observabilityHooks\");\n }\n },\n [publicApiKey, observabilityHooks, setBannerError],\n );\n\n // Helper function to trigger chat error and render error UI\n const triggerChatError = useCallback(\n (error: any, operation: string, originalError?: any) => {\n const errorMessage =\n error?.message || error?.toString() || \"An error occurred\";\n\n // Set chat error state for rendering\n setChatError({\n message: errorMessage,\n operation,\n timestamp: Date.now(),\n });\n\n const errorEvent: CopilotErrorEvent = {\n type: \"error\",\n timestamp: Date.now(),\n context: {\n source: \"ui\",\n request: {\n operation,\n url: chatApiEndpoint,\n startTime: Date.now(),\n },\n technical: {\n environment: \"browser\",\n userAgent:\n typeof navigator !== \"undefined\"\n ? navigator.userAgent\n : undefined,\n stackTrace:\n originalError instanceof Error ? originalError.stack : undefined,\n },\n },\n error,\n };\n\n if (onError) {\n onError(errorEvent);\n }\n\n // Also trigger observability hook if available\n if (publicApiKey && observabilityHooks?.onError) {\n observabilityHooks.onError(errorEvent);\n }\n\n // Show banner error if onError hook is used without publicApiKey\n if (observabilityHooks?.onError && !publicApiKey) {\n setBannerError(\n new CopilotKitError({\n message:\n \"observabilityHooks.onError requires a publicApiKey to function.\",\n code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n severity: Severity.CRITICAL,\n visibility: ErrorVisibility.BANNER,\n }),\n );\n styledConsole.publicApiKeyRequired(\"observabilityHooks.onError\");\n }\n },\n [publicApiKey, chatApiEndpoint, observabilityHooks, setBannerError],\n );\n\n useEffect(() => {\n const id = \"chat-component\";\n setInternalErrorHandler({\n [id]: (error: CopilotErrorEvent) => {\n if (!error) return;\n triggerChatError(error.error, \"sendMessage\");\n },\n });\n return () => {\n // unregister when this instance unmounts\n removeInternalErrorHandler?.(id);\n };\n }, [triggerChatError, setInternalErrorHandler, removeInternalErrorHandler]);\n\n // Clipboard paste handler\n useEffect(() => {\n if (!imageUploadsEnabled) return;\n\n const handlePaste = async (e: ClipboardEvent) => {\n const target = e.target as HTMLElement;\n if (!target.parentElement?.classList.contains(\"copilotKitInput\")) return;\n\n const items = Array.from(e.clipboardData?.items || []);\n const imageItems = items.filter((item) => item.type.startsWith(\"image/\"));\n\n if (imageItems.length === 0) return;\n\n e.preventDefault(); // Prevent default paste behavior for images\n\n const imagePromises: Promise<ImageUpload | null>[] = imageItems.map(\n (item) => {\n const file = item.getAsFile();\n if (!file) return Promise.resolve(null);\n\n return new Promise<ImageUpload | null>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64String = (e.target?.result as string)?.split(\",\")[1];\n if (base64String) {\n resolve({\n contentType: file.type,\n bytes: base64String,\n });\n } else {\n resolve(null);\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n },\n );\n\n try {\n const loadedImages = (await Promise.all(imagePromises)).filter(\n (img) => img !== null,\n );\n setSelectedImages((prev) => [...prev, ...loadedImages]);\n } catch (error) {\n // Trigger chat-level error handler\n triggerChatError(error, \"processClipboardImages\", error);\n console.error(\"Error processing pasted images:\", error);\n }\n };\n\n document.addEventListener(\"paste\", handlePaste);\n return () => document.removeEventListener(\"paste\", handlePaste);\n }, [imageUploadsEnabled, triggerChatError]);\n\n useEffect(() => {\n if (!additionalInstructions?.length) {\n setChatInstructions(instructions || \"\");\n return;\n }\n\n /*\n Will result in a prompt like:\n\n You are a helpful assistant. \n Additionally, follow these instructions:\n - Do not answer questions about the weather.\n - Do not answer questions about the stock market.\"\n */\n const combinedAdditionalInstructions = [\n instructions,\n \"Additionally, follow these instructions:\",\n ...additionalInstructions.map((instruction) => `- ${instruction}`),\n ];\n\n setChatInstructions(combinedAdditionalInstructions.join(\"\\n\") || \"\");\n }, [instructions, additionalInstructions]);\n\n const {\n messages,\n isLoading,\n sendMessage,\n stopGeneration,\n reloadMessages,\n suggestions: currentSuggestions,\n isLoadingSuggestions,\n agent,\n } = useCopilotChatInternal({\n suggestions,\n onInProgress,\n onSubmitMessage,\n onStopGeneration,\n onReloadMessages,\n });\n // makeSystemMessage,\n // disableSystemMessage,\n\n // Track loading state changes for chat start/stop events\n const prevIsLoading = useRef(isLoading);\n useEffect(() => {\n if (prevIsLoading.current !== isLoading) {\n if (isLoading) {\n triggerObservabilityHook(\"onChatStarted\");\n } else {\n triggerObservabilityHook(\"onChatStopped\");\n }\n prevIsLoading.current = isLoading;\n }\n }, [isLoading, triggerObservabilityHook]);\n\n // Wrapper for sendMessage to clear selected images\n const handleSendMessage = (text: string) => {\n const images = selectedImages;\n setSelectedImages([]);\n if (fileInputRef.current) {\n fileInputRef.current.value = \"\";\n }\n\n // Trigger message sent event\n triggerObservabilityHook(\"onMessageSent\", text);\n\n // TODO: send images?\n return sendMessage({\n id: randomUUID(),\n content: text,\n role: \"user\",\n });\n };\n\n const chatContext = React.useContext(ChatContext);\n const isVisible = chatContext ? chatContext.open : true;\n\n const handleRegenerate = (messageId: string) => {\n if (onRegenerate) {\n onRegenerate(messageId);\n }\n\n // Trigger message regenerated event\n triggerObservabilityHook(\"onMessageRegenerated\", messageId);\n\n reloadMessages(messageId);\n };\n\n const handleCopy = (message: string) => {\n if (onCopy) {\n onCopy(message);\n }\n\n // Trigger message copied event\n triggerObservabilityHook(\"onMessageCopied\", message);\n };\n\n const handleImageUpload = async (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n if (!event.target.files || event.target.files.length === 0) {\n return;\n }\n\n const files = Array.from(event.target.files).filter((file) =>\n file.type.startsWith(\"image/\"),\n );\n if (files.length === 0) return;\n\n const fileReadPromises = files.map((file) => {\n return new Promise<{ contentType: string; bytes: string }>(\n (resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64String =\n (e.target?.result as string)?.split(\",\")[1] || \"\";\n if (base64String) {\n resolve({\n contentType: file.type,\n bytes: base64String,\n });\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n },\n );\n });\n\n try {\n const loadedImages = await Promise.all(fileReadPromises);\n setSelectedImages((prev) => [...prev, ...loadedImages]);\n } catch (error) {\n // Trigger chat-level error handler\n triggerChatError(error, \"processUploadedImages\", error);\n console.error(\"Error reading files:\", error);\n }\n };\n\n const removeSelectedImage = (index: number) => {\n setSelectedImages((prev) => prev.filter((_, i) => i !== index));\n };\n\n const handleThumbsUp = (message: Message) => {\n if (onThumbsUp) {\n onThumbsUp(message);\n }\n\n // Update feedback state\n setMessageFeedback((prev) => ({\n ...prev,\n [message.id]: \"thumbsUp\",\n }));\n\n // Trigger feedback given event\n triggerObservabilityHook(\"onFeedbackGiven\", message.id, \"thumbsUp\");\n };\n\n const handleThumbsDown = (message: Message) => {\n if (onThumbsDown) {\n onThumbsDown(message);\n }\n\n // Update feedback state\n setMessageFeedback((prev) => ({\n ...prev,\n [message.id]: \"thumbsDown\",\n }));\n\n // Trigger feedback given event\n triggerObservabilityHook(\"onFeedbackGiven\", message.id, \"thumbsDown\");\n };\n\n return (\n <WrappedCopilotChat icons={icons} labels={labels} className={className}>\n {/* Render error above messages if present */}\n {chatError &&\n renderError &&\n renderError({\n ...chatError,\n onDismiss: () => setChatError(null),\n onRetry: () => {\n // Clear error and potentially retry based on operation\n setChatError(null);\n // TODO: Implement specific retry logic based on operation type\n },\n })}\n\n <Messages\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n RenderMessage={RenderMessage}\n messages={messages}\n inProgress={isLoading}\n onRegenerate={handleRegenerate}\n onCopy={handleCopy}\n onThumbsUp={handleThumbsUp}\n onThumbsDown={handleThumbsDown}\n messageFeedback={messageFeedback}\n markdownTagRenderers={markdownTagRenderers}\n ImageRenderer={ImageRenderer}\n ErrorMessage={ErrorMessage}\n chatError={chatError}\n // Legacy props - passed through to Messages component\n RenderTextMessage={RenderTextMessage}\n RenderActionExecutionMessage={RenderActionExecutionMessage}\n RenderAgentStateMessage={RenderAgentStateMessage}\n RenderResultMessage={RenderResultMessage}\n RenderImageMessage={RenderImageMessage}\n >\n {currentSuggestions.length > 0 && (\n <RenderSuggestionsList\n onSuggestionClick={handleSendMessage}\n suggestions={currentSuggestions}\n isLoading={isLoadingSuggestions}\n />\n )}\n </Messages>\n\n {imageUploadsEnabled && (\n <>\n <ImageUploadQueue\n images={selectedImages}\n onRemoveImage={removeSelectedImage}\n />\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n onChange={handleImageUpload}\n accept={inputFileAccept}\n style={{ display: \"none\" }}\n />\n </>\n )}\n <Input\n inProgress={isLoading}\n chatReady={Boolean(agent)}\n // @ts-ignore\n onSend={handleSendMessage}\n isVisible={isVisible}\n onStop={stopGeneration}\n onUpload={\n imageUploadsEnabled ? () => fileInputRef.current?.click() : undefined\n }\n hideStopButton={hideStopButton}\n />\n </WrappedCopilotChat>\n );\n}\n\nexport function WrappedCopilotChat({\n children,\n icons,\n labels,\n className,\n}: {\n children: React.ReactNode;\n icons?: CopilotChatIcons;\n labels?: CopilotChatLabels;\n className?: string;\n}) {\n const chatContext = React.useContext(ChatContext);\n if (!chatContext) {\n return (\n <ChatContextProvider\n icons={icons}\n labels={labels}\n open={true}\n setOpen={() => {}}\n >\n <div className={`copilotKitChat ${className ?? \"\"}`}>{children}</div>\n </ChatContextProvider>\n );\n }\n return <>{children}</>;\n}\n","import React, { useMemo, useCallback, useEffect, useRef } from \"react\";\nimport { ChatContextProvider, useChatContext } from \"./ChatContext\";\nimport {\n ButtonProps,\n HeaderProps,\n WindowProps,\n CopilotObservabilityHooks,\n} from \"./props\";\nimport { Window as DefaultWindow } from \"./Window\";\nimport { Button as DefaultButton } from \"./Button\";\nimport { Header as DefaultHeader } from \"./Header\";\nimport { Messages as DefaultMessages } from \"./Messages\";\nimport { Input as DefaultInput } from \"./Input\";\nimport { CopilotChat, CopilotChatProps } from \"./Chat\";\nimport { AssistantMessage as DefaultAssistantMessage } from \"./messages/AssistantMessage\";\nimport { UserMessage as DefaultUserMessage } from \"./messages/UserMessage\";\nimport { useCopilotContext } from \"@copilotkit/react-core\";\nimport {\n CopilotKitError,\n CopilotKitErrorCode,\n Severity,\n ErrorVisibility,\n styledConsole,\n} from \"@copilotkit/shared\";\n\nexport interface CopilotModalProps extends CopilotChatProps {\n /**\n * Whether the chat window should be open by default.\n * @default false\n */\n defaultOpen?: boolean;\n\n /**\n * If the chat window should close when the user clicks outside of it.\n * @default true\n */\n clickOutsideToClose?: boolean;\n\n /**\n * If the chat window should close when the user hits the Escape key.\n * @default true\n */\n hitEscapeToClose?: boolean;\n\n /**\n * The shortcut key to open the chat window.\n * Uses Command-[shortcut] on a Mac and Ctrl-[shortcut] on Windows.\n * @default '/'\n */\n shortcut?: string;\n\n /**\n * A callback that gets called when the chat window opens or closes.\n */\n onSetOpen?: (open: boolean) => void;\n\n /**\n * A custom Window component to use instead of the default.\n */\n Window?: React.ComponentType<WindowProps>;\n\n /**\n * A custom Button component to use instead of the default.\n */\n Button?: React.ComponentType<ButtonProps>;\n\n /**\n * A custom Header component to use instead of the default.\n */\n Header?: React.ComponentType<HeaderProps>;\n}\n\n// Inner component that has access to the Copilot context\nconst CopilotModalInner = ({\n observabilityHooks,\n onSetOpen,\n clickOutsideToClose,\n hitEscapeToClose,\n shortcut,\n className,\n children,\n Window,\n Button,\n Header,\n ...chatProps\n}: Omit<CopilotModalProps, \"icons\" | \"labels\" | \"defaultOpen\"> & {\n Window: React.ComponentType<WindowProps>;\n Button: React.ComponentType<ButtonProps>;\n Header: React.ComponentType<HeaderProps>;\n clickOutsideToClose: boolean;\n hitEscapeToClose: boolean;\n shortcut: string;\n}) => {\n const { copilotApiConfig, setBannerError } = useCopilotContext();\n\n // Destructure stable values to avoid object reference changes\n const { publicApiKey } = copilotApiConfig;\n\n // Helper function to trigger event hooks only if publicApiKey is provided\n const triggerObservabilityHook = useCallback(\n (hookName: keyof CopilotObservabilityHooks, ...args: any[]) => {\n if (publicApiKey && observabilityHooks?.[hookName]) {\n (observabilityHooks[hookName] as any)(...args);\n }\n if (observabilityHooks?.[hookName] && !publicApiKey) {\n setBannerError(\n new CopilotKitError({\n message: \"observabilityHooks requires a publicApiKey to function.\",\n code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,\n severity: Severity.CRITICAL,\n visibility: ErrorVisibility.BANNER,\n }),\n );\n styledConsole.publicApiKeyRequired(\"observabilityHooks\");\n }\n },\n [publicApiKey, observabilityHooks, setBannerError],\n );\n\n const { open } = useChatContext();\n const prevOpen = useRef(open);\n\n // Monitor open state changes and trigger event hooks\n useEffect(() => {\n if (prevOpen.current !== open) {\n onSetOpen?.(open);\n\n // Trigger chat minimize/expand events\n if (open) {\n triggerObservabilityHook(\"onChatExpanded\");\n } else {\n triggerObservabilityHook(\"onChatMinimized\");\n }\n prevOpen.current = open;\n }\n }, [open, onSetOpen, triggerObservabilityHook]);\n\n const memoizedHeader = useMemo(() => <Header />, [Header]);\n const memoizedChildren = useMemo(() => children, [children]);\n\n return (\n <>\n {memoizedChildren}\n <div className={className}>\n <Button></Button>\n <Window\n clickOutsideToClose={clickOutsideToClose}\n shortcut={shortcut}\n hitEscapeToClose={hitEscapeToClose}\n >\n {memoizedHeader}\n <CopilotChat {...chatProps} observabilityHooks={observabilityHooks} />\n </Window>\n </div>\n </>\n );\n};\n\nexport const CopilotModal = ({\n instructions,\n defaultOpen = false,\n clickOutsideToClose = true,\n hitEscapeToClose = true,\n onSetOpen,\n onSubmitMessage,\n onStopGeneration,\n onReloadMessages,\n shortcut = \"/\",\n icons,\n labels,\n makeSystemMessage,\n onInProgress,\n Window = DefaultWindow,\n Button = DefaultButton,\n Header = DefaultHeader,\n Messages = DefaultMessages,\n Input = DefaultInput,\n AssistantMessage = DefaultAssistantMessage,\n UserMessage = DefaultUserMessage,\n onThumbsUp,\n onThumbsDown,\n onCopy,\n onRegenerate,\n markdownTagRenderers,\n className,\n children,\n observabilityHooks,\n ...props\n}: CopilotModalProps) => {\n const [openState, setOpenState] = React.useState(defaultOpen);\n\n return (\n <ChatContextProvider\n icons={icons}\n labels={labels}\n open={openState}\n setOpen={setOpenState}\n >\n <CopilotModalInner\n observabilityHooks={observabilityHooks}\n onSetOpen={onSetOpen}\n clickOutsideToClose={clickOutsideToClose ?? true}\n hitEscapeToClose={hitEscapeToClose ?? true}\n shortcut={shortcut ?? \"/\"}\n className={className}\n Window={Window}\n Button={Button}\n Header={Header}\n instructions={instructions}\n onSubmitMessage={onSubmitMessage}\n onStopGeneration={onStopGeneration}\n onReloadMessages={onReloadMessages}\n makeSystemMessage={makeSystemMessage}\n onInProgress={onInProgress}\n Messages={Messages}\n Input={Input}\n AssistantMessage={AssistantMessage}\n UserMessage={UserMessage}\n onThumbsUp={onThumbsUp}\n onThumbsDown={onThumbsDown}\n onCopy={onCopy}\n onRegenerate={onRegenerate}\n markdownTagRenderers={markdownTagRenderers}\n {...props}\n >\n {children}\n </CopilotModalInner>\n </ChatContextProvider>\n );\n};\n","/**\n * <br/>\n * <img src=\"https://cdn.copilotkit.ai/docs/copilotkit/images/CopilotPopup.gif\" width=\"500\" />\n *\n * A chatbot popup component for the CopilotKit framework. The component allows for a high degree\n * of customization through various props and custom CSS.\n *\n * See [CopilotSidebar](/reference/v1/components/chat/CopilotSidebar) for a sidebar version of this component.\n *\n * ## Install Dependencies\n *\n * This component is part of the [@copilotkit/react-ui](https://npmjs.com/package/@copilotkit/react-ui) package.\n *\n * ```shell npm2yarn \\\"@copilotkit/react-ui\"\\\n * npm install @copilotkit/react-core @copilotkit/react-ui\n * ```\n * ## Usage\n *\n * ```tsx\n * import { CopilotPopup } from \"@copilotkit/react-ui\";\n * import \"@copilotkit/react-ui/styles.css\";\n *\n * <CopilotPopup\n * labels={{\n * title: \"Your Assistant\",\n * initial: \"Hi! 👋 How can I assist you today?\",\n * }}\n * />\n * ```\n *\n * ### With Observability Hooks\n *\n * To monitor user interactions, provide the `observabilityHooks` prop.\n * **Note:** This requires a `publicApiKey` in the `<CopilotKit>` provider.\n *\n * ```tsx\n * <CopilotKit publicApiKey=\"YOUR_PUBLIC_API_KEY\">\n * <CopilotPopup\n * observabilityHooks={{\n * onChatExpanded: () => {\n * console.log(\"Popup opened\");\n * },\n * onChatMinimized: () => {\n * console.log(\"Popup closed\");\n * },\n * }}\n * />\n * </CopilotKit>\n * ```\n *\n * ### Look & Feel\n *\n * By default, CopilotKit components do not have any styles. You can import CopilotKit's stylesheet at the root of your project:\n * ```tsx title=\"YourRootComponent.tsx\"\n * ...\n * import \"@copilotkit/react-ui/styles.css\"; // [!code highlight]\n *\n * export function YourRootComponent() {\n * return (\n * <CopilotKit>\n * ...\n * </CopilotKit>\n * );\n * }\n * ```\n * For more information about how to customize the styles, check out the [Customize Look & Feel](/guides/custom-look-and-feel/customize-built-in-ui-components) guide.\n */\n\nimport { CopilotModal, CopilotModalProps } from \"./Modal\";\n\nexport function CopilotPopup(props: CopilotModalProps) {\n props = {\n ...props,\n className: props.className\n ? props.className + \" copilotKitPopup\"\n : \"copilotKitPopup\",\n };\n return <CopilotModal {...props}>{props.children}</CopilotModal>;\n}\n","/**\n * <br/>\n * <img src=\"https://cdn.copilotkit.ai/docs/copilotkit/images/CopilotSidebar.gif\" width=\"500\" />\n *\n * A chatbot sidebar component for the CopilotKit framework. Highly customizable through various props and custom CSS.\n *\n * See [CopilotPopup](/reference/v1/components/chat/CopilotPopup) for a popup version of this component.\n *\n * ## Install Dependencies\n *\n * This component is part of the [@copilotkit/react-ui](https://npmjs.com/package/@copilotkit/react-ui) package.\n *\n * ```shell npm2yarn \\\"@copilotkit/react-ui\"\\\n * npm install @copilotkit/react-core @copilotkit/react-ui\n * ```\n *\n * ## Usage\n *\n * ```tsx\n * import { CopilotSidebar } from \"@copilotkit/react-ui\";\n * import \"@copilotkit/react-ui/styles.css\";\n *\n * <CopilotSidebar\n * labels={{\n * title: \"Your Assistant\",\n * initial: \"Hi! 👋 How can I assist you today?\",\n * }}\n * >\n * <YourApp/>\n * </CopilotSidebar>\n * ```\n *\n * ### With Observability Hooks\n *\n * To monitor user interactions, provide the `observabilityHooks` prop.\n * **Note:** This requires a `publicApiKey` in the `<CopilotKit>` provider.\n *\n * ```tsx\n * <CopilotKit publicApiKey=\"YOUR_PUBLIC_API_KEY\">\n * <CopilotSidebar\n * observabilityHooks={{\n * onChatExpanded: () => {\n * console.log(\"Sidebar opened\");\n * },\n * onChatMinimized: () => {\n * console.log(\"Sidebar closed\");\n * },\n * }}\n * >\n * <YourApp/>\n * </CopilotSidebar>\n * </CopilotKit>\n * ```\n *\n * ### Look & Feel\n *\n * By default, CopilotKit components do not have any styles. You can import CopilotKit's stylesheet at the root of your project:\n * ```tsx title=\"YourRootComponent.tsx\"\n * ...\n * import \"@copilotkit/react-ui/styles.css\"; // [!code highlight]\n *\n * export function YourRootComponent() {\n * return (\n * <CopilotKit>\n * ...\n * </CopilotKit>\n * );\n * }\n * ```\n * For more information about how to customize the styles, check out the [Customize Look & Feel](/guides/custom-look-and-feel/customize-built-in-ui-components) guide.\n */\nimport React, { useState } from \"react\";\nimport { CopilotModal, CopilotModalProps } from \"./Modal\";\n\nexport function CopilotSidebar(props: CopilotModalProps) {\n props = {\n ...props,\n className: props.className\n ? props.className + \" copilotKitSidebar\"\n : \"copilotKitSidebar\",\n };\n const [expandedClassName, setExpandedClassName] = useState(\n props.defaultOpen ? \"sidebarExpanded\" : \"\",\n );\n\n const onSetOpen = (open: boolean) => {\n props.onSetOpen?.(open);\n setExpandedClassName(open ? \"sidebarExpanded\" : \"\");\n };\n\n return (\n <div className={`copilotKitSidebarContentWrapper ${expandedClassName}`}>\n <CopilotModal {...props} {...{ onSetOpen }}>\n {props.children}\n </CopilotModal>\n </div>\n );\n}\n","/**\n * <Callout type=\"warning\">\n * useCopilotChatSuggestions is experimental. The interface is not final and\n * can change without notice.\n * </Callout>\n *\n * `useCopilotReadable` is a React hook that provides app-state and other information\n * to the Copilot. Optionally, the hook can also handle hierarchical state within your\n * application, passing these parent-child relationships to the Copilot.\n *\n * <br/>\n * <img src=\"https://cdn.copilotkit.ai/docs/copilotkit/images/use-copilot-chat-suggestions/use-copilot-chat-suggestions.gif\" width=\"500\" />\n *\n * ## Usage\n *\n * ### Install Dependencies\n *\n * This component is part of the [@copilotkit/react-ui](https://npmjs.com/package/@copilotkit/react-ui) package.\n *\n * ```shell npm2yarn \\\"@copilotkit/react-ui\"\\\n * npm install @copilotkit/react-core @copilotkit/react-ui\n * ```\n *\n * ### Simple Usage\n *\n * ```tsx\n * import { useCopilotChatSuggestions } from \"@copilotkit/react-ui\";\n *\n * export function MyComponent() {\n * const [employees, setEmployees] = useState([]);\n *\n * useCopilotChatSuggestions({\n * instructions: `The following employees are on duty: ${JSON.stringify(employees)}`,\n * });\n * }\n * ```\n *\n * ### Dependency Management\n *\n * ```tsx\n * import { useCopilotChatSuggestions } from \"@copilotkit/react-ui\";\n *\n * export function MyComponent() {\n * useCopilotChatSuggestions(\n * {\n * instructions: \"Suggest the most relevant next actions.\",\n * },\n * [appState],\n * );\n * }\n * ```\n *\n * In the example above, the suggestions are generated based on the given instructions.\n * The hook monitors `appState`, and updates suggestions accordingly whenever it changes.\n *\n * ### Behavior and Lifecycle\n *\n * The hook registers the configuration with the chat context upon component mount and\n * removes it on unmount, ensuring a clean and efficient lifecycle management.\n */\nimport {\n useCopilotChatSuggestions as useCoreCopilotChatSuggestions,\n type UseCopilotChatSuggestionsConfiguration,\n} from \"@copilotkit/react-core\";\n\nexport function useCopilotChatSuggestions(\n config: UseCopilotChatSuggestionsConfiguration,\n dependencies: any[] = [],\n) {\n useCoreCopilotChatSuggestions(config, dependencies);\n}\n"],"mappings":"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CR;CACD,mCAAmC,EACjC,gBAAgB,aACjB;CACD,UAAU,EACR,OAAO,WACR;CACD,QAAQ,EACN,OAAO,WACR;CACD,kBAAkB,EAChB,OAAO,WACR;CACD,QAAQ,EACN,OAAO,WACR;CACD,eAAe,EACb,OAAO,WACR;CACD,cAAc,EACZ,OAAO,WACR;CACD,uBAAuB,EACrB,OAAO,WACR;CACD,0BAA0B,EACxB,OAAO,WACR;CACD,SAAS,EACP,OAAO,WACR;CACD,kBAAkB,EAChB,OAAO,WACR;CACD,wBAAwB,EACtB,OAAO,WACR;CACD,UAAU,EACR,OAAO,WACR;CACD,6BAA6B,EAC3B,OAAO,WACR;CACD,OAAO,EACL,OAAO,WACR;CACD,WAAW,EACT,OAAO,WACR;CACD,QAAQ,EACN,WAAW,UACZ;CACD,cAAc,EACZ,OAAO,WACR;CACD,oBAAoB,EAClB,OAAO,WACR;CACD,SAAS,EACP,OAAO,WACR;CACD,WAAW,EACT,OAAO,WACR;CACD,eAAe,EACb,OAAO,WACR;CACD,yCAAyC,EACvC,OAAO,WACR;CACD,UAAU,EACR,OAAO,WACR;CACD,4BAA4B,EAC1B,OAAO,WACR;CACD,4BAA4B,EAC1B,OAAO,WACR;CACD,QAAQ,EACN,OAAO,WACR;CACD,mBAAmB,EACjB,OAAO,WACR;CACD,OAAO,EACL,OAAO,WACR;CACD,cAAc,EACZ,OAAO,WACR;CACD,0BAA0B,EACxB,OAAO,WACR;CACD,sCAAsC,EACpC,OAAO,WACR;CACD,WAAW,EACT,OAAO,WACR;CACD,uCAAqC,EACnC,OAAO,WACR;CACD,wCAAsC,EACpC,OAAO,WACR;CACD,gCAA8B,EAC5B,OAAO,WACR;CACD,iCAA+B,EAC7B,OAAO,WACR;CACD,uCAAqC,EACnC,OAAO,WACR;CACD,wCAAsC,EACpC,OAAO,WACR;CACD,gCAA8B,EAC5B,OAAO,WACR;CACD,iCAA+B,EAC7B,OAAO,WACR;CACD,gCAA8B,EAC5B,OAAO,WACR;CACD,iCAA+B,EAC7B,OAAO,WACR;CACD,iCAA+B,EAC7B,OAAO,WACR;CACD,kCAAgC,EAC9B,OAAO,WACR;CACD,iCAAiC,EAC/B,OAAO,WACR;CACD,qCAAqC,EACnC,OAAO,WACR;CACD,0DAAsD;EACpD,UAAU;EACV,QAAQ;EACT;CACD,kCAAkC;EAChC,YAAY;EACZ,WAAW;EACX,QAAQ;EACT;CACF;;;;AC/ZD,MAAM,oBAAgC;CACpC,EAAE,EAAE,UAAU,GAAG,SAAS;AACxB,SACE,oBAAC;GACC,WAAU;GACV,GAAI;GACJ,QAAO;GACP,KAAI;GAEH;IACC;;CAIR,KAAK,EAAE,UAAU,WAAW,QAAQ,GAAG,SAAS;AAC9C,MAAI,MAAM,QAAQ,SAAS,IAAI,SAAS,QAAQ;AAC9C,OAAI,SAAS,MAAM,IACjB,QACE,oBAAC;IACC,OAAO;KACL,WAAW;KACX,WAAW;KACZ;cACF;KAEM;AAIX,YAAS,MAAM,WAAW,IAAc,QAAQ,OAAO,IAAI;;EAG7D,MAAM,QAAQ,iBAAiB,KAAK,aAAa,GAAG;EAIpD,MAAM,cAAc,SAAS,MAAM;EAEnC,MAAM,cADU,OAAO,SAAS,CACJ,SAAS,KAAK;AAG1C,MAFiB,CAAC,eAAe,CAAC,YAGhC,QACE,oBAAC;GACC,WAAW,kDAAkD,aAAa;GAC1E,GAAI;GAEH;IACI;AAIX,SACE,oBAAC;GAEC,UAAW,SAAS,MAAM,MAAO;GACjC,OAAO,OAAO,SAAS,CAAC,QAAQ,OAAO,GAAG;GAC1C,GAAI;KAHC,KAAK,QAAQ,CAIlB;;CAGN,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAEP,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAEP,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAEP,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAEP,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAEP,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAEP,IAAI,EAAE,UAAU,GAAG,YACjB,oBAAC;EAAE,WAAU;EAA4B,GAAI;EAC1C;GACC;CAEN,MAAM,EAAE,UAAU,GAAG,YACnB,oBAAC;EAAI,WAAU;EAA4B,GAAI;EAC5C;GACG;CAER,aAAa,EAAE,UAAU,GAAG,YAC1B,oBAAC;EAAW,WAAU;EAA4B,GAAI;EACnD;GACU;CAEf,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAEP,KAAK,EAAE,UAAU,GAAG,YAClB,oBAAC;EAAG,WAAU;EAA4B,GAAI;EAC3C;GACE;CAER;AAED,MAAM,wBAAqC,KACzC,gBACC,WAAW,cACV,UAAU,aAAa,UAAU,YACjC,UAAU,eAAe,UAAU,WACtC;AAOD,MAAa,YAAY,EAAE,SAAS,iBAAgC;AAClE,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GACC,YAAY;IAAE,GAAG;IAAmB,GAAG;IAAY;GACnD,eAAe,CACb,WACA,CAAC,YAAY,EAAE,sBAAsB,OAAO,CAAC,CAC9C;GACD,eAAe,CAAC,UAAU;aAEzB;IACqB;GACpB;;;;;AChJV,MAAa,oBAAoB,UAAiC;CAChE,MAAM,EAAE,OAAO,WAAW,gBAAgB;CAC1C,MAAM,EACJ,SACA,WACA,cACA,QACA,YACA,cACA,kBACA,UACA,yBACE;CACJ,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAE3C,MAAM,mBAAmB;EACvB,MAAM,UAAU,SAAS,WAAW;AACpC,MAAI,WAAW,QAAQ;AACrB,aAAU,UAAU,UAAU,QAAQ;AACtC,aAAU,KAAK;AACf,UAAO,QAAQ;AACf,oBAAiB,UAAU,MAAM,EAAE,IAAK;aAC/B,SAAS;AAClB,aAAU,UAAU,UAAU,QAAQ;AACtC,aAAU,KAAK;AACf,oBAAiB,UAAU,MAAM,EAAE,IAAK;;;CAI5C,MAAM,yBAAyB;AAC7B,MAAI,aAAc,eAAc;;CAGlC,MAAM,uBAAuB;AAC3B,MAAI,cAAc,QAChB,YAAW,QAAQ;;CAIvB,MAAM,yBAAyB;AAC7B,MAAI,gBAAgB,QAClB,cAAa,QAAQ;;CAIzB,MAAM,oBAAoB,oBAAC,oBAAM,MAAM,eAAoB;CAC3D,MAAM,UAAU,SAAS,WAAW;CACpC,MAAM,eAAe,SAAS,gBAAgB,IAAI,MAAM;CACxD,MAAM,uBAAuB,SAAS,wBAAwB;CAC9D,MAAM,eAAe,gBAAgB,yBAAyB;CAC9D,MAAM,cAAc,gBAAgB,yBAAyB;AAE7D,QACE;EACG,eACC,oBAAC;GAAI,OAAO,EAAE,cAAc,UAAU;aAAG;IAAmB,GAC1D;EACH,WACC,qBAAC;GAAI,WAAU;cACZ,WACC,oBAAC;IAAkB;IAAS,YAAY;KAAwB,EAGjE,WAAW,CAAC,aACX,qBAAC;IACC,WAAW,6BAA6B,mBAAmB,mBAAmB;;KAE9E,oBAAC;MACC,WAAU;MACV,SAAS;MACT,cAAY,OAAO;MACnB,OAAO,OAAO;gBAEb,MAAM;OACA;KACT,oBAAC;MACC,WAAU;MACV,SAAS;MACT,cAAY,OAAO;MACnB,OAAO,OAAO;gBAEb,SACC,oBAAC;OAAK,OAAO;QAAE,UAAU;QAAQ,YAAY;QAAQ;iBAAE;QAEhD,GAEP,MAAM;OAED;KACR,cACC,oBAAC;MACC,WAAW,kCACT,aAAa,aAAa,WAAW;MAEvC,SAAS;MACT,cAAY,OAAO;MACnB,OAAO,OAAO;gBAEb,MAAM;OACA;KAEV,gBACC,oBAAC;MACC,WAAW,kCACT,aAAa,eAAe,WAAW;MAEzC,SAAS;MACT,cAAY,OAAO;MACnB,OAAO,OAAO;gBAEb,MAAM;OACA;;KAEP;IAEJ;EAEP,cACC,oBAAC;GAAI,OAAO,EAAE,cAAc,UAAU;aAAG;IAAmB,GAC1D;EACH,aAAa,oBAAC,gBAAc;KAC5B;;;;;;;;;ACxHP,MAAa,iBAA+C,EAC1D,OACA,SACA,YAAY,SACR;CACJ,MAAM,CAAC,YAAY,iBAAiB,SAAS,MAAM;CACnD,MAAM,WAAW,cAAc,MAAM,OAAO,UAAU,MAAM;CAC5D,MAAM,UAAU,WAAW;CAE3B,MAAM,yBAAyB;AAC7B,gBAAc,KAAK;;AAGrB,KAAI,WACF,QACE,qBAAC;EACC,WAAW,0DAA0D;aAErE,oBAAC;GAAI,WAAU;aAAuC;IAEhD,EACL,WACC,oBAAC;GAAI,WAAU;aAAmC;IAAc;GAE9D;AAIV,QACE,qBAAC;EAAI,WAAW,4BAA4B;aAC1C,oBAAC;GACC,KAAK;GACL,KAAK;GACL,WAAU;GACV,SAAS;IACT,EACD,WACC,oBAAC;GAAI,WAAU;aAAmC;IAAc;GAE9D;;;;;ACzCV,SAAgB,cAAc,EAC5B,6BAAcC,aACd,uCAAmBC,kBACnB,iCAAgBC,eAChB,GAAG,SACkB;CACrB,MAAM,EACJ,SACA,UACA,YACA,OACA,kBACA,cACA,QACA,YACA,cACA,iBACA,yBACE;AAEJ,SAAQ,QAAQ,MAAhB;EACE,KAAK,OACH,QACE,oBAACC;GAEC,SAAS;GACT,qBAAkB;GACT;GACT,eAAeC;KAJV,MAKL;EAEN,KAAK,YACH,QACE,oBAACC;GAEC,qBAAkB;GAClB,cAAc,QAAQ,gBAAgB;GACtC,SAAS;GACA;GACC;GACV,WAAW,cAAc,oBAAoB,CAAC,QAAQ;GACtD,cAAc,cAAc,oBAAoB,CAAC,CAAC,QAAQ;GACxC;GAClB,oBAAoB,eAAe,QAAQ,GAAG;GACtC;GACI;GACE;GACd,UAAU,kBAAkB,QAAQ,OAAO;GACrB;GACtB,eAAeD;KAfV,MAgBL;EAEN,QACE,QAAO;;;;;;;;;;AC/Bb,MAAa,uBAA2D,EACtE,SACA,UACA,YACA,OACA,kBACA,cACA,kBACA,aACA,eACA,cACA,QACA,YACA,cACA,sBACA,kBACI;CACJ,MAAM,EACJ,mBACA,8BACA,yBACA,qBACA,uBACE;CAEJ,MAAM,oBAAoB,UAAU,QAAQ,CAAC,MAAM;AAGnD,KAAI,kBAAkB,eAAe,IAAI,kBACvC,QACE,oBAAC;EACU;EACC;EACE;EACL;EACW;EACA;EACL;EACC;EACN;EACI;EACE;EACQ;GACtB;AAIN,KACE,kBAAkB,0BAA0B,IAC5C,6BAEA,QACE,oBAAC;EACW;EACD;EACG;EACL;EACW;EACJ;EACI;EACL;GACb;AAIN,KAAI,kBAAkB,qBAAqB,IAAI,wBAC7C,QACE,oBAAC;EACW;EACD;EACG;EACL;EACW;EACA;EACL;GACb;AAIN,KAAI,kBAAkB,iBAAiB,IAAI,oBACzC,QACE,oBAAC;EACW;EACD;EACG;EACL;EACW;EACA;EACL;GACb;AAIN,KAAI,kBAAkB,gBAAgB,IAAI,mBACxC,QACE,oBAAC;EACW;EACD;EACG;EACL;EACW;EACA;EACL;GACb;AAKN,QACE,oBAACE;EACW;EACD;EACG;EACL;EACW;EACA;EACL;EACE;EACD;EACN;EACI;EACE;EACQ;GACtB;;;;;AC5IN,MAAa,YAAY,EACvB,YACA,UACA,eACA,kBACA,aACA,cACA,eACA,cACA,QACA,YACA,cACA,iBACA,sBACA,WAGA,mBACA,8BACA,yBACA,qBACA,yBACmB;CACnB,MAAM,EAAE,QAAQ,UAAU,gBAAgB;CAC1C,MAAM,EAAE,UAAU,iBAAiB,cAAc,wBAAwB;CAKzE,MAAM,WAAW,CAAC,GAJM,cAChB,oBAAoB,OAAO,QAAQ,EACzC,CAAC,OAAO,QAAQ,CACjB,EACqC,GAAG,gBAAgB;CACzD,MAAM,EAAE,sBAAsB,mBAAmB,kBAAkB,SAAS;CAG5E,MAAM,iBAAiB,CAAC,EACtB,qBACA,gCACA,2BACA,uBACA;AAIF,iBAAgB;AACd,MAAI,eACF,SAAQ,KACN,iPAGD;IAEF,CAAC,eAAe,CAAC;CAGpB,MAAM,cAAiC,eAC9B;EACL;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACD,CACF;CAGD,MAAM,kBAAkB,kBACnB,UACC,oBAAC;EAAoB,GAAI;EAAoB;GAAe,GAE9D;CAEJ,MAAM,oBAAoB,oBAAC,oBAAM,MAAM,eAAoB;AAE3D,QACE,qBAAC;EAAI,WAAU;EAAqB,KAAK;aACvC,qBAAC;GAAI,WAAU;;IACZ,SAAS,KAAK,SAAS,UAAU;AAEhC,YACE,oBAAC;MAEU;MACC;MACE;MACL;MACP,kBARqB,UAAU,SAAS,SAAS;MAS/B;MACL;MACE;MACD;MACN;MACI;MACE;MACG;MACK;QAdjB,MAeL;MAEJ;IACD,SAAS,SAAS,SAAS,IAAI,SAAS,UAAU,cACjD,oBAAC,gBAAc;IAEhB;IACA,aAAa,gBACZ,oBAAC;KAAa,OAAO;KAAW;MAAmB;;IAEjD,EACN,oBAAC;GAAO,WAAU;GAA2B,KAAK;GAC/C;IACM;GACL;;AAIV,SAAS,oBACP,SACW;AACX,KAAI,CAAC,QAAS,QAAO,EAAE;AAEvB,KAAI,MAAM,QAAQ,QAAQ,CACxB,QAAO,QAAQ,KAAK,YAAY;AAC9B,SAAO;GACL,IAAI;GACJ,MAAM;GACN,SAAS;GACV;GACD;AAGJ,QAAO,CACL;EACE,IAAI;EACJ,MAAM;EACN,SAAS;EACV,CACF;;AAGH,SAAgB,kBAAkB,UAAqB;CACrD,MAAM,iBAAiB,OAAuB,KAAK;CACnD,MAAM,uBAAuB,OAA8B,KAAK;CAChE,MAAM,0BAA0B,OAAO,MAAM;CAC7C,MAAM,oBAAoB,OAAO,MAAM;CAEvC,MAAM,uBAAuB;AAC3B,MAAI,qBAAqB,WAAW,eAAe,SAAS;AAC1D,2BAAwB,UAAU;AAClC,wBAAqB,QAAQ,YAC3B,qBAAqB,QAAQ;;;CAInC,MAAM,qBAAqB;AACzB,MAAI,wBAAwB,SAAS;AACnC,2BAAwB,UAAU;AAClC;;AAGF,MAAI,qBAAqB,SAAS;GAChC,MAAM,EAAE,WAAW,cAAc,iBAC/B,qBAAqB;AACvB,qBAAkB,UAAU,YAAY,eAAe;;;AAI3D,iBAAgB;EACd,MAAM,YAAY,qBAAqB;AACvC,MAAI,UACF,WAAU,iBAAiB,UAAU,aAAa;AAEpD,eAAa;AACX,OAAI,UACF,WAAU,oBAAoB,UAAU,aAAa;;IAGxD,EAAE,CAAC;AAEN,iBAAgB;EACd,MAAM,YAAY,qBAAqB;AACvC,MAAI,CAAC,UACH;EAGF,MAAM,mBAAmB,IAAI,uBAAuB;AAClD,OAAI,CAAC,kBAAkB,QACrB,iBAAgB;IAElB;AAEF,mBAAiB,QAAQ,WAAW;GAClC,WAAW;GACX,SAAS;GACT,eAAe;GAChB,CAAC;AAEF,eAAa;AACX,oBAAiB,YAAY;;IAE9B,EAAE,CAAC;AAEN,iBAAgB;AACd,oBAAkB,UAAU;AAC5B,kBAAgB;IACf,CAAC,SAAS,QAAQ,MAAM,EAAE,SAAS,OAAO,CAAC,OAAO,CAAC;AAEtD,QAAO;EAAE;EAAgB;EAAsB;;;;;ACzMjD,MAAM,uBAAuB,YAKzB,EACE,UAAU,GACV,aACA,OACA,UACA,WACA,oBACA,kBACA,aAEF,QACG;CACH,MAAM,sBAAsB,OAA4B,KAAK;CAC7D,MAAM,CAAC,WAAW,gBAAgB,SAAiB,EAAE;AAErD,qBACE,WACM,oBAAoB,QAC3B;AAED,iBAAgB;EACd,MAAM,2BAA2B;GAC/B,MAAM,WAAW,oBAAoB;AACrC,OAAI,UAAU;AACZ,aAAS,MAAM,SAAS;IACxB,MAAM,kBAAkB,SAAS;AACjC,iBAAa,kBAAkB,QAAQ;AACvC,QAAI,UACF,UAAS,OAAO;;;AAKtB,sBAAoB;IACnB,CAAC,QAAQ,CAAC;AAEb,iBAAgB;EACd,MAAM,WAAW,oBAAoB;AACrC,MAAI,UAAU;AACZ,YAAS,MAAM,SAAS;AACxB,YAAS,MAAM,SAAS,GAAG,KAAK,IAAI,SAAS,cAAc,UAAU,CAAC;;IAEvE,CAAC,OAAO,UAAU,CAAC;AAEtB,QACE,oBAAC;EACC,KAAK;EACE;EACG;EACC;EACS;EACF;EACL;EACb,OAAO;GACL,UAAU;GACV,QAAQ;GACR,WAAW,GAAG,UAAU;GACzB;EACD,MAAM;GACN;EAGP;;;;ACnDD,MAAM,iBAAiB,OACrB,gBACA,kBACA,iBACA,gBACA,WACG;AACH,KAAI,CAAC,eAAe,WAAW,CAAC,gBAAgB,SAAS;AACvD,iBAAe,UAAU,MAAM,UAAU,aAAa,aAAa,EACjE,OAAO,MACR,CAAC;AACF,kBAAgB,UAAU,IAAI,OAAO,cAAc;AACnD,QAAM,gBAAgB,QAAQ,QAAQ;;AAGxC,kBAAiB,UAAU,IAAI,cAAc,eAAe,QAAS;AACrE,kBAAiB,QAAQ,MAAM,IAAK;AACpC,kBAAiB,QAAQ,mBAAmB,UAAU;AACpD,iBAAe,KAAK,MAAM,KAAK;;AAEjC,kBAAiB,QAAQ,SAAS;;AAGpC,MAAM,iBACJ,qBACG;AACH,KACE,iBAAiB,WACjB,iBAAiB,QAAQ,UAAU,WAEnC,kBAAiB,QAAQ,MAAM;;AAInC,MAAM,kBAAkB,OACtB,gBACA,uBACG;CACH,MAAM,eAAe,IAAI,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;CACpE,MAAM,WAAW,IAAI,UAAU;AAC/B,UAAS,OAAO,QAAQ,cAAc,gBAAgB;CAEtD,MAAM,WAAW,MAAM,MAAM,oBAAoB;EAC/C,QAAQ;EACR,MAAM;EACP,CAAC;AAEF,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,UAAU,SAAS,aAAa;AAIlD,SADsB,MAAM,SAAS,MAAM,EACtB;;AAGvB,MAAM,qBACJ,MACA,iBACA,iBACG;CAEH,MAAM,MAAM,GAAG,gBAAgB,QADX,mBAAmB,KAAK;AAG5C,OAAM,IAAI,CACP,MAAM,aAAa,SAAS,aAAa,CAAC,CAC1C,MAAM,gBAAgB,aAAa,gBAAgB,YAAY,CAAC,CAChE,MAAM,gBAAgB;EACrB,MAAM,SAAS,aAAa,oBAAoB;AAChD,SAAO,SAAS;AAChB,SAAO,QAAQ,aAAa,YAAY;AACxC,SAAO,MAAM,EAAE;GACf,CACD,OAAO,UAAU;AAChB,UAAQ,MAAM,kCAAkC,MAAM;GACtD;;AAON,MAAa,iBAAiB,EAC5B,cACA,iBAII;CACJ,MAAM,CAAC,iBAAiB,sBACtB,SAA0B,OAAO;CACnC,MAAM,iBAAiB,OAA2B,KAAK;CACvD,MAAM,kBAAkB,OAA4B,KAAK;CACzD,MAAM,mBAAmB,OAA6B,KAAK;CAC3D,MAAM,iBAAiB,OAAe,EAAE,CAAC;CACzC,MAAM,iBAAiB,mBAAmB;CAC1C,MAAM,kBAAkB,2BAA2B;CACnD,MAAM,UAAU;EAAE,GAAG;EAAgB,GAAG;EAAiB;CACzD,MAAM,CAAC,2BAA2B,gCAAgC,SAEhE,KAAK;AAEP,iBAAgB;AACd,MAAI,oBAAoB,YACtB,gBACE,gBACA,kBACA,iBACA,eAAe,eACT;AACJ,sBAAmB,eAAe;IAErC;OACI;AACL,iBAAc,iBAAiB;AAC/B,OAAI,oBAAoB,eACtB,iBACE,eAAe,SACf,QAAQ,iBAAiB,mBAC1B,CAAC,KAAK,OAAO,kBAAkB;AAC9B,mBAAe,UAAU,EAAE;AAC3B,uBAAmB,OAAO;AAE1B,kCADgB,MAAM,aAAa,cAAc,EACZ,GAAG;KACxC;;AAIN,eAAa;AACX,iBAAc,iBAAiB;;IAEhC,CAAC,gBAAgB,CAAC;AAErB,iBAAgB;AACd,MAAI,eAAe,SAAS,2BAA2B;GACrD,MAAM,mBAAmB,QAAQ,SAAS,WACvC,YAAY,QAAQ,OAAO,0BAC7B;AAWD,qBATqB,UAAU,QAAQ,SAAS,CAG7C,MAAM,mBAAmB,EAAE,CAC3B,QAAQ,YAAY,QAAQ,SAAS,YAAY,CAGjD,KAAK,YAAY,QAAQ,QAAQ,CACjC,KAAK,KAAK,EAGX,QAAQ,iBAAiB,iBACzB,gBAAgB,QACjB;AAED,gCAA6B,KAAK;;IAEnC,CAAC,2BAA2B,WAAW,CAAC;AAE3C,QAAO;EAAE;EAAiB;EAAoB;;;;;AChMhD,MAAa,oBAAoB;AAC/B,KAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QACE,SAAS,gBAAgB,UAAU,SAAS,OAAO,IACnD,SAAS,KAAK,UAAU,SAAS,OAAO,IACxC,SAAS,gBAAgB,aAAa,aAAa,KAAK,UACxD,SAAS,KAAK,aAAa,aAAa,KAAK,UAC7C,OAAO,WAAW,+BAA+B,CAAC;;;;;ACJtD,SAAgB,aAAa,EAC3B,gBAAgB,QAGf;CACD,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,SAAS,aAAa;AAU5B,iBAAgB;AACd,aAAW,KAAK;IACf,EAAE,CAAC;AAEN,KAAI,CAAC,cACH,QAAO;AAaT,QACE,oBAAC,mBAEC,oBAAC;EAAE,WAAU;EAAY,OAbN;GACrB,YAAY;GACZ,SAAS;GACT,UAAU;GACV,WAAW;GACX,UAAU;GACV,SAAS;GACT,OAAO,WAAW,SAAS,oBAAoB;GAChD;YAKmD;GAE5C,GACA;;;;;AChCV,MAAM,eAAe;AAErB,MAAa,SAAS,EACpB,YACA,QACA,YAAY,OACZ,QACA,UACA,iBAAiB,YACD;CAChB,MAAM,UAAU,gBAAgB;CAChC,MAAM,iBAAiB,mBAAmB;CAE1C,MAAM,gBAAgB,CAAC,eAAe,kBAAkB;CAExD,MAAM,uBACJ,eAAe,iBAAiB,oBAAoB,UACpD,eAAe,iBAAiB,uBAAuB;CAEzD,MAAM,cAAc,OAA4B,KAAK;CACrD,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CAErD,MAAM,kBAAkB,UAA4C;EAClE,MAAM,SAAS,MAAM;AAGrB,MAAI,OAAO,QAAQ,SAAS,CAAE;AAG9B,MAAI,OAAO,YAAY,WAAY;AAGnC,cAAY,SAAS,OAAO;;CAG9B,MAAM,CAAC,MAAM,WAAW,SAAS,GAAG;CACpC,MAAM,aAAa;AACjB,MAAI,WAAY;AAChB,SAAO,KAAK;AACZ,UAAQ,GAAG;AAEX,cAAY,SAAS,OAAO;;CAkB9B,MAAM,EAAE,iBAAiB,uBAAuB,cAAc;EAC5D,cAAc;EACd;EACD,CAAC;CAEF,MAAM,eAAe,cAAc,oBAAoB;CACvD,MAAM,EAAE,YAAY,cAAc,cAAc;AAC9C,MAAI,CAAC,UACH,QAAO;GAAE,YAAY,QAAQ,MAAM;GAAa,WAAW;GAAW;AACxE,SAAO,gBAAgB,CAAC,kBAAkB,YACtC;GAAE,YAAY,QAAQ,MAAM;GAAU,WAAW;GAAQ,GACzD;GAAE,YAAY,QAAQ,MAAM;GAAU,WAAW;GAAQ;IAC5D;EACD;EACA;EACA;EACA,QAAQ,MAAM;EACd,QAAQ,MAAM;EACf,CAAC;CACF,MAAM,iBACJ,yBACC,oBAAoB,UAAU,oBAAoB,gBACnD,CAAC;CAEH,MAAM,EAAE,cAAc,wBAAwB;CAE9C,MAAM,UAAU,cAAc;AAC5B,SACE,CAAC,gBACD,KAAK,MAAM,CAAC,SAAS,KACrB,oBAAoB,UACpB,CAAC;IAEF;EAAC;EAAW;EAAc;EAAM;EAAgB,CAAC;CAEpD,MAAM,UAAU,cAAc;AAC5B,SAAO,gBAAgB,CAAC;IACvB,CAAC,cAAc,eAAe,CAAC;CAElC,MAAM,eAAe,CAAC,WAAW,CAAC;AAElC,QACE,qBAAC;EACC,WAAW,4BAA4B,gBAAgB,uBAAuB;aAE9E,qBAAC;GAAI,WAAU;GAAkB,SAAS;cACxC,oBAAC;IACC,KAAK;IACL,aAAa,QAAQ,OAAO;IAC5B,WAAW;IACX,SAAS;IACT,OAAO;IACP,WAAW,UAAU,QAAQ,MAAM,OAAO,MAAM;IAChD,0BAA0B,eAAe,KAAK;IAC9C,wBAAwB,eAAe,MAAM;IAC7C,YAAY,UAAU;AACpB,SAAI,MAAM,QAAQ,WAAW,CAAC,MAAM,YAAY,CAAC,aAAa;AAC5D,YAAM,gBAAgB;AACtB,UAAI,QACF,OAAM;;;KAIZ,EACF,qBAAC;IAAI,WAAU;;KACZ,YACC,oBAAC;MAAO,SAAS;MAAU,WAAU;gBAClC,QAAQ,MAAM;OACR;KAGX,oBAAC,SAAI,OAAO,EAAE,UAAU,GAAG,GAAI;KAE9B,kBACC,oBAAC;MACC,eACE,mBACE,oBAAoB,SAAS,cAAc,eAC5C;MAEH,WACE,oBAAoB,cAChB,+DACA;gBAGL,QAAQ,MAAM;OACR;KAEX,oBAAC;MACC,UAAU;MACV,SAAS,gBAAgB,CAAC,iBAAiB,SAAS;MACpD,+BAA6B;MAC7B,gBACE,aACI,qCACA;MAEN,WAAU;MACV,cAAY;gBAEX;OACM;;KACL;IACF,EACN,oBAAC,gBAA4B,gBAAiB;GAC1C;;;;;ACxKV,MAAa,oBAAqD,EAChE,QACA,eACA,YAAY,SACR;AACJ,KAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QACE,oBAAC;EACC,WAAW,8BAA8B;EACzC,OAAO;GACL,SAAS;GACT,UAAU;GACV,KAAK;GACL,QAAQ;GACR,SAAS;GACV;YAEA,OAAO,KAAK,OAAO,UAClB,qBAAC;GAEC,WAAU;GACV,OAAO;IACL,UAAU;IACV,SAAS;IACT,OAAO;IACP,QAAQ;IACR,cAAc;IACd,UAAU;IACX;cAGD,oBAAC;IACC,KAAK,QAAQ,MAAM,YAAY,UAAU,MAAM;IAC/C,KAAK,kBAAkB,QAAQ;IAC/B,OAAO;KACL,OAAO;KACP,QAAQ;KACR,WAAW;KACZ;KACD,EACF,oBAAC;IACC,eAAe,cAAc,MAAM;IACnC,WAAU;IACV,OAAO;KACL,UAAU;KACV,KAAK;KACL,OAAO;KACP,YAAY;KACZ,OAAO;KACP,QAAQ;KACR,cAAc;KACd,OAAO;KACP,QAAQ;KACR,SAAS;KACT,YAAY;KACZ,gBAAgB;KAChB,QAAQ;KACR,UAAU;KACV,SAAS;KACV;cACF;KAEQ;KA3CJ,MA4CD,CACN;GACE;;;;;AC/DV,SAAgB,WAAW,EACzB,OACA,SACA,SACA,aACmB;CACnB,MAAM,EAAE,cAAc,wBAAwB;AAC9C,KAAI,CAAC,MAAO,QAAO;AAEnB,QACE,oBAAC;EACC,UAAU,WAAW;EACrB,UAAU,MAAM;AACd,KAAE,gBAAgB;AAClB,YAAS;;EAEX,WAAW,cAAc,aAAa,GAAG,GAAG,UAAU,YAAY;EAClE,gBAAa;EACb,MAAK;YAEJ,UAAU,mBAAmB,oBAAC,oBAAM,QAAa;GAC3C;;;;;AC7Bb,SAAgB,YAAY,EAC1B,aACA,mBACA,aAC6B;AAC7B,QACE,oBAAC;EAAI,WAAU;YACZ,YAAY,KAAK,YAAY,UAC5B,oBAAC;GAEC,OAAO,WAAW;GAClB,SAAS,WAAW;GACpB,SAAS,WAAW,aAAa,WAAW,WAAW;GACvD,WAAW,WAAW;GACtB,eAAe,kBAAkB,WAAW,QAAQ;KAL/C,MAML,CACF;GACE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC6TV,SAAgB,YAAY,EAC1B,cACA,cAAc,QACd,iBACA,mBACA,sBACA,cACA,kBACA,kBACA,cACA,QACA,YACA,cACA,sBACA,uBAAWC,UACX,iCAAgBC,eAChB,wBAAwBC,aACxB,iBAAQC,OACR,WACA,OACA,QACA,uCAAmBC,kBACnB,6BAAcC,aACd,iCAAgBC,eAChB,cACA,qBACA,kBAAkB,WAClB,gBACA,oBACA,aACA,SAEA,mBACA,8BACA,yBACA,qBACA,sBACmB;CACnB,MAAM,EACJ,wBACA,qBACA,kBACA,gBACA,yBACA,+BACE,mBAAmB;CAGvB,MAAM,EAAE,cAAc,oBAAoB;CAC1C,MAAM,CAAC,gBAAgB,qBAAqB,SAA6B,EAAE,CAAC;CAC5E,MAAM,CAAC,WAAW,gBAAgB,SAA2B,KAAK;CAClE,MAAM,CAAC,iBAAiB,sBAAsB,SAE5C,EAAE,CAAC;CACL,MAAM,eAAe,OAAyB,KAAK;CAGnD,MAAM,2BAA2B,aAC9B,UAA2C,GAAG,SAAgB;AAC7D,MAAI,gBAAgB,qBAAqB,UACvC,CAAC,mBAAmB,UAAkB,GAAG,KAAK;AAEhD,MAAI,qBAAqB,aAAa,CAAC,cAAc;AACnD,kBACE,IAAI,gBAAgB;IAClB,SAAS;IACT,MAAM,oBAAoB;IAC1B,UAAU,SAAS;IACnB,YAAY,gBAAgB;IAC7B,CAAC,CACH;AACD,iBAAc,qBAAqB,qBAAqB;;IAG5D;EAAC;EAAc;EAAoB;EAAe,CACnD;CAGD,MAAM,mBAAmB,aACtB,OAAY,WAAmB,kBAAwB;AAKtD,eAAa;GACX,SAJA,OAAO,WAAW,OAAO,UAAU,IAAI;GAKvC;GACA,WAAW,KAAK,KAAK;GACtB,CAAC;EAEF,MAAM,aAAgC;GACpC,MAAM;GACN,WAAW,KAAK,KAAK;GACrB,SAAS;IACP,QAAQ;IACR,SAAS;KACP;KACA,KAAK;KACL,WAAW,KAAK,KAAK;KACtB;IACD,WAAW;KACT,aAAa;KACb,WACE,OAAO,cAAc,cACjB,UAAU,YACV;KACN,YACE,yBAAyB,QAAQ,cAAc,QAAQ;KAC1D;IACF;GACD;GACD;AAED,MAAI,QACF,SAAQ,WAAW;AAIrB,MAAI,gBAAgB,oBAAoB,QACtC,oBAAmB,QAAQ,WAAW;AAIxC,MAAI,oBAAoB,WAAW,CAAC,cAAc;AAChD,kBACE,IAAI,gBAAgB;IAClB,SACE;IACF,MAAM,oBAAoB;IAC1B,UAAU,SAAS;IACnB,YAAY,gBAAgB;IAC7B,CAAC,CACH;AACD,iBAAc,qBAAqB,6BAA6B;;IAGpE;EAAC;EAAc;EAAiB;EAAoB;EAAe,CACpE;AAED,iBAAgB;EACd,MAAM,KAAK;AACX,0BAAwB,GACrB,MAAM,UAA6B;AAClC,OAAI,CAAC,MAAO;AACZ,oBAAiB,MAAM,OAAO,cAAc;KAE/C,CAAC;AACF,eAAa;AAEX,gCAA6B,GAAG;;IAEjC;EAAC;EAAkB;EAAyB;EAA2B,CAAC;AAG3E,iBAAgB;AACd,MAAI,CAAC,oBAAqB;EAE1B,MAAM,cAAc,OAAO,MAAsB;AAE/C,OAAI,CADW,EAAE,OACL,eAAe,UAAU,SAAS,kBAAkB,CAAE;GAGlE,MAAM,aADQ,MAAM,KAAK,EAAE,eAAe,SAAS,EAAE,CAAC,CAC7B,QAAQ,SAAS,KAAK,KAAK,WAAW,SAAS,CAAC;AAEzE,OAAI,WAAW,WAAW,EAAG;AAE7B,KAAE,gBAAgB;GAElB,MAAM,gBAA+C,WAAW,KAC7D,SAAS;IACR,MAAM,OAAO,KAAK,WAAW;AAC7B,QAAI,CAAC,KAAM,QAAO,QAAQ,QAAQ,KAAK;AAEvC,WAAO,IAAI,SAA6B,SAAS,WAAW;KAC1D,MAAM,SAAS,IAAI,YAAY;AAC/B,YAAO,UAAU,MAAM;MACrB,MAAM,gBAAgB,EAAE,QAAQ,SAAmB,MAAM,IAAI,CAAC;AAC9D,UAAI,aACF,SAAQ;OACN,aAAa,KAAK;OAClB,OAAO;OACR,CAAC;UAEF,SAAQ,KAAK;;AAGjB,YAAO,UAAU;AACjB,YAAO,cAAc,KAAK;MAC1B;KAEL;AAED,OAAI;IACF,MAAM,gBAAgB,MAAM,QAAQ,IAAI,cAAc,EAAE,QACrD,QAAQ,QAAQ,KAClB;AACD,uBAAmB,SAAS,CAAC,GAAG,MAAM,GAAG,aAAa,CAAC;YAChD,OAAO;AAEd,qBAAiB,OAAO,0BAA0B,MAAM;AACxD,YAAQ,MAAM,mCAAmC,MAAM;;;AAI3D,WAAS,iBAAiB,SAAS,YAAY;AAC/C,eAAa,SAAS,oBAAoB,SAAS,YAAY;IAC9D,CAAC,qBAAqB,iBAAiB,CAAC;AAE3C,iBAAgB;AACd,MAAI,CAAC,wBAAwB,QAAQ;AACnC,uBAAoB,gBAAgB,GAAG;AACvC;;AAiBF,sBANuC;GACrC;GACA;GACA,GAAG,uBAAuB,KAAK,gBAAgB,KAAK,cAAc;GACnE,CAEkD,KAAK,KAAK,IAAI,GAAG;IACnE,CAAC,cAAc,uBAAuB,CAAC;CAE1C,MAAM,EACJ,UACA,WACA,aACA,gBACA,gBACA,aAAa,oBACb,sBACA,UACE,uBAAuB;EACzB;EACA;EACA;EACA;EACA;EACD,CAAC;CAKF,MAAM,gBAAgB,OAAO,UAAU;AACvC,iBAAgB;AACd,MAAI,cAAc,YAAY,WAAW;AACvC,OAAI,UACF,0BAAyB,gBAAgB;OAEzC,0BAAyB,gBAAgB;AAE3C,iBAAc,UAAU;;IAEzB,CAAC,WAAW,yBAAyB,CAAC;CAGzC,MAAM,qBAAqB,SAAiB;AAE1C,oBAAkB,EAAE,CAAC;AACrB,MAAI,aAAa,QACf,cAAa,QAAQ,QAAQ;AAI/B,2BAAyB,iBAAiB,KAAK;AAG/C,SAAO,YAAY;GACjB,IAAI,YAAY;GAChB,SAAS;GACT,MAAM;GACP,CAAC;;CAGJ,MAAM,cAAc,MAAM,WAAW,YAAY;CACjD,MAAM,YAAY,cAAc,YAAY,OAAO;CAEnD,MAAM,oBAAoB,cAAsB;AAC9C,MAAI,aACF,cAAa,UAAU;AAIzB,2BAAyB,wBAAwB,UAAU;AAE3D,iBAAe,UAAU;;CAG3B,MAAM,cAAc,YAAoB;AACtC,MAAI,OACF,QAAO,QAAQ;AAIjB,2BAAyB,mBAAmB,QAAQ;;CAGtD,MAAM,oBAAoB,OACxB,UACG;AACH,MAAI,CAAC,MAAM,OAAO,SAAS,MAAM,OAAO,MAAM,WAAW,EACvD;EAGF,MAAM,QAAQ,MAAM,KAAK,MAAM,OAAO,MAAM,CAAC,QAAQ,SACnD,KAAK,KAAK,WAAW,SAAS,CAC/B;AACD,MAAI,MAAM,WAAW,EAAG;EAExB,MAAM,mBAAmB,MAAM,KAAK,SAAS;AAC3C,UAAO,IAAI,SACR,SAAS,WAAW;IACnB,MAAM,SAAS,IAAI,YAAY;AAC/B,WAAO,UAAU,MAAM;KACrB,MAAM,gBACH,EAAE,QAAQ,SAAmB,MAAM,IAAI,CAAC,MAAM;AACjD,SAAI,aACF,SAAQ;MACN,aAAa,KAAK;MAClB,OAAO;MACR,CAAC;;AAGN,WAAO,UAAU;AACjB,WAAO,cAAc,KAAK;KAE7B;IACD;AAEF,MAAI;GACF,MAAM,eAAe,MAAM,QAAQ,IAAI,iBAAiB;AACxD,sBAAmB,SAAS,CAAC,GAAG,MAAM,GAAG,aAAa,CAAC;WAChD,OAAO;AAEd,oBAAiB,OAAO,yBAAyB,MAAM;AACvD,WAAQ,MAAM,wBAAwB,MAAM;;;CAIhD,MAAM,uBAAuB,UAAkB;AAC7C,qBAAmB,SAAS,KAAK,QAAQ,GAAG,MAAM,MAAM,MAAM,CAAC;;CAGjE,MAAM,kBAAkB,YAAqB;AAC3C,MAAI,WACF,YAAW,QAAQ;AAIrB,sBAAoB,UAAU;GAC5B,GAAG;IACF,QAAQ,KAAK;GACf,EAAE;AAGH,2BAAyB,mBAAmB,QAAQ,IAAI,WAAW;;CAGrE,MAAM,oBAAoB,YAAqB;AAC7C,MAAI,aACF,cAAa,QAAQ;AAIvB,sBAAoB,UAAU;GAC5B,GAAG;IACF,QAAQ,KAAK;GACf,EAAE;AAGH,2BAAyB,mBAAmB,QAAQ,IAAI,aAAa;;AAGvE,QACE,qBAAC;EAA0B;EAAe;EAAmB;;GAE1D,aACC,eACA,YAAY;IACV,GAAG;IACH,iBAAiB,aAAa,KAAK;IACnC,eAAe;AAEb,kBAAa,KAAK;;IAGrB,CAAC;GAEJ,oBAACC;IACC,kBAAkBC;IAClB,aAAaC;IACb,eAAeC;IACL;IACV,YAAY;IACZ,cAAc;IACd,QAAQ;IACR,YAAY;IACZ,cAAc;IACG;IACK;IACtB,eAAeC;IACD;IACH;IAEQ;IACW;IACL;IACJ;IACD;cAEnB,mBAAmB,SAAS,KAC3B,oBAAC;KACC,mBAAmB;KACnB,aAAa;KACb,WAAW;MACX;KAEK;GAEV,uBACC,4CACE,oBAAC;IACC,QAAQ;IACR,eAAe;KACf,EACF,oBAAC;IACC,MAAK;IACL;IACA,KAAK;IACL,UAAU;IACV,QAAQ;IACR,OAAO,EAAE,SAAS,QAAQ;KAC1B,IACD;GAEL,oBAACC;IACC,YAAY;IACZ,WAAW,QAAQ,MAAM;IAEzB,QAAQ;IACG;IACX,QAAQ;IACR,UACE,4BAA4B,aAAa,SAAS,OAAO,GAAG;IAE9C;KAChB;;GACiB;;AAIzB,SAAgB,mBAAmB,EACjC,UACA,OACA,QACA,aAMC;AAED,KAAI,CADgB,MAAM,WAAW,YAAY,CAE/C,QACE,oBAAC;EACQ;EACC;EACR,MAAM;EACN,eAAe;YAEf,oBAAC;GAAI,WAAW,kBAAkB,aAAa;GAAO;IAAe;GACjD;AAG1B,QAAO,gCAAG,WAAY;;;;;AC3uBxB,MAAM,qBAAqB,EACzB,oBACA,WACA,qBACA,kBACA,UACA,WACA,UACA,QACA,QACA,QACA,GAAG,gBAQC;CACJ,MAAM,EAAE,kBAAkB,mBAAmB,mBAAmB;CAGhE,MAAM,EAAE,iBAAiB;CAGzB,MAAM,2BAA2B,aAC9B,UAA2C,GAAG,SAAgB;AAC7D,MAAI,gBAAgB,qBAAqB,UACvC,CAAC,mBAAmB,UAAkB,GAAG,KAAK;AAEhD,MAAI,qBAAqB,aAAa,CAAC,cAAc;AACnD,kBACE,IAAI,gBAAgB;IAClB,SAAS;IACT,MAAM,oBAAoB;IAC1B,UAAU,SAAS;IACnB,YAAY,gBAAgB;IAC7B,CAAC,CACH;AACD,iBAAc,qBAAqB,qBAAqB;;IAG5D;EAAC;EAAc;EAAoB;EAAe,CACnD;CAED,MAAM,EAAE,SAAS,gBAAgB;CACjC,MAAM,WAAW,OAAO,KAAK;AAG7B,iBAAgB;AACd,MAAI,SAAS,YAAY,MAAM;AAC7B,eAAY,KAAK;AAGjB,OAAI,KACF,0BAAyB,iBAAiB;OAE1C,0BAAyB,kBAAkB;AAE7C,YAAS,UAAU;;IAEpB;EAAC;EAAM;EAAW;EAAyB,CAAC;CAE/C,MAAM,iBAAiB,cAAc,oBAAC,WAAS,EAAE,CAAC,OAAO,CAAC;AAG1D,QACE,4CAHuB,cAAc,UAAU,CAAC,SAAS,CAAC,EAKxD,qBAAC;EAAe;aACd,oBAAC,WAAgB,EACjB,qBAAC;GACsB;GACX;GACQ;cAEjB,gBACD,oBAAC;IAAY,GAAI;IAA+B;KAAsB;IAC/D;GACL,IACL;;AAIP,MAAa,gBAAgB,EAC3B,cACA,cAAc,OACd,sBAAsB,MACtB,mBAAmB,MACnB,WACA,iBACA,kBACA,kBACA,WAAW,KACX,OACA,QACA,mBACA,cACA,mBAASC,QACT,mBAASC,QACT,mBAASC,QACT,uBAAWC,UACX,iBAAQC,OACR,uCAAmBC,kBACnB,6BAAcC,aACd,YACA,cACA,QACA,cACA,sBACA,WACA,UACA,oBACA,GAAG,YACoB;CACvB,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAS,YAAY;AAE7D,QACE,oBAAC;EACQ;EACC;EACR,MAAM;EACN,SAAS;YAET,oBAAC;GACqB;GACT;GACX,qBAAqB,uBAAuB;GAC5C,kBAAkB,oBAAoB;GACtC,UAAU,YAAY;GACX;GACX,QAAQC;GACR,QAAQC;GACR,QAAQC;GACM;GACG;GACC;GACA;GACC;GACL;GACd,UAAUC;GACV,OAAOC;GACP,kBAAkBC;GAClB,aAAaC;GACD;GACE;GACN;GACM;GACQ;GACtB,GAAI;GAEH;IACiB;GACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7J1B,SAAgB,aAAa,OAA0B;AACrD,SAAQ;EACN,GAAG;EACH,WAAW,MAAM,YACb,MAAM,YAAY,qBAClB;EACL;AACD,QAAO,oBAAC;EAAa,GAAI;YAAQ,MAAM;GAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACHjE,SAAgB,eAAe,OAA0B;AACvD,SAAQ;EACN,GAAG;EACH,WAAW,MAAM,YACb,MAAM,YAAY,uBAClB;EACL;CACD,MAAM,CAAC,mBAAmB,wBAAwB,SAChD,MAAM,cAAc,oBAAoB,GACzC;CAED,MAAM,aAAa,SAAkB;AACnC,QAAM,YAAY,KAAK;AACvB,uBAAqB,OAAO,oBAAoB,GAAG;;AAGrD,QACE,oBAAC;EAAI,WAAW,mCAAmC;YACjD,oBAAC;GAAa,GAAI;GAAa;aAC5B,MAAM;IACM;GACX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC9BV,SAAgB,0BACd,QACA,eAAsB,EAAE,EACxB;AACA,6BAA8B,QAAQ,aAAa"} |