Merge branch 'main' of interstellardevelopment.org:sageTheDm/interstellar_ai
This commit is contained in:
		
						commit
						54817a89ea
					
				
					 8 changed files with 202 additions and 121 deletions
				
			
		|  | @ -1,30 +1,28 @@ | ||||||
| 
 | 
 | ||||||
| type Message = { | // type Message = {
 | ||||||
|     role: string; | //     role: string;
 | ||||||
|     content:string | //     content:string
 | ||||||
| } | // }
 | ||||||
| 
 | 
 | ||||||
| type Chat = { | // type Chat = {
 | ||||||
|     name: string; | //     name: string;
 | ||||||
|     messages: Message[]; | //     messages: Message[];
 | ||||||
|     timestamp: number; | //     timestamp: number;
 | ||||||
| }; | // };
 | ||||||
| 
 | 
 | ||||||
| export let chatHistory: Chat[] = []; | // export function addMessageToHistory(index: number, chat: Chat): void {
 | ||||||
|  | //     if (index >= 0 && index < chatHistory.length) {
 | ||||||
|  | //         chatHistory[index] = chat;
 | ||||||
|  | //         chatHistory.sort((a, b) => b.timestamp - a.timestamp)  
 | ||||||
|  | //     }
 | ||||||
|  | // }
 | ||||||
| 
 | 
 | ||||||
| export function addMessageToHistory(index: number, chat: Chat): void { | // export function removeMessageFromHistory(timestamp: number): void {
 | ||||||
|     if (index >= 0 && index < chatHistory.length) { | //     const index = chatHistory.findIndex((msg) => msg.timestamp === timestamp);
 | ||||||
|         chatHistory[index] = chat; | //     if (index > -1) {
 | ||||||
|         chatHistory.sort((a, b) => b.timestamp - a.timestamp) | //         chatHistory.splice(index, 1);
 | ||||||
|     } | //         console.log(`Removed message with timestamp: ${timestamp}`);
 | ||||||
| } | //     } else {
 | ||||||
| 
 | //         console.log(`Message not found with timestamp: ${timestamp}`);
 | ||||||
| export function removeMessageFromHistory(timestamp: number): void { | //     }
 | ||||||
|     const index = chatHistory.findIndex((msg) => msg.timestamp === timestamp); | // }
 | ||||||
|     if (index > -1) { |  | ||||||
|         chatHistory.splice(index, 1); |  | ||||||
|         console.log(`Removed message with timestamp: ${timestamp}`); |  | ||||||
|     } else { |  | ||||||
|         console.log(`Message not found with timestamp: ${timestamp}`); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  | @ -5,34 +5,26 @@ import InputFrontend from "../components/InputFrontend"; | ||||||
| import { sendToVoiceRecognition } from "./voice_backend" | import { sendToVoiceRecognition } from "./voice_backend" | ||||||
| import axios from "axios"; | import axios from "axios"; | ||||||
| import { changeHistory, checkCredentials, getHistory } from './database'; | import { changeHistory, checkCredentials, getHistory } from './database'; | ||||||
| import { addMessageToHistory, removeMessageFromHistory } from "./ChatHistory"; | import { useChatHistory } from '../hooks/useChatHistory'; | ||||||
| 
 | 
 | ||||||
| interface InputOutputHandlerProps { | const InputOutputBackend: React.FC = () => { | ||||||
|   selectedIndex: number; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const InputOutputBackend: React.FC<InputOutputHandlerProps> = ({selectedIndex}) => { |  | ||||||
|   // # variables
 |   // # variables
 | ||||||
|   type Message = { |   type Message = { | ||||||
|     role: string |     role: string | ||||||
|     content: string |     content: string | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   type Chat = { |  | ||||||
|     name?: string |  | ||||||
|     messages: Message[] |  | ||||||
|     timestamp: string |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // Define state variables for user preferences and messages
 |   // Define state variables for user preferences and messages
 | ||||||
|  |   const [chatHistory, setChatHistory, setSelectedIndex] = useChatHistory() | ||||||
|   const [preferredCurrency, setPreferredCurrency] = useState<string>("USD"); |   const [preferredCurrency, setPreferredCurrency] = useState<string>("USD"); | ||||||
|   const [preferredLanguage, setPreferredLanguage] = useState<string>("english"); |   const [preferredLanguage, setPreferredLanguage] = useState<string>("english"); | ||||||
|   const [timeFormat, setTimeFormat] = useState<string>("24-hour"); |   const [timeFormat, setTimeFormat] = useState<string>("24-hour"); | ||||||
|   const [preferredMeasurement, setPreferredMeasurement] = useState<string>("metric"); |   const [preferredMeasurement, setPreferredMeasurement] = useState<string>("metric"); | ||||||
|   const [timeZone, setTimeZone] = useState<string>("GMT"); |   const [timeZone, setTimeZone] = useState<string>("GMT"); | ||||||
|   const [dateFormat, setDateFormat] = useState<string>("DD-MM-YYYY"); |   const [dateFormat, setDateFormat] = useState<string>("DD-MM-YYYY"); | ||||||
|   const [messages, setMessages] = useState<Message[]>([]); |   const [messages, setMessages] = useState<Message[]>(chatHistory.chats[chatHistory.selectedIndex]?.messages || []); | ||||||
|   const [myBoolean, setMyBoolean] = useState<boolean>(false); |   const [myBoolean, setMyBoolean] = useState<boolean>(false); | ||||||
|  |   const [systemMessage, setSystemMessage] = useState<string>("You are a helpful assistant") | ||||||
|   const apiURL = new URL("http://localhost:5000/interstellar_ai/api/ai_create") |   const apiURL = new URL("http://localhost:5000/interstellar_ai/api/ai_create") | ||||||
|   if (typeof window !== 'undefined') { |   if (typeof window !== 'undefined') { | ||||||
|     apiURL.hostname = window.location.hostname; |     apiURL.hostname = window.location.hostname; | ||||||
|  | @ -40,6 +32,23 @@ const InputOutputBackend: React.FC<InputOutputHandlerProps> = ({selectedIndex}) | ||||||
|     apiURL.hostname = "localhost" |     apiURL.hostname = "localhost" | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  | 
 | ||||||
|  |     console.log("History", chatHistory); | ||||||
|  |     console.log("Messages", messages); | ||||||
|  | 
 | ||||||
|  |     // Get the current chat's messages
 | ||||||
|  |     const currentMessages = chatHistory.chats[chatHistory.selectedIndex]?.messages || []; | ||||||
|  | 
 | ||||||
|  |     // If currentMessages is not empty, update messages only if it's not the same
 | ||||||
|  |     if (currentMessages.length > 0 && JSON.stringify(currentMessages) !== JSON.stringify(messages)) { | ||||||
|  |         setMessages(currentMessages); | ||||||
|  |     } else if (messages.length === 0) { | ||||||
|  |         setMessages([{ role: "system", content: systemMessage }, { role: "assistant", content: "Hello! How can I help you?" }]); | ||||||
|  |     } | ||||||
|  | }, [chatHistory, setSelectedIndex]); | ||||||
|  | 
 | ||||||
|   // Update messages when any of the settings change
 |   // Update messages when any of the settings change
 | ||||||
|   useEffect(() => { |   useEffect(() => { | ||||||
|     if (typeof localStorage !== 'undefined') { |     if (typeof localStorage !== 'undefined') { | ||||||
|  | @ -51,11 +60,14 @@ const InputOutputBackend: React.FC<InputOutputHandlerProps> = ({selectedIndex}) | ||||||
|       setDateFormat(localStorage.getItem("dateFormat") || "DD-MM-YYYY"); |       setDateFormat(localStorage.getItem("dateFormat") || "DD-MM-YYYY"); | ||||||
|       setMyBoolean(localStorage.getItem('myBoolean') === 'true'); |       setMyBoolean(localStorage.getItem('myBoolean') === 'true'); | ||||||
|     } |     } | ||||||
|  |   },[]) | ||||||
|  | 
 | ||||||
|  |   useEffect(() => { | ||||||
|     const measurementString = (preferredMeasurement == "Metric") |     const measurementString = (preferredMeasurement == "Metric") | ||||||
|       ? "All measurements follow the metric system. Refuse to use any other measurement system." |       ? "All measurements follow the metric system. Refuse to use any other measurement system." | ||||||
|       : "All measurements follow the imperial system. Refuse to use any other measurement system."; |       : "All measurements follow the imperial system. Refuse to use any other measurement system."; | ||||||
| 
 | 
 | ||||||
|     const systemMessage = myBoolean |     const newSystemMessage = myBoolean | ||||||
|       ? `You are operating in the timezone: ${timeZone}. Use the ${timeFormat} time format and ${dateFormat} for dates. 
 |       ? `You are operating in the timezone: ${timeZone}. Use the ${timeFormat} time format and ${dateFormat} for dates. 
 | ||||||
|       ${measurementString}  |       ${measurementString}  | ||||||
|       The currency is ${preferredCurrency}.  |       The currency is ${preferredCurrency}.  | ||||||
|  | @ -63,12 +75,20 @@ const InputOutputBackend: React.FC<InputOutputHandlerProps> = ({selectedIndex}) | ||||||
|       You are only able to change language if the user specifically states you must.  |       You are only able to change language if the user specifically states you must.  | ||||||
|       Do not answer in multiple languages or multiple measurement systems under any circumstances other than the user requesting it.` |       Do not answer in multiple languages or multiple measurement systems under any circumstances other than the user requesting it.` | ||||||
|       : `You are a helpful assistant`; |       : `You are a helpful assistant`; | ||||||
|     setMessages([ | 
 | ||||||
|       { role: "system", content: systemMessage }, |     setSystemMessage(newSystemMessage) | ||||||
|       { role: "assistant", content: "Hello! How may I help you?" }, |  | ||||||
|     ]); |  | ||||||
|   }, [preferredCurrency, preferredLanguage, timeFormat, preferredMeasurement, timeZone, dateFormat, myBoolean]); |   }, [preferredCurrency, preferredLanguage, timeFormat, preferredMeasurement, timeZone, dateFormat, myBoolean]); | ||||||
| 
 | 
 | ||||||
|  |   useEffect(() => { | ||||||
|  |     const updateSystemprompt = (prompt: string) => { | ||||||
|  |       setMessages(prevMessages => { | ||||||
|  |         const newMessage = { role: "system", content: prompt } | ||||||
|  |         return [newMessage, ...prevMessages] | ||||||
|  |       }) | ||||||
|  |     } | ||||||
|  |     updateSystemprompt | ||||||
|  |   },[systemMessage]) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|   const conversationRef = useRef<HTMLDivElement>(null) |   const conversationRef = useRef<HTMLDivElement>(null) | ||||||
|   const [copyClicked, setCopyClicked] = useState(false) |   const [copyClicked, setCopyClicked] = useState(false) | ||||||
|  | @ -180,7 +200,11 @@ const InputOutputBackend: React.FC<InputOutputHandlerProps> = ({selectedIndex}) | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   const addMessage = (role: string, content: string) => { |   const addMessage = (role: string, content: string) => { | ||||||
|     setMessages(previous => [...previous, { role, content }]) |     const newMessage: Message = { role: role, content: content } | ||||||
|  |     setMessages((prevMessages) => [...prevMessages, newMessage]) | ||||||
|  |     const updatedChats = [...chatHistory.chats] | ||||||
|  |     updatedChats[chatHistory.selectedIndex].messages.push(newMessage) | ||||||
|  |     setChatHistory({...chatHistory, chats:updatedChats}) | ||||||
|   } |   } | ||||||
|   const handleSendClick = (inputValue: string, override: boolean) => { |   const handleSendClick = (inputValue: string, override: boolean) => { | ||||||
|     if (inputValue != "") { |     if (inputValue != "") { | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ import React, { ForwardedRef, useState, useEffect, useRef } from 'react'; | ||||||
| import Markdown from 'react-markdown'; | import Markdown from 'react-markdown'; | ||||||
| import rehypeRaw from 'rehype-raw'; | import rehypeRaw from 'rehype-raw'; | ||||||
| import remarkGfm from 'remark-gfm'; | import remarkGfm from 'remark-gfm'; | ||||||
|  | import { useChatHistory } from '../hooks/useChatHistory'; | ||||||
| 
 | 
 | ||||||
| type Message = { | type Message = { | ||||||
|   role: string; |   role: string; | ||||||
|  | @ -21,6 +22,7 @@ const ConversationFrontend = React.forwardRef<HTMLDivElement, ConversationProps> | ||||||
|   ({ messages, onStopClick, onResendClick, onEditClick, onCopyClick, isClicked }, ref: ForwardedRef<HTMLDivElement>) => { |   ({ messages, onStopClick, onResendClick, onEditClick, onCopyClick, isClicked }, ref: ForwardedRef<HTMLDivElement>) => { | ||||||
|     const [isScrolling, setIsScrolling] = useState(true); |     const [isScrolling, setIsScrolling] = useState(true); | ||||||
|     const messagesEndRef = useRef<HTMLDivElement | null>(null); |     const messagesEndRef = useRef<HTMLDivElement | null>(null); | ||||||
|  |     const [chatHistory, setChatHistory, setSelectedIndex] = useChatHistory() | ||||||
| 
 | 
 | ||||||
|     useEffect(() => { |     useEffect(() => { | ||||||
|       const observer = new IntersectionObserver( |       const observer = new IntersectionObserver( | ||||||
|  | @ -58,7 +60,7 @@ const ConversationFrontend = React.forwardRef<HTMLDivElement, ConversationProps> | ||||||
|     return ( |     return ( | ||||||
|       <div className="output" ref={ref}> |       <div className="output" ref={ref}> | ||||||
|         <div className="conversation resize" id="conversation"> |         <div className="conversation resize" id="conversation"> | ||||||
|           {messages.map((message, index) => { |           {chatHistory.chats[chatHistory.selectedIndex].messages.map((message, index) => { | ||||||
|             if (index >= 1) { |             if (index >= 1) { | ||||||
|               return ( |               return ( | ||||||
|                 <div |                 <div | ||||||
|  |  | ||||||
|  | @ -1,11 +1,8 @@ | ||||||
| import React, { useState } from 'react'; | import React, { useState } from 'react'; | ||||||
|  | import { useChatHistory } from '../hooks/useChatHistory'; | ||||||
| 
 | 
 | ||||||
| interface HistoryProps{ | const History: React.FC = () => { | ||||||
|   selectedIndex: number; |   const [chatHistory, setChatHistory, setSelectedIndex] = useChatHistory() | ||||||
|   setSelectedIndex: (index: number) => void; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const History: React.FC<HistoryProps> = ({selectedIndex, setSelectedIndex}) => { |  | ||||||
| 
 | 
 | ||||||
|   const handleHistoryClick = (index: number) => { |   const handleHistoryClick = (index: number) => { | ||||||
|     setSelectedIndex(index) |     setSelectedIndex(index) | ||||||
|  | @ -16,9 +13,9 @@ const History: React.FC<HistoryProps> = ({selectedIndex, setSelectedIndex}) => { | ||||||
|       <div className="history"> |       <div className="history"> | ||||||
|         <ul> |         <ul> | ||||||
|           {/* Populate with history items */} |           {/* Populate with history items */} | ||||||
|           {Array.from({ length: 20 }, (_, index) => ( |           {chatHistory.chats.map((chats, index) => ( | ||||||
|             <li key={index}> |             <li key={index}> | ||||||
|               <a href="#" onClick={()=>handleHistoryClick(index)}>history{index + 1}</a> |               <a href="#" onClick={() => handleHistoryClick(index)}>{chatHistory.chats[index].name}</a> | ||||||
|             </li> |             </li> | ||||||
|           ))} |           ))} | ||||||
|         </ul> |         </ul> | ||||||
|  |  | ||||||
							
								
								
									
										55
									
								
								app/hooks/useChatHistory.tsx
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								app/hooks/useChatHistory.tsx
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,55 @@ | ||||||
|  | import { useEffect, useState } from "react" | ||||||
|  | 
 | ||||||
|  | interface Message { | ||||||
|  |     role: string | ||||||
|  |     content:string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | interface ChatMessages { | ||||||
|  |     name: string | ||||||
|  |     messages: Message[] | ||||||
|  |     timestamp: number | ||||||
|  |      | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | interface GlobalChatHistory { | ||||||
|  |     chats: ChatMessages[] | ||||||
|  |     selectedIndex: number | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | let globalChatHistory: GlobalChatHistory = { | ||||||
|  |     chats: [ | ||||||
|  |         { name: "Chat 1", messages: [], timestamp: 4 } | ||||||
|  |     ], | ||||||
|  |     selectedIndex:0 | ||||||
|  | } | ||||||
|  | let listeners: ((state: GlobalChatHistory) => void)[] = [] | ||||||
|  | 
 | ||||||
|  | const setGlobalState = (newState: GlobalChatHistory): void => { | ||||||
|  |     globalChatHistory = newState; | ||||||
|  |     listeners.forEach((listener) => listener(globalChatHistory)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const useChatHistory = (): [GlobalChatHistory, (newState:GlobalChatHistory) => void, (index:number)=>void] => { | ||||||
|  |     const [state, setState] = useState<GlobalChatHistory>(globalChatHistory) | ||||||
|  | 
 | ||||||
|  |     useEffect(() => { | ||||||
|  |         console.log("help", globalChatHistory); | ||||||
|  |          | ||||||
|  |         const listener = (newState: GlobalChatHistory) => { | ||||||
|  |             setState(newState) | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         listeners.push(listener) | ||||||
|  | 
 | ||||||
|  |         return () => { | ||||||
|  |             listeners = listeners.filter((l) => l!== listener) | ||||||
|  |         } | ||||||
|  |     }, []) | ||||||
|  | 
 | ||||||
|  |     const setSelectedIndex = (index: number) => { | ||||||
|  |         setGlobalState({...state,selectedIndex:index}) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return [state, setGlobalState, setSelectedIndex] | ||||||
|  | } | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| You will need to make three folders: | You will need to make three folders: | ||||||
| 
 | 
 | ||||||
| node-bin - contains nodejs portable | node-bin - contains nodejs portable | ||||||
| python-bin - contains python3 portable - don't forget to add the .pth file and adjust it accordingly, because import site is normally missing. | python-bin - contains python3 portable - don't forget to add the .pth file and adjust it accordingly, because import site is normally missing. -- also put your python files in here too, else it will not run! | ||||||
| ollama.bin - contains ollama portable | ollama.bin - contains ollama portable | ||||||
| 
 | 
 | ||||||
| you also need vc redist 2019 | you also need vc redist 2019 | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| python313.zip | python312.zip | ||||||
| . | . | ||||||
| 
 | 
 | ||||||
| # Uncomment to run site.main() automatically | # Uncomment to run site.main() automatically | ||||||
							
								
								
									
										133
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										133
									
								
								package-lock.json
									
										
									
										generated
									
									
									
								
							|  | @ -685,9 +685,9 @@ | ||||||
|       "license": "MIT" |       "license": "MIT" | ||||||
|     }, |     }, | ||||||
|     "node_modules/@types/node": { |     "node_modules/@types/node": { | ||||||
|       "version": "20.16.10", |       "version": "20.16.11", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.10.tgz", |       "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.11.tgz", | ||||||
|       "integrity": "sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==", |       "integrity": "sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==", | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "undici-types": "~6.19.2" |         "undici-types": "~6.19.2" | ||||||
|  | @ -700,9 +700,9 @@ | ||||||
|       "license": "MIT" |       "license": "MIT" | ||||||
|     }, |     }, | ||||||
|     "node_modules/@types/react": { |     "node_modules/@types/react": { | ||||||
|       "version": "18.3.10", |       "version": "18.3.11", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", |       "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", | ||||||
|       "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", |       "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@types/prop-types": "*", |         "@types/prop-types": "*", | ||||||
|  | @ -745,17 +745,17 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/eslint-plugin": { |     "node_modules/@typescript-eslint/eslint-plugin": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", | ||||||
|       "integrity": "sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==", |       "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@eslint-community/regexpp": "^4.10.0", |         "@eslint-community/regexpp": "^4.10.0", | ||||||
|         "@typescript-eslint/scope-manager": "8.8.0", |         "@typescript-eslint/scope-manager": "8.8.1", | ||||||
|         "@typescript-eslint/type-utils": "8.8.0", |         "@typescript-eslint/type-utils": "8.8.1", | ||||||
|         "@typescript-eslint/utils": "8.8.0", |         "@typescript-eslint/utils": "8.8.1", | ||||||
|         "@typescript-eslint/visitor-keys": "8.8.0", |         "@typescript-eslint/visitor-keys": "8.8.1", | ||||||
|         "graphemer": "^1.4.0", |         "graphemer": "^1.4.0", | ||||||
|         "ignore": "^5.3.1", |         "ignore": "^5.3.1", | ||||||
|         "natural-compare": "^1.4.0", |         "natural-compare": "^1.4.0", | ||||||
|  | @ -779,16 +779,16 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/parser": { |     "node_modules/@typescript-eslint/parser": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", | ||||||
|       "integrity": "sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==", |       "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "BSD-2-Clause", |       "license": "BSD-2-Clause", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@typescript-eslint/scope-manager": "8.8.0", |         "@typescript-eslint/scope-manager": "8.8.1", | ||||||
|         "@typescript-eslint/types": "8.8.0", |         "@typescript-eslint/types": "8.8.1", | ||||||
|         "@typescript-eslint/typescript-estree": "8.8.0", |         "@typescript-eslint/typescript-estree": "8.8.1", | ||||||
|         "@typescript-eslint/visitor-keys": "8.8.0", |         "@typescript-eslint/visitor-keys": "8.8.1", | ||||||
|         "debug": "^4.3.4" |         "debug": "^4.3.4" | ||||||
|       }, |       }, | ||||||
|       "engines": { |       "engines": { | ||||||
|  | @ -808,14 +808,14 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/scope-manager": { |     "node_modules/@typescript-eslint/scope-manager": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", | ||||||
|       "integrity": "sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==", |       "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@typescript-eslint/types": "8.8.0", |         "@typescript-eslint/types": "8.8.1", | ||||||
|         "@typescript-eslint/visitor-keys": "8.8.0" |         "@typescript-eslint/visitor-keys": "8.8.1" | ||||||
|       }, |       }, | ||||||
|       "engines": { |       "engines": { | ||||||
|         "node": "^18.18.0 || ^20.9.0 || >=21.1.0" |         "node": "^18.18.0 || ^20.9.0 || >=21.1.0" | ||||||
|  | @ -826,14 +826,14 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/type-utils": { |     "node_modules/@typescript-eslint/type-utils": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", | ||||||
|       "integrity": "sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==", |       "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@typescript-eslint/typescript-estree": "8.8.0", |         "@typescript-eslint/typescript-estree": "8.8.1", | ||||||
|         "@typescript-eslint/utils": "8.8.0", |         "@typescript-eslint/utils": "8.8.1", | ||||||
|         "debug": "^4.3.4", |         "debug": "^4.3.4", | ||||||
|         "ts-api-utils": "^1.3.0" |         "ts-api-utils": "^1.3.0" | ||||||
|       }, |       }, | ||||||
|  | @ -851,9 +851,9 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/types": { |     "node_modules/@typescript-eslint/types": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", | ||||||
|       "integrity": "sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==", |       "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "engines": { |       "engines": { | ||||||
|  | @ -865,14 +865,14 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/typescript-estree": { |     "node_modules/@typescript-eslint/typescript-estree": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", | ||||||
|       "integrity": "sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==", |       "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "BSD-2-Clause", |       "license": "BSD-2-Clause", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@typescript-eslint/types": "8.8.0", |         "@typescript-eslint/types": "8.8.1", | ||||||
|         "@typescript-eslint/visitor-keys": "8.8.0", |         "@typescript-eslint/visitor-keys": "8.8.1", | ||||||
|         "debug": "^4.3.4", |         "debug": "^4.3.4", | ||||||
|         "fast-glob": "^3.3.2", |         "fast-glob": "^3.3.2", | ||||||
|         "is-glob": "^4.0.3", |         "is-glob": "^4.0.3", | ||||||
|  | @ -933,16 +933,16 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/utils": { |     "node_modules/@typescript-eslint/utils": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", | ||||||
|       "integrity": "sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==", |       "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@eslint-community/eslint-utils": "^4.4.0", |         "@eslint-community/eslint-utils": "^4.4.0", | ||||||
|         "@typescript-eslint/scope-manager": "8.8.0", |         "@typescript-eslint/scope-manager": "8.8.1", | ||||||
|         "@typescript-eslint/types": "8.8.0", |         "@typescript-eslint/types": "8.8.1", | ||||||
|         "@typescript-eslint/typescript-estree": "8.8.0" |         "@typescript-eslint/typescript-estree": "8.8.1" | ||||||
|       }, |       }, | ||||||
|       "engines": { |       "engines": { | ||||||
|         "node": "^18.18.0 || ^20.9.0 || >=21.1.0" |         "node": "^18.18.0 || ^20.9.0 || >=21.1.0" | ||||||
|  | @ -956,13 +956,13 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/@typescript-eslint/visitor-keys": { |     "node_modules/@typescript-eslint/visitor-keys": { | ||||||
|       "version": "8.8.0", |       "version": "8.8.1", | ||||||
|       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.0.tgz", |       "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", | ||||||
|       "integrity": "sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==", |       "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "@typescript-eslint/types": "8.8.0", |         "@typescript-eslint/types": "8.8.1", | ||||||
|         "eslint-visitor-keys": "^3.4.3" |         "eslint-visitor-keys": "^3.4.3" | ||||||
|       }, |       }, | ||||||
|       "engines": { |       "engines": { | ||||||
|  | @ -1457,9 +1457,9 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/caniuse-lite": { |     "node_modules/caniuse-lite": { | ||||||
|       "version": "1.0.30001664", |       "version": "1.0.30001667", | ||||||
|       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", |       "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", | ||||||
|       "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", |       "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", | ||||||
|       "funding": [ |       "funding": [ | ||||||
|         { |         { | ||||||
|           "type": "opencollective", |           "type": "opencollective", | ||||||
|  | @ -2256,6 +2256,7 @@ | ||||||
|       "version": "8.57.1", |       "version": "8.57.1", | ||||||
|       "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", |       "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", | ||||||
|       "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", |       "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", | ||||||
|  |       "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|  | @ -2423,9 +2424,9 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/eslint-plugin-import": { |     "node_modules/eslint-plugin-import": { | ||||||
|       "version": "2.30.0", |       "version": "2.31.0", | ||||||
|       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz", |       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", | ||||||
|       "integrity": "sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==", |       "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|  | @ -2437,7 +2438,7 @@ | ||||||
|         "debug": "^3.2.7", |         "debug": "^3.2.7", | ||||||
|         "doctrine": "^2.1.0", |         "doctrine": "^2.1.0", | ||||||
|         "eslint-import-resolver-node": "^0.3.9", |         "eslint-import-resolver-node": "^0.3.9", | ||||||
|         "eslint-module-utils": "^2.9.0", |         "eslint-module-utils": "^2.12.0", | ||||||
|         "hasown": "^2.0.2", |         "hasown": "^2.0.2", | ||||||
|         "is-core-module": "^2.15.1", |         "is-core-module": "^2.15.1", | ||||||
|         "is-glob": "^4.0.3", |         "is-glob": "^4.0.3", | ||||||
|  | @ -2446,13 +2447,14 @@ | ||||||
|         "object.groupby": "^1.0.3", |         "object.groupby": "^1.0.3", | ||||||
|         "object.values": "^1.2.0", |         "object.values": "^1.2.0", | ||||||
|         "semver": "^6.3.1", |         "semver": "^6.3.1", | ||||||
|  |         "string.prototype.trimend": "^1.0.8", | ||||||
|         "tsconfig-paths": "^3.15.0" |         "tsconfig-paths": "^3.15.0" | ||||||
|       }, |       }, | ||||||
|       "engines": { |       "engines": { | ||||||
|         "node": ">=4" |         "node": ">=4" | ||||||
|       }, |       }, | ||||||
|       "peerDependencies": { |       "peerDependencies": { | ||||||
|         "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" |         "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/eslint-plugin-import/node_modules/debug": { |     "node_modules/eslint-plugin-import/node_modules/debug": { | ||||||
|  | @ -4136,9 +4138,9 @@ | ||||||
|       "license": "ISC" |       "license": "ISC" | ||||||
|     }, |     }, | ||||||
|     "node_modules/iterator.prototype": { |     "node_modules/iterator.prototype": { | ||||||
|       "version": "1.1.2", |       "version": "1.1.3", | ||||||
|       "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", |       "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", | ||||||
|       "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", |       "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|  | @ -4147,6 +4149,9 @@ | ||||||
|         "has-symbols": "^1.0.3", |         "has-symbols": "^1.0.3", | ||||||
|         "reflect.getprototypeof": "^1.0.4", |         "reflect.getprototypeof": "^1.0.4", | ||||||
|         "set-function-name": "^2.0.1" |         "set-function-name": "^2.0.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.4" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/jackspeak": { |     "node_modules/jackspeak": { | ||||||
|  | @ -6294,16 +6299,16 @@ | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "node_modules/regexp.prototype.flags": { |     "node_modules/regexp.prototype.flags": { | ||||||
|       "version": "1.5.2", |       "version": "1.5.3", | ||||||
|       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", |       "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", | ||||||
|       "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", |       "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "license": "MIT", |       "license": "MIT", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "call-bind": "^1.0.6", |         "call-bind": "^1.0.7", | ||||||
|         "define-properties": "^1.2.1", |         "define-properties": "^1.2.1", | ||||||
|         "es-errors": "^1.3.0", |         "es-errors": "^1.3.0", | ||||||
|         "set-function-name": "^2.0.1" |         "set-function-name": "^2.0.2" | ||||||
|       }, |       }, | ||||||
|       "engines": { |       "engines": { | ||||||
|         "node": ">= 0.4" |         "node": ">= 0.4" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue