diff --git a/frontend/src/components/AutoResumeThread.tsx b/frontend/src/components/AutoResumeThread.tsx index 03168b4efb..0ded86a7d4 100644 --- a/frontend/src/components/AutoResumeThread.tsx +++ b/frontend/src/components/AutoResumeThread.tsx @@ -1,13 +1,12 @@ import { useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; -import { useRecoilState } from 'recoil'; import { toast } from 'sonner'; import { - resumeThreadErrorState, useChatInteract, useChatSession, - useConfig + useConfig, + useThreadStore } from '@chainlit/react-client'; interface Props { @@ -19,8 +18,9 @@ export default function AutoResumeThread({ id }: Props) { const { config } = useConfig(); const { clear, setIdToResume } = useChatInteract(); const { session, idToResume } = useChatSession(); - const [resumeThreadError, setResumeThreadError] = useRecoilState( - resumeThreadErrorState + const resumeThreadError = useThreadStore((state) => state.resumeThreadError); + const setResumeThreadError = useThreadStore( + (state) => state.setResumeThreadError ); useEffect(() => { diff --git a/frontend/src/components/ChatSettings/index.tsx b/frontend/src/components/ChatSettings/index.tsx index f117bf74b7..59bf377b5d 100644 --- a/frontend/src/components/ChatSettings/index.tsx +++ b/frontend/src/components/ChatSettings/index.tsx @@ -1,12 +1,12 @@ import mapValues from 'lodash/mapValues'; import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; -import { useRecoilState, useSetRecoilState } from 'recoil'; +import { useRecoilState } from 'recoil'; import { - chatSettingsValueState, useChatData, - useChatInteract + useChatInteract, + useChatStore } from '@chainlit/react-client'; import { Button } from '@/components/ui/button'; @@ -36,7 +36,9 @@ export default function ChatSettingsModal() { const { handleSubmit, setValue, reset, watch } = useForm({ defaultValues: chatSettingsValue }); - const setChatSettingsValue = useSetRecoilState(chatSettingsValueState); + const setChatSettingsValue = useChatStore( + (state) => state.setChatSettingsValue + ); // Reset form when default values change useEffect(() => { diff --git a/frontend/src/components/ElementSideView.tsx b/frontend/src/components/ElementSideView.tsx index c18b5547e2..e4ea82ef44 100644 --- a/frontend/src/components/ElementSideView.tsx +++ b/frontend/src/components/ElementSideView.tsx @@ -1,9 +1,8 @@ import { cn } from '@/lib/utils'; import { ArrowLeft } from 'lucide-react'; import { useEffect, useState } from 'react'; -import { useRecoilState } from 'recoil'; -import { sideViewState } from '@chainlit/react-client'; +import { useChatStore } from '@chainlit/react-client'; import { Card, CardContent } from '@/components/ui/card'; import { ResizableHandle, ResizablePanel } from '@/components/ui/resizable'; @@ -20,7 +19,9 @@ import { Element } from './Elements'; import { Button } from './ui/button'; export default function ElementSideView() { - const [sideView, setSideView] = useRecoilState(sideViewState); + const sideView = useChatStore((state) => state.sideView); + const setSideView = useChatStore((state) => state.setSideView); + const isMobile = useIsMobile(); const [isVisible, setIsVisible] = useState(false); diff --git a/frontend/src/components/Elements/CustomElement/index.tsx b/frontend/src/components/Elements/CustomElement/index.tsx index 81bb0ae2b0..c1283afe69 100644 --- a/frontend/src/components/Elements/CustomElement/index.tsx +++ b/frontend/src/components/Elements/CustomElement/index.tsx @@ -8,7 +8,6 @@ import { useState } from 'react'; import { Runner } from 'react-runner'; -import { useRecoilValue } from 'recoil'; import { v4 as uuidv4 } from 'uuid'; import { @@ -16,9 +15,9 @@ import { IAction, ICustomElement, IElement, - sessionIdState, useAuth, - useChatInteract + useChatInteract, + useSessionState } from '@chainlit/react-client'; import Alert from '@/components/Alert'; @@ -28,7 +27,8 @@ import * as Renderer from './Renderer'; const CustomElement = memo(function ({ element }: { element: ICustomElement }) { const apiClient = useContext(ChainlitContext); - const sessionId = useRecoilValue(sessionIdState); + const sessionId = useSessionState((state) => state.sessionId); + const { sendMessage } = useChatInteract(); const { user } = useAuth(); const { askUser } = useContext(MessageContext); diff --git a/frontend/src/components/LeftSidebar/ThreadHistory.tsx b/frontend/src/components/LeftSidebar/ThreadHistory.tsx index e7c2bf4866..35138f7cec 100644 --- a/frontend/src/components/LeftSidebar/ThreadHistory.tsx +++ b/frontend/src/components/LeftSidebar/ThreadHistory.tsx @@ -1,11 +1,10 @@ import { uniqBy } from 'lodash'; import { useContext, useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; -import { useRecoilState } from 'recoil'; import { ChainlitContext, - threadHistoryState, + useAuthStore, useChatMessages } from '@chainlit/react-client'; @@ -25,7 +24,9 @@ export function ThreadHistory() { const scrollRef = useRef(null); const apiClient = useContext(ChainlitContext); const { firstInteraction, messages, threadId } = useChatMessages(); - const [threadHistory, setThreadHistory] = useRecoilState(threadHistoryState); + const threadHistory = useAuthStore((state) => state.threadHistory); + const setThreadHistory = useAuthStore((state) => state.setThreadHistory); + const [error, setError] = useState(); const [isLoadingMore, setIsLoadingMore] = useState(false); const [isFetching, setIsFetching] = useState(false); @@ -91,11 +92,10 @@ export function ThreadHistory() { ); if (allThreads) { - setThreadHistory((prev) => ({ - ...prev, + setThreadHistory({ pageInfo, threads: allThreads - })); + }); } } catch (err) { setError(err instanceof Error ? err.message : 'Unknown error occurred'); diff --git a/frontend/src/components/LeftSidebar/ThreadList.tsx b/frontend/src/components/LeftSidebar/ThreadList.tsx index ca97d42683..7a4b41218b 100644 --- a/frontend/src/components/LeftSidebar/ThreadList.tsx +++ b/frontend/src/components/LeftSidebar/ThreadList.tsx @@ -3,14 +3,13 @@ import { size } from 'lodash'; import { useContext, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Link, useNavigate } from 'react-router-dom'; -import { useSetRecoilState } from 'recoil'; import { toast } from 'sonner'; import { ChainlitContext, ClientError, ThreadHistory, - threadHistoryState, + useAuthStore, useChatInteract, useChatMessages, useChatSession @@ -78,7 +77,7 @@ export function ThreadList({ const [threadIdToDelete, setThreadIdToDelete] = useState(); const [threadIdToRename, setThreadIdToRename] = useState(); const [threadNewName, setThreadNewName] = useState(); - const setThreadHistory = useSetRecoilState(threadHistoryState); + const setThreadHistory = useAuthStore((state) => state.setThreadHistory); const apiClient = useContext(ChainlitContext); const sortedTimeGroupKeys = useMemo(() => { diff --git a/frontend/src/components/ReadOnlyThread.tsx b/frontend/src/components/ReadOnlyThread.tsx index 8719c79b7f..e9f279d86c 100644 --- a/frontend/src/components/ReadOnlyThread.tsx +++ b/frontend/src/components/ReadOnlyThread.tsx @@ -2,7 +2,6 @@ import { MessageContext } from '@/contexts/MessageContext'; import { useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useNavigate } from 'react-router-dom'; -import { useSetRecoilState } from 'recoil'; import { toast } from 'sonner'; import { @@ -13,8 +12,8 @@ import { IStep, IThread, nestMessages, - sideViewState, useApi, + useChatStore, useConfig } from '@chainlit/react-client'; @@ -38,7 +37,8 @@ const ReadOnlyThread = ({ id }: Props) => { revalidateOnFocus: false }); const navigate = useNavigate(); - const setSideView = useSetRecoilState(sideViewState); + const setSideView = useChatStore((state) => state.setSideView); + const [steps, setSteps] = useState([]); const apiClient = useContext(ChainlitContext); const { t } = useTranslation(); diff --git a/frontend/src/components/chat/MessageComposer/CommandButtons.tsx b/frontend/src/components/chat/MessageComposer/CommandButtons.tsx index 91a8a8df10..f7ce993edb 100644 --- a/frontend/src/components/chat/MessageComposer/CommandButtons.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandButtons.tsx @@ -1,7 +1,6 @@ import { cn } from '@/lib/utils'; -import { useRecoilValue } from 'recoil'; -import { ICommand, commandsState } from '@chainlit/react-client'; +import { ICommand, useChatStore } from '@chainlit/react-client'; import Icon from '@/components/Icon'; import { Button } from '@/components/ui/button'; @@ -23,8 +22,8 @@ export const CommandButtons = ({ selectedCommandId, onCommandSelect }: Props) => { - const commands = useRecoilValue(commandsState); - const commandButtons = commands.filter((c) => !!c.button); + const commands = useChatStore((state) => state.commands); + const commandButtons = commands.filter((command) => !!command.button); if (!commandButtons.length) return null; diff --git a/frontend/src/components/chat/MessageComposer/CommandPopoverButton.tsx b/frontend/src/components/chat/MessageComposer/CommandPopoverButton.tsx index 919f578493..27ab423fa5 100644 --- a/frontend/src/components/chat/MessageComposer/CommandPopoverButton.tsx +++ b/frontend/src/components/chat/MessageComposer/CommandPopoverButton.tsx @@ -4,9 +4,8 @@ import { PopoverTrigger } from '@radix-ui/react-popover'; import { every } from 'lodash'; -import { useRecoilValue } from 'recoil'; -import { ICommand, commandsState } from '@chainlit/react-client'; +import { ICommand, useChatStore } from '@chainlit/react-client'; import Icon from '@/components/Icon'; import { ToolBox } from '@/components/icons/ToolBox'; @@ -33,8 +32,8 @@ export const CommandPopoverButton = ({ disabled = false, onCommandSelect }: Props) => { - const commands = useRecoilValue(commandsState); - const allButtons = every(commands.map((c) => !!c.button)); + const commands = useChatStore((state) => state.commands); + const allButtons = every(commands.map((command) => !!command.button)); if (!commands.length || allButtons) return null; diff --git a/frontend/src/components/chat/MessageComposer/Input.tsx b/frontend/src/components/chat/MessageComposer/Input.tsx index 857715716b..d5a3dd7c5f 100644 --- a/frontend/src/components/chat/MessageComposer/Input.tsx +++ b/frontend/src/components/chat/MessageComposer/Input.tsx @@ -6,9 +6,8 @@ import React, { useRef, useState } from 'react'; -import { useRecoilValue } from 'recoil'; -import { ICommand, commandsState } from '@chainlit/react-client'; +import { ICommand, useChatStore } from '@chainlit/react-client'; import Icon from '@/components/Icon'; import { @@ -49,7 +48,7 @@ const Input = forwardRef( }, ref ) => { - const commands = useRecoilValue(commandsState); + const commands = useChatStore((state) => state.commands); const [isComposing, setIsComposing] = useState(false); const [showCommands, setShowCommands] = useState(false); const [selectedIndex, setSelectedIndex] = useState(0); diff --git a/frontend/src/components/chat/MessageComposer/Mcp/AddForm.tsx b/frontend/src/components/chat/MessageComposer/Mcp/AddForm.tsx index fe8c13025b..246255a97d 100644 --- a/frontend/src/components/chat/MessageComposer/Mcp/AddForm.tsx +++ b/frontend/src/components/chat/MessageComposer/Mcp/AddForm.tsx @@ -1,11 +1,10 @@ import { useContext, useState } from 'react'; -import { useRecoilValue, useSetRecoilState } from 'recoil'; import { toast } from 'sonner'; import { ChainlitContext, - mcpState, - sessionIdState + useMcpStore, + useSessionState } from '@chainlit/react-client'; import { Button } from '@/components/ui/button'; @@ -36,8 +35,8 @@ export const McpAddForm = ({ allowHttp }: McpAddFormProps) => { const apiClient = useContext(ChainlitContext); - const sessionId = useRecoilValue(sessionIdState); - const setMcps = useSetRecoilState(mcpState); + const sessionId = useSessionState((state) => state.sessionId); + const setMcps = useMcpStore((state) => state.setMcps); const [serverName, setServerName] = useState(''); // Pick the first protocol enabled by the parent component. diff --git a/frontend/src/components/chat/MessageComposer/Mcp/List.tsx b/frontend/src/components/chat/MessageComposer/Mcp/List.tsx index 6f38634773..56a20f6d45 100644 --- a/frontend/src/components/chat/MessageComposer/Mcp/List.tsx +++ b/frontend/src/components/chat/MessageComposer/Mcp/List.tsx @@ -1,14 +1,13 @@ import { cn } from '@/lib/utils'; import { Link, RefreshCw, SquareTerminal, Trash2, Wrench } from 'lucide-react'; import { useContext, useState } from 'react'; -import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'; import { toast } from 'sonner'; import { ChainlitContext, IMcp, - mcpState, - sessionIdState + useMcpStore, + useSessionState } from '@chainlit/react-client'; import CopyButton from '@/components/CopyButton'; @@ -33,8 +32,10 @@ interface McpListProps { export const McpList = ({ onAddNewClick }: McpListProps) => { const apiClient = useContext(ChainlitContext); - const sessionId = useRecoilValue(sessionIdState); - const [mcps, setMcps] = useRecoilState(mcpState); + const sessionId = useSessionState((state) => state.sessionId); + const mcps = useMcpStore((state) => state.mcps); + const setMcps = useMcpStore((state) => state.setMcps); + const [isLoading, setIsLoading] = useState(false); const deleteMcp = (mcp: IMcp) => { @@ -194,8 +195,9 @@ const DeleteMcpButton = ({ mcp, onDelete, disabled }: DeleteMcpButtonProps) => { const ReconnectMcpButton = ({ mcp }: { mcp: IMcp }) => { const apiClient = useContext(ChainlitContext); - const setMcps = useSetRecoilState(mcpState); - const sessionId = useRecoilValue(sessionIdState); + const setMcps = useMcpStore((state) => state.setMcps); + const sessionId = useSessionState((state) => state.sessionId); + const [isLoading, setIsLoading] = useState(false); const reconnectMcp = () => { diff --git a/frontend/src/components/chat/MessageComposer/Mcp/index.tsx b/frontend/src/components/chat/MessageComposer/Mcp/index.tsx index eaf1d4dbfe..72265e4fda 100644 --- a/frontend/src/components/chat/MessageComposer/Mcp/index.tsx +++ b/frontend/src/components/chat/MessageComposer/Mcp/index.tsx @@ -1,8 +1,7 @@ import { Plug } from 'lucide-react'; import { useState } from 'react'; -import { useRecoilState } from 'recoil'; -import { mcpState, useConfig } from '@chainlit/react-client'; +import { useConfig, useMcpStore } from '@chainlit/react-client'; import { Button } from '@/components/ui/button'; import { @@ -30,7 +29,7 @@ interface Props { const McpButton = ({ disabled }: Props) => { const { config } = useConfig(); - const [mcps] = useRecoilState(mcpState); + const mcps = useMcpStore((state) => state.mcps); const [open, setOpen] = useState(false); const [activeTab, setActiveTab] = useState('add'); diff --git a/frontend/src/components/chat/Messages/Message/Buttons/Actions/ActionButton.tsx b/frontend/src/components/chat/Messages/Message/Buttons/Actions/ActionButton.tsx index dd9f4a0e2b..4d83a7d43f 100644 --- a/frontend/src/components/chat/Messages/Message/Buttons/Actions/ActionButton.tsx +++ b/frontend/src/components/chat/Messages/Message/Buttons/Actions/ActionButton.tsx @@ -1,12 +1,11 @@ import { MessageContext } from 'contexts/MessageContext'; import { useCallback, useContext, useMemo, useState } from 'react'; -import { useRecoilValue } from 'recoil'; import { toast } from 'sonner'; import { ChainlitContext, type IAction, - sessionIdState + useSessionState } from '@chainlit/react-client'; import Icon from '@/components/Icon'; @@ -26,7 +25,7 @@ interface ActionProps { const ActionButton = ({ action }: ActionProps) => { const { loading, askUser } = useContext(MessageContext); const apiClient = useContext(ChainlitContext); - const sessionId = useRecoilValue(sessionIdState); + const sessionId = useSessionState((state) => state.sessionId); const [isRunning, setIsRunning] = useState(false); const content = useMemo(() => { diff --git a/frontend/src/components/chat/Messages/Message/Buttons/FeedbackButtons.tsx b/frontend/src/components/chat/Messages/Message/Buttons/FeedbackButtons.tsx index 2f74b31ce4..531a656f0f 100644 --- a/frontend/src/components/chat/Messages/Message/Buttons/FeedbackButtons.tsx +++ b/frontend/src/components/chat/Messages/Message/Buttons/FeedbackButtons.tsx @@ -1,13 +1,8 @@ import { MessageContext } from '@/contexts/MessageContext'; import { MessageCircle, ThumbsDown, ThumbsUp } from 'lucide-react'; import { useCallback, useContext, useState } from 'react'; -import { useRecoilValue } from 'recoil'; -import { - IStep, - firstUserInteraction, - useChatSession -} from '@chainlit/react-client'; +import { IStep, useChatSession, useUserState } from '@chainlit/react-client'; import Translator from '@/components/i18n/Translator'; import { Button } from '@/components/ui/button'; @@ -42,7 +37,8 @@ export function FeedbackButtons({ message }: FeedbackButtonsProps) { ); const [showDialog, setShowDialog] = useState(); const [commentInput, setCommentInput] = useState(); - const firstInteraction = useRecoilValue(firstUserInteraction); + const firstInteraction = useUserState((state) => state.firstUserInteraction); + const { idToResume } = useChatSession(); if (!showFeedbackButtons) { diff --git a/frontend/src/components/chat/Messages/Message/UserMessage.tsx b/frontend/src/components/chat/Messages/Message/UserMessage.tsx index 32403dcf0f..45e490533f 100644 --- a/frontend/src/components/chat/Messages/Message/UserMessage.tsx +++ b/frontend/src/components/chat/Messages/Message/UserMessage.tsx @@ -1,13 +1,12 @@ import { cn } from '@/lib/utils'; import { MessageContext } from 'contexts/MessageContext'; import { useContext, useMemo, useState } from 'react'; -import { useSetRecoilState } from 'recoil'; import { IMessageElement, IStep, - messagesState, - useChatInteract + useChatInteract, + useMessagesStore } from '@chainlit/react-client'; import AutoResizeTextarea from '@/components/AutoResizeTextarea'; @@ -29,7 +28,8 @@ export default function UserMessage({ }: React.PropsWithChildren) { const { askUser, loading, editable } = useContext(MessageContext); const { editMessage } = useChatInteract(); - const setMessages = useSetRecoilState(messagesState); + const setMessages = useMessagesStore((state) => state.setMessages); + const disabled = loading || !!askUser; const [isEditing, setIsEditing] = useState(false); const [editValue, setEditValue] = useState(''); diff --git a/frontend/src/components/chat/MessagesContainer/index.tsx b/frontend/src/components/chat/MessagesContainer/index.tsx index 7c4df3a521..29d9d0a522 100644 --- a/frontend/src/components/chat/MessagesContainer/index.tsx +++ b/frontend/src/components/chat/MessagesContainer/index.tsx @@ -1,6 +1,5 @@ import { MessageContext } from '@/contexts/MessageContext'; import { useCallback, useContext, useMemo } from 'react'; -import { useSetRecoilState } from 'recoil'; import { toast } from 'sonner'; import { @@ -8,13 +7,13 @@ import { IFeedback, IMessageElement, IStep, - messagesState, - sideViewState, updateMessageById, useChatData, useChatInteract, useChatMessages, - useConfig + useChatStore, + useConfig, + useMessagesStore } from '@chainlit/react-client'; import { Messages } from '@/components/chat/Messages'; @@ -30,8 +29,9 @@ const MessagesContainer = ({ navigate }: Props) => { const { elements, askUser, loading, actions } = useChatData(); const { messages } = useChatMessages(); const { uploadFile: _uploadFile } = useChatInteract(); - const setMessages = useSetRecoilState(messagesState); - const setSideView = useSetRecoilState(sideViewState); + + const setMessages = useMessagesStore((state) => state.setMessages); + const setSideView = useChatStore((state) => state.setSideView); const { t } = useTranslation(); diff --git a/frontend/src/components/chat/index.tsx b/frontend/src/components/chat/index.tsx index 3011ab98db..a50f8cf340 100644 --- a/frontend/src/components/chat/index.tsx +++ b/frontend/src/components/chat/index.tsx @@ -5,8 +5,8 @@ import { toast } from 'sonner'; import { v4 as uuidv4 } from 'uuid'; import { - threadHistoryState, useAuth, + useAuthStore, useChatData, useChatInteract, useChatMessages, @@ -33,7 +33,7 @@ const Chat = () => { const { user } = useAuth(); const { config } = useConfig(); const setAttachments = useSetRecoilState(attachmentsState); - const setThreads = useSetRecoilState(threadHistoryState); + const setThreads = useAuthStore((state) => state.setThreadHistory); const autoScrollRef = useRef(true); const { error, disabled, callFn } = useChatData(); @@ -180,10 +180,9 @@ const Chat = () => { ) { navigate(`/thread/${threadId}`); } else { - setThreads((prev) => ({ - ...prev, + setThreads({ currentThreadId: threadId - })); + }); } }, []); diff --git a/frontend/src/pages/Page.tsx b/frontend/src/pages/Page.tsx index 1edaf53934..2fb746a15a 100644 --- a/frontend/src/pages/Page.tsx +++ b/frontend/src/pages/Page.tsx @@ -1,7 +1,7 @@ import { Navigate } from 'react-router-dom'; import { useRecoilValue } from 'recoil'; -import { sideViewState, useAuth, useConfig } from '@chainlit/react-client'; +import { useAuth, useChatStore, useConfig } from '@chainlit/react-client'; import ElementSideView from '@/components/ElementSideView'; import LeftSidebar from '@/components/LeftSidebar'; @@ -20,7 +20,7 @@ const Page = ({ children }: Props) => { const { config } = useConfig(); const { data } = useAuth(); const userEnv = useRecoilValue(userEnvState); - const sideView = useRecoilValue(sideViewState); + const sideView = useChatStore((state) => state.sideView); if (config?.userEnv) { for (const key of config.userEnv || []) { diff --git a/frontend/src/pages/Thread.tsx b/frontend/src/pages/Thread.tsx index c0a813cb60..d61da2f62c 100644 --- a/frontend/src/pages/Thread.tsx +++ b/frontend/src/pages/Thread.tsx @@ -1,11 +1,10 @@ import { useEffect } from 'react'; import { useParams } from 'react-router-dom'; -import { useSetRecoilState } from 'recoil'; import Page from 'pages/Page'; import { - threadHistoryState, + useAuthStore, useChatMessages, useConfig } from '@chainlit/react-client'; @@ -19,17 +18,16 @@ export default function ThreadPage() { const { id } = useParams(); const { config } = useConfig(); - const setThreadHistory = useSetRecoilState(threadHistoryState); + const threadHistory = useAuthStore((state) => state.threadHistory); + const setThreadHistory = useAuthStore((state) => state.setThreadHistory); const { threadId } = useChatMessages(); const isCurrentThread = threadId === id; useEffect(() => { - setThreadHistory((prev) => { - if (prev?.currentThreadId === id) return prev; - return { ...prev, currentThreadId: id }; - }); + if (threadHistory?.currentThreadId === id) return; + setThreadHistory({ currentThreadId: id }); }, [id]); return ( diff --git a/libs/copilot/src/chat/index.tsx b/libs/copilot/src/chat/index.tsx index a5feff858a..ba1ea4ad86 100644 --- a/libs/copilot/src/chat/index.tsx +++ b/libs/copilot/src/chat/index.tsx @@ -1,20 +1,15 @@ import { useEffect, useRef } from 'react'; -import { useRecoilValue, useSetRecoilState } from 'recoil'; +import { useRecoilValue } from 'recoil'; -import { - threadIdToResumeState, - useChatInteract, - useChatSession -} from '@chainlit/react-client'; +import { useChatInteract, useChatSession } from '@chainlit/react-client'; import { copilotThreadIdState } from '../state'; import ChatBody from './body'; export default function ChatWrapper() { const { connect, session, idToResume } = useChatSession(); - const { sendMessage } = useChatInteract(); + const { sendMessage, setIdToResume } = useChatInteract(); const copilotThreadId = useRecoilValue(copilotThreadIdState); - const setThreadIdToResume = useSetRecoilState(threadIdToResumeState); const hasConnected = useRef(false); const lastConnectedThreadId = useRef(null); @@ -23,8 +18,8 @@ export default function ChatWrapper() { return; } - setThreadIdToResume(copilotThreadId); - }, [copilotThreadId, setThreadIdToResume]); + setIdToResume(copilotThreadId); + }, [copilotThreadId, idToResume]); useEffect(() => { if ( diff --git a/libs/copilot/src/components/ElementSideView.tsx b/libs/copilot/src/components/ElementSideView.tsx index a9359096c9..075293d467 100644 --- a/libs/copilot/src/components/ElementSideView.tsx +++ b/libs/copilot/src/components/ElementSideView.tsx @@ -1,5 +1,3 @@ -import { useRecoilState } from 'recoil'; - import { Element } from '@chainlit/app/src/components/Elements'; import { Dialog, @@ -7,10 +5,11 @@ import { DialogHeader, DialogTitle } from '@chainlit/app/src/components/ui/dialog'; -import { sideViewState } from '@chainlit/react-client'; +import { useChatStore } from '@chainlit/react-client'; export default function ElementSideView() { - const [sideView, setSideView] = useRecoilState(sideViewState); + const sideView = useChatStore((state) => state.sideView); + const setSideView = useChatStore((state) => state.setSideView); if (!sideView || sideView.title === 'canvas') return null; diff --git a/libs/react-client/package.json b/libs/react-client/package.json index 5da188c445..ff766eb671 100644 --- a/libs/react-client/package.json +++ b/libs/react-client/package.json @@ -1,10 +1,10 @@ { "name": "@chainlit/react-client", "description": "Websocket client to connect to your chainlit app.", - "version": "0.2.4", + "version": "0.3.0", "scripts": { - "build": "tsup src/index.ts --tsconfig tsconfig.build.json --clean --format esm,cjs --dts --external react --external recoil --minify --sourcemap --treeshake", - "dev": "tsup src/index.ts --clean --format esm,cjs --dts --external react --external recoil --minify --sourcemap --treeshake", + "build": "tsup src/index.ts --tsconfig tsconfig.build.json --clean --format esm,cjs --dts --external react --external zustand --minify --sourcemap --treeshake", + "dev": "tsup src/index.ts --clean --format esm,cjs --dts --external react --external zustand --minify --sourcemap --treeshake", "lint": "eslint ./src --ext ts,tsx --report-unused-disable-directives --max-warnings 0 && tsc --noemit", "format": "prettier '**/*.{ts,tsx}' --write", "test": "echo no tests yet", @@ -31,33 +31,35 @@ "types": "dist/index.d.ts", "devDependencies": { "@swc/core": "^1.3.86", - "@testing-library/jest-dom": "^5.17.0", - "@testing-library/react": "^14.0.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.2.0", "@types/lodash": "^4.14.199", "@types/uuid": "^9.0.3", "@vitejs/plugin-react": "^4.0.4", "@vitejs/plugin-react-swc": "^3.3.2", "jsdom": "^22.1.0", "tslib": "^2.6.2", - "tsup": "^7.2.0", + "tsup": "^8.4.0", "typescript": "^5.2.2", "vite": "^5.4.14", "vite-tsconfig-paths": "^4.2.0", "vitest": "^0.34.4" }, "peerDependencies": { - "@types/react": "^18.3.1", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "recoil": "^0.7.7" + "@types/react": "^19.0.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "zustand": "^5.0.3" }, "dependencies": { "jwt-decode": "^3.1.2", "lodash": "^4.17.21", "socket.io-client": "^4.7.2", "sonner": "^1.7.1", - "swr": "^2.2.2", - "uuid": "^9.0.0" + "swr": "^2.3.0", + "uuid": "^9.0.0", + "zustand": "^5.0.3" }, "pnpm": { "overrides": { diff --git a/libs/react-client/pnpm-lock.yaml b/libs/react-client/pnpm-lock.yaml index 9ab79fd928..73e54fca62 100644 --- a/libs/react-client/pnpm-lock.yaml +++ b/libs/react-client/pnpm-lock.yaml @@ -22,8 +22,8 @@ importers: .: dependencies: '@types/react': - specifier: ^18.3.1 - version: 18.3.18 + specifier: ^19.0.0 + version: 19.0.8 jwt-decode: specifier: ^3.1.2 version: 3.1.2 @@ -31,36 +31,39 @@ importers: specifier: ^4.17.21 version: 4.17.21 react: - specifier: ^18.3.1 - version: 18.3.1 + specifier: ^19.0.0 + version: 19.0.0 react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) - recoil: - specifier: ^0.7.7 - version: 0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^19.0.0 + version: 19.0.0(react@19.0.0) socket.io-client: specifier: ^4.7.2 version: 4.7.2 sonner: specifier: ^1.7.1 - version: 1.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) swr: - specifier: ^2.2.2 - version: 2.2.2(react@18.3.1) + specifier: ^2.3.0 + version: 2.3.0(react@19.0.0) uuid: specifier: ^9.0.0 version: 9.0.0 + zustand: + specifier: ^5.0.3 + version: 5.0.3(@types/react@19.0.8)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)) devDependencies: '@swc/core': specifier: ^1.3.86 version: 1.3.86 + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.0 '@testing-library/jest-dom': - specifier: ^5.17.0 - version: 5.17.0 + specifier: ^6.6.3 + version: 6.6.3 '@testing-library/react': - specifier: ^14.0.0 - version: 14.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^16.2.0 + version: 16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.15)(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@types/lodash': specifier: ^4.14.199 version: 4.14.199 @@ -80,8 +83,8 @@ importers: specifier: ^2.6.2 version: 2.6.2 tsup: - specifier: ^7.2.0 - version: 7.2.0(@swc/core@1.3.86)(postcss@8.4.47)(typescript@5.2.2) + specifier: ^8.4.0 + version: 8.4.0(@swc/core@1.3.86)(postcss@8.4.47)(typescript@5.2.2) typescript: specifier: ^5.2.2 version: 5.2.2 @@ -217,11 +220,11 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.18.20': - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} @@ -229,10 +232,10 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm@0.18.20': - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} + engines: {node: '>=18'} + cpu: [arm64] os: [android] '@esbuild/android-arm@0.21.5': @@ -241,10 +244,10 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.18.20': - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} + engines: {node: '>=18'} + cpu: [arm] os: [android] '@esbuild/android-x64@0.21.5': @@ -253,11 +256,11 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.18.20': - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} @@ -265,10 +268,10 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.18.20': - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} + engines: {node: '>=18'} + cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.21.5': @@ -277,11 +280,11 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.18.20': - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} @@ -289,10 +292,10 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.18.20': - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} + engines: {node: '>=18'} + cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.21.5': @@ -301,11 +304,11 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.18.20': - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} @@ -313,10 +316,10 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.18.20': - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} + engines: {node: '>=18'} + cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.21.5': @@ -325,10 +328,10 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.18.20': - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} + engines: {node: '>=18'} + cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.21.5': @@ -337,10 +340,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.18.20': - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} + engines: {node: '>=18'} + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.21.5': @@ -349,10 +352,10 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.18.20': - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} + engines: {node: '>=18'} + cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.21.5': @@ -361,10 +364,10 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.18.20': - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} + engines: {node: '>=18'} + cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.21.5': @@ -373,10 +376,10 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.18.20': - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} + engines: {node: '>=18'} + cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.21.5': @@ -385,10 +388,10 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.18.20': - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} + engines: {node: '>=18'} + cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.21.5': @@ -397,10 +400,10 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.18.20': - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} + engines: {node: '>=18'} + cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.21.5': @@ -409,10 +412,16 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.18.20': - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} + engines: {node: '>=18'} cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} + engines: {node: '>=18'} + cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.21.5': @@ -421,10 +430,16 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.18.20': - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} + engines: {node: '>=18'} cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} + engines: {node: '>=18'} + cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.21.5': @@ -433,11 +448,11 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.18.20': - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} + engines: {node: '>=18'} cpu: [x64] - os: [sunos] + os: [openbsd] '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} @@ -445,11 +460,11 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.18.20': - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} @@ -457,10 +472,10 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.18.20': - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} + engines: {node: '>=18'} + cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.21.5': @@ -469,10 +484,10 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.18.20': - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} + engines: {node: '>=18'} + cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.21.5': @@ -481,22 +496,20 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.3': resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -515,18 +528,6 @@ packages: '@jridgewell/trace-mapping@0.3.20': resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -536,81 +537,181 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.40.2': + resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.24.0': resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.40.2': + resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.24.0': resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.40.2': + resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.24.0': resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.40.2': + resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.2': + resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.2': + resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.24.0': resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.24.0': resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.40.2': + resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.24.0': resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.40.2': + resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.24.0': resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.2': + resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.24.0': resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.40.2': + resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.24.0': resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.40.2': + resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.24.0': resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.40.2': + resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.24.0': resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.40.2': + resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.24.0': resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.40.2': + resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.24.0': resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.40.2': + resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + cpu: [x64] + os: [win32] + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -689,20 +790,28 @@ packages: '@swc/types@0.1.5': resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} - '@testing-library/dom@9.3.3': - resolution: {integrity: sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==} - engines: {node: '>=14'} + '@testing-library/dom@10.4.0': + resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} + engines: {node: '>=18'} - '@testing-library/jest-dom@5.17.0': - resolution: {integrity: sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==} - engines: {node: '>=8', npm: '>=6', yarn: '>=1'} + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} + engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@14.0.0': - resolution: {integrity: sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==} - engines: {node: '>=14'} + '@testing-library/react@16.2.0': + resolution: {integrity: sha512-2cSskAvA1QNtKc8Y9VJQRv0tm3hLVgxRGDB+KYhIaPQJ1I+RHbhIXcM+zClKXzMes/wshsMVzf4B9vS4IZpqDQ==} + engines: {node: '>=18'} peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -720,17 +829,8 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@29.5.8': - resolution: {integrity: sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/lodash@4.14.199': resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} @@ -738,30 +838,15 @@ packages: '@types/node@20.9.0': resolution: {integrity: sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==} - '@types/prop-types@15.7.10': - resolution: {integrity: sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==} - '@types/react-dom@18.2.15': resolution: {integrity: sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==} - '@types/react@18.3.18': - resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} - - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/testing-library__jest-dom@5.14.9': - resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} + '@types/react@19.0.8': + resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} '@types/uuid@9.0.3': resolution: {integrity: sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug==} - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.31': - resolution: {integrity: sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==} - '@vitejs/plugin-react-swc@3.3.2': resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==} peerDependencies: @@ -831,65 +916,36 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} browserslist@4.22.1: resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bundle-require@4.0.2: - resolution: {integrity: sha512-jwzPOChofl67PSTW2SGubV9HBQAhhR2i6nskiOThauo9dzwDUgOWQScFVaJkjEfYX+UXiD+LEx8EblQMc2wIag==} + bundle-require@5.1.0: + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.17' + esbuild: '>=0.18' cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - caniuse-lite@1.0.30001562: resolution: {integrity: sha512-kfte3Hym//51EdX4239i+Rmp20EsLIYGdPkERegTgU19hQWCRhsRFGKHTliUlsry53tv17K7n077Kqa0WJU4ng==} @@ -912,16 +968,9 @@ packages: check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -944,6 +993,10 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -974,6 +1027,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -981,18 +1043,6 @@ packages: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - - define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1005,13 +1055,12 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + dom-accessibility-api@0.6.3: + resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} + domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} @@ -1039,19 +1088,16 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} + engines: {node: '>=18'} + hasBin: true + escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -1060,31 +1106,13 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} @@ -1099,12 +1127,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1112,17 +1134,6 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -1131,25 +1142,9 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - hamt_plus@1.0.2: - resolution: {integrity: sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA==} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -1158,25 +1153,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -1189,139 +1165,27 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -1354,9 +1218,9 @@ packages: jwt-decode@3.1.2: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -1375,10 +1239,6 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} @@ -1396,17 +1256,6 @@ packages: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1415,10 +1264,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -1437,6 +1282,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -1448,14 +1296,6 @@ packages: node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} @@ -1463,25 +1303,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1500,10 +1321,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} @@ -1516,9 +1333,12 @@ packages: picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} @@ -1527,16 +1347,22 @@ packages: pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - postcss-load-config@4.0.1: - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} + postcss-load-config@6.0.1: + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: + jiti: '>=1.21.0' postcss: '>=8.0.9' - ts-node: '>=9.0.0' + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true postcss@8.4.47: @@ -1561,13 +1387,10 @@ packages: querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + react-dom@19.0.0: + resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} peerDependencies: - react: ^18.3.1 + react: ^19.0.0 react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} @@ -1579,25 +1402,13 @@ packages: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} engines: {node: '>=0.10.0'} - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - recoil@0.7.7: - resolution: {integrity: sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==} - peerDependencies: - react: '>=16.13.1' - react-dom: '*' - react-native: '*' - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -1606,10 +1417,6 @@ packages: regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -1617,21 +1424,19 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.24.0: resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.40.2: + resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + rrweb-cssom@0.6.0: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -1639,21 +1444,13 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.25.0: + resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1662,23 +1459,13 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - socket.io-client@4.7.2: resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} engines: {node: '>=10.0.0'} @@ -1701,20 +1488,12 @@ packages: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@3.5.0: resolution: {integrity: sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA==} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1731,10 +1510,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -1755,10 +1530,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - swr@2.2.2: - resolution: {integrity: sha512-CbR41AoMD4TQBQw9ic3GTXspgfM9Y8Mdhb5Ob4uIKXhWqnRLItwA5fpGvB7SmSw3+zEjb0PdhiEumtUvYoQ+bQ==} + swr@2.3.0: + resolution: {integrity: sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==} peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -1773,6 +1548,13 @@ packages: tinybench@2.5.1: resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + tinypool@0.7.0: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} @@ -1785,10 +1567,6 @@ packages: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} @@ -1820,15 +1598,18 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsup@7.2.0: - resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} - engines: {node: '>=16.14'} + tsup@8.4.0: + resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} + engines: {node: '>=18'} hasBin: true peerDependencies: + '@microsoft/api-extractor': ^7.36.0 '@swc/core': ^1 postcss: ^8.4.12 - typescript: '>=4.1.0' + typescript: '>=4.5.0' peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true '@swc/core': optional: true postcss: @@ -1864,10 +1645,10 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + use-sync-external-store@1.4.0: + resolution: {integrity: sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==} peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 uuid@9.0.0: resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} @@ -1974,16 +1755,6 @@ packages: whatwg-url@7.1.0: resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - - which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2028,14 +1799,28 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zustand@5.0.3: + resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + snapshots: '@adobe/css-tools@4.4.0': {} @@ -2189,138 +1974,147 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.18.20': + '@esbuild/aix-ppc64@0.25.4': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm@0.18.20': + '@esbuild/android-arm64@0.25.4': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-x64@0.18.20': + '@esbuild/android-arm@0.25.4': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.18.20': + '@esbuild/android-x64@0.25.4': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-x64@0.18.20': + '@esbuild/darwin-arm64@0.25.4': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.18.20': + '@esbuild/darwin-x64@0.25.4': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.18.20': + '@esbuild/freebsd-arm64@0.25.4': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/linux-arm64@0.18.20': + '@esbuild/freebsd-x64@0.25.4': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.18.20': + '@esbuild/linux-arm64@0.25.4': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-ia32@0.18.20': + '@esbuild/linux-arm@0.25.4': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-loong64@0.18.20': + '@esbuild/linux-ia32@0.25.4': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-mips64el@0.18.20': + '@esbuild/linux-loong64@0.25.4': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-ppc64@0.18.20': + '@esbuild/linux-mips64el@0.25.4': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.18.20': + '@esbuild/linux-ppc64@0.25.4': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-s390x@0.18.20': + '@esbuild/linux-riscv64@0.25.4': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-x64@0.18.20': + '@esbuild/linux-s390x@0.25.4': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.18.20': + '@esbuild/linux-x64@0.25.4': + optional: true + + '@esbuild/netbsd-arm64@0.25.4': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.18.20': + '@esbuild/netbsd-x64@0.25.4': + optional: true + + '@esbuild/openbsd-arm64@0.25.4': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.18.20': + '@esbuild/openbsd-x64@0.25.4': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.18.20': + '@esbuild/sunos-x64@0.25.4': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.18.20': + '@esbuild/win32-arm64@0.25.4': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.18.20': + '@esbuild/win32-ia32@0.25.4': optional: true '@esbuild/win32-x64@0.21.5': optional: true + '@esbuild/win32-x64@0.25.4': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -2330,23 +2124,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/expect-utils@29.7.0': - dependencies: - jest-get-type: 29.6.3 - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.9.0 - '@types/yargs': 17.0.31 - chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 @@ -2359,22 +2140,10 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/trace-mapping@0.3.20': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': + '@jridgewell/trace-mapping@0.3.20': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 '@pkgjs/parseargs@0.11.0': optional: true @@ -2382,51 +2151,111 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.24.0': optional: true + '@rollup/rollup-android-arm-eabi@4.40.2': + optional: true + '@rollup/rollup-android-arm64@4.24.0': optional: true + '@rollup/rollup-android-arm64@4.40.2': + optional: true + '@rollup/rollup-darwin-arm64@4.24.0': optional: true + '@rollup/rollup-darwin-arm64@4.40.2': + optional: true + '@rollup/rollup-darwin-x64@4.24.0': optional: true + '@rollup/rollup-darwin-x64@4.40.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.2': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.24.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.24.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.40.2': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.24.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.40.2': + optional: true + '@rollup/rollup-linux-arm64-musl@4.24.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.40.2': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.24.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.40.2': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.2': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.24.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.40.2': + optional: true + '@rollup/rollup-linux-x64-gnu@4.24.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.40.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.24.0': optional: true + '@rollup/rollup-linux-x64-musl@4.40.2': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.24.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.40.2': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.24.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.40.2': + optional: true + '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.40.2': + optional: true + '@sinclair/typebox@0.27.8': {} '@socket.io/component-emitter@3.1.0': {} @@ -2478,36 +2307,36 @@ snapshots: '@swc/types@0.1.5': {} - '@testing-library/dom@9.3.3': + '@testing-library/dom@10.4.0': dependencies: '@babel/code-frame': 7.22.13 '@babel/runtime': 7.23.2 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@5.17.0': + '@testing-library/jest-dom@6.6.3': dependencies: '@adobe/css-tools': 4.4.0 - '@babel/runtime': 7.23.2 - '@types/testing-library__jest-dom': 5.14.9 aria-query: 5.3.0 chalk: 3.0.0 css.escape: 1.5.1 - dom-accessibility-api: 0.5.16 + dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@14.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.2.0(@testing-library/dom@10.4.0)(@types/react-dom@18.2.15)(@types/react@19.0.8)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@babel/runtime': 7.23.2 - '@testing-library/dom': 9.3.3 + '@testing-library/dom': 10.4.0 + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.8 '@types/react-dom': 18.2.15 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) '@tootallnate/once@2.0.0': {} @@ -2521,20 +2350,7 @@ snapshots: '@types/estree@1.0.6': {} - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/jest@29.5.8': - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + '@types/estree@1.0.7': {} '@types/lodash@4.14.199': {} @@ -2542,31 +2358,17 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/prop-types@15.7.10': {} - '@types/react-dom@18.2.15': dependencies: - '@types/react': 18.3.18 + '@types/react': 19.0.8 + optional: true - '@types/react@18.3.18': + '@types/react@19.0.8': dependencies: - '@types/prop-types': 15.7.10 csstype: 3.1.2 - '@types/stack-utils@2.0.3': {} - - '@types/testing-library__jest-dom@5.14.9': - dependencies: - '@types/jest': 29.5.8 - '@types/uuid@9.0.3': {} - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.31': - dependencies: - '@types/yargs-parser': 21.0.3 - '@vitejs/plugin-react-swc@3.3.2(vite@5.4.14(@types/node@20.9.0))': dependencies: '@swc/core': 1.3.86 @@ -2642,44 +2444,20 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - aria-query@5.3.0: dependencies: dequal: 2.0.3 - array-buffer-byte-length@1.0.0: - dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 - - array-union@2.1.0: {} - assertion-error@1.1.0: {} asynckit@0.4.0: {} - available-typed-arrays@1.0.5: {} - balanced-match@1.0.2: {} - binary-extensions@2.2.0: {} - - brace-expansion@2.0.2: + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - browserslist@4.22.1: dependencies: caniuse-lite: 1.0.30001562 @@ -2687,19 +2465,13 @@ snapshots: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) - bundle-require@4.0.2(esbuild@0.18.20): + bundle-require@5.1.0(esbuild@0.25.4): dependencies: - esbuild: 0.18.20 + esbuild: 0.25.4 load-tsconfig: 0.2.5 cac@6.7.14: {} - call-bind@1.0.5: - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - caniuse-lite@1.0.30001562: {} chai@4.3.10: @@ -2732,21 +2504,9 @@ snapshots: dependencies: get-func-name: 2.0.2 - chokidar@3.5.3: + chokidar@4.0.3: dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - ci-info@3.9.0: {} - - client-only@0.0.1: {} + readdirp: 4.1.2 color-convert@1.9.3: dependencies: @@ -2766,6 +2526,8 @@ snapshots: commander@4.1.1: {} + consola@3.4.2: {} + convert-source-map@2.0.0: {} cross-spawn@7.0.6: @@ -2792,57 +2554,26 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decimal.js@10.4.3: {} deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.2 - is-arguments: 1.1.1 - is-array-buffer: 3.0.2 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.1 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 - - define-data-property@1.1.1: - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - delayed-stream@1.0.0: {} dequal@2.0.3: {} diff-sequences@29.6.3: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - dom-accessibility-api@0.5.16: {} + dom-accessibility-api@0.6.3: {} + domexception@4.0.0: dependencies: webidl-conversions: 7.0.0 @@ -2871,43 +2602,6 @@ snapshots: entities@4.5.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - esbuild@0.18.20: - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -2934,51 +2628,41 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.25.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 + escalade@3.1.1: {} escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fastq@1.15.0: - dependencies: - reusify: 1.0.4 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 foreground-child@3.3.1: dependencies: @@ -2994,27 +2678,10 @@ snapshots: fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - - functions-have-names@1.2.3: {} - gensync@1.0.0-beta.2: {} get-func-name@2.0.2: {} - get-intrinsic@1.2.2: - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - - get-stream@6.0.1: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -3026,47 +2693,12 @@ snapshots: globals@11.12.0: {} - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - globrex@0.1.2: {} - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.2 - - graceful-fs@4.2.11: {} - - hamt_plus@1.0.2: {} - - has-bigints@1.0.2: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} - has-property-descriptors@1.0.1: - dependencies: - get-intrinsic: 1.2.2 - - has-proto@1.0.1: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.0: - dependencies: - function-bind: 1.1.2 - html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 @@ -3086,104 +2718,16 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - ignore@5.2.4: {} - indent-string@4.0.0: {} - internal-slot@1.0.6: - dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - - is-array-buffer@3.0.2: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - - is-callable@1.2.7: {} - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.0 - - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-map@2.0.2: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - - is-number@7.0.0: {} - is-potential-custom-element-name@1.0.1: {} - is-regex@1.1.4: - dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 - - is-set@2.0.2: {} - - is-shared-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.5 - - is-stream@2.0.1: {} - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.12: - dependencies: - which-typed-array: 1.1.13 - - is-weakmap@2.0.1: {} - - is-weakset@2.0.2: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - - isarray@2.0.5: {} - isexe@2.0.0: {} jackspeak@3.4.3: @@ -3192,43 +2736,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jest-diff@29.7.0: - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-get-type@29.6.3: {} - - jest-matcher-utils@29.7.0: - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-message-util@29.7.0: - dependencies: - '@babel/code-frame': 7.22.13 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.9.0 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - joycon@3.1.1: {} js-tokens@4.0.0: {} @@ -3271,7 +2778,7 @@ snapshots: jwt-decode@3.1.2: {} - lilconfig@2.1.0: {} + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -3283,10 +2790,6 @@ snapshots: lodash@4.17.21: {} - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - loupe@2.3.7: dependencies: get-func-name: 2.0.2 @@ -3303,28 +2806,17 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - mime-db@1.52.0: {} mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mimic-fn@2.1.0: {} - min-indent@1.0.1: {} minimatch@9.0.5: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.1 minipass@7.1.2: {} @@ -3337,6 +2829,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -3347,36 +2841,10 @@ snapshots: node-releases@2.0.13: {} - normalize-path@3.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - nwsapi@2.2.7: {} object-assign@4.1.1: {} - object-inspect@1.13.1: {} - - object-is@1.1.5: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.4: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 @@ -3394,8 +2862,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-type@4.0.0: {} - pathe@1.1.1: {} pathval@1.1.1: {} @@ -3404,7 +2870,9 @@ snapshots: picocolors@1.1.0: {} - picomatch@2.3.1: {} + picocolors@1.1.1: {} + + picomatch@4.0.2: {} pirates@4.0.6: {} @@ -3414,10 +2882,9 @@ snapshots: mlly: 1.4.2 pathe: 1.1.1 - postcss-load-config@4.0.1(postcss@8.4.47): + postcss-load-config@6.0.1(postcss@8.4.47): dependencies: - lilconfig: 2.1.0 - yaml: 2.3.4 + lilconfig: 3.1.3 optionalDependencies: postcss: 8.4.47 @@ -3445,13 +2912,10 @@ snapshots: querystringify@2.2.0: {} - queue-microtask@1.2.3: {} - - react-dom@18.3.1(react@18.3.1): + react-dom@19.0.0(react@19.0.0): dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 + react: 19.0.0 + scheduler: 0.25.0 react-is@17.0.2: {} @@ -3459,20 +2923,9 @@ snapshots: react-refresh@0.14.0: {} - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 + react@19.0.0: {} - recoil@0.7.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - hamt_plus: 1.0.2 - react: 18.3.1 - optionalDependencies: - react-dom: 18.3.1(react@18.3.1) + readdirp@4.1.2: {} redent@3.0.0: dependencies: @@ -3481,18 +2934,10 @@ snapshots: regenerator-runtime@0.14.0: {} - regexp.prototype.flags@1.5.1: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - requires-port@1.0.0: {} resolve-from@5.0.0: {} - reusify@1.0.4: {} - rollup@4.24.0: dependencies: '@types/estree': 1.0.6 @@ -3515,11 +2960,33 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.24.0 fsevents: 2.3.3 - rrweb-cssom@0.6.0: {} - - run-parallel@1.2.0: + rollup@4.40.2: dependencies: - queue-microtask: 1.2.3 + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.2 + '@rollup/rollup-android-arm64': 4.40.2 + '@rollup/rollup-darwin-arm64': 4.40.2 + '@rollup/rollup-darwin-x64': 4.40.2 + '@rollup/rollup-freebsd-arm64': 4.40.2 + '@rollup/rollup-freebsd-x64': 4.40.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 + '@rollup/rollup-linux-arm-musleabihf': 4.40.2 + '@rollup/rollup-linux-arm64-gnu': 4.40.2 + '@rollup/rollup-linux-arm64-musl': 4.40.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-gnu': 4.40.2 + '@rollup/rollup-linux-riscv64-musl': 4.40.2 + '@rollup/rollup-linux-s390x-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-musl': 4.40.2 + '@rollup/rollup-win32-arm64-msvc': 4.40.2 + '@rollup/rollup-win32-ia32-msvc': 4.40.2 + '@rollup/rollup-win32-x64-msvc': 4.40.2 + fsevents: 2.3.3 + + rrweb-cssom@0.6.0: {} safer-buffer@2.1.2: {} @@ -3527,45 +2994,20 @@ snapshots: dependencies: xmlchars: 2.2.0 - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 + scheduler@0.25.0: {} semver@6.3.1: {} - set-function-length@1.1.1: - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - - set-function-name@2.0.1: - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - side-channel@1.0.4: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - slash@3.0.0: {} - socket.io-client@4.7.2: dependencies: '@socket.io/component-emitter': 3.1.0 @@ -3584,10 +3026,10 @@ snapshots: transitivePeerDependencies: - supports-color - sonner@1.7.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + sonner@1.7.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) source-map-js@1.2.1: {} @@ -3595,18 +3037,10 @@ snapshots: dependencies: whatwg-url: 7.1.0 - stack-utils@2.0.6: - dependencies: - escape-string-regexp: 2.0.0 - stackback@0.0.2: {} std-env@3.5.0: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.6 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -3627,8 +3061,6 @@ snapshots: dependencies: ansi-regex: 6.1.0 - strip-final-newline@2.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -3655,11 +3087,11 @@ snapshots: dependencies: has-flag: 4.0.0 - swr@2.2.2(react@18.3.1): + swr@2.3.0(react@19.0.0): dependencies: - client-only: 0.0.1 - react: 18.3.1 - use-sync-external-store: 1.2.0(react@18.3.1) + dequal: 2.0.3 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) symbol-tree@3.2.4: {} @@ -3673,16 +3105,19 @@ snapshots: tinybench@2.5.1: {} + tinyexec@0.3.2: {} + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@0.7.0: {} tinyspy@2.2.0: {} to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - tough-cookie@4.1.3: dependencies: psl: 1.9.0 @@ -3708,29 +3143,33 @@ snapshots: tslib@2.6.2: {} - tsup@7.2.0(@swc/core@1.3.86)(postcss@8.4.47)(typescript@5.2.2): + tsup@8.4.0(@swc/core@1.3.86)(postcss@8.4.47)(typescript@5.2.2): dependencies: - bundle-require: 4.0.2(esbuild@0.18.20) + bundle-require: 5.1.0(esbuild@0.25.4) cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.18.20 - execa: 5.1.1 - globby: 11.1.0 + chokidar: 4.0.3 + consola: 3.4.2 + debug: 4.4.0 + esbuild: 0.25.4 joycon: 3.1.1 - postcss-load-config: 4.0.1(postcss@8.4.47) + picocolors: 1.1.1 + postcss-load-config: 6.0.1(postcss@8.4.47) resolve-from: 5.0.0 - rollup: 4.24.0 + rollup: 4.40.2 source-map: 0.8.0-beta.0 sucrase: 3.35.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.13 tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.3.86 postcss: 8.4.47 typescript: 5.2.2 transitivePeerDependencies: + - jiti - supports-color - - ts-node + - tsx + - yaml type-detect@4.0.8: {} @@ -3753,9 +3192,9 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-sync-external-store@1.2.0(react@18.3.1): + use-sync-external-store@1.4.0(react@19.0.0): dependencies: - react: 18.3.1 + react: 19.0.0 uuid@9.0.0: {} @@ -3861,29 +3300,6 @@ snapshots: tr46: 1.0.1 webidl-conversions: 4.0.2 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-collection@1.0.1: - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 - - which-typed-array@1.1.13: - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -3915,6 +3331,10 @@ snapshots: yallist@3.1.1: {} - yaml@2.3.4: {} - yocto-queue@1.0.0: {} + + zustand@5.0.3(@types/react@19.0.8)(react@19.0.0)(use-sync-external-store@1.4.0(react@19.0.0)): + optionalDependencies: + '@types/react': 19.0.8 + react: 19.0.0 + use-sync-external-store: 1.4.0(react@19.0.0) diff --git a/libs/react-client/src/api/hooks/auth/state.ts b/libs/react-client/src/api/hooks/auth/state.ts index 03a165f4ca..b0673bdfb7 100644 --- a/libs/react-client/src/api/hooks/auth/state.ts +++ b/libs/react-client/src/api/hooks/auth/state.ts @@ -1,10 +1,11 @@ -import { useRecoilState, useSetRecoilState } from 'recoil'; -import { authState, threadHistoryState, userState } from 'src/state'; +import { useAuthStore } from 'src/store/auth'; export const useAuthState = () => { - const [authConfig, setAuthConfig] = useRecoilState(authState); - const [user, setUser] = useRecoilState(userState); - const setThreadHistory = useSetRecoilState(threadHistoryState); + const authConfig = useAuthStore((state) => state.authConfig); + const setAuthConfig = useAuthStore((state) => state.setAuthConfig); + const user = useAuthStore((state) => state.user); + const setUser = useAuthStore((state) => state.setUser); + const setThreadHistory = useAuthStore((state) => state.setThreadHistory); return { authConfig, diff --git a/libs/react-client/src/index.ts b/libs/react-client/src/index.ts index 083d74abe4..a3c87e7953 100644 --- a/libs/react-client/src/index.ts +++ b/libs/react-client/src/index.ts @@ -7,8 +7,8 @@ export * from './useConfig'; export * from './api'; export * from './types'; export * from './context'; -export * from './state'; export * from './utils/message'; +export * from './store'; export { Socket } from 'socket.io-client'; diff --git a/libs/react-client/src/state.ts b/libs/react-client/src/state.ts deleted file mode 100644 index c527db52e3..0000000000 --- a/libs/react-client/src/state.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { isEqual } from 'lodash'; -import { AtomEffect, DefaultValue, atom, selector } from 'recoil'; -import { Socket } from 'socket.io-client'; -import { v4 as uuidv4 } from 'uuid'; - -import { ICommand } from './types/command'; - -import { - IAction, - IAsk, - IAuthConfig, - ICallFn, - IChainlitConfig, - IMcp, - IMessageElement, - IStep, - ITasklistElement, - IUser, - ThreadHistory -} from './types'; -import { groupByDate } from './utils/group'; -import { WavRecorder, WavStreamPlayer } from './wavtools'; - -export interface ISession { - socket: Socket; - error?: boolean; -} - -export const threadIdToResumeState = atom({ - key: 'ThreadIdToResume', - default: undefined -}); - -export const resumeThreadErrorState = atom({ - key: 'ResumeThreadErrorState', - default: undefined -}); - -export const chatProfileState = atom({ - key: 'ChatProfile', - default: undefined -}); - -const sessionIdAtom = atom({ - key: 'SessionId', - default: uuidv4() -}); - -export const sessionIdState = selector({ - key: 'SessionIdSelector', - get: ({ get }) => get(sessionIdAtom), - set: ({ set }, newValue) => - set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue) -}); - -export const sessionState = atom({ - key: 'Session', - dangerouslyAllowMutability: true, - default: undefined -}); - -export const actionState = atom({ - key: 'Actions', - default: [] -}); - -export const messagesState = atom({ - key: 'Messages', - dangerouslyAllowMutability: true, - default: [] -}); - -export const commandsState = atom({ - key: 'Commands', - default: [] -}); - -export const tokenCountState = atom({ - key: 'TokenCount', - default: 0 -}); - -export const loadingState = atom({ - key: 'Loading', - default: false -}); - -export const askUserState = atom({ - key: 'AskUser', - default: undefined -}); - -export const wavRecorderState = atom({ - key: 'WavRecorder', - dangerouslyAllowMutability: true, - default: new WavRecorder() -}); - -export const wavStreamPlayerState = atom({ - key: 'WavStreamPlayer', - dangerouslyAllowMutability: true, - default: new WavStreamPlayer() -}); - -export const audioConnectionState = atom<'connecting' | 'on' | 'off'>({ - key: 'AudioConnection', - default: 'off' -}); - -export const isAiSpeakingState = atom({ - key: 'isAiSpeaking', - default: false -}); - -export const callFnState = atom({ - key: 'CallFn', - default: undefined -}); - -export const chatSettingsInputsState = atom({ - key: 'ChatSettings', - default: [] -}); - -export const chatSettingsDefaultValueSelector = selector({ - key: 'ChatSettingsValue/Default', - get: ({ get }) => { - const chatSettings = get(chatSettingsInputsState); - return chatSettings.reduce( - (form: { [key: string]: any }, input: any) => ( - (form[input.id] = input.initial), form - ), - {} - ); - } -}); - -export const chatSettingsValueState = atom({ - key: 'ChatSettingsValue', - default: chatSettingsDefaultValueSelector -}); - -export const elementState = atom({ - key: 'DisplayElements', - default: [] -}); - -export const tasklistState = atom({ - key: 'TasklistElements', - default: [] -}); - -export const firstUserInteraction = atom({ - key: 'FirstUserInteraction', - default: undefined -}); - -export const userState = atom({ - key: 'User', - default: undefined -}); - -export const configState = atom({ - key: 'ChainlitConfig', - default: undefined -}); - -export const authState = atom({ - key: 'AuthConfig', - default: undefined -}); - -export const threadHistoryState = atom({ - key: 'ThreadHistory', - default: { - threads: undefined, - currentThreadId: undefined, - timeGroupedThreads: undefined, - pageInfo: undefined - }, - effects: [ - ({ setSelf, onSet }: { setSelf: any; onSet: any }) => { - onSet( - ( - newValue: ThreadHistory | undefined, - oldValue: ThreadHistory | undefined - ) => { - let timeGroupedThreads = newValue?.timeGroupedThreads; - if ( - newValue?.threads && - !isEqual(newValue.threads, oldValue?.timeGroupedThreads) - ) { - timeGroupedThreads = groupByDate(newValue.threads); - } - - setSelf({ - ...newValue, - timeGroupedThreads - }); - } - ); - } - ] -}); - -export const sideViewState = atom< - { title: string; elements: IMessageElement[]; key?: string } | undefined ->({ - key: 'SideView', - default: undefined -}); - -export const currentThreadIdState = atom({ - key: 'CurrentThreadId', - default: undefined -}); - -const localStorageEffect = - (key: string): AtomEffect => - ({ setSelf, onSet }) => { - // When the atom is first initialized, try to get its value from localStorage - const savedValue = localStorage.getItem(key); - if (savedValue != null) { - try { - setSelf(JSON.parse(savedValue)); - } catch (error) { - console.error( - `Error parsing localStorage value for key "${key}":`, - error - ); - } - } - - // Subscribe to state changes and update localStorage - onSet((newValue, _, isReset) => { - if (isReset) { - localStorage.removeItem(key); - } else { - localStorage.setItem(key, JSON.stringify(newValue)); - } - }); - }; - -export const mcpState = atom({ - key: 'Mcp', - default: [], - effects: [localStorageEffect('mcp_storage_key')] -}); diff --git a/libs/react-client/src/store/auth.ts b/libs/react-client/src/store/auth.ts new file mode 100644 index 0000000000..841b609d99 --- /dev/null +++ b/libs/react-client/src/store/auth.ts @@ -0,0 +1,52 @@ +import { isEqual } from 'lodash'; +import { groupByDate } from 'src/utils/group'; +import { create } from 'zustand'; + +import { IAuthConfig, IUser, ThreadHistory } from '..'; + +interface AuthState { + authConfig?: IAuthConfig; + user?: IUser | null; + + threadHistory?: ThreadHistory; + + setAuthConfig: (authConfig?: IAuthConfig) => void; + setUser: (user?: IUser | null) => void; + setThreadHistory: (threadHistory?: ThreadHistory) => void; +} + +export const useAuthStore = create((set, get) => ({ + threadHistory: { + threads: undefined, + currentThreadId: undefined, + timeGroupedThreads: undefined, + pageInfo: undefined + }, + + setAuthConfig: (authConfig?: IAuthConfig) => { + set({ authConfig }); + }, + + setUser: (user?: IUser | null) => { + set({ user }); + }, + + setThreadHistory: (threadHistory?: ThreadHistory) => { + const oldValue = get().threadHistory; + + let timeGroupedThreads = threadHistory?.timeGroupedThreads; + if ( + threadHistory?.threads && + !isEqual(threadHistory.threads, oldValue?.timeGroupedThreads) + ) { + timeGroupedThreads = groupByDate(threadHistory.threads); + } + + set({ + threadHistory: { + ...threadHistory, + timeGroupedThreads + } + }); + } +})); diff --git a/libs/react-client/src/store/chat.ts b/libs/react-client/src/store/chat.ts new file mode 100644 index 0000000000..fa049f8c62 --- /dev/null +++ b/libs/react-client/src/store/chat.ts @@ -0,0 +1,121 @@ +import { ICallFn, ICommand, IMessageElement } from 'src/types'; +import { WavRecorder, WavStreamPlayer } from 'src/wavtools'; +import { create } from 'zustand'; + +import { stateOrSetter } from './utils'; + +// import { subscribeWithSelector } from 'zustand/middleware/subscribeWithSelector'; + +interface ChatState { + isAiSpeaking: boolean; + audioConnection: 'connecting' | 'on' | 'off'; + loading: boolean; + wavStreamPlayer: WavStreamPlayer; + wavRecorder: WavRecorder; + callFn?: ICallFn; + commands: ICommand[]; + sideView?: { title: string; elements: IMessageElement[] }; + chatProfile?: string; + chatSettingsInputs: any[]; + chatSettingsDefaultValue: Record; + chatSettingsValue: Record; + + setIsAiSpeaking: (isAiSpeaking: boolean) => void; + setAudioConnection: (audioConnection: 'connecting' | 'on' | 'off') => void; + setLoading: (loading: boolean) => void; + setCallFn: (callFn?: ICallFn) => void; + setCommands: (commands: ICommand[]) => void; + setSideView: ( + sideViewOrSetter?: + | { title: string; elements: IMessageElement[]; key?: string } + | ((old?: { + title: string; + elements: IMessageElement[]; + key?: string; + }) => + | { + title: string; + elements: IMessageElement[]; + key?: string; + } + | undefined) + ) => void; + setChatProfile: (chatProfile: string) => void; + setChatSettingsInputs: (chatSettingsInputs: any[]) => void; + setChatSettingsValue: (chatSettingsValue: Partial>) => void; + resetChatSettingsInputs: () => void; + resetChatSettingsValue: () => void; +} + +export const useChatStore = create((set, get) => ({ + isAiSpeaking: false as boolean, + audioConnection: 'off', + loading: false, + wavStreamPlayer: new WavStreamPlayer(), + wavRecorder: new WavRecorder(), + commands: [], + chatSettingsInputs: [], + chatSettingsValue: {}, + chatSettingsDefaultValue: {}, + + setIsAiSpeaking: (isAiSpeaking) => { + set({ isAiSpeaking }); + }, + + setAudioConnection: (audioConnection) => { + set({ audioConnection }); + }, + + setLoading: (loading) => { + set({ loading }); + }, + + setCallFn: (callFn) => { + set({ callFn }); + }, + + setCommands: (commands) => { + set({ commands }); + }, + + setSideView: (sideViewOrSetter) => { + stateOrSetter(set, 'sideView', sideViewOrSetter); + }, + + setChatProfile: (chatProfile) => { + set({ chatProfile }); + }, + + setChatSettingsInputs: (chatSettingsInputs) => { + // Collect default values of all inputs + const chatSettingsDefaultValue = chatSettingsInputs.reduce( + (form: { [key: string]: any }, input: any) => ( + (form[input.id] = input.initial), form + ), + {} + ); + + set({ chatSettingsInputs, chatSettingsDefaultValue }); + }, + + setChatSettingsValue: (newValue) => { + set(({ chatSettingsValue }) => ({ + chatSettingsValue: { ...chatSettingsValue, ...newValue } + })); + }, + + resetChatSettingsInputs: () => { + set({ chatSettingsInputs: [] }); + }, + + resetChatSettingsValue: () => { + const chatSettingsValue = get().chatSettingsInputs.reduce( + (form: { [key: string]: any }, input: any) => ( + (form[input.id] = input.initial), form + ), + {} + ); + + set({ chatSettingsValue }); + } +})); diff --git a/libs/react-client/src/store/config.ts b/libs/react-client/src/store/config.ts new file mode 100644 index 0000000000..192a6926a2 --- /dev/null +++ b/libs/react-client/src/store/config.ts @@ -0,0 +1,14 @@ +import { create } from 'zustand'; + +import { IChainlitConfig } from '..'; + +interface ConfigState { + config?: IChainlitConfig; + setConfig: (config: IChainlitConfig) => void; +} + +export const useConfigStore = create((set) => ({ + setConfig: (config: IChainlitConfig) => { + set({ config }); + } +})); diff --git a/libs/react-client/src/store/index.ts b/libs/react-client/src/store/index.ts new file mode 100644 index 0000000000..3b56606379 --- /dev/null +++ b/libs/react-client/src/store/index.ts @@ -0,0 +1,9 @@ +export * from './auth'; +export * from './chat'; +export * from './config'; +export * from './mcp'; +export * from './messages'; +export * from './session'; +export * from './thread'; +export * from './user'; +export * from './utils'; diff --git a/libs/react-client/src/store/mcp.ts b/libs/react-client/src/store/mcp.ts new file mode 100644 index 0000000000..4173900077 --- /dev/null +++ b/libs/react-client/src/store/mcp.ts @@ -0,0 +1,22 @@ +import { persist } from 'zustand/middleware'; +import { create } from 'zustand/react'; + +import { IMcp } from '../types'; +import { stateOrSetter } from './utils'; + +interface McpState { + mcps: IMcp[]; + setMcps: (mcpsOrSetter: ((prev: IMcp[]) => IMcp[]) | IMcp[]) => void; +} + +export const useMcpStore = create()( + persist( + (set) => ({ + mcps: [] as IMcp[], + setMcps: (mcpsOrSetter) => stateOrSetter(set, 'mcps', mcpsOrSetter) + }), + { + name: 'mcp_storage_key' + } + ) +); diff --git a/libs/react-client/src/store/messages.ts b/libs/react-client/src/store/messages.ts new file mode 100644 index 0000000000..9aa99bc3f8 --- /dev/null +++ b/libs/react-client/src/store/messages.ts @@ -0,0 +1,56 @@ +import { IAction, IMessageElement, IStep, ITasklistElement } from 'src/types'; +import { create } from 'zustand'; + +import { stateOrSetter } from './utils'; + +interface MessagesState { + messages: IStep[]; + elements: IMessageElement[]; + taskList: ITasklistElement[]; + actions: IAction[]; + tokenCount: number; + + setMessages: (setterFnOrItems: ((old: IStep[]) => IStep[]) | IStep[]) => void; + setElements: ( + setterFnOrItems: + | ((old: IMessageElement[]) => IMessageElement[]) + | IMessageElement[] + ) => void; + setTaskList: ( + setterFnOrItems: + | ((old: ITasklistElement[]) => ITasklistElement[]) + | ITasklistElement[] + ) => void; + setActions: ( + setterFnOrItems: ((old: IAction[]) => IAction[]) | IAction[] + ) => void; + setTokenCount: (setterFnOrCount: ((old: number) => number) | number) => void; +} + +export const useMessagesStore = create((set) => ({ + messages: [], + elements: [], + taskList: [], + actions: [], + tokenCount: 0, + + setMessages: (setterFnOrItems) => { + stateOrSetter(set, 'messages', setterFnOrItems); + }, + + setElements: (elements) => { + stateOrSetter(set, 'elements', elements); + }, + + setTaskList: (taskList) => { + stateOrSetter(set, 'taskList', taskList); + }, + + setActions: (actions) => { + stateOrSetter(set, 'actions', actions); + }, + + setTokenCount: (tokenCount) => { + stateOrSetter(set, 'tokenCount', tokenCount); + } +})); diff --git a/libs/react-client/src/store/session.ts b/libs/react-client/src/store/session.ts new file mode 100644 index 0000000000..738bd898f6 --- /dev/null +++ b/libs/react-client/src/store/session.ts @@ -0,0 +1,29 @@ +import { v4 as uuidv4 } from 'uuid'; +import { create } from 'zustand'; + +import { ISession } from '../types'; +import { stateOrSetter } from './utils'; + +interface SessionState { + sessionId: string; + session?: ISession; + + setState: (state: Partial) => void; + setSession: ( + setterFnOrState: ((old?: ISession) => ISession) | ISession + ) => void; + resetSessionId: () => void; +} + +export const useSessionState = create((set) => ({ + sessionId: uuidv4(), + + setState: (state) => set(state), + setSession: (setterFnOrState) => { + stateOrSetter(set, 'session', setterFnOrState); + }, + + resetSessionId: () => { + set({ sessionId: uuidv4() }); + } +})); diff --git a/libs/react-client/src/store/thread.ts b/libs/react-client/src/store/thread.ts new file mode 100644 index 0000000000..9bc22d2275 --- /dev/null +++ b/libs/react-client/src/store/thread.ts @@ -0,0 +1,19 @@ +import { create } from 'zustand'; + +interface ThreadState { + idToResume?: string; + resumeThreadError?: string; + currentThreadId?: string; + + setState: (state: Partial) => void; + setIdToResume: (idToResume?: string) => void; + setCurrentThreadId: (currentThreadId?: string) => void; + setResumeThreadError: (resumeThreadError?: string) => void; +} + +export const useThreadStore = create((set) => ({ + setState: (state) => set(state), + setIdToResume: (idToResume) => set({ idToResume }), + setCurrentThreadId: (currentThreadId) => set({ currentThreadId }), + setResumeThreadError: (resumeThreadError) => set({ resumeThreadError }) +})); diff --git a/libs/react-client/src/store/user.ts b/libs/react-client/src/store/user.ts new file mode 100644 index 0000000000..2c85cf1080 --- /dev/null +++ b/libs/react-client/src/store/user.ts @@ -0,0 +1,20 @@ +import { IAsk } from 'src/types'; +import { create } from 'zustand'; + +interface UserState { + firstUserInteraction?: string; + askUser?: IAsk; + + setFirstUserInteraction: (interaction?: string) => void; + setAskUser: (ask?: IAsk) => void; +} + +export const useUserState = create((set) => ({ + setFirstUserInteraction: (interaction) => { + set({ firstUserInteraction: interaction }); + }, + + setAskUser: (ask) => { + set({ askUser: ask }); + } +})); diff --git a/libs/react-client/src/store/utils.ts b/libs/react-client/src/store/utils.ts new file mode 100644 index 0000000000..872dbb8a18 --- /dev/null +++ b/libs/react-client/src/store/utils.ts @@ -0,0 +1,25 @@ +export interface SetterFn { + ( + partial: T | Partial | ((state: T) => T | Partial), + replace?: false + ): void; + (state: T | ((state: T) => T), replace: true): void; +} + +export const stateOrSetter = ( + set: SetterFn, + key: K, + stateOrSetterFn: ((old: T[K]) => T[K]) | T[K] +) => { + if (typeof stateOrSetterFn === 'function') { + const setter = stateOrSetterFn as (old: T[K]) => T[K]; + + set((state) => ({ ...state, [key]: setter(state[key]) })); + + return; + } + + const state = stateOrSetterFn as T[K]; + + set((prevState) => ({ ...prevState, [key]: state })); +}; diff --git a/libs/react-client/src/types/index.ts b/libs/react-client/src/types/index.ts index 8a1d98034c..a6536d6b3e 100644 --- a/libs/react-client/src/types/index.ts +++ b/libs/react-client/src/types/index.ts @@ -9,3 +9,4 @@ export * from './thread'; export * from './history'; export * from './config'; export * from './mcp'; +export * from './session'; diff --git a/libs/react-client/src/types/session.ts b/libs/react-client/src/types/session.ts new file mode 100644 index 0000000000..ac40aedb7a --- /dev/null +++ b/libs/react-client/src/types/session.ts @@ -0,0 +1,6 @@ +import { Socket } from 'socket.io-client'; + +export interface ISession { + socket: Socket; + error?: boolean; +} diff --git a/libs/react-client/src/useAudio.ts b/libs/react-client/src/useAudio.ts index 79a964f3f2..5653774dee 100644 --- a/libs/react-client/src/useAudio.ts +++ b/libs/react-client/src/useAudio.ts @@ -1,20 +1,14 @@ import { useCallback } from 'react'; -import { useRecoilState, useRecoilValue } from 'recoil'; -import { - audioConnectionState, - isAiSpeakingState, - wavRecorderState, - wavStreamPlayerState -} from './state'; +import { useChatStore } from './store/chat'; import { useChatInteract } from './useChatInteract'; const useAudio = () => { - const [audioConnection, setAudioConnection] = - useRecoilState(audioConnectionState); - const wavRecorder = useRecoilValue(wavRecorderState); - const wavStreamPlayer = useRecoilValue(wavStreamPlayerState); - const isAiSpeaking = useRecoilValue(isAiSpeakingState); + const audioConnection = useChatStore((state) => state.audioConnection); + const setAudioConnection = useChatStore((state) => state.setAudioConnection); + const wavRecorder = useChatStore((state) => state.wavRecorder); + const wavStreamPlayer = useChatStore((state) => state.wavStreamPlayer); + const isAiSpeaking = useChatStore((state) => state.isAiSpeaking); const { startAudioStream, endAudioStream } = useChatInteract(); diff --git a/libs/react-client/src/useChatData.ts b/libs/react-client/src/useChatData.ts index d457531e7c..aa6358a3fc 100644 --- a/libs/react-client/src/useChatData.ts +++ b/libs/react-client/src/useChatData.ts @@ -1,17 +1,7 @@ -import { useRecoilValue } from 'recoil'; - -import { - actionState, - askUserState, - callFnState, - chatSettingsDefaultValueSelector, - chatSettingsInputsState, - chatSettingsValueState, - elementState, - loadingState, - sessionState, - tasklistState -} from './state'; +import { useChatStore } from './store/chat'; +import { useMessagesStore } from './store/messages'; +import { useSessionState } from './store/session'; +import { useUserState } from './store/user'; export interface IToken { id: number | string; @@ -21,17 +11,17 @@ export interface IToken { } const useChatData = () => { - const loading = useRecoilValue(loadingState); - const elements = useRecoilValue(elementState); - const tasklists = useRecoilValue(tasklistState); - const actions = useRecoilValue(actionState); - const session = useRecoilValue(sessionState); - const askUser = useRecoilValue(askUserState); - const callFn = useRecoilValue(callFnState); - const chatSettingsInputs = useRecoilValue(chatSettingsInputsState); - const chatSettingsValue = useRecoilValue(chatSettingsValueState); - const chatSettingsDefaultValue = useRecoilValue( - chatSettingsDefaultValueSelector + const loading = useChatStore((state) => state.loading); + const elements = useMessagesStore((state) => state.elements); + const tasklists = useMessagesStore((state) => state.taskList); + const actions = useMessagesStore((state) => state.actions); + const session = useSessionState((state) => state.session); + const askUser = useUserState((state) => state.askUser); + const callFn = useChatStore((state) => state.callFn); + const chatSettingsInputs = useChatStore((state) => state.chatSettingsInputs); + const chatSettingsValue = useChatStore((state) => state.chatSettingsValue); + const chatSettingsDefaultValue = useChatStore( + (state) => state.chatSettingsDefaultValue ); const connected = session?.socket.connected && !session?.error; diff --git a/libs/react-client/src/useChatInteract.ts b/libs/react-client/src/useChatInteract.ts index bd5499ef9c..55cead290e 100644 --- a/libs/react-client/src/useChatInteract.ts +++ b/libs/react-client/src/useChatInteract.ts @@ -1,50 +1,45 @@ import { useCallback, useContext } from 'react'; -import { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil'; -import { - actionState, - askUserState, - chatSettingsInputsState, - chatSettingsValueState, - currentThreadIdState, - elementState, - firstUserInteraction, - loadingState, - messagesState, - sessionIdState, - sessionState, - sideViewState, - tasklistState, - threadIdToResumeState, - tokenCountState -} from 'src/state'; import { IFileRef, IStep } from 'src/types'; import { addMessage } from 'src/utils/message'; import { v4 as uuidv4 } from 'uuid'; import { ChainlitContext } from './context'; +import { useChatStore } from './store/chat'; +import { useMessagesStore } from './store/messages'; +import { useSessionState } from './store/session'; +import { useThreadStore } from './store/thread'; +import { useUserState } from './store/user'; type PartialBy = Omit & Partial>; const useChatInteract = () => { const client = useContext(ChainlitContext); - const session = useRecoilValue(sessionState); - const askUser = useRecoilValue(askUserState); - const sessionId = useRecoilValue(sessionIdState); - - const resetChatSettings = useResetRecoilState(chatSettingsInputsState); - const resetSessionId = useResetRecoilState(sessionIdState); - const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState); - - const setFirstUserInteraction = useSetRecoilState(firstUserInteraction); - const setLoading = useSetRecoilState(loadingState); - const setMessages = useSetRecoilState(messagesState); - const setElements = useSetRecoilState(elementState); - const setTasklists = useSetRecoilState(tasklistState); - const setActions = useSetRecoilState(actionState); - const setTokenCount = useSetRecoilState(tokenCountState); - const setIdToResume = useSetRecoilState(threadIdToResumeState); - const setSideView = useSetRecoilState(sideViewState); - const setCurrentThreadId = useSetRecoilState(currentThreadIdState); + const session = useSessionState((state) => state.session); + const askUser = useUserState((state) => state.askUser); + const sessionId = useSessionState((state) => state.sessionId); + + const resetChatSettings = useChatStore( + (state) => state.resetChatSettingsInputs + ); + const resetSessionId = useSessionState((state) => state.resetSessionId); + const resetChatSettingsValue = useChatStore( + (state) => state.resetChatSettingsValue + ); + + const setFirstUserInteraction = useUserState( + (state) => state.setFirstUserInteraction + ); + const setLoading = useChatStore((state) => state.setLoading); + const setMessages = useMessagesStore((state) => state.setMessages); + const setElements = useMessagesStore((state) => state.setElements); + const setTasklists = useMessagesStore((state) => state.setTaskList); + const setActions = useMessagesStore((state) => state.setActions); + const setTokenCount = useMessagesStore((state) => state.setTokenCount); + const setIdToResume = useThreadStore((state) => state.setIdToResume); + const setSideView = useChatStore((state) => state.setSideView); + const setCurrentThreadId = useThreadStore( + (state) => state.setCurrentThreadId + ); const clear = useCallback(() => { session?.socket.emit('clear_session'); diff --git a/libs/react-client/src/useChatMessages.ts b/libs/react-client/src/useChatMessages.ts index c3b1f5c949..9f7555233c 100644 --- a/libs/react-client/src/useChatMessages.ts +++ b/libs/react-client/src/useChatMessages.ts @@ -1,15 +1,11 @@ -import { useRecoilValue } from 'recoil'; - -import { - currentThreadIdState, - firstUserInteraction, - messagesState -} from './state'; +import { useMessagesStore } from './store/messages'; +import { useThreadStore } from './store/thread'; +import { useUserState } from './store/user'; const useChatMessages = () => { - const messages = useRecoilValue(messagesState); - const firstInteraction = useRecoilValue(firstUserInteraction); - const threadId = useRecoilValue(currentThreadIdState); + const messages = useMessagesStore((state) => state.messages); + const firstInteraction = useUserState((state) => state.firstUserInteraction); + const threadId = useThreadStore((state) => state.currentThreadId); return { threadId, diff --git a/libs/react-client/src/useChatSession.ts b/libs/react-client/src/useChatSession.ts index eb93679efa..53e0803aa6 100644 --- a/libs/react-client/src/useChatSession.ts +++ b/libs/react-client/src/useChatSession.ts @@ -1,39 +1,7 @@ import { debounce } from 'lodash'; import { useCallback, useContext, useEffect } from 'react'; -import { - useRecoilState, - useRecoilValue, - useResetRecoilState, - useSetRecoilState -} from 'recoil'; import io from 'socket.io-client'; import { toast } from 'sonner'; -import { - actionState, - askUserState, - audioConnectionState, - callFnState, - chatProfileState, - chatSettingsInputsState, - chatSettingsValueState, - commandsState, - currentThreadIdState, - elementState, - firstUserInteraction, - isAiSpeakingState, - loadingState, - mcpState, - messagesState, - resumeThreadErrorState, - sessionIdState, - sessionState, - sideViewState, - tasklistState, - threadIdToResumeState, - tokenCountState, - wavRecorderState, - wavStreamPlayerState -} from 'src/state'; import { IAction, ICommand, @@ -53,38 +21,58 @@ import { import { OutputAudioChunk } from './types/audio'; import { ChainlitContext } from './context'; +import { useChatStore } from './store/chat'; +import { useMcpStore } from './store/mcp'; +import { useMessagesStore } from './store/messages'; +import { useSessionState } from './store/session'; +import { useThreadStore } from './store/thread'; +import { useUserState } from './store/user'; import type { IToken } from './useChatData'; const useChatSession = () => { const client = useContext(ChainlitContext); - const sessionId = useRecoilValue(sessionIdState); - - const [session, setSession] = useRecoilState(sessionState); - const setIsAiSpeaking = useSetRecoilState(isAiSpeakingState); - const setAudioConnection = useSetRecoilState(audioConnectionState); - const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState); - const setChatSettingsValue = useSetRecoilState(chatSettingsValueState); - const setFirstUserInteraction = useSetRecoilState(firstUserInteraction); - const setLoading = useSetRecoilState(loadingState); - const setMcps = useSetRecoilState(mcpState); - const wavStreamPlayer = useRecoilValue(wavStreamPlayerState); - const wavRecorder = useRecoilValue(wavRecorderState); - const setMessages = useSetRecoilState(messagesState); - const setAskUser = useSetRecoilState(askUserState); - const setCallFn = useSetRecoilState(callFnState); - const setCommands = useSetRecoilState(commandsState); - const setSideView = useSetRecoilState(sideViewState); - const setElements = useSetRecoilState(elementState); - const setTasklists = useSetRecoilState(tasklistState); - const setActions = useSetRecoilState(actionState); - const setChatSettingsInputs = useSetRecoilState(chatSettingsInputsState); - const setTokenCount = useSetRecoilState(tokenCountState); - const [chatProfile, setChatProfile] = useRecoilState(chatProfileState); - const idToResume = useRecoilValue(threadIdToResumeState); - const setThreadResumeError = useSetRecoilState(resumeThreadErrorState); - - const [currentThreadId, setCurrentThreadId] = - useRecoilState(currentThreadIdState); + const sessionId = useSessionState((state) => state.sessionId); + + const session = useSessionState((state) => state.session); + const setSession = useSessionState((state) => state.setSession); + const setIsAiSpeaking = useChatStore((state) => state.setIsAiSpeaking); + const setAudioConnection = useChatStore((state) => state.setAudioConnection); + const setChatSettingsInputs = useChatStore( + (state) => state.setChatSettingsInputs + ); + const resetChatSettingsValue = useChatStore( + (state) => state.resetChatSettingsValue + ); + const setChatSettingsValue = useChatStore( + (state) => state.setChatSettingsValue + ); + const setFirstUserInteraction = useUserState( + (state) => state.setFirstUserInteraction + ); + const setLoading = useChatStore((state) => state.setLoading); + const setMcps = useMcpStore((state) => state.setMcps); + const wavStreamPlayer = useChatStore((state) => state.wavStreamPlayer); + const wavRecorder = useChatStore((state) => state.wavRecorder); + const setMessages = useMessagesStore((state) => state.setMessages); + const setAskUser = useUserState((state) => state.setAskUser); + const setCallFn = useChatStore((state) => state.setCallFn); + const setCommands = useChatStore((state) => state.setCommands); + const setSideView = useChatStore((state) => state.setSideView); + const setElements = useMessagesStore((state) => state.setElements); + const setTasklists = useMessagesStore((state) => state.setTaskList); + const setActions = useMessagesStore((state) => state.setActions); + const setTokenCount = useMessagesStore((state) => state.setTokenCount); + const chatProfile = useChatStore((state) => state.chatProfile); + const setChatProfile = useChatStore((state) => state.setChatProfile); + const idToResume = useThreadStore((state) => state.idToResume); + const setThreadResumeError = useThreadStore( + (state) => state.setResumeThreadError + ); + + const currentThreadId = useThreadStore((state) => state.currentThreadId); + const setCurrentThreadId = useThreadStore( + (state) => state.setCurrentThreadId + ); // Use currentThreadId as thread id in websocket header useEffect(() => { @@ -126,9 +114,11 @@ const useChatSession = () => { chatProfile: chatProfile ? encodeURIComponent(chatProfile) : '' } }); + setSession((old) => { old?.socket?.removeAllListeners(); old?.socket?.close(); + return { socket }; diff --git a/libs/react-client/src/useConfig.ts b/libs/react-client/src/useConfig.ts index 9f1ae60978..07ee81f9b9 100644 --- a/libs/react-client/src/useConfig.ts +++ b/libs/react-client/src/useConfig.ts @@ -1,12 +1,11 @@ import { useEffect } from 'react'; -import { useRecoilState } from 'recoil'; import { useApi, useAuth } from './api'; -import { configState } from './state'; +import { useConfigStore } from './store/config'; import { IChainlitConfig } from './types'; const useConfig = () => { - const [config, setConfig] = useRecoilState(configState); + const { config, setConfig } = useConfigStore(); const { isAuthenticated } = useAuth(); const language = navigator.language || 'en-US';