vesakkivignesh commited on
Commit
25f6ee4
·
1 Parent(s): 2478b29
.gitignore ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Logs
2
+ logs
3
+ *.log
4
+ npm-debug.log*
5
+ yarn-debug.log*
6
+ yarn-error.log*
7
+ pnpm-debug.log*
8
+ lerna-debug.log*
9
+
10
+ node_modules
11
+ dist
12
+ dist-ssr
13
+ *.local
14
+
15
+ # Editor directories and files
16
+ .vscode/*
17
+ !.vscode/extensions.json
18
+ .idea
19
+ .DS_Store
20
+ *.suo
21
+ *.ntvs*
22
+ *.njsproj
23
+ *.sln
24
+ *.sw?
App.tsx ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import React, { useState, useEffect, useRef, useCallback } from 'react';
3
+ import { ChatMessage as ChatMessageType } from './types';
4
+ import { sendMessageToGemini } from './services/geminiService';
5
+ import Header from './components/Header';
6
+ import ChatMessage from './components/ChatMessage';
7
+ import ChatInput from './components/ChatInput';
8
+
9
+ const App: React.FC = () => {
10
+ const [messages, setMessages] = useState<ChatMessageType[]>([]);
11
+ const [isLoading, setIsLoading] = useState<boolean>(false);
12
+ const messagesEndRef = useRef<HTMLDivElement>(null);
13
+
14
+ useEffect(() => {
15
+ setMessages([
16
+ {
17
+ id: 'initial-bot-message',
18
+ text: "Hello! I am MediBot AI. I can provide general information on medical topics. How can I help you today? \n\n**Disclaimer:** I am an AI assistant and not a medical professional. This information is for educational purposes only. Please consult with a qualified healthcare provider for any medical concerns.",
19
+ sender: 'bot'
20
+ }
21
+ ]);
22
+ }, []);
23
+
24
+ const scrollToBottom = () => {
25
+ messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
26
+ };
27
+
28
+ useEffect(() => {
29
+ scrollToBottom();
30
+ }, [messages]);
31
+
32
+ const handleSendMessage = useCallback(async (text: string) => {
33
+ if (!text.trim()) return;
34
+
35
+ const userMessage: ChatMessageType = {
36
+ id: `user-${Date.now()}`,
37
+ text,
38
+ sender: 'user'
39
+ };
40
+ setMessages(prev => [...prev, userMessage]);
41
+ setIsLoading(true);
42
+
43
+ try {
44
+ const botResponseText = await sendMessageToGemini(text);
45
+ const botMessage: ChatMessageType = {
46
+ id: `bot-${Date.now()}`,
47
+ text: botResponseText,
48
+ sender: 'bot'
49
+ };
50
+ setMessages(prev => [...prev, botMessage]);
51
+ } catch (error) {
52
+ console.error("Failed to get response from Gemini:", error);
53
+ const errorMessage: ChatMessageType = {
54
+ id: `error-${Date.now()}`,
55
+ text: "Sorry, I encountered an error. Please try again later.",
56
+ sender: 'bot'
57
+ };
58
+ setMessages(prev => [...prev, errorMessage]);
59
+ } finally {
60
+ setIsLoading(false);
61
+ }
62
+ }, []);
63
+
64
+ return (
65
+ <div className="flex flex-col h-screen bg-gray-100 font-sans">
66
+ <Header />
67
+ <main className="flex-1 overflow-y-auto p-4 md:p-6 space-y-4">
68
+ {messages.map((msg) => (
69
+ <ChatMessage key={msg.id} message={msg} />
70
+ ))}
71
+ {isLoading && (
72
+ <div className="flex justify-start">
73
+ <div className="bg-white rounded-lg p-3 max-w-lg shadow-sm">
74
+ <div className="flex items-center space-x-2">
75
+ <div className="w-2 h-2 bg-blue-500 rounded-full animate-pulse"></div>
76
+ <div className="w-2 h-2 bg-blue-500 rounded-full animate-pulse delay-75"></div>
77
+ <div className="w-2 h-2 bg-blue-500 rounded-full animate-pulse delay-150"></div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ )}
82
+ <div ref={messagesEndRef} />
83
+ </main>
84
+ <ChatInput onSendMessage={handleSendMessage} isLoading={isLoading} />
85
+ </div>
86
+ );
87
+ };
88
+
89
+ export default App;
README.md CHANGED
@@ -1,11 +1,20 @@
1
- ---
2
- title: 6ammedical
3
- emoji: 🏆
4
- colorFrom: blue
5
- colorTo: red
6
- sdk: docker
7
- pinned: false
8
- license: apache-2.0
9
- ---
10
-
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
1
+ <div align="center">
2
+ <img width="1200" height="475" alt="GHBanner" src="https://github.com/user-attachments/assets/0aa67016-6eaf-458a-adb2-6e31a0763ed6" />
3
+ </div>
4
+
5
+ # Run and deploy your AI Studio app
6
+
7
+ This contains everything you need to run your app locally.
8
+
9
+ View your app in AI Studio: https://ai.studio/apps/drive/1M1desnS263rQUQR9DYyqxqy7Lw0U_iL4
10
+
11
+ ## Run Locally
12
+
13
+ **Prerequisites:** Node.js
14
+
15
+
16
+ 1. Install dependencies:
17
+ `npm install`
18
+ 2. Set the `GEMINI_API_KEY` in [.env.local](.env.local) to your Gemini API key
19
+ 3. Run the app:
20
+ `npm run dev`
components/ChatInput.tsx ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect, useRef } from 'react';
2
+
3
+ interface ChatInputProps {
4
+ onSendMessage: (text: string) => void;
5
+ isLoading: boolean;
6
+ }
7
+
8
+ // Check for SpeechRecognition API
9
+ // FIX: Cast window to `any` to access non-standard SpeechRecognition APIs without TypeScript errors.
10
+ const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;
11
+ const recognition = SpeechRecognition ? new SpeechRecognition() : null;
12
+
13
+ if (recognition) {
14
+ recognition.continuous = false;
15
+ recognition.lang = 'en-US';
16
+ recognition.interimResults = false;
17
+ }
18
+
19
+ const ChatInput: React.FC<ChatInputProps> = ({ onSendMessage, isLoading }) => {
20
+ const [text, setText] = useState('');
21
+ const [isListening, setIsListening] = useState(false);
22
+ const recognitionRef = useRef(recognition);
23
+
24
+ useEffect(() => {
25
+ const currentRecognition = recognitionRef.current;
26
+ if (!currentRecognition) return;
27
+
28
+ // FIX: Use `any` for the event type as SpeechRecognitionEvent is not defined in this project's TS config.
29
+ const handleResult = (event: any) => {
30
+ const transcript = event.results[0][0].transcript;
31
+ setText(transcript);
32
+ handleSend(); // Auto-send after transcription
33
+ };
34
+
35
+ const handleEnd = () => {
36
+ setIsListening(false);
37
+ };
38
+
39
+ // FIX: Use `any` for the event type as SpeechRecognitionError (or the correct SpeechRecognitionErrorEvent) is not defined.
40
+ const handleError = (event: any) => {
41
+ console.error('Speech recognition error', event.error);
42
+ setIsListening(false);
43
+ }
44
+
45
+ currentRecognition.addEventListener('result', handleResult);
46
+ currentRecognition.addEventListener('end', handleEnd);
47
+ currentRecognition.addEventListener('error', handleError);
48
+
49
+
50
+ return () => {
51
+ currentRecognition.removeEventListener('result', handleResult);
52
+ currentRecognition.removeEventListener('end', handleEnd);
53
+ currentRecognition.removeEventListener('error', handleError);
54
+ };
55
+ // eslint-disable-next-line react-hooks/exhaustive-deps
56
+ }, []);
57
+
58
+ const handleSend = () => {
59
+ if (text.trim() && !isLoading) {
60
+ onSendMessage(text);
61
+ setText('');
62
+ }
63
+ };
64
+
65
+ const handleKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {
66
+ if (e.key === 'Enter') {
67
+ handleSend();
68
+ }
69
+ };
70
+
71
+ const toggleListening = () => {
72
+ if (!recognitionRef.current) return;
73
+ if (isListening) {
74
+ recognitionRef.current.stop();
75
+ } else {
76
+ recognitionRef.current.start();
77
+ }
78
+ setIsListening(!isListening);
79
+ };
80
+
81
+
82
+ return (
83
+ <footer className="bg-white border-t border-gray-200 p-4">
84
+ <div className="max-w-4xl mx-auto flex items-center space-x-3">
85
+ {recognition && (
86
+ <button
87
+ onClick={toggleListening}
88
+ disabled={isLoading}
89
+ className={`flex-shrink-0 w-10 h-10 rounded-full flex items-center justify-center transition-colors duration-200 ${
90
+ isListening ? 'bg-red-500 text-white' : 'bg-gray-200 text-gray-600 hover:bg-gray-300'
91
+ } disabled:opacity-50 disabled:cursor-not-allowed`}
92
+ >
93
+ <svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
94
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 01-3-3V5a3 3 0 116 0v6a3 3 0 01-3 3z" />
95
+ </svg>
96
+ </button>
97
+ )}
98
+ <input
99
+ type="text"
100
+ value={text}
101
+ onChange={(e) => setText(e.target.value)}
102
+ onKeyPress={handleKeyPress}
103
+ placeholder="Type your medical question..."
104
+ className="w-full p-3 border border-gray-300 rounded-full focus:outline-none focus:ring-2 focus:ring-blue-500 transition-shadow"
105
+ disabled={isLoading}
106
+ />
107
+ <button
108
+ onClick={handleSend}
109
+ disabled={isLoading || !text.trim()}
110
+ className="bg-blue-500 text-white rounded-full p-3 flex-shrink-0 hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:bg-blue-300 disabled:cursor-not-allowed transition-colors"
111
+ >
112
+ <svg xmlns="http://www.w3.org/2000/svg" className="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
113
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 10l7-7m0 0l7 7m-7-7v18" />
114
+ </svg>
115
+ </button>
116
+ </div>
117
+ </footer>
118
+ );
119
+ };
120
+
121
+ export default ChatInput;
components/ChatMessage.tsx ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import React from 'react';
3
+ import { ChatMessage as ChatMessageType } from '../types';
4
+
5
+ interface ChatMessageProps {
6
+ message: ChatMessageType;
7
+ }
8
+
9
+ const ChatMessage: React.FC<ChatMessageProps> = ({ message }) => {
10
+ const isUser = message.sender === 'user';
11
+ const bubbleClasses = isUser
12
+ ? 'bg-blue-500 text-white self-end rounded-br-none'
13
+ : 'bg-white text-gray-800 self-start rounded-bl-none';
14
+ const containerClasses = isUser ? 'justify-end' : 'justify-start';
15
+
16
+ // Basic markdown to HTML conversion for bold and newlines
17
+ const formatText = (text: string) => {
18
+ return text
19
+ .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
20
+ .replace(/\n/g, '<br />');
21
+ };
22
+
23
+ return (
24
+ <div className={`flex ${containerClasses}`}>
25
+ <div className={`rounded-xl p-4 max-w-lg lg:max-w-2xl shadow-md ${bubbleClasses}`}>
26
+ <p className="text-sm" dangerouslySetInnerHTML={{ __html: formatText(message.text) }} />
27
+ </div>
28
+ </div>
29
+ );
30
+ };
31
+
32
+ export default ChatMessage;
components/Header.tsx ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import React from 'react';
3
+
4
+ const Header: React.FC = () => {
5
+ return (
6
+ <header className="bg-white shadow-md p-4 flex items-center space-x-3">
7
+ <div className="w-12 h-12 bg-blue-500 rounded-full flex items-center justify-center">
8
+ <svg xmlns="http://www.w3.org/2000/svg" className="h-7 w-7 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
9
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" />
10
+ </svg>
11
+ </div>
12
+ <div>
13
+ <h1 className="text-xl font-bold text-gray-800">MediBot AI</h1>
14
+ <p className="text-sm text-gray-500">Your Personal Health Information Assistant</p>
15
+ </div>
16
+ </header>
17
+ );
18
+ };
19
+
20
+ export default Header;
index.html ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ <!DOCTYPE html>
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
+ <title>MediBot AI</title>
9
+ <script src="https://cdn.tailwindcss.com"></script>
10
+ <script type="importmap">
11
+ {
12
+ "imports": {
13
+ "react/": "https://aistudiocdn.com/react@^19.2.0/",
14
+ "react": "https://aistudiocdn.com/react@^19.2.0",
15
+ "react-dom/": "https://aistudiocdn.com/react-dom@^19.2.0/",
16
+ "@google/genai": "https://aistudiocdn.com/@google/genai@^1.27.0"
17
+ }
18
+ }
19
+ </script>
20
+ </head>
21
+ <body>
22
+ <div id="root"></div>
23
+ <script type="module" src="/index.tsx"></script>
24
+ </body>
25
+ </html>
index.tsx ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import React from 'react';
3
+ import ReactDOM from 'react-dom/client';
4
+ import App from './App';
5
+
6
+ const rootElement = document.getElementById('root');
7
+ if (!rootElement) {
8
+ throw new Error("Could not find root element to mount to");
9
+ }
10
+
11
+ const root = ReactDOM.createRoot(rootElement);
12
+ root.render(
13
+ <React.StrictMode>
14
+ <App />
15
+ </React.StrictMode>
16
+ );
metadata.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "MediBot AI",
3
+ "description": "An AI-powered medical chatbot providing general health information. This application is not a substitute for professional medical advice.",
4
+ "requestFramePermissions": [
5
+ "microphone"
6
+ ]
7
+ }
package-lock.json ADDED
@@ -0,0 +1,1945 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "medibot-ai",
3
+ "version": "0.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "medibot-ai",
9
+ "version": "0.0.0",
10
+ "dependencies": {
11
+ "@google/genai": "^1.27.0",
12
+ "react": "^19.2.0",
13
+ "react-dom": "^19.2.0"
14
+ },
15
+ "devDependencies": {
16
+ "@types/node": "^22.14.0",
17
+ "@vitejs/plugin-react": "^5.0.0",
18
+ "typescript": "~5.8.2",
19
+ "vite": "^6.2.0"
20
+ }
21
+ },
22
+ "node_modules/@babel/code-frame": {
23
+ "version": "7.27.1",
24
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
25
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
26
+ "dev": true,
27
+ "dependencies": {
28
+ "@babel/helper-validator-identifier": "^7.27.1",
29
+ "js-tokens": "^4.0.0",
30
+ "picocolors": "^1.1.1"
31
+ },
32
+ "engines": {
33
+ "node": ">=6.9.0"
34
+ }
35
+ },
36
+ "node_modules/@babel/compat-data": {
37
+ "version": "7.28.5",
38
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
39
+ "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
40
+ "dev": true,
41
+ "engines": {
42
+ "node": ">=6.9.0"
43
+ }
44
+ },
45
+ "node_modules/@babel/core": {
46
+ "version": "7.28.5",
47
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
48
+ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
49
+ "dev": true,
50
+ "dependencies": {
51
+ "@babel/code-frame": "^7.27.1",
52
+ "@babel/generator": "^7.28.5",
53
+ "@babel/helper-compilation-targets": "^7.27.2",
54
+ "@babel/helper-module-transforms": "^7.28.3",
55
+ "@babel/helpers": "^7.28.4",
56
+ "@babel/parser": "^7.28.5",
57
+ "@babel/template": "^7.27.2",
58
+ "@babel/traverse": "^7.28.5",
59
+ "@babel/types": "^7.28.5",
60
+ "@jridgewell/remapping": "^2.3.5",
61
+ "convert-source-map": "^2.0.0",
62
+ "debug": "^4.1.0",
63
+ "gensync": "^1.0.0-beta.2",
64
+ "json5": "^2.2.3",
65
+ "semver": "^6.3.1"
66
+ },
67
+ "engines": {
68
+ "node": ">=6.9.0"
69
+ },
70
+ "funding": {
71
+ "type": "opencollective",
72
+ "url": "https://opencollective.com/babel"
73
+ }
74
+ },
75
+ "node_modules/@babel/generator": {
76
+ "version": "7.28.5",
77
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
78
+ "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
79
+ "dev": true,
80
+ "dependencies": {
81
+ "@babel/parser": "^7.28.5",
82
+ "@babel/types": "^7.28.5",
83
+ "@jridgewell/gen-mapping": "^0.3.12",
84
+ "@jridgewell/trace-mapping": "^0.3.28",
85
+ "jsesc": "^3.0.2"
86
+ },
87
+ "engines": {
88
+ "node": ">=6.9.0"
89
+ }
90
+ },
91
+ "node_modules/@babel/helper-compilation-targets": {
92
+ "version": "7.27.2",
93
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
94
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
95
+ "dev": true,
96
+ "dependencies": {
97
+ "@babel/compat-data": "^7.27.2",
98
+ "@babel/helper-validator-option": "^7.27.1",
99
+ "browserslist": "^4.24.0",
100
+ "lru-cache": "^5.1.1",
101
+ "semver": "^6.3.1"
102
+ },
103
+ "engines": {
104
+ "node": ">=6.9.0"
105
+ }
106
+ },
107
+ "node_modules/@babel/helper-globals": {
108
+ "version": "7.28.0",
109
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
110
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
111
+ "dev": true,
112
+ "engines": {
113
+ "node": ">=6.9.0"
114
+ }
115
+ },
116
+ "node_modules/@babel/helper-module-imports": {
117
+ "version": "7.27.1",
118
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
119
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
120
+ "dev": true,
121
+ "dependencies": {
122
+ "@babel/traverse": "^7.27.1",
123
+ "@babel/types": "^7.27.1"
124
+ },
125
+ "engines": {
126
+ "node": ">=6.9.0"
127
+ }
128
+ },
129
+ "node_modules/@babel/helper-module-transforms": {
130
+ "version": "7.28.3",
131
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
132
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
133
+ "dev": true,
134
+ "dependencies": {
135
+ "@babel/helper-module-imports": "^7.27.1",
136
+ "@babel/helper-validator-identifier": "^7.27.1",
137
+ "@babel/traverse": "^7.28.3"
138
+ },
139
+ "engines": {
140
+ "node": ">=6.9.0"
141
+ },
142
+ "peerDependencies": {
143
+ "@babel/core": "^7.0.0"
144
+ }
145
+ },
146
+ "node_modules/@babel/helper-plugin-utils": {
147
+ "version": "7.27.1",
148
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
149
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
150
+ "dev": true,
151
+ "engines": {
152
+ "node": ">=6.9.0"
153
+ }
154
+ },
155
+ "node_modules/@babel/helper-string-parser": {
156
+ "version": "7.27.1",
157
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
158
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
159
+ "dev": true,
160
+ "engines": {
161
+ "node": ">=6.9.0"
162
+ }
163
+ },
164
+ "node_modules/@babel/helper-validator-identifier": {
165
+ "version": "7.28.5",
166
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
167
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
168
+ "dev": true,
169
+ "engines": {
170
+ "node": ">=6.9.0"
171
+ }
172
+ },
173
+ "node_modules/@babel/helper-validator-option": {
174
+ "version": "7.27.1",
175
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
176
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
177
+ "dev": true,
178
+ "engines": {
179
+ "node": ">=6.9.0"
180
+ }
181
+ },
182
+ "node_modules/@babel/helpers": {
183
+ "version": "7.28.4",
184
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
185
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
186
+ "dev": true,
187
+ "dependencies": {
188
+ "@babel/template": "^7.27.2",
189
+ "@babel/types": "^7.28.4"
190
+ },
191
+ "engines": {
192
+ "node": ">=6.9.0"
193
+ }
194
+ },
195
+ "node_modules/@babel/parser": {
196
+ "version": "7.28.5",
197
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
198
+ "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
199
+ "dev": true,
200
+ "dependencies": {
201
+ "@babel/types": "^7.28.5"
202
+ },
203
+ "bin": {
204
+ "parser": "bin/babel-parser.js"
205
+ },
206
+ "engines": {
207
+ "node": ">=6.0.0"
208
+ }
209
+ },
210
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
211
+ "version": "7.27.1",
212
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
213
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
214
+ "dev": true,
215
+ "dependencies": {
216
+ "@babel/helper-plugin-utils": "^7.27.1"
217
+ },
218
+ "engines": {
219
+ "node": ">=6.9.0"
220
+ },
221
+ "peerDependencies": {
222
+ "@babel/core": "^7.0.0-0"
223
+ }
224
+ },
225
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
226
+ "version": "7.27.1",
227
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
228
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
229
+ "dev": true,
230
+ "dependencies": {
231
+ "@babel/helper-plugin-utils": "^7.27.1"
232
+ },
233
+ "engines": {
234
+ "node": ">=6.9.0"
235
+ },
236
+ "peerDependencies": {
237
+ "@babel/core": "^7.0.0-0"
238
+ }
239
+ },
240
+ "node_modules/@babel/template": {
241
+ "version": "7.27.2",
242
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
243
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
244
+ "dev": true,
245
+ "dependencies": {
246
+ "@babel/code-frame": "^7.27.1",
247
+ "@babel/parser": "^7.27.2",
248
+ "@babel/types": "^7.27.1"
249
+ },
250
+ "engines": {
251
+ "node": ">=6.9.0"
252
+ }
253
+ },
254
+ "node_modules/@babel/traverse": {
255
+ "version": "7.28.5",
256
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
257
+ "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
258
+ "dev": true,
259
+ "dependencies": {
260
+ "@babel/code-frame": "^7.27.1",
261
+ "@babel/generator": "^7.28.5",
262
+ "@babel/helper-globals": "^7.28.0",
263
+ "@babel/parser": "^7.28.5",
264
+ "@babel/template": "^7.27.2",
265
+ "@babel/types": "^7.28.5",
266
+ "debug": "^4.3.1"
267
+ },
268
+ "engines": {
269
+ "node": ">=6.9.0"
270
+ }
271
+ },
272
+ "node_modules/@babel/types": {
273
+ "version": "7.28.5",
274
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
275
+ "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
276
+ "dev": true,
277
+ "dependencies": {
278
+ "@babel/helper-string-parser": "^7.27.1",
279
+ "@babel/helper-validator-identifier": "^7.28.5"
280
+ },
281
+ "engines": {
282
+ "node": ">=6.9.0"
283
+ }
284
+ },
285
+ "node_modules/@esbuild/aix-ppc64": {
286
+ "version": "0.25.11",
287
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz",
288
+ "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==",
289
+ "cpu": [
290
+ "ppc64"
291
+ ],
292
+ "dev": true,
293
+ "optional": true,
294
+ "os": [
295
+ "aix"
296
+ ],
297
+ "engines": {
298
+ "node": ">=18"
299
+ }
300
+ },
301
+ "node_modules/@esbuild/android-arm": {
302
+ "version": "0.25.11",
303
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz",
304
+ "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==",
305
+ "cpu": [
306
+ "arm"
307
+ ],
308
+ "dev": true,
309
+ "optional": true,
310
+ "os": [
311
+ "android"
312
+ ],
313
+ "engines": {
314
+ "node": ">=18"
315
+ }
316
+ },
317
+ "node_modules/@esbuild/android-arm64": {
318
+ "version": "0.25.11",
319
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz",
320
+ "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==",
321
+ "cpu": [
322
+ "arm64"
323
+ ],
324
+ "dev": true,
325
+ "optional": true,
326
+ "os": [
327
+ "android"
328
+ ],
329
+ "engines": {
330
+ "node": ">=18"
331
+ }
332
+ },
333
+ "node_modules/@esbuild/android-x64": {
334
+ "version": "0.25.11",
335
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz",
336
+ "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==",
337
+ "cpu": [
338
+ "x64"
339
+ ],
340
+ "dev": true,
341
+ "optional": true,
342
+ "os": [
343
+ "android"
344
+ ],
345
+ "engines": {
346
+ "node": ">=18"
347
+ }
348
+ },
349
+ "node_modules/@esbuild/darwin-arm64": {
350
+ "version": "0.25.11",
351
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz",
352
+ "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==",
353
+ "cpu": [
354
+ "arm64"
355
+ ],
356
+ "dev": true,
357
+ "optional": true,
358
+ "os": [
359
+ "darwin"
360
+ ],
361
+ "engines": {
362
+ "node": ">=18"
363
+ }
364
+ },
365
+ "node_modules/@esbuild/darwin-x64": {
366
+ "version": "0.25.11",
367
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz",
368
+ "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==",
369
+ "cpu": [
370
+ "x64"
371
+ ],
372
+ "dev": true,
373
+ "optional": true,
374
+ "os": [
375
+ "darwin"
376
+ ],
377
+ "engines": {
378
+ "node": ">=18"
379
+ }
380
+ },
381
+ "node_modules/@esbuild/freebsd-arm64": {
382
+ "version": "0.25.11",
383
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz",
384
+ "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==",
385
+ "cpu": [
386
+ "arm64"
387
+ ],
388
+ "dev": true,
389
+ "optional": true,
390
+ "os": [
391
+ "freebsd"
392
+ ],
393
+ "engines": {
394
+ "node": ">=18"
395
+ }
396
+ },
397
+ "node_modules/@esbuild/freebsd-x64": {
398
+ "version": "0.25.11",
399
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz",
400
+ "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==",
401
+ "cpu": [
402
+ "x64"
403
+ ],
404
+ "dev": true,
405
+ "optional": true,
406
+ "os": [
407
+ "freebsd"
408
+ ],
409
+ "engines": {
410
+ "node": ">=18"
411
+ }
412
+ },
413
+ "node_modules/@esbuild/linux-arm": {
414
+ "version": "0.25.11",
415
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz",
416
+ "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==",
417
+ "cpu": [
418
+ "arm"
419
+ ],
420
+ "dev": true,
421
+ "optional": true,
422
+ "os": [
423
+ "linux"
424
+ ],
425
+ "engines": {
426
+ "node": ">=18"
427
+ }
428
+ },
429
+ "node_modules/@esbuild/linux-arm64": {
430
+ "version": "0.25.11",
431
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz",
432
+ "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==",
433
+ "cpu": [
434
+ "arm64"
435
+ ],
436
+ "dev": true,
437
+ "optional": true,
438
+ "os": [
439
+ "linux"
440
+ ],
441
+ "engines": {
442
+ "node": ">=18"
443
+ }
444
+ },
445
+ "node_modules/@esbuild/linux-ia32": {
446
+ "version": "0.25.11",
447
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz",
448
+ "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==",
449
+ "cpu": [
450
+ "ia32"
451
+ ],
452
+ "dev": true,
453
+ "optional": true,
454
+ "os": [
455
+ "linux"
456
+ ],
457
+ "engines": {
458
+ "node": ">=18"
459
+ }
460
+ },
461
+ "node_modules/@esbuild/linux-loong64": {
462
+ "version": "0.25.11",
463
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz",
464
+ "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==",
465
+ "cpu": [
466
+ "loong64"
467
+ ],
468
+ "dev": true,
469
+ "optional": true,
470
+ "os": [
471
+ "linux"
472
+ ],
473
+ "engines": {
474
+ "node": ">=18"
475
+ }
476
+ },
477
+ "node_modules/@esbuild/linux-mips64el": {
478
+ "version": "0.25.11",
479
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz",
480
+ "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==",
481
+ "cpu": [
482
+ "mips64el"
483
+ ],
484
+ "dev": true,
485
+ "optional": true,
486
+ "os": [
487
+ "linux"
488
+ ],
489
+ "engines": {
490
+ "node": ">=18"
491
+ }
492
+ },
493
+ "node_modules/@esbuild/linux-ppc64": {
494
+ "version": "0.25.11",
495
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz",
496
+ "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==",
497
+ "cpu": [
498
+ "ppc64"
499
+ ],
500
+ "dev": true,
501
+ "optional": true,
502
+ "os": [
503
+ "linux"
504
+ ],
505
+ "engines": {
506
+ "node": ">=18"
507
+ }
508
+ },
509
+ "node_modules/@esbuild/linux-riscv64": {
510
+ "version": "0.25.11",
511
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz",
512
+ "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==",
513
+ "cpu": [
514
+ "riscv64"
515
+ ],
516
+ "dev": true,
517
+ "optional": true,
518
+ "os": [
519
+ "linux"
520
+ ],
521
+ "engines": {
522
+ "node": ">=18"
523
+ }
524
+ },
525
+ "node_modules/@esbuild/linux-s390x": {
526
+ "version": "0.25.11",
527
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz",
528
+ "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==",
529
+ "cpu": [
530
+ "s390x"
531
+ ],
532
+ "dev": true,
533
+ "optional": true,
534
+ "os": [
535
+ "linux"
536
+ ],
537
+ "engines": {
538
+ "node": ">=18"
539
+ }
540
+ },
541
+ "node_modules/@esbuild/linux-x64": {
542
+ "version": "0.25.11",
543
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz",
544
+ "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==",
545
+ "cpu": [
546
+ "x64"
547
+ ],
548
+ "dev": true,
549
+ "optional": true,
550
+ "os": [
551
+ "linux"
552
+ ],
553
+ "engines": {
554
+ "node": ">=18"
555
+ }
556
+ },
557
+ "node_modules/@esbuild/netbsd-arm64": {
558
+ "version": "0.25.11",
559
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz",
560
+ "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==",
561
+ "cpu": [
562
+ "arm64"
563
+ ],
564
+ "dev": true,
565
+ "optional": true,
566
+ "os": [
567
+ "netbsd"
568
+ ],
569
+ "engines": {
570
+ "node": ">=18"
571
+ }
572
+ },
573
+ "node_modules/@esbuild/netbsd-x64": {
574
+ "version": "0.25.11",
575
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz",
576
+ "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==",
577
+ "cpu": [
578
+ "x64"
579
+ ],
580
+ "dev": true,
581
+ "optional": true,
582
+ "os": [
583
+ "netbsd"
584
+ ],
585
+ "engines": {
586
+ "node": ">=18"
587
+ }
588
+ },
589
+ "node_modules/@esbuild/openbsd-arm64": {
590
+ "version": "0.25.11",
591
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz",
592
+ "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==",
593
+ "cpu": [
594
+ "arm64"
595
+ ],
596
+ "dev": true,
597
+ "optional": true,
598
+ "os": [
599
+ "openbsd"
600
+ ],
601
+ "engines": {
602
+ "node": ">=18"
603
+ }
604
+ },
605
+ "node_modules/@esbuild/openbsd-x64": {
606
+ "version": "0.25.11",
607
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz",
608
+ "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==",
609
+ "cpu": [
610
+ "x64"
611
+ ],
612
+ "dev": true,
613
+ "optional": true,
614
+ "os": [
615
+ "openbsd"
616
+ ],
617
+ "engines": {
618
+ "node": ">=18"
619
+ }
620
+ },
621
+ "node_modules/@esbuild/openharmony-arm64": {
622
+ "version": "0.25.11",
623
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz",
624
+ "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==",
625
+ "cpu": [
626
+ "arm64"
627
+ ],
628
+ "dev": true,
629
+ "optional": true,
630
+ "os": [
631
+ "openharmony"
632
+ ],
633
+ "engines": {
634
+ "node": ">=18"
635
+ }
636
+ },
637
+ "node_modules/@esbuild/sunos-x64": {
638
+ "version": "0.25.11",
639
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz",
640
+ "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==",
641
+ "cpu": [
642
+ "x64"
643
+ ],
644
+ "dev": true,
645
+ "optional": true,
646
+ "os": [
647
+ "sunos"
648
+ ],
649
+ "engines": {
650
+ "node": ">=18"
651
+ }
652
+ },
653
+ "node_modules/@esbuild/win32-arm64": {
654
+ "version": "0.25.11",
655
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz",
656
+ "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==",
657
+ "cpu": [
658
+ "arm64"
659
+ ],
660
+ "dev": true,
661
+ "optional": true,
662
+ "os": [
663
+ "win32"
664
+ ],
665
+ "engines": {
666
+ "node": ">=18"
667
+ }
668
+ },
669
+ "node_modules/@esbuild/win32-ia32": {
670
+ "version": "0.25.11",
671
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz",
672
+ "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==",
673
+ "cpu": [
674
+ "ia32"
675
+ ],
676
+ "dev": true,
677
+ "optional": true,
678
+ "os": [
679
+ "win32"
680
+ ],
681
+ "engines": {
682
+ "node": ">=18"
683
+ }
684
+ },
685
+ "node_modules/@esbuild/win32-x64": {
686
+ "version": "0.25.11",
687
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz",
688
+ "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==",
689
+ "cpu": [
690
+ "x64"
691
+ ],
692
+ "dev": true,
693
+ "optional": true,
694
+ "os": [
695
+ "win32"
696
+ ],
697
+ "engines": {
698
+ "node": ">=18"
699
+ }
700
+ },
701
+ "node_modules/@google/genai": {
702
+ "version": "1.27.0",
703
+ "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.27.0.tgz",
704
+ "integrity": "sha512-sveeQqwyzO/U5kOjo3EflF1rf7v0ZGprrjPGmeT6V5u22IUTcA4wBFxW+q1n7hOX0M1iWR3944MImoNPOM+zsA==",
705
+ "dependencies": {
706
+ "google-auth-library": "^10.3.0",
707
+ "ws": "^8.18.0"
708
+ },
709
+ "engines": {
710
+ "node": ">=20.0.0"
711
+ },
712
+ "peerDependencies": {
713
+ "@modelcontextprotocol/sdk": "^1.20.1"
714
+ },
715
+ "peerDependenciesMeta": {
716
+ "@modelcontextprotocol/sdk": {
717
+ "optional": true
718
+ }
719
+ }
720
+ },
721
+ "node_modules/@jridgewell/gen-mapping": {
722
+ "version": "0.3.13",
723
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
724
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
725
+ "dev": true,
726
+ "dependencies": {
727
+ "@jridgewell/sourcemap-codec": "^1.5.0",
728
+ "@jridgewell/trace-mapping": "^0.3.24"
729
+ }
730
+ },
731
+ "node_modules/@jridgewell/remapping": {
732
+ "version": "2.3.5",
733
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
734
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
735
+ "dev": true,
736
+ "dependencies": {
737
+ "@jridgewell/gen-mapping": "^0.3.5",
738
+ "@jridgewell/trace-mapping": "^0.3.24"
739
+ }
740
+ },
741
+ "node_modules/@jridgewell/resolve-uri": {
742
+ "version": "3.1.2",
743
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
744
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
745
+ "dev": true,
746
+ "engines": {
747
+ "node": ">=6.0.0"
748
+ }
749
+ },
750
+ "node_modules/@jridgewell/sourcemap-codec": {
751
+ "version": "1.5.5",
752
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
753
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
754
+ "dev": true
755
+ },
756
+ "node_modules/@jridgewell/trace-mapping": {
757
+ "version": "0.3.31",
758
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
759
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
760
+ "dev": true,
761
+ "dependencies": {
762
+ "@jridgewell/resolve-uri": "^3.1.0",
763
+ "@jridgewell/sourcemap-codec": "^1.4.14"
764
+ }
765
+ },
766
+ "node_modules/@rolldown/pluginutils": {
767
+ "version": "1.0.0-beta.43",
768
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz",
769
+ "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==",
770
+ "dev": true
771
+ },
772
+ "node_modules/@rollup/rollup-android-arm-eabi": {
773
+ "version": "4.52.5",
774
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz",
775
+ "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==",
776
+ "cpu": [
777
+ "arm"
778
+ ],
779
+ "dev": true,
780
+ "optional": true,
781
+ "os": [
782
+ "android"
783
+ ]
784
+ },
785
+ "node_modules/@rollup/rollup-android-arm64": {
786
+ "version": "4.52.5",
787
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz",
788
+ "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==",
789
+ "cpu": [
790
+ "arm64"
791
+ ],
792
+ "dev": true,
793
+ "optional": true,
794
+ "os": [
795
+ "android"
796
+ ]
797
+ },
798
+ "node_modules/@rollup/rollup-darwin-arm64": {
799
+ "version": "4.52.5",
800
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz",
801
+ "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==",
802
+ "cpu": [
803
+ "arm64"
804
+ ],
805
+ "dev": true,
806
+ "optional": true,
807
+ "os": [
808
+ "darwin"
809
+ ]
810
+ },
811
+ "node_modules/@rollup/rollup-darwin-x64": {
812
+ "version": "4.52.5",
813
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz",
814
+ "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==",
815
+ "cpu": [
816
+ "x64"
817
+ ],
818
+ "dev": true,
819
+ "optional": true,
820
+ "os": [
821
+ "darwin"
822
+ ]
823
+ },
824
+ "node_modules/@rollup/rollup-freebsd-arm64": {
825
+ "version": "4.52.5",
826
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz",
827
+ "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==",
828
+ "cpu": [
829
+ "arm64"
830
+ ],
831
+ "dev": true,
832
+ "optional": true,
833
+ "os": [
834
+ "freebsd"
835
+ ]
836
+ },
837
+ "node_modules/@rollup/rollup-freebsd-x64": {
838
+ "version": "4.52.5",
839
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz",
840
+ "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==",
841
+ "cpu": [
842
+ "x64"
843
+ ],
844
+ "dev": true,
845
+ "optional": true,
846
+ "os": [
847
+ "freebsd"
848
+ ]
849
+ },
850
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
851
+ "version": "4.52.5",
852
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz",
853
+ "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==",
854
+ "cpu": [
855
+ "arm"
856
+ ],
857
+ "dev": true,
858
+ "optional": true,
859
+ "os": [
860
+ "linux"
861
+ ]
862
+ },
863
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
864
+ "version": "4.52.5",
865
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz",
866
+ "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==",
867
+ "cpu": [
868
+ "arm"
869
+ ],
870
+ "dev": true,
871
+ "optional": true,
872
+ "os": [
873
+ "linux"
874
+ ]
875
+ },
876
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
877
+ "version": "4.52.5",
878
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz",
879
+ "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==",
880
+ "cpu": [
881
+ "arm64"
882
+ ],
883
+ "dev": true,
884
+ "optional": true,
885
+ "os": [
886
+ "linux"
887
+ ]
888
+ },
889
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
890
+ "version": "4.52.5",
891
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz",
892
+ "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==",
893
+ "cpu": [
894
+ "arm64"
895
+ ],
896
+ "dev": true,
897
+ "optional": true,
898
+ "os": [
899
+ "linux"
900
+ ]
901
+ },
902
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
903
+ "version": "4.52.5",
904
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz",
905
+ "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==",
906
+ "cpu": [
907
+ "loong64"
908
+ ],
909
+ "dev": true,
910
+ "optional": true,
911
+ "os": [
912
+ "linux"
913
+ ]
914
+ },
915
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
916
+ "version": "4.52.5",
917
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz",
918
+ "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==",
919
+ "cpu": [
920
+ "ppc64"
921
+ ],
922
+ "dev": true,
923
+ "optional": true,
924
+ "os": [
925
+ "linux"
926
+ ]
927
+ },
928
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
929
+ "version": "4.52.5",
930
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz",
931
+ "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==",
932
+ "cpu": [
933
+ "riscv64"
934
+ ],
935
+ "dev": true,
936
+ "optional": true,
937
+ "os": [
938
+ "linux"
939
+ ]
940
+ },
941
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
942
+ "version": "4.52.5",
943
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz",
944
+ "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==",
945
+ "cpu": [
946
+ "riscv64"
947
+ ],
948
+ "dev": true,
949
+ "optional": true,
950
+ "os": [
951
+ "linux"
952
+ ]
953
+ },
954
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
955
+ "version": "4.52.5",
956
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz",
957
+ "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==",
958
+ "cpu": [
959
+ "s390x"
960
+ ],
961
+ "dev": true,
962
+ "optional": true,
963
+ "os": [
964
+ "linux"
965
+ ]
966
+ },
967
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
968
+ "version": "4.52.5",
969
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz",
970
+ "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==",
971
+ "cpu": [
972
+ "x64"
973
+ ],
974
+ "dev": true,
975
+ "optional": true,
976
+ "os": [
977
+ "linux"
978
+ ]
979
+ },
980
+ "node_modules/@rollup/rollup-linux-x64-musl": {
981
+ "version": "4.52.5",
982
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz",
983
+ "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==",
984
+ "cpu": [
985
+ "x64"
986
+ ],
987
+ "dev": true,
988
+ "optional": true,
989
+ "os": [
990
+ "linux"
991
+ ]
992
+ },
993
+ "node_modules/@rollup/rollup-openharmony-arm64": {
994
+ "version": "4.52.5",
995
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz",
996
+ "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==",
997
+ "cpu": [
998
+ "arm64"
999
+ ],
1000
+ "dev": true,
1001
+ "optional": true,
1002
+ "os": [
1003
+ "openharmony"
1004
+ ]
1005
+ },
1006
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
1007
+ "version": "4.52.5",
1008
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz",
1009
+ "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==",
1010
+ "cpu": [
1011
+ "arm64"
1012
+ ],
1013
+ "dev": true,
1014
+ "optional": true,
1015
+ "os": [
1016
+ "win32"
1017
+ ]
1018
+ },
1019
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
1020
+ "version": "4.52.5",
1021
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz",
1022
+ "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==",
1023
+ "cpu": [
1024
+ "ia32"
1025
+ ],
1026
+ "dev": true,
1027
+ "optional": true,
1028
+ "os": [
1029
+ "win32"
1030
+ ]
1031
+ },
1032
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
1033
+ "version": "4.52.5",
1034
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz",
1035
+ "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==",
1036
+ "cpu": [
1037
+ "x64"
1038
+ ],
1039
+ "dev": true,
1040
+ "optional": true,
1041
+ "os": [
1042
+ "win32"
1043
+ ]
1044
+ },
1045
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
1046
+ "version": "4.52.5",
1047
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz",
1048
+ "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==",
1049
+ "cpu": [
1050
+ "x64"
1051
+ ],
1052
+ "dev": true,
1053
+ "optional": true,
1054
+ "os": [
1055
+ "win32"
1056
+ ]
1057
+ },
1058
+ "node_modules/@types/babel__core": {
1059
+ "version": "7.20.5",
1060
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
1061
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
1062
+ "dev": true,
1063
+ "dependencies": {
1064
+ "@babel/parser": "^7.20.7",
1065
+ "@babel/types": "^7.20.7",
1066
+ "@types/babel__generator": "*",
1067
+ "@types/babel__template": "*",
1068
+ "@types/babel__traverse": "*"
1069
+ }
1070
+ },
1071
+ "node_modules/@types/babel__generator": {
1072
+ "version": "7.27.0",
1073
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
1074
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
1075
+ "dev": true,
1076
+ "dependencies": {
1077
+ "@babel/types": "^7.0.0"
1078
+ }
1079
+ },
1080
+ "node_modules/@types/babel__template": {
1081
+ "version": "7.4.4",
1082
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
1083
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
1084
+ "dev": true,
1085
+ "dependencies": {
1086
+ "@babel/parser": "^7.1.0",
1087
+ "@babel/types": "^7.0.0"
1088
+ }
1089
+ },
1090
+ "node_modules/@types/babel__traverse": {
1091
+ "version": "7.28.0",
1092
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
1093
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
1094
+ "dev": true,
1095
+ "dependencies": {
1096
+ "@babel/types": "^7.28.2"
1097
+ }
1098
+ },
1099
+ "node_modules/@types/estree": {
1100
+ "version": "1.0.8",
1101
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
1102
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
1103
+ "dev": true
1104
+ },
1105
+ "node_modules/@types/node": {
1106
+ "version": "22.18.12",
1107
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.12.tgz",
1108
+ "integrity": "sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==",
1109
+ "dev": true,
1110
+ "dependencies": {
1111
+ "undici-types": "~6.21.0"
1112
+ }
1113
+ },
1114
+ "node_modules/@vitejs/plugin-react": {
1115
+ "version": "5.1.0",
1116
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz",
1117
+ "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==",
1118
+ "dev": true,
1119
+ "dependencies": {
1120
+ "@babel/core": "^7.28.4",
1121
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
1122
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
1123
+ "@rolldown/pluginutils": "1.0.0-beta.43",
1124
+ "@types/babel__core": "^7.20.5",
1125
+ "react-refresh": "^0.18.0"
1126
+ },
1127
+ "engines": {
1128
+ "node": "^20.19.0 || >=22.12.0"
1129
+ },
1130
+ "peerDependencies": {
1131
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1132
+ }
1133
+ },
1134
+ "node_modules/agent-base": {
1135
+ "version": "7.1.4",
1136
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
1137
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
1138
+ "engines": {
1139
+ "node": ">= 14"
1140
+ }
1141
+ },
1142
+ "node_modules/base64-js": {
1143
+ "version": "1.5.1",
1144
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
1145
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
1146
+ "funding": [
1147
+ {
1148
+ "type": "github",
1149
+ "url": "https://github.com/sponsors/feross"
1150
+ },
1151
+ {
1152
+ "type": "patreon",
1153
+ "url": "https://www.patreon.com/feross"
1154
+ },
1155
+ {
1156
+ "type": "consulting",
1157
+ "url": "https://feross.org/support"
1158
+ }
1159
+ ]
1160
+ },
1161
+ "node_modules/baseline-browser-mapping": {
1162
+ "version": "2.8.20",
1163
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz",
1164
+ "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==",
1165
+ "dev": true,
1166
+ "bin": {
1167
+ "baseline-browser-mapping": "dist/cli.js"
1168
+ }
1169
+ },
1170
+ "node_modules/bignumber.js": {
1171
+ "version": "9.3.1",
1172
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz",
1173
+ "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==",
1174
+ "engines": {
1175
+ "node": "*"
1176
+ }
1177
+ },
1178
+ "node_modules/browserslist": {
1179
+ "version": "4.27.0",
1180
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz",
1181
+ "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==",
1182
+ "dev": true,
1183
+ "funding": [
1184
+ {
1185
+ "type": "opencollective",
1186
+ "url": "https://opencollective.com/browserslist"
1187
+ },
1188
+ {
1189
+ "type": "tidelift",
1190
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1191
+ },
1192
+ {
1193
+ "type": "github",
1194
+ "url": "https://github.com/sponsors/ai"
1195
+ }
1196
+ ],
1197
+ "dependencies": {
1198
+ "baseline-browser-mapping": "^2.8.19",
1199
+ "caniuse-lite": "^1.0.30001751",
1200
+ "electron-to-chromium": "^1.5.238",
1201
+ "node-releases": "^2.0.26",
1202
+ "update-browserslist-db": "^1.1.4"
1203
+ },
1204
+ "bin": {
1205
+ "browserslist": "cli.js"
1206
+ },
1207
+ "engines": {
1208
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1209
+ }
1210
+ },
1211
+ "node_modules/buffer-equal-constant-time": {
1212
+ "version": "1.0.1",
1213
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
1214
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
1215
+ },
1216
+ "node_modules/caniuse-lite": {
1217
+ "version": "1.0.30001751",
1218
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz",
1219
+ "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==",
1220
+ "dev": true,
1221
+ "funding": [
1222
+ {
1223
+ "type": "opencollective",
1224
+ "url": "https://opencollective.com/browserslist"
1225
+ },
1226
+ {
1227
+ "type": "tidelift",
1228
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1229
+ },
1230
+ {
1231
+ "type": "github",
1232
+ "url": "https://github.com/sponsors/ai"
1233
+ }
1234
+ ]
1235
+ },
1236
+ "node_modules/convert-source-map": {
1237
+ "version": "2.0.0",
1238
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1239
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1240
+ "dev": true
1241
+ },
1242
+ "node_modules/data-uri-to-buffer": {
1243
+ "version": "4.0.1",
1244
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
1245
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
1246
+ "engines": {
1247
+ "node": ">= 12"
1248
+ }
1249
+ },
1250
+ "node_modules/debug": {
1251
+ "version": "4.4.3",
1252
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1253
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1254
+ "dependencies": {
1255
+ "ms": "^2.1.3"
1256
+ },
1257
+ "engines": {
1258
+ "node": ">=6.0"
1259
+ },
1260
+ "peerDependenciesMeta": {
1261
+ "supports-color": {
1262
+ "optional": true
1263
+ }
1264
+ }
1265
+ },
1266
+ "node_modules/ecdsa-sig-formatter": {
1267
+ "version": "1.0.11",
1268
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
1269
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
1270
+ "dependencies": {
1271
+ "safe-buffer": "^5.0.1"
1272
+ }
1273
+ },
1274
+ "node_modules/electron-to-chromium": {
1275
+ "version": "1.5.241",
1276
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz",
1277
+ "integrity": "sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w==",
1278
+ "dev": true
1279
+ },
1280
+ "node_modules/esbuild": {
1281
+ "version": "0.25.11",
1282
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz",
1283
+ "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==",
1284
+ "dev": true,
1285
+ "hasInstallScript": true,
1286
+ "bin": {
1287
+ "esbuild": "bin/esbuild"
1288
+ },
1289
+ "engines": {
1290
+ "node": ">=18"
1291
+ },
1292
+ "optionalDependencies": {
1293
+ "@esbuild/aix-ppc64": "0.25.11",
1294
+ "@esbuild/android-arm": "0.25.11",
1295
+ "@esbuild/android-arm64": "0.25.11",
1296
+ "@esbuild/android-x64": "0.25.11",
1297
+ "@esbuild/darwin-arm64": "0.25.11",
1298
+ "@esbuild/darwin-x64": "0.25.11",
1299
+ "@esbuild/freebsd-arm64": "0.25.11",
1300
+ "@esbuild/freebsd-x64": "0.25.11",
1301
+ "@esbuild/linux-arm": "0.25.11",
1302
+ "@esbuild/linux-arm64": "0.25.11",
1303
+ "@esbuild/linux-ia32": "0.25.11",
1304
+ "@esbuild/linux-loong64": "0.25.11",
1305
+ "@esbuild/linux-mips64el": "0.25.11",
1306
+ "@esbuild/linux-ppc64": "0.25.11",
1307
+ "@esbuild/linux-riscv64": "0.25.11",
1308
+ "@esbuild/linux-s390x": "0.25.11",
1309
+ "@esbuild/linux-x64": "0.25.11",
1310
+ "@esbuild/netbsd-arm64": "0.25.11",
1311
+ "@esbuild/netbsd-x64": "0.25.11",
1312
+ "@esbuild/openbsd-arm64": "0.25.11",
1313
+ "@esbuild/openbsd-x64": "0.25.11",
1314
+ "@esbuild/openharmony-arm64": "0.25.11",
1315
+ "@esbuild/sunos-x64": "0.25.11",
1316
+ "@esbuild/win32-arm64": "0.25.11",
1317
+ "@esbuild/win32-ia32": "0.25.11",
1318
+ "@esbuild/win32-x64": "0.25.11"
1319
+ }
1320
+ },
1321
+ "node_modules/escalade": {
1322
+ "version": "3.2.0",
1323
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1324
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1325
+ "dev": true,
1326
+ "engines": {
1327
+ "node": ">=6"
1328
+ }
1329
+ },
1330
+ "node_modules/extend": {
1331
+ "version": "3.0.2",
1332
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
1333
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
1334
+ },
1335
+ "node_modules/fdir": {
1336
+ "version": "6.5.0",
1337
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
1338
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
1339
+ "dev": true,
1340
+ "engines": {
1341
+ "node": ">=12.0.0"
1342
+ },
1343
+ "peerDependencies": {
1344
+ "picomatch": "^3 || ^4"
1345
+ },
1346
+ "peerDependenciesMeta": {
1347
+ "picomatch": {
1348
+ "optional": true
1349
+ }
1350
+ }
1351
+ },
1352
+ "node_modules/fetch-blob": {
1353
+ "version": "3.2.0",
1354
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
1355
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
1356
+ "funding": [
1357
+ {
1358
+ "type": "github",
1359
+ "url": "https://github.com/sponsors/jimmywarting"
1360
+ },
1361
+ {
1362
+ "type": "paypal",
1363
+ "url": "https://paypal.me/jimmywarting"
1364
+ }
1365
+ ],
1366
+ "dependencies": {
1367
+ "node-domexception": "^1.0.0",
1368
+ "web-streams-polyfill": "^3.0.3"
1369
+ },
1370
+ "engines": {
1371
+ "node": "^12.20 || >= 14.13"
1372
+ }
1373
+ },
1374
+ "node_modules/formdata-polyfill": {
1375
+ "version": "4.0.10",
1376
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
1377
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
1378
+ "dependencies": {
1379
+ "fetch-blob": "^3.1.2"
1380
+ },
1381
+ "engines": {
1382
+ "node": ">=12.20.0"
1383
+ }
1384
+ },
1385
+ "node_modules/fsevents": {
1386
+ "version": "2.3.3",
1387
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1388
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1389
+ "dev": true,
1390
+ "hasInstallScript": true,
1391
+ "optional": true,
1392
+ "os": [
1393
+ "darwin"
1394
+ ],
1395
+ "engines": {
1396
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1397
+ }
1398
+ },
1399
+ "node_modules/gaxios": {
1400
+ "version": "7.1.2",
1401
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.2.tgz",
1402
+ "integrity": "sha512-/Szrn8nr+2TsQT1Gp8iIe/BEytJmbyfrbFh419DfGQSkEgNEhbPi7JRJuughjkTzPWgU9gBQf5AVu3DbHt0OXA==",
1403
+ "dependencies": {
1404
+ "extend": "^3.0.2",
1405
+ "https-proxy-agent": "^7.0.1",
1406
+ "node-fetch": "^3.3.2"
1407
+ },
1408
+ "engines": {
1409
+ "node": ">=18"
1410
+ }
1411
+ },
1412
+ "node_modules/gcp-metadata": {
1413
+ "version": "8.1.1",
1414
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.1.tgz",
1415
+ "integrity": "sha512-dTCcAe9fRQf06ELwel6lWWFrEbstwjUBYEhr5VRGoC+iPDZQucHppCowaIp8b8v92tU1G4X4H3b/Y6zXZxkMsQ==",
1416
+ "dependencies": {
1417
+ "gaxios": "^7.0.0",
1418
+ "google-logging-utils": "^1.0.0",
1419
+ "json-bigint": "^1.0.0"
1420
+ },
1421
+ "engines": {
1422
+ "node": ">=18"
1423
+ }
1424
+ },
1425
+ "node_modules/gensync": {
1426
+ "version": "1.0.0-beta.2",
1427
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1428
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1429
+ "dev": true,
1430
+ "engines": {
1431
+ "node": ">=6.9.0"
1432
+ }
1433
+ },
1434
+ "node_modules/google-auth-library": {
1435
+ "version": "10.4.2",
1436
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.4.2.tgz",
1437
+ "integrity": "sha512-EKiQasw6aEdxSovPEf1oBxCEvxjFamZ6MPaVOSPXZMnqKFLo+rrYjHyjKlFfZcXiKi9qAH6cutr5WRqqa1jKhg==",
1438
+ "dependencies": {
1439
+ "base64-js": "^1.3.0",
1440
+ "ecdsa-sig-formatter": "^1.0.11",
1441
+ "gaxios": "^7.0.0",
1442
+ "gcp-metadata": "^8.0.0",
1443
+ "google-logging-utils": "^1.0.0",
1444
+ "gtoken": "^8.0.0",
1445
+ "jws": "^4.0.0"
1446
+ },
1447
+ "engines": {
1448
+ "node": ">=18"
1449
+ }
1450
+ },
1451
+ "node_modules/google-logging-utils": {
1452
+ "version": "1.1.1",
1453
+ "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.1.tgz",
1454
+ "integrity": "sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A==",
1455
+ "engines": {
1456
+ "node": ">=14"
1457
+ }
1458
+ },
1459
+ "node_modules/gtoken": {
1460
+ "version": "8.0.0",
1461
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz",
1462
+ "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==",
1463
+ "dependencies": {
1464
+ "gaxios": "^7.0.0",
1465
+ "jws": "^4.0.0"
1466
+ },
1467
+ "engines": {
1468
+ "node": ">=18"
1469
+ }
1470
+ },
1471
+ "node_modules/https-proxy-agent": {
1472
+ "version": "7.0.6",
1473
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
1474
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
1475
+ "dependencies": {
1476
+ "agent-base": "^7.1.2",
1477
+ "debug": "4"
1478
+ },
1479
+ "engines": {
1480
+ "node": ">= 14"
1481
+ }
1482
+ },
1483
+ "node_modules/js-tokens": {
1484
+ "version": "4.0.0",
1485
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1486
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1487
+ "dev": true
1488
+ },
1489
+ "node_modules/jsesc": {
1490
+ "version": "3.1.0",
1491
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1492
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1493
+ "dev": true,
1494
+ "bin": {
1495
+ "jsesc": "bin/jsesc"
1496
+ },
1497
+ "engines": {
1498
+ "node": ">=6"
1499
+ }
1500
+ },
1501
+ "node_modules/json-bigint": {
1502
+ "version": "1.0.0",
1503
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz",
1504
+ "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==",
1505
+ "dependencies": {
1506
+ "bignumber.js": "^9.0.0"
1507
+ }
1508
+ },
1509
+ "node_modules/json5": {
1510
+ "version": "2.2.3",
1511
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1512
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1513
+ "dev": true,
1514
+ "bin": {
1515
+ "json5": "lib/cli.js"
1516
+ },
1517
+ "engines": {
1518
+ "node": ">=6"
1519
+ }
1520
+ },
1521
+ "node_modules/jwa": {
1522
+ "version": "2.0.1",
1523
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz",
1524
+ "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==",
1525
+ "dependencies": {
1526
+ "buffer-equal-constant-time": "^1.0.1",
1527
+ "ecdsa-sig-formatter": "1.0.11",
1528
+ "safe-buffer": "^5.0.1"
1529
+ }
1530
+ },
1531
+ "node_modules/jws": {
1532
+ "version": "4.0.0",
1533
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
1534
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
1535
+ "dependencies": {
1536
+ "jwa": "^2.0.0",
1537
+ "safe-buffer": "^5.0.1"
1538
+ }
1539
+ },
1540
+ "node_modules/lru-cache": {
1541
+ "version": "5.1.1",
1542
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
1543
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
1544
+ "dev": true,
1545
+ "dependencies": {
1546
+ "yallist": "^3.0.2"
1547
+ }
1548
+ },
1549
+ "node_modules/ms": {
1550
+ "version": "2.1.3",
1551
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1552
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1553
+ },
1554
+ "node_modules/nanoid": {
1555
+ "version": "3.3.11",
1556
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
1557
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
1558
+ "dev": true,
1559
+ "funding": [
1560
+ {
1561
+ "type": "github",
1562
+ "url": "https://github.com/sponsors/ai"
1563
+ }
1564
+ ],
1565
+ "bin": {
1566
+ "nanoid": "bin/nanoid.cjs"
1567
+ },
1568
+ "engines": {
1569
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1570
+ }
1571
+ },
1572
+ "node_modules/node-domexception": {
1573
+ "version": "1.0.0",
1574
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
1575
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
1576
+ "deprecated": "Use your platform's native DOMException instead",
1577
+ "funding": [
1578
+ {
1579
+ "type": "github",
1580
+ "url": "https://github.com/sponsors/jimmywarting"
1581
+ },
1582
+ {
1583
+ "type": "github",
1584
+ "url": "https://paypal.me/jimmywarting"
1585
+ }
1586
+ ],
1587
+ "engines": {
1588
+ "node": ">=10.5.0"
1589
+ }
1590
+ },
1591
+ "node_modules/node-fetch": {
1592
+ "version": "3.3.2",
1593
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
1594
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
1595
+ "dependencies": {
1596
+ "data-uri-to-buffer": "^4.0.0",
1597
+ "fetch-blob": "^3.1.4",
1598
+ "formdata-polyfill": "^4.0.10"
1599
+ },
1600
+ "engines": {
1601
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
1602
+ },
1603
+ "funding": {
1604
+ "type": "opencollective",
1605
+ "url": "https://opencollective.com/node-fetch"
1606
+ }
1607
+ },
1608
+ "node_modules/node-releases": {
1609
+ "version": "2.0.26",
1610
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz",
1611
+ "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==",
1612
+ "dev": true
1613
+ },
1614
+ "node_modules/picocolors": {
1615
+ "version": "1.1.1",
1616
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1617
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1618
+ "dev": true
1619
+ },
1620
+ "node_modules/picomatch": {
1621
+ "version": "4.0.3",
1622
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
1623
+ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
1624
+ "dev": true,
1625
+ "engines": {
1626
+ "node": ">=12"
1627
+ },
1628
+ "funding": {
1629
+ "url": "https://github.com/sponsors/jonschlinkert"
1630
+ }
1631
+ },
1632
+ "node_modules/postcss": {
1633
+ "version": "8.5.6",
1634
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
1635
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
1636
+ "dev": true,
1637
+ "funding": [
1638
+ {
1639
+ "type": "opencollective",
1640
+ "url": "https://opencollective.com/postcss/"
1641
+ },
1642
+ {
1643
+ "type": "tidelift",
1644
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1645
+ },
1646
+ {
1647
+ "type": "github",
1648
+ "url": "https://github.com/sponsors/ai"
1649
+ }
1650
+ ],
1651
+ "dependencies": {
1652
+ "nanoid": "^3.3.11",
1653
+ "picocolors": "^1.1.1",
1654
+ "source-map-js": "^1.2.1"
1655
+ },
1656
+ "engines": {
1657
+ "node": "^10 || ^12 || >=14"
1658
+ }
1659
+ },
1660
+ "node_modules/react": {
1661
+ "version": "19.2.0",
1662
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
1663
+ "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
1664
+ "engines": {
1665
+ "node": ">=0.10.0"
1666
+ }
1667
+ },
1668
+ "node_modules/react-dom": {
1669
+ "version": "19.2.0",
1670
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
1671
+ "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
1672
+ "dependencies": {
1673
+ "scheduler": "^0.27.0"
1674
+ },
1675
+ "peerDependencies": {
1676
+ "react": "^19.2.0"
1677
+ }
1678
+ },
1679
+ "node_modules/react-refresh": {
1680
+ "version": "0.18.0",
1681
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
1682
+ "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
1683
+ "dev": true,
1684
+ "engines": {
1685
+ "node": ">=0.10.0"
1686
+ }
1687
+ },
1688
+ "node_modules/rollup": {
1689
+ "version": "4.52.5",
1690
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz",
1691
+ "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==",
1692
+ "dev": true,
1693
+ "dependencies": {
1694
+ "@types/estree": "1.0.8"
1695
+ },
1696
+ "bin": {
1697
+ "rollup": "dist/bin/rollup"
1698
+ },
1699
+ "engines": {
1700
+ "node": ">=18.0.0",
1701
+ "npm": ">=8.0.0"
1702
+ },
1703
+ "optionalDependencies": {
1704
+ "@rollup/rollup-android-arm-eabi": "4.52.5",
1705
+ "@rollup/rollup-android-arm64": "4.52.5",
1706
+ "@rollup/rollup-darwin-arm64": "4.52.5",
1707
+ "@rollup/rollup-darwin-x64": "4.52.5",
1708
+ "@rollup/rollup-freebsd-arm64": "4.52.5",
1709
+ "@rollup/rollup-freebsd-x64": "4.52.5",
1710
+ "@rollup/rollup-linux-arm-gnueabihf": "4.52.5",
1711
+ "@rollup/rollup-linux-arm-musleabihf": "4.52.5",
1712
+ "@rollup/rollup-linux-arm64-gnu": "4.52.5",
1713
+ "@rollup/rollup-linux-arm64-musl": "4.52.5",
1714
+ "@rollup/rollup-linux-loong64-gnu": "4.52.5",
1715
+ "@rollup/rollup-linux-ppc64-gnu": "4.52.5",
1716
+ "@rollup/rollup-linux-riscv64-gnu": "4.52.5",
1717
+ "@rollup/rollup-linux-riscv64-musl": "4.52.5",
1718
+ "@rollup/rollup-linux-s390x-gnu": "4.52.5",
1719
+ "@rollup/rollup-linux-x64-gnu": "4.52.5",
1720
+ "@rollup/rollup-linux-x64-musl": "4.52.5",
1721
+ "@rollup/rollup-openharmony-arm64": "4.52.5",
1722
+ "@rollup/rollup-win32-arm64-msvc": "4.52.5",
1723
+ "@rollup/rollup-win32-ia32-msvc": "4.52.5",
1724
+ "@rollup/rollup-win32-x64-gnu": "4.52.5",
1725
+ "@rollup/rollup-win32-x64-msvc": "4.52.5",
1726
+ "fsevents": "~2.3.2"
1727
+ }
1728
+ },
1729
+ "node_modules/safe-buffer": {
1730
+ "version": "5.2.1",
1731
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1732
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1733
+ "funding": [
1734
+ {
1735
+ "type": "github",
1736
+ "url": "https://github.com/sponsors/feross"
1737
+ },
1738
+ {
1739
+ "type": "patreon",
1740
+ "url": "https://www.patreon.com/feross"
1741
+ },
1742
+ {
1743
+ "type": "consulting",
1744
+ "url": "https://feross.org/support"
1745
+ }
1746
+ ]
1747
+ },
1748
+ "node_modules/scheduler": {
1749
+ "version": "0.27.0",
1750
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
1751
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="
1752
+ },
1753
+ "node_modules/semver": {
1754
+ "version": "6.3.1",
1755
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1756
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1757
+ "dev": true,
1758
+ "bin": {
1759
+ "semver": "bin/semver.js"
1760
+ }
1761
+ },
1762
+ "node_modules/source-map-js": {
1763
+ "version": "1.2.1",
1764
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
1765
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
1766
+ "dev": true,
1767
+ "engines": {
1768
+ "node": ">=0.10.0"
1769
+ }
1770
+ },
1771
+ "node_modules/tinyglobby": {
1772
+ "version": "0.2.15",
1773
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
1774
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
1775
+ "dev": true,
1776
+ "dependencies": {
1777
+ "fdir": "^6.5.0",
1778
+ "picomatch": "^4.0.3"
1779
+ },
1780
+ "engines": {
1781
+ "node": ">=12.0.0"
1782
+ },
1783
+ "funding": {
1784
+ "url": "https://github.com/sponsors/SuperchupuDev"
1785
+ }
1786
+ },
1787
+ "node_modules/typescript": {
1788
+ "version": "5.8.3",
1789
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
1790
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
1791
+ "dev": true,
1792
+ "bin": {
1793
+ "tsc": "bin/tsc",
1794
+ "tsserver": "bin/tsserver"
1795
+ },
1796
+ "engines": {
1797
+ "node": ">=14.17"
1798
+ }
1799
+ },
1800
+ "node_modules/undici-types": {
1801
+ "version": "6.21.0",
1802
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
1803
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
1804
+ "dev": true
1805
+ },
1806
+ "node_modules/update-browserslist-db": {
1807
+ "version": "1.1.4",
1808
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz",
1809
+ "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==",
1810
+ "dev": true,
1811
+ "funding": [
1812
+ {
1813
+ "type": "opencollective",
1814
+ "url": "https://opencollective.com/browserslist"
1815
+ },
1816
+ {
1817
+ "type": "tidelift",
1818
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
1819
+ },
1820
+ {
1821
+ "type": "github",
1822
+ "url": "https://github.com/sponsors/ai"
1823
+ }
1824
+ ],
1825
+ "dependencies": {
1826
+ "escalade": "^3.2.0",
1827
+ "picocolors": "^1.1.1"
1828
+ },
1829
+ "bin": {
1830
+ "update-browserslist-db": "cli.js"
1831
+ },
1832
+ "peerDependencies": {
1833
+ "browserslist": ">= 4.21.0"
1834
+ }
1835
+ },
1836
+ "node_modules/vite": {
1837
+ "version": "6.4.1",
1838
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz",
1839
+ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==",
1840
+ "dev": true,
1841
+ "dependencies": {
1842
+ "esbuild": "^0.25.0",
1843
+ "fdir": "^6.4.4",
1844
+ "picomatch": "^4.0.2",
1845
+ "postcss": "^8.5.3",
1846
+ "rollup": "^4.34.9",
1847
+ "tinyglobby": "^0.2.13"
1848
+ },
1849
+ "bin": {
1850
+ "vite": "bin/vite.js"
1851
+ },
1852
+ "engines": {
1853
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
1854
+ },
1855
+ "funding": {
1856
+ "url": "https://github.com/vitejs/vite?sponsor=1"
1857
+ },
1858
+ "optionalDependencies": {
1859
+ "fsevents": "~2.3.3"
1860
+ },
1861
+ "peerDependencies": {
1862
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
1863
+ "jiti": ">=1.21.0",
1864
+ "less": "*",
1865
+ "lightningcss": "^1.21.0",
1866
+ "sass": "*",
1867
+ "sass-embedded": "*",
1868
+ "stylus": "*",
1869
+ "sugarss": "*",
1870
+ "terser": "^5.16.0",
1871
+ "tsx": "^4.8.1",
1872
+ "yaml": "^2.4.2"
1873
+ },
1874
+ "peerDependenciesMeta": {
1875
+ "@types/node": {
1876
+ "optional": true
1877
+ },
1878
+ "jiti": {
1879
+ "optional": true
1880
+ },
1881
+ "less": {
1882
+ "optional": true
1883
+ },
1884
+ "lightningcss": {
1885
+ "optional": true
1886
+ },
1887
+ "sass": {
1888
+ "optional": true
1889
+ },
1890
+ "sass-embedded": {
1891
+ "optional": true
1892
+ },
1893
+ "stylus": {
1894
+ "optional": true
1895
+ },
1896
+ "sugarss": {
1897
+ "optional": true
1898
+ },
1899
+ "terser": {
1900
+ "optional": true
1901
+ },
1902
+ "tsx": {
1903
+ "optional": true
1904
+ },
1905
+ "yaml": {
1906
+ "optional": true
1907
+ }
1908
+ }
1909
+ },
1910
+ "node_modules/web-streams-polyfill": {
1911
+ "version": "3.3.3",
1912
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
1913
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
1914
+ "engines": {
1915
+ "node": ">= 8"
1916
+ }
1917
+ },
1918
+ "node_modules/ws": {
1919
+ "version": "8.18.3",
1920
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
1921
+ "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
1922
+ "engines": {
1923
+ "node": ">=10.0.0"
1924
+ },
1925
+ "peerDependencies": {
1926
+ "bufferutil": "^4.0.1",
1927
+ "utf-8-validate": ">=5.0.2"
1928
+ },
1929
+ "peerDependenciesMeta": {
1930
+ "bufferutil": {
1931
+ "optional": true
1932
+ },
1933
+ "utf-8-validate": {
1934
+ "optional": true
1935
+ }
1936
+ }
1937
+ },
1938
+ "node_modules/yallist": {
1939
+ "version": "3.1.1",
1940
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
1941
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
1942
+ "dev": true
1943
+ }
1944
+ }
1945
+ }
package.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "medibot-ai",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "react": "^19.2.0",
13
+ "react-dom": "^19.2.0",
14
+ "@google/genai": "^1.27.0"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.14.0",
18
+ "@vitejs/plugin-react": "^5.0.0",
19
+ "typescript": "~5.8.2",
20
+ "vite": "^6.2.0"
21
+ }
22
+ }
services/geminiService.ts ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ import { GoogleGenAI } from "@google/genai";
3
+
4
+ const API_KEY = process.env.API_KEY;
5
+
6
+ if (!API_KEY) {
7
+ throw new Error("API_KEY environment variable not set");
8
+ }
9
+
10
+ const ai = new GoogleGenAI({ apiKey: API_KEY });
11
+
12
+ const model = 'gemini-2.5-flash';
13
+ const systemInstruction = `You are an AI medical assistant. Your role is to provide helpful, general medical information based on user queries. You must not provide diagnoses, prescribe treatments, or offer any form of professional medical advice. Always conclude your responses with a clear disclaimer in a new paragraph: 'Disclaimer: I am an AI assistant and not a medical professional. This information is for educational purposes only. Please consult with a qualified healthcare provider for any medical concerns or before making any health decisions.'`;
14
+
15
+ export async function sendMessageToGemini(message: string): Promise<string> {
16
+ try {
17
+ const response = await ai.models.generateContent({
18
+ model: model,
19
+ contents: message,
20
+ config: {
21
+ systemInstruction: systemInstruction,
22
+ temperature: 0.5,
23
+ topP: 0.95,
24
+ topK: 64,
25
+ }
26
+ });
27
+
28
+ const text = response.text;
29
+ if (!text) {
30
+ throw new Error("Received an empty response from the API.");
31
+ }
32
+ return text;
33
+ } catch (error) {
34
+ console.error("Error calling Gemini API:", error);
35
+ throw new Error("Failed to communicate with the AI model.");
36
+ }
37
+ }
tsconfig.json ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "experimentalDecorators": true,
5
+ "useDefineForClassFields": false,
6
+ "module": "ESNext",
7
+ "lib": [
8
+ "ES2022",
9
+ "DOM",
10
+ "DOM.Iterable"
11
+ ],
12
+ "skipLibCheck": true,
13
+ "types": [
14
+ "node"
15
+ ],
16
+ "moduleResolution": "bundler",
17
+ "isolatedModules": true,
18
+ "moduleDetection": "force",
19
+ "allowJs": true,
20
+ "jsx": "react-jsx",
21
+ "paths": {
22
+ "@/*": [
23
+ "./*"
24
+ ]
25
+ },
26
+ "allowImportingTsExtensions": true,
27
+ "noEmit": true
28
+ }
29
+ }
types.ts ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+
2
+ export type Sender = 'user' | 'bot';
3
+
4
+ export interface ChatMessage {
5
+ id: string;
6
+ text: string;
7
+ sender: Sender;
8
+ }
vite.config.ts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import path from 'path';
2
+ import { defineConfig, loadEnv } from 'vite';
3
+ import react from '@vitejs/plugin-react';
4
+
5
+ export default defineConfig(({ mode }) => {
6
+ const env = loadEnv(mode, '.', '');
7
+ return {
8
+ server: {
9
+ port: 3000,
10
+ host: '0.0.0.0',
11
+ },
12
+ plugins: [react()],
13
+ define: {
14
+ 'process.env.API_KEY': JSON.stringify(env.GEMINI_API_KEY),
15
+ 'process.env.GEMINI_API_KEY': JSON.stringify(env.GEMINI_API_KEY)
16
+ },
17
+ resolve: {
18
+ alias: {
19
+ '@': path.resolve(__dirname, '.'),
20
+ }
21
+ }
22
+ };
23
+ });