diff --git a/README.md b/README.md index d1074064c..715636bec 100644 --- a/README.md +++ b/README.md @@ -171,22 +171,6 @@ VITE_BACKEND_API_URL=${VITE_BACKEND_API_URL-backendurl} 7. Enjoy Graph Building. --- -## Additional Configuration - -### **LLM Models** -Configure LLM models using the `VITE_LLM_MODELS_PROD` variable. Example: -```bash -VITE_LLM_MODELS_PROD="openai_gpt_4o,openai_gpt_4o_mini,diffbot,gemini_1.5_flash" -``` - -### **Input Sources** -The default input sources are: `local`, `YouTube`, `Wikipedia`, `AWS S3`, and `web`. - -To enable GCS integration, include `gcs` and your Google client ID: -```bash -VITE_REACT_APP_SOURCES="local,youtube,wiki,s3,gcs,web" -VITE_GOOGLE_CLIENT_ID="your-google-client-id" -``` ## Usage 1. Connect to Neo4j Aura Instance which can be both AURA DS or AURA DB by passing URI and password through Backend env, fill using login dialog or drag and drop the Neo4j credentials file. @@ -237,16 +221,16 @@ VITE_GOOGLE_CLIENT_ID="your-google-client-id" | RAGAS_EMBEDDING_MODEL | Optional | openai | embedding model used by ragas evaluation framework | | | | **FRONTEND ENV** -| VITE_BACKEND_API_URL | Optional | http://localhost:8000 | URL for backend API | -| VITE_BLOOM_URL | Optional | https://workspace-preview.neo4j.io/workspace/explore?connectURL={CONNECT_URL}&search=Show+me+a+graph&featureGenAISuggestions=true&featureGenAISuggestionsInternal=true | URL for Bloom visualization | +| VITE_BLOOM_URL | Mandatory | https://workspace-preview.neo4j.io/workspace/explore?connectURL={CONNECT_URL}&search=Show+me+a+graph&featureGenAISuggestions=true&featureGenAISuggestionsInternal=true | URL for Bloom visualization | | VITE_REACT_APP_SOURCES | Mandatory | local,youtube,wiki,s3 | List of input sources that will be available | | VITE_CHAT_MODES | Mandatory | vector,graph+vector,graph,hybrid | Chat modes available for Q&A -| VITE_ENV | Mandatory | DEV or PROD | Environment variable for the app | +| VITE_ENV | Mandatory | DEV or PROD | Environment variable for the app| +| VITE_LLM_MODELS | Mandatory | 'diffbot,openai_gpt_3.5,openai_gpt_4o,openai_gpt_4o_mini,gemini_1.5_pro,gemini_1.5_flash,azure_ai_gpt_35,azure_ai_gpt_4o,ollama_llama3,groq_llama3_70b,anthropic_claude_3_5_sonnet' | Supported Models For the application +| VITE_BACKEND_API_URL | Optional | http://localhost:8000 | URL for backend API | | VITE_TIME_PER_PAGE | Optional | 50 | Time per page for processing | | VITE_CHUNK_SIZE | Optional | 5242880 | Size of each chunk of file for upload | | VITE_GOOGLE_CLIENT_ID | Optional | | Client ID for Google authentication | -| VITE_LLM_MODELS_PROD | Optional | openai_gpt_4o,openai_gpt_4o_mini,diffbot,gemini_1.5_flash | To Distinguish models based on the Enviornment PROD or DEV -| VITE_LLM_MODELS | Optional | 'diffbot,openai_gpt_3.5,openai_gpt_4o,openai_gpt_4o_mini,gemini_1.5_pro,gemini_1.5_flash,azure_ai_gpt_35,azure_ai_gpt_4o,ollama_llama3,groq_llama3_70b,anthropic_claude_3_5_sonnet' | Supported Models For the application +| VITE_LLM_MODELS_PROD | Optional | openai_gpt_4o,openai_gpt_4o_mini,diffbot,gemini_1.5_flash | To Distinguish models based on the Enviornment PROD or DEV | | VITE_AUTH0_CLIENT_ID | Mandatory if you are enabling Authentication otherwise it is optional | |Okta Oauth Client ID for authentication | VITE_AUTH0_DOMAIN | Mandatory if you are enabling Authentication otherwise it is optional | | Okta Oauth Cliend Domain | VITE_SKIP_AUTH | Optional | true | Flag to skip the authentication diff --git a/backend/src/document_sources/wikipedia.py b/backend/src/document_sources/wikipedia.py index 163f971b4..9e306fa19 100644 --- a/backend/src/document_sources/wikipedia.py +++ b/backend/src/document_sources/wikipedia.py @@ -11,6 +11,6 @@ def get_documents_from_Wikipedia(wiki_query:str, language:str): except Exception as e: message="Failed To Process Wikipedia Query" error_message = str(e) - logging.exception(f'Failed To Process Wikipedia Query: {file_name}, Exception Stack trace: {error_message}') + logging.exception(f'Failed To Process Wikipedia Query, Exception Stack trace: {error_message}') raise LLMGraphBuilderException(error_message+' '+message) \ No newline at end of file diff --git a/backend/test_integrationqa.py b/backend/test_integrationqa.py index 2d7a5c5e5..f80ed2f0c 100644 --- a/backend/test_integrationqa.py +++ b/backend/test_integrationqa.py @@ -8,8 +8,7 @@ from dotenv import load_dotenv from src.main import * from src.QA_integration import QA_RAG -from src.ragas_eval import get_ragas_metrics -from datasets import Dataset + # Load environment variables load_dotenv() URI = os.getenv('NEO4J_URI') @@ -49,7 +48,7 @@ def test_graph_from_file_local(model_name): create_source_node_local(graph, model_name, file_name) result = asyncio.run( extract_graph_from_file_local_file( - URI, USERNAME, PASSWORD, DATABASE, model_name, merged_file_path, file_name, '', '', None, '' + URI, USERNAME, PASSWORD, DATABASE, model_name, merged_file_path, file_name, '', '',100,20,1, None,'' ) ) logging.info(f"Local file test result: {result}") @@ -67,7 +66,7 @@ def test_graph_from_wikipedia(model_name): create_source_node_graph_url_wikipedia(graph, model_name, wiki_query, "Wikipedia") result = asyncio.run( extract_graph_from_file_Wikipedia( - URI, USERNAME, PASSWORD, DATABASE, model_name, file_name, 'en', file_name, '', '', None, '' + URI, USERNAME, PASSWORD, DATABASE, model_name, file_name, 'en', file_name, '', '', 100,20,1,None,'' ) ) logging.info(f"Wikipedia test result: {result}") @@ -85,9 +84,9 @@ def test_graph_from_youtube_video(model_name): create_source_node_graph_url_youtube(graph, model_name, source_url, "youtube") result = asyncio.run( extract_graph_from_file_youtube( - URI, USERNAME, PASSWORD, DATABASE, model_name, source_url, file_name, '', '', None, '' + URI, USERNAME, PASSWORD, DATABASE, model_name, source_url, file_name, '', '',100,20,1, None,'' ) - ) + ) logging.info(f"YouTube video test result: {result}") if isinstance(result, dict) and result.get("status") == "Failed": return {"status": "Failed", "error": result.get("error", "Unknown error")} @@ -104,7 +103,7 @@ def test_graph_website(model_name): create_source_node_graph_web_url(graph, model_name, source_url, "web-url") result = asyncio.run( extract_graph_from_web_page( - URI, USERNAME, PASSWORD, DATABASE, model_name, source_url, "Google Cloud Skills Boost", '', '', None, '' + URI, USERNAME, PASSWORD, DATABASE, model_name, source_url, "Google Cloud Skills Boost-www", '', '',100,20,1, None,'' ) ) logging.info(f"Web URL test result: {result}") @@ -122,7 +121,8 @@ def test_chatbot_qna(model_name, mode='vector'): result = QA_RAG(graph, model_name, 'Tell me about Amazon', '[]', 1, mode) # assert len(result['message']) > 20 logging.info(f"Chatbot QnA test passed for mode: {mode}") - return result + final_result = {'model_name':model_name,'mode':mode,'result':result} + return final_result except Exception as e: logging.error(f"Error in chatbot QnA: {e}") return {"status": "Failed", "error": str(e)} @@ -170,7 +170,26 @@ def get_duplicate_nodes(): return "Data successfully loaded" else: return "Unable to load data" - + +def flatten_extract_dataframe(df: pd.DataFrame): + rows = [] + for _, row in df.iterrows(): + try: + col1, col2, execution_date = row[0], row[1], row[2] if len(row) > 2 else None + data_dict = ast.literal_eval(col1) if isinstance(col1, str) and col1.startswith("{") else {} + meta_dict = ast.literal_eval(col2) if isinstance(col2, str) and col2.startswith("{") else {} + combined_dict = {**data_dict, **meta_dict} + for key in combined_dict.keys(): + if isinstance(combined_dict[key], dict) and key.startswith("processed_chunk_detail"): + combined_dict[key] = str(combined_dict[key]) + combined_dict["execution_date"] = execution_date + rows.append(combined_dict) + except (SyntaxError, ValueError, TypeError) as e: + print(f"Error parsing row: {row} - {e}") + continue + flat_df = pd.DataFrame(rows) + return flat_df + def run_tests(): """Runs all integration tests and logs results.""" extract_list = [] @@ -178,7 +197,7 @@ def run_tests(): chatbot_list = [] chatbot_error_list = [] other_api_list = [] - models = ['openai_gpt_4','openai_gpt_4o','openai_gpt_4o_mini','gemini_1.5_pro','gemini_1.5_flash','gemini_2.0_flash','bedrock_nova_micro_v1','bedrock_nova_lite_v1','bedrock_nova_pro_v1','fireworks_qwen72b_instruct'] + models = ['openai_gpt_4o','openai_gpt_4o_mini','openai_gpt_4.1','openai_gpt_4.1_mini','gemini_2.0_flash','fireworks_llama4_maverick','bedrock_nova_pro_v1'] chatbot_modes = [ "vector", "graph+vector", @@ -218,9 +237,7 @@ def run_tests(): try: schema_result = test_populate_graph_schema_from_text(model_name) - print("KAUSTUBH : ",schema_result) other_api_list.append({f"{model_name}":schema_result}) - print("other_api_list : ",other_api_list) except Exception as e: logging.error(f"Error in test_populate_graph_schema_from_text for {model_name}: {e}") other_api_list.append({f"{model_name}":str(e)}) diff --git a/frontend/package.json b/frontend/package.json index 68ac3260b..a364dd9d7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -32,9 +32,11 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-icons": "^5.5.0", - "react-markdown": "^9.0.1", + "react-markdown": "^10.1.0", "react-router": "^6.23.1", "react-router-dom": "^6.23.1", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", "uuid": "^11.1.0" }, "devDependencies": { diff --git a/frontend/src/App.css b/frontend/src/App.css index a5efdd056..e8f1955d1 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -469,4 +469,5 @@ .animate-highlight { animation: highlightAnimation 1.5s ease-in-out; border: 2px solid rgb(var(--theme-palette-primary-bg-strong)); -} \ No newline at end of file +} + diff --git a/frontend/src/components/ChatBot/Chatbot.tsx b/frontend/src/components/ChatBot/Chatbot.tsx index 59617a7c6..4e1cab6e8 100644 --- a/frontend/src/components/ChatBot/Chatbot.tsx +++ b/frontend/src/components/ChatBot/Chatbot.tsx @@ -41,6 +41,8 @@ import { downloadClickHandler, getDateTime } from '../../utils/Utils'; import ChatModesSwitch from './ChatModesSwitch'; import CommonActions from './CommonChatActions'; import Loader from '../../utils/Loader'; +import remarkGfm from 'remark-gfm'; +import rehypeRaw from 'rehype-raw'; const InfoModal = lazy(() => import('./ChatInfoModal')); if (typeof window !== 'undefined') { if (!sessionStorage.getItem('session_id')) { @@ -467,9 +469,17 @@ const Chatbot: FC = (props) => { chat.isLoading && index === listMessages.length - 1 && chat.user === 'chatbot' ? 'loader' : '' }`} > - - {chat.modes[chat.currentMode]?.message || ''} - +
+ + {chat.modes[chat.currentMode]?.message || ''} + +
diff --git a/frontend/src/components/ChatBot/ChunkInfo.tsx b/frontend/src/components/ChatBot/ChunkInfo.tsx index 6c6756549..ab2fa951a 100644 --- a/frontend/src/components/ChatBot/ChunkInfo.tsx +++ b/frontend/src/components/ChatBot/ChunkInfo.tsx @@ -13,7 +13,8 @@ import { chatModeLables } from '../../utils/Constants'; import GraphViewModal from '../Graph/GraphViewModal'; import { handleGraphNodeClick } from './chatInfo'; import { IconButtonWithToolTip } from '../UI/IconButtonToolTip'; - +import remarkGfm from 'remark-gfm'; +import rehypeRaw from 'rehype-raw'; const ChunkInfo: FC = ({ loading, chunks, mode }) => { const themeUtils = useContext(ThemeWrapperContext); const [neoNodes, setNeoNodes] = useState([]); @@ -257,8 +258,10 @@ const ChunkInfo: FC = ({ loading, chunks, mode }) => {
)} -
- {chunk?.text} +
+ + {chunk?.text} +
))} diff --git a/frontend/src/components/ChatBot/CommunitiesInfo.tsx b/frontend/src/components/ChatBot/CommunitiesInfo.tsx index afecdcefb..7d356e845 100644 --- a/frontend/src/components/ChatBot/CommunitiesInfo.tsx +++ b/frontend/src/components/ChatBot/CommunitiesInfo.tsx @@ -5,7 +5,8 @@ import { CommunitiesProps } from '../../types'; import { chatModeLables } from '../../utils/Constants'; import GraphViewModal from '../Graph/GraphViewModal'; import { handleGraphNodeClick } from './chatInfo'; - +import remarkGfm from 'remark-gfm'; +import rehypeRaw from 'rehype-raw'; const CommunitiesInfo: FC = ({ loading, communities, mode }) => { const [neoNodes, setNeoNodes] = useState([]); const [neoRels, setNeoRels] = useState([]); @@ -51,7 +52,11 @@ const CommunitiesInfo: FC = ({ loading, communities, mode }) = {community.score} )} - {community.summary} +
+ + {community.summary} + +
))} diff --git a/frontend/src/components/Content.tsx b/frontend/src/components/Content.tsx index 5a69ef911..c333857de 100644 --- a/frontend/src/components/Content.tsx +++ b/frontend/src/components/Content.tsx @@ -52,6 +52,7 @@ import { useHasSelections } from '../hooks/useHasSelections'; import { ChevronUpIconOutline, ChevronDownIconOutline } from '@neo4j-ndl/react/icons'; import { ThemeWrapperContext } from '../context/ThemeWrapper'; import { useAuth0 } from '@auth0/auth0-react'; +import React from 'react'; const ConfirmationDialog = lazy(() => import('./Popups/LargeFilePopUp/ConfirmationDialog')); @@ -168,10 +169,10 @@ const Content: React.FC = ({ ? postProcessingTasks.filter((task) => task !== 'graph_schema_consolidation') : postProcessingTasks : hasSelections - ? postProcessingTasks.filter( - (task) => task !== 'graph_schema_consolidation' && task !== 'enable_communities' - ) - : postProcessingTasks.filter((task) => task !== 'enable_communities'); + ? postProcessingTasks.filter( + (task) => task !== 'graph_schema_consolidation' && task !== 'enable_communities' + ) + : postProcessingTasks.filter((task) => task !== 'enable_communities'); if (payload.length) { const response = await postProcessing(payload); if (response.data.status === 'Success') { @@ -236,7 +237,7 @@ const Content: React.FC = ({ ...curfile, model: curfile.status === 'New' || curfile.status === 'Ready to Reprocess' - ? selectedOption?.value ?? '' + ? (selectedOption?.value ?? '') : curfile.model, }; }); @@ -536,7 +537,7 @@ const Content: React.FC = ({ } }; - const processWaitingFilesOnRefresh = () => { + const processWaitingFilesOnRefresh = useCallback(() => { let data = []; const processingFilesCount = filesData.filter((f) => f.status === 'Processing').length; @@ -556,7 +557,7 @@ const Content: React.FC = ({ .filter((f) => f.status === 'New' || f.status == 'Ready to Reprocess'); addFilesToQueue(selectedNewFiles as CustomFile[]); } - }; + }, [filesData, queue]); const handleOpenGraphClick = () => { const bloomUrl = process.env.VITE_BLOOM_URL; @@ -966,26 +967,29 @@ const Content: React.FC = ({ { + onInspect={useCallback((name) => { setInspectedName(name); setOpenGraphView(true); setViewPoint('tableView'); - }} - onRetry={(id) => { + }, [])} + onRetry={useCallback((id) => { setRetryFile(id); toggleRetryPopup(); - }} - onChunkView={async (name) => { - setDocumentName(name); - if (name != documentName) { - toggleChunkPopup(); - if (totalPageCount) { - setTotalPageCount(null); + }, [])} + onChunkView={useCallback( + async (name) => { + setDocumentName(name); + if (name != documentName) { + toggleChunkPopup(); + if (totalPageCount) { + setTotalPageCount(null); + } + setCurrentPage(1); + await getChunks(name, 1); } - setCurrentPage(1); - await getChunks(name, 1); - } - }} + }, + [documentName, totalPageCount] + )} ref={childRef} handleGenerateGraph={processWaitingFilesOnRefresh} > @@ -1089,4 +1093,4 @@ const Content: React.FC = ({ ); }; -export default Content; +export default React.memo(Content); diff --git a/frontend/src/components/FileTable.tsx b/frontend/src/components/FileTable.tsx index 1617d88a1..1d0987287 100644 --- a/frontend/src/components/FileTable.tsx +++ b/frontend/src/components/FileTable.tsx @@ -67,6 +67,7 @@ import { ThemeWrapperContext } from '../context/ThemeWrapper'; import BreakDownPopOver from './BreakDownPopOver'; import { InformationCircleIconOutline } from '@neo4j-ndl/react/icons'; import { useAuth0 } from '@auth0/auth0-react'; +import React from 'react'; let onlyfortheFirstRender = true; @@ -89,7 +90,6 @@ const FileTable: ForwardRefRenderFunction = (props, re const islargeDesktop = useMediaQuery(`(min-width:1440px )`); const tableRef = useRef(null); const { isAuthenticated } = useAuth0(); - const { updateStatusForLargeFiles } = useServerSideEvent( (inMinutes, time, fileName) => { showNormalToast(`${fileName} will take approx ${time} ${inMinutes ? 'Min' : 'Sec'}`); @@ -729,8 +729,8 @@ const FileTable: ForwardRefRenderFunction = (props, re name: item?.fileName, size: item?.fileSize ?? 0, type: item?.fileType?.includes('.') - ? item?.fileType?.substring(1)?.toUpperCase() ?? 'None' - : item?.fileType?.toUpperCase() ?? 'None', + ? (item?.fileType?.substring(1)?.toUpperCase() ?? 'None') + : (item?.fileType?.toUpperCase() ?? 'None'), nodesCount: item?.nodeCount ?? 0, processingTotalTime: item?.processingTime ?? 'None', relationshipsCount: item?.relationshipCount ?? 0, @@ -1061,4 +1061,4 @@ const FileTable: ForwardRefRenderFunction = (props, re ); }; -export default forwardRef(FileTable); +export default React.memo(forwardRef(FileTable)); diff --git a/frontend/src/components/Layout/PageLayout.tsx b/frontend/src/components/Layout/PageLayout.tsx index d4b1e8568..6a3e3ff92 100644 --- a/frontend/src/components/Layout/PageLayout.tsx +++ b/frontend/src/components/Layout/PageLayout.tsx @@ -1,4 +1,4 @@ -import { lazy, Suspense, useEffect, useMemo, useReducer, useState } from 'react'; +import { lazy, Suspense, useCallback, useEffect, useMemo, useReducer, useState } from 'react'; import SideNav from './SideNav'; import DrawerDropzone from './DrawerDropzone'; import DrawerChatbot from './DrawerChatbot'; @@ -178,20 +178,20 @@ const PageLayout: React.FC = () => { const navigate = useNavigate(); - const toggleLeftDrawer = () => { + const toggleLeftDrawer = useCallback(() => { if (isLargeDesktop) { setIsLeftExpanded(!isLeftExpanded); } else { setIsLeftExpanded(false); } - }; - const toggleRightDrawer = () => { + }, [isLargeDesktop]); + const toggleRightDrawer = useCallback(() => { if (isLargeDesktop) { setIsRightExpanded(!isRightExpanded); } else { setIsRightExpanded(false); } - }; + }, [isLargeDesktop]); const isYoutubeOnly = useMemo( () => APP_SOURCES.includes('youtube') && !APP_SOURCES.includes('wiki') && !APP_SOURCES.includes('web'), [] @@ -305,7 +305,7 @@ const PageLayout: React.FC = () => { } }, [isAuthenticated]); - const deleteOnClick = async () => { + const deleteOnClick = useCallback(async () => { try { setClearHistoryData(true); setIsDeleteChatLoading(true); @@ -335,9 +335,9 @@ const PageLayout: React.FC = () => { console.log(error); setClearHistoryData(false); } - }; + }, []); - const handleApplyPatternsFromText = (newPatterns: string[], nodes: OptionType[], rels: OptionType[]) => { + const handleApplyPatternsFromText = useCallback((newPatterns: string[], nodes: OptionType[], rels: OptionType[]) => { setSchemaTextPattern((prevPatterns: string[]) => { const uniquePatterns = Array.from(new Set([...newPatterns, ...prevPatterns])); return uniquePatterns; @@ -349,9 +349,9 @@ const PageLayout: React.FC = () => { setSchemaValNodes(nodes); setSchemaValRels(rels); setSchemaView('text'); - }; + }, []); - const handleDbApply = (newPatterns: string[], nodes: OptionType[], rels: OptionType[]) => { + const handleDbApply = useCallback((newPatterns: string[], nodes: OptionType[], rels: OptionType[]) => { setDbPattern((prevPatterns: string[]) => { const uniquePatterns = Array.from(new Set([...newPatterns, ...prevPatterns])); return uniquePatterns; @@ -363,9 +363,9 @@ const PageLayout: React.FC = () => { setSchemaView('db'); setDbNodes(nodes); setDbRels(rels); - }; + }, []); - const handlePredinedApply = (newPatterns: string[], nodes: OptionType[], rels: OptionType[]) => { + const handlePredinedApply = useCallback((newPatterns: string[], nodes: OptionType[], rels: OptionType[]) => { setPreDefinedPattern((prevPatterns: string[]) => { const uniquePatterns = Array.from(new Set([...newPatterns, ...prevPatterns])); return uniquePatterns; @@ -377,7 +377,7 @@ const PageLayout: React.FC = () => { setSchemaView('preDefined'); setPreDefinedNodes(nodes); setPreDefinedRels(rels); - }; + }, []); return ( <> @@ -491,17 +491,17 @@ const PageLayout: React.FC = () => { /> )} setShowChatBot(true)} + openChatBot={useCallback(() => setShowChatBot(true), [])} showChatBot={showChatBot} - openTextSchema={() => { + openTextSchema={useCallback(() => { setShowTextFromSchemaDialog({ triggeredFrom: 'schemadialog', show: true }); - }} - openLoadSchema={() => { + }, [])} + openLoadSchema={useCallback(() => { setSchemaLoadDialog({ triggeredFrom: 'loadDialog', show: true }); - }} - openPredefinedSchema={() => { + }, [])} + openPredefinedSchema={useCallback(() => { setPredefinedSchemaDialog({ triggeredFrom: 'predefinedDialog', show: true }); - }} + }, [])} showEnhancementDialog={showEnhancementDialog} toggleEnhancementDialog={toggleEnhancementDialog} setOpenConnection={setOpenConnection} @@ -562,15 +562,15 @@ const PageLayout: React.FC = () => { setShowChatBot(true)} showChatBot={showChatBot} - openTextSchema={() => { + openTextSchema={useCallback(() => { setShowTextFromSchemaDialog({ triggeredFrom: 'schemaDialog', show: true }); - }} - openLoadSchema={() => { + }, [])} + openLoadSchema={useCallback(() => { setShowTextFromSchemaDialog({ triggeredFrom: 'loadDialog', show: true }); - }} - openPredefinedSchema={() => { + }, [])} + openPredefinedSchema={useCallback(() => { setPredefinedSchemaDialog({ triggeredFrom: 'prdefinedDialog', show: true }); - }} + }, [])} showEnhancementDialog={showEnhancementDialog} toggleEnhancementDialog={toggleEnhancementDialog} setOpenConnection={setOpenConnection} diff --git a/frontend/src/components/Popups/ChunkPopUp/index.tsx b/frontend/src/components/Popups/ChunkPopUp/index.tsx index 1db028508..d0d6fcd25 100644 --- a/frontend/src/components/Popups/ChunkPopUp/index.tsx +++ b/frontend/src/components/Popups/ChunkPopUp/index.tsx @@ -5,7 +5,9 @@ import Loader from '../../../utils/Loader'; import { useMemo } from 'react'; import chunklogo from '../../../assets/images/chunks.svg'; import { tokens } from '@neo4j-ndl/base'; - +import remarkGfm from 'remark-gfm'; +import rehypeRaw from 'rehype-raw'; +import ReactMarkdown from 'react-markdown'; const ChunkPopUp = ({ showChunkPopup, chunks, @@ -71,7 +73,12 @@ const ChunkPopUp = ({ {c.pagenumber} ) : null} - {c.text} + +
+ + {c.text} + +
))} diff --git a/frontend/src/components/Popups/ConnectionModal/VectorIndexMisMatchAlert.tsx b/frontend/src/components/Popups/ConnectionModal/VectorIndexMisMatchAlert.tsx index 6bcf3e299..e037c3cdd 100644 --- a/frontend/src/components/Popups/ConnectionModal/VectorIndexMisMatchAlert.tsx +++ b/frontend/src/components/Popups/ConnectionModal/VectorIndexMisMatchAlert.tsx @@ -21,17 +21,19 @@ export default function VectorIndexMisMatchAlert({ return ( - - {isVectorIndexAlreadyExists - ? `**Vector Index Incompatibility** +
+ + {isVectorIndexAlreadyExists + ? `**Vector Index Incompatibility** The existing Neo4j vector index dimension (${userVectorIndexDimension}) is incompatible with the supported dimension (384) for this application. To proceed, please choose one of the following options: 1.**Recreate Vector Index:** Click "Re-Create Vector Index" to generate a compatible vector index. 2.**Use a Different Instance:** Connect to a Neo4j instance with a compatible vector index configuration ` - : chunksExists - ? `A vector index is essential for performing efficient similarity searches within your data. Without it, some chunks of data will be invisible to queries based on meaning and context. Creating a vector index unlocks the full potential of your data by allowing you to find related information quickly and accurately.` - : ''} - + : chunksExists + ? `A vector index is essential for performing efficient similarity searches within your data. Without it, some chunks of data will be invisible to queries based on meaning and context. Creating a vector index unlocks the full potential of your data by allowing you to find related information quickly and accurately.` + : ''} + +
{ try { const formdata = new FormData(); - const response = await api.post(`/sources_list?`, formdata); + const response = await api.post(`/sources_list`, formdata); return response; } catch (error) { console.log(error); diff --git a/frontend/src/utils/Constants.ts b/frontend/src/utils/Constants.ts index c3a92b80b..05445eeaf 100644 --- a/frontend/src/utils/Constants.ts +++ b/frontend/src/utils/Constants.ts @@ -6,7 +6,7 @@ import schemaExamples from '../assets/newSchema.json'; export const APP_SOURCES = process.env.VITE_REACT_APP_SOURCES !== '' ? (process.env.VITE_REACT_APP_SOURCES?.split(',') as string[]) - : ['gcs', 's3', 'local', 'wiki', 'youtube', 'web']; + : ['s3', 'local', 'wiki', 'youtube', 'web']; export const llms = process.env?.VITE_LLM_MODELS?.trim() != '' diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 53e00605a..c05bc13e1 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -3186,6 +3186,11 @@ enhanced-resolve@^5.18.1: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + environment@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" @@ -3454,6 +3459,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" + integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== + eslint-config-prettier@^10.1.1: version "10.1.1" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.1.tgz#cf0ff6e5c4e7e15f129f1f1ce2a5ecba92dec132" @@ -3961,7 +3971,7 @@ gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - + graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" @@ -4037,11 +4047,51 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +hast-util-from-parse5@^8.0.0: + version "8.0.3" + resolved "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz#830a35022fff28c3fea3697a98c2f4cc6b835a2e" + integrity sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + devlop "^1.0.0" + hastscript "^9.0.0" + property-information "^7.0.0" + vfile "^6.0.0" + vfile-location "^5.0.0" + web-namespaces "^2.0.0" + hast-util-parse-selector@^2.0.0: version "2.2.5" resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== +hast-util-parse-selector@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz#352879fa86e25616036037dd8931fb5f34cb4a27" + integrity sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A== + dependencies: + "@types/hast" "^3.0.0" + +hast-util-raw@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-9.1.0.tgz#79b66b26f6f68fb50dfb4716b2cdca90d92adf2e" + integrity sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw== + dependencies: + "@types/hast" "^3.0.0" + "@types/unist" "^3.0.0" + "@ungap/structured-clone" "^1.0.0" + hast-util-from-parse5 "^8.0.0" + hast-util-to-parse5 "^8.0.0" + html-void-elements "^3.0.0" + mdast-util-to-hast "^13.0.0" + parse5 "^7.0.0" + unist-util-position "^5.0.0" + unist-util-visit "^5.0.0" + vfile "^6.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + hast-util-to-jsx-runtime@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz#3ed27caf8dc175080117706bf7269404a0aa4f7c" @@ -4063,6 +4113,19 @@ hast-util-to-jsx-runtime@^2.0.0: unist-util-position "^5.0.0" vfile-message "^4.0.0" +hast-util-to-parse5@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" + integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + devlop "^1.0.0" + property-information "^6.0.0" + space-separated-tokens "^2.0.0" + web-namespaces "^2.0.0" + zwitch "^2.0.0" + hast-util-whitespace@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" @@ -4081,6 +4144,17 @@ hastscript@^6.0.0: property-information "^5.0.0" space-separated-tokens "^1.0.0" +hastscript@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-9.0.1.tgz#dbc84bef6051d40084342c229c451cd9dc567dff" + integrity sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w== + dependencies: + "@types/hast" "^3.0.0" + comma-separated-tokens "^2.0.0" + hast-util-parse-selector "^4.0.0" + property-information "^7.0.0" + space-separated-tokens "^2.0.0" + highlight.js@^10.4.1, highlight.js@~10.7.0: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -4098,6 +4172,11 @@ html-url-attributes@^3.0.0: resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.0.tgz#fc4abf0c3fb437e2329c678b80abb3c62cff6f08" integrity sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow== +html-void-elements@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== + human-signals@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" @@ -4556,7 +4635,6 @@ iterator.prototype@^1.1.4: has-symbols "^1.1.0" set-function-name "^2.0.2" - jiti@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" @@ -4643,7 +4721,7 @@ levn@^0.4.1: dependencies: prelude-ls "^1.2.1" type-check "~0.4.0" - + lightningcss-darwin-arm64@1.29.1: version "1.29.1" resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.1.tgz#dce17349c7b9f968f396ec240503de14e7b4870b" @@ -4815,11 +4893,26 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +mdast-util-find-and-replace@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz#70a3174c894e14df722abf43bc250cbae44b11df" + integrity sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg== + dependencies: + "@types/mdast" "^4.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^6.0.0" + unist-util-visit-parents "^6.0.0" + mdast-util-from-markdown@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz#32a6e8f512b416e1f51eb817fc64bd867ebcd9cc" @@ -4838,6 +4931,71 @@ mdast-util-from-markdown@^2.0.0: micromark-util-types "^2.0.0" unist-util-stringify-position "^4.0.0" +mdast-util-gfm-autolink-literal@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz#abd557630337bd30a6d5a4bd8252e1c2dc0875d5" + integrity sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ== + dependencies: + "@types/mdast" "^4.0.0" + ccount "^2.0.0" + devlop "^1.0.0" + mdast-util-find-and-replace "^3.0.0" + micromark-util-character "^2.0.0" + +mdast-util-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz#7778e9d9ca3df7238cc2bd3fa2b1bf6a65b19403" + integrity sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.1.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + +mdast-util-gfm-strikethrough@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz#d44ef9e8ed283ac8c1165ab0d0dfd058c2764c16" + integrity sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz#7a435fb6223a72b0862b33afbd712b6dae878d38" + integrity sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm-task-list-item@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz#e68095d2f8a4303ef24094ab642e1047b991a936" + integrity sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ== + dependencies: + "@types/mdast" "^4.0.0" + devlop "^1.0.0" + mdast-util-from-markdown "^2.0.0" + mdast-util-to-markdown "^2.0.0" + +mdast-util-gfm@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz#2cdf63b92c2a331406b0fb0db4c077c1b0331751" + integrity sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ== + dependencies: + mdast-util-from-markdown "^2.0.0" + mdast-util-gfm-autolink-literal "^2.0.0" + mdast-util-gfm-footnote "^2.0.0" + mdast-util-gfm-strikethrough "^2.0.0" + mdast-util-gfm-table "^2.0.0" + mdast-util-gfm-task-list-item "^2.0.0" + mdast-util-to-markdown "^2.0.0" + mdast-util-mdx-expression@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz#4968b73724d320a379110d853e943a501bfd9d87" @@ -4967,6 +5125,85 @@ micromark-core-commonmark@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-extension-gfm-autolink-literal@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== + dependencies: + micromark-util-character "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-footnote@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== + dependencies: + devlop "^1.0.0" + micromark-core-commonmark "^2.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-strikethrough@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz#86106df8b3a692b5f6a92280d3879be6be46d923" + integrity sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw== + dependencies: + devlop "^1.0.0" + micromark-util-chunked "^2.0.0" + micromark-util-classify-character "^2.0.0" + micromark-util-resolve-all "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-table@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz#fac70bcbf51fe65f5f44033118d39be8a9b5940b" + integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm-tagfilter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz#f26d8a7807b5985fba13cf61465b58ca5ff7dc57" + integrity sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg== + dependencies: + micromark-util-types "^2.0.0" + +micromark-extension-gfm-task-list-item@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz#bcc34d805639829990ec175c3eea12bb5b781f2c" + integrity sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw== + dependencies: + devlop "^1.0.0" + micromark-factory-space "^2.0.0" + micromark-util-character "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" + +micromark-extension-gfm@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz#3e13376ab95dd7a5cfd0e29560dfe999657b3c5b" + integrity sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w== + dependencies: + micromark-extension-gfm-autolink-literal "^2.0.0" + micromark-extension-gfm-footnote "^2.0.0" + micromark-extension-gfm-strikethrough "^2.0.0" + micromark-extension-gfm-table "^2.0.0" + micromark-extension-gfm-tagfilter "^2.0.0" + micromark-extension-gfm-task-list-item "^2.0.0" + micromark-util-combine-extensions "^2.0.0" + micromark-util-types "^2.0.0" + micromark-factory-destination@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" @@ -5212,11 +5449,6 @@ nanoid@^3.3.8: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== -nanoid@^3.3.8: - version "3.3.8" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" - integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5252,7 +5484,7 @@ npm-run-path@^5.1.0: integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" - + obj-case@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/obj-case/-/obj-case-0.2.1.tgz#13a554d04e5ca32dfd9d566451fd2b0e11007f1a" @@ -5428,6 +5660,13 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse5@^7.0.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + dependencies: + entities "^4.5.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -5463,12 +5702,6 @@ picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -5498,15 +5731,6 @@ postcss@^8.4.27, postcss@^8.4.41, postcss@^8.5.3: picocolors "^1.1.1" source-map-js "^1.2.1" -postcss@^8.4.41: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== - dependencies: - nanoid "^3.3.8" - picocolors "^1.1.1" - source-map-js "^1.2.1" - prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5548,6 +5772,11 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== +property-information@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.0.0.tgz#3508a6d6b0b8eb3ca6eb2c6623b164d2ed2ab112" + integrity sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -5700,12 +5929,13 @@ react-is@^18.3.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-markdown@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-9.0.1.tgz#c05ddbff67fd3b3f839f8c648e6fb35d022397d1" - integrity sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg== +react-markdown@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-10.1.0.tgz#e22bc20faddbc07605c15284255653c0f3bad5ca" + integrity sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ== dependencies: "@types/hast" "^3.0.0" + "@types/mdast" "^4.0.0" devlop "^1.0.0" hast-util-to-jsx-runtime "^2.0.0" html-url-attributes "^3.0.0" @@ -5899,6 +6129,27 @@ regexp.prototype.flags@^1.5.3: gopd "^1.2.0" set-function-name "^2.0.2" +rehype-raw@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rehype-raw/-/rehype-raw-7.0.0.tgz#59d7348fd5dbef3807bbaa1d443efd2dd85ecee4" + integrity sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww== + dependencies: + "@types/hast" "^3.0.0" + hast-util-raw "^9.0.0" + vfile "^6.0.0" + +remark-gfm@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-4.0.1.tgz#33227b2a74397670d357bf05c098eaf8513f0d6b" + integrity sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-gfm "^3.0.0" + micromark-extension-gfm "^3.0.0" + remark-parse "^11.0.0" + remark-stringify "^11.0.0" + unified "^11.0.0" + remark-parse@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-11.0.0.tgz#aa60743fcb37ebf6b069204eb4da304e40db45a1" @@ -5920,6 +6171,15 @@ remark-rehype@^11.0.0: unified "^11.0.0" vfile "^6.0.0" +remark-stringify@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-11.0.0.tgz#4c5b01dd711c269df1aaae11743eb7e2e7636fd3" + integrity sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw== + dependencies: + "@types/mdast" "^4.0.0" + mdast-util-to-markdown "^2.0.0" + unified "^11.0.0" + resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -6214,11 +6474,6 @@ source-map-js@^1.2.1: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -6633,6 +6888,7 @@ typed-array-length@^1.0.7: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" reflect.getprototypeof "^1.0.6" + typescript@^5.7.3: version "5.7.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e" @@ -6784,6 +7040,14 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +vfile-location@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-5.0.3.tgz#cb9eacd20f2b6426d19451e0eafa3d0a846225c3" + integrity sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg== + dependencies: + "@types/unist" "^3.0.0" + vfile "^6.0.0" + vfile-message@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" @@ -6812,6 +7076,11 @@ vite@^4.5.3: optionalDependencies: fsevents "~2.3.2" +web-namespaces@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" + integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"