├── README.md └── chatapp ├── next.config.mjs ├── postcss.config.js ├── src └── app │ ├── favicon.ico │ ├── components │ ├── LiveWordDisplay.tsx │ ├── MicToggle.tsx │ ├── ChatWindow.tsx │ ├── MessageInput.tsx │ └── MicrophoneToggle.tsx │ ├── layout.tsx │ ├── globals.css │ ├── api │ ├── openai │ │ └── openai.ts │ ├── tts.ts │ └── route.ts │ ├── page.tsx │ └── ttsChat.tsx ├── .gitignore ├── tailwind.config.ts ├── public ├── vercel.svg └── next.svg ├── package.json ├── tsconfig.json ├── README.md └── package-lock.json /README.md: -------------------------------------------------------------------------------- 1 | # chat-application -------------------------------------------------------------------------------- /chatapp/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {}; 3 | 4 | export default nextConfig; 5 | -------------------------------------------------------------------------------- /chatapp/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /chatapp/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pandablue0809/chat-application-OpenAI-API-/HEAD/chatapp/src/app/favicon.ico -------------------------------------------------------------------------------- /chatapp/src/app/components/LiveWordDisplay.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface Props { 4 | liveWords: string; 5 | } 6 | 7 | const LiveWordDisplay: React.FC = ({ liveWords }) => { 8 | return ( 9 |
10 |

{liveWords}

11 |
12 | ); 13 | }; 14 | 15 | export default LiveWordDisplay; 16 | -------------------------------------------------------------------------------- /chatapp/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /chatapp/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Inter } from "next/font/google"; 3 | import "./globals.css"; 4 | 5 | const inter = Inter({ subsets: ["latin"] }); 6 | 7 | export const metadata: Metadata = { 8 | title: "Create Next App", 9 | description: "Generated by create next app", 10 | }; 11 | 12 | export default function RootLayout({ 13 | children, 14 | }: Readonly<{ 15 | children: React.ReactNode; 16 | }>) { 17 | return ( 18 | 19 | {children} 20 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /chatapp/src/app/components/MicToggle.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface MicToggleProps { 4 | isListening: boolean; 5 | onToggle: () => void; 6 | } 7 | 8 | const MicToggle: React.FC = ({ isListening, onToggle }) => { 9 | return ( 10 |
11 | 14 |
15 | ); 16 | }; 17 | 18 | export default MicToggle; 19 | -------------------------------------------------------------------------------- /chatapp/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config: Config = { 4 | content: [ 5 | "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", 6 | "./src/components/**/*.{js,ts,jsx,tsx,mdx}", 7 | "./src/app/**/*.{js,ts,jsx,tsx,mdx}", 8 | ], 9 | theme: { 10 | extend: { 11 | backgroundImage: { 12 | "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", 13 | "gradient-conic": 14 | "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", 15 | }, 16 | }, 17 | }, 18 | plugins: [], 19 | }; 20 | export default config; 21 | -------------------------------------------------------------------------------- /chatapp/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /chatapp/src/app/components/ChatWindow.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | interface ChatWindowProps { 4 | messages: Message[]; 5 | } 6 | 7 | const ChatWindow: React.FC = ({ messages }) => { 8 | return ( 9 |
10 | {messages.map((message, index) => ( 11 |
12 | {message.user}: {message.text} 13 |
14 | ))} 15 |
16 | ); 17 | }; 18 | 19 | interface Message { 20 | user: string; 21 | text: string; 22 | } 23 | 24 | export default ChatWindow; 25 | -------------------------------------------------------------------------------- /chatapp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatapp", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "axios": "^1.6.7", 13 | "next": "14.1.0", 14 | "openai": "^4.26.1", 15 | "react": "^18", 16 | "react-dom": "^18", 17 | "whisper": "^0.2.5" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "^20", 21 | "@types/react": "^18", 22 | "@types/react-dom": "^18", 23 | "autoprefixer": "^10.0.1", 24 | "postcss": "^8", 25 | "tailwindcss": "^3.3.0", 26 | "typescript": "^5" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /chatapp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /chatapp/src/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --foreground-rgb: 0, 0, 0; 7 | --background-start-rgb: 214, 219, 220; 8 | --background-end-rgb: 255, 255, 255; 9 | } 10 | 11 | @media (prefers-color-scheme: dark) { 12 | :root { 13 | --foreground-rgb: 255, 255, 255; 14 | --background-start-rgb: 0, 0, 0; 15 | --background-end-rgb: 0, 0, 0; 16 | } 17 | } 18 | 19 | body { 20 | color: rgb(var(--foreground-rgb)); 21 | background: linear-gradient( 22 | to bottom, 23 | transparent, 24 | rgb(var(--background-end-rgb)) 25 | ) 26 | rgb(var(--background-start-rgb)); 27 | } 28 | 29 | @layer utilities { 30 | .text-balance { 31 | text-wrap: balance; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /chatapp/src/app/api/openai/openai.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | 4 | export async function sendMessage(message: string): Promise { 5 | try { 6 | const response = await axios.post('https://api.openai.com/v1/chat/completions', { 7 | model: 'gpt-3.5-turbo', 8 | messages: [{ role: 'user', content: message }], 9 | }, { 10 | headers: { 11 | 'Authorization': `Bearer ${OPENAI_API_KEY}`, 12 | 'Content-Type': 'application/json', 13 | }, 14 | }); 15 | return response.data.choices[0].text.trim(); 16 | } catch (error) { 17 | console.error('Error sending message:', error.response?.data || error.message); 18 | throw new Error('Failed to send message'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /chatapp/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | import { useState } from 'react'; 3 | import { sendMessage } from './api/openai/openai'; 4 | 5 | export default function ChatPage() { 6 | const [inputMessage, setInputMessage] = useState(''); 7 | const [chatLog, setChatLog] = useState([]); 8 | 9 | const sendMessageToAI = async () => { 10 | if (!inputMessage.trim()) return; 11 | 12 | try { 13 | const response = await sendMessage(inputMessage); 14 | setChatLog(prevChatLog => [...prevChatLog, inputMessage, response]); 15 | setInputMessage(''); 16 | } catch (error) { 17 | console.error('Failed to send message:', error.message); 18 | } 19 | }; 20 | 21 | return ( 22 |
23 |
24 | {chatLog.map((message, index) => ( 25 |
{message}
26 | ))} 27 |
28 | setInputMessage(e.target.value)} /> 29 | 30 |
31 | ); 32 | } 33 | -------------------------------------------------------------------------------- /chatapp/src/app/components/MessageInput.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | 3 | interface MessageInputProps { 4 | onSubmit: (text: string) => void; 5 | } 6 | 7 | const MessageInput: React.FC = ({ onSubmit }) => { 8 | const [inputText, setInputText] = useState(''); 9 | 10 | const handleSubmit = (e: React.FormEvent) => { 11 | e.preventDefault(); 12 | if (inputText.trim() !== '') { 13 | onSubmit(inputText); 14 | setInputText(''); 15 | } 16 | }; 17 | 18 | return ( 19 |
20 | setInputText(e.target.value)} 24 | className="flex-1 border rounded-l-md p-2" 25 | placeholder="Type your message..." 26 | /> 27 | 30 |
31 | ); 32 | }; 33 | 34 | export default MessageInput; 35 | -------------------------------------------------------------------------------- /chatapp/src/app/api/tts.ts: -------------------------------------------------------------------------------- 1 | import type { NextApiRequest, NextApiResponse } from 'next'; 2 | import axios from 'axios'; 3 | 4 | const ELEVENLABS_API_KEY = process.env.ELEVENLABS_API_KEY; 5 | 6 | const handler = async (req: NextApiRequest, res: NextApiResponse) => { 7 | if (req.method === 'POST') { 8 | const { text } = req.body; 9 | 10 | try { 11 | const response = await axios.post( 12 | 'https://api.eleven-labs.com/voice/synthesize', 13 | { 14 | text, 15 | output: 'audio', 16 | voice: 'en-US', 17 | }, 18 | { 19 | headers: { 20 | 'Content-Type': 'application/json', 21 | 'Authorization': `Bearer ${ELEVENLABS_API_KEY}`, 22 | }, 23 | responseType: 'blob', 24 | } 25 | ); 26 | 27 | res.status(200).send(response.data); 28 | } catch (error) { 29 | console.error('Error fetching data from ElevenLabs:', error); 30 | res.status(500).json({ error: 'Failed to fetch data from ElevenLabs' }); 31 | } 32 | } else { 33 | res.status(405).json({ error: 'Method Not Allowed' }); 34 | } 35 | }; 36 | 37 | export default handler; 38 | -------------------------------------------------------------------------------- /chatapp/public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /chatapp/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 37 | -------------------------------------------------------------------------------- /chatapp/src/app/components/MicrophoneToggle.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | 3 | const MicrophoneToggle: React.FC = () => { 4 | const [isListening, setIsListening] = useState(false); 5 | const [mediaStream, setMediaStream] = useState(null); 6 | const [mediaRecorder, setMediaRecorder] = useState(null); 7 | const [recordedChunks, setRecordedChunks] = useState([]); 8 | 9 | const toggleMicrophone = async () => { 10 | if (!isListening) { 11 | try { 12 | const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); 13 | setMediaStream(stream); 14 | const recorder = new MediaRecorder(stream); 15 | setMediaRecorder(recorder); 16 | 17 | recorder.ondataavailable = (event) => { 18 | if (event.data.size > 0) { 19 | setRecordedChunks([...recordedChunks, event.data]); 20 | } 21 | }; 22 | 23 | recorder.onstop = () => { 24 | const audioBlob = new Blob(recordedChunks, { type: 'audio/wav' }); 25 | // Do something with the recorded audio, like sending it to an API for speech recognition 26 | console.log(audioBlob); 27 | }; 28 | 29 | recorder.start(); 30 | setIsListening(true); 31 | } catch (error) { 32 | console.error('Error accessing microphone:', error); 33 | } 34 | } else { 35 | if (mediaRecorder) { 36 | mediaRecorder.stop(); 37 | setIsListening(false); 38 | } 39 | if (mediaStream) { 40 | mediaStream.getTracks().forEach((track) => { 41 | track.stop(); 42 | }); 43 | setMediaStream(null); 44 | } 45 | setRecordedChunks([]); 46 | } 47 | }; 48 | 49 | return ( 50 | 56 | ); 57 | }; 58 | 59 | export default MicrophoneToggle; 60 | -------------------------------------------------------------------------------- /chatapp/src/app/api/route.ts: -------------------------------------------------------------------------------- 1 | // Import necessary libraries 2 | import { Configuration, OpenAIApi } from "openai"; 3 | import { exec } from 'child_process'; 4 | import fs from 'fs'; 5 | import { NextResponse } from "next/server"; 6 | 7 | // Promisify the exec function from child_process 8 | const util = require('util'); 9 | const execAsync = util.promisify(exec); 10 | // Configure the OpenAI API client 11 | const configuration = new Configuration({ 12 | apiKey: process.env.OPENAI_API_KEY, 13 | }); 14 | const openai = new OpenAIApi(configuration); 15 | // This function handles POST requests to the /api/speechToText route 16 | export async function POST(request) { 17 | // Check if the OpenAI API key is configured 18 | if (!configuration.apiKey) { 19 | return NextResponse.json({ error: "OpenAI API key not configured, please follow instructions in README.md" }, {status:500}); 20 | } 21 | // Parse the request body 22 | const req = await request.json() 23 | // Extract the audio data from the request body 24 | const base64Audio = req.audio; 25 | // Convert the Base64 audio data back to a Buffer 26 | const audio = Buffer.from(base64Audio, 'base64'); 27 | try { 28 | // Convert the audio data to text 29 | const text = await convertAudioToText(audio); 30 | // Return the transcribed text in the response 31 | return NextResponse.json({result: text}, {status:200}); 32 | } catch(error) { 33 | // Handle any errors that occur during the request 34 | if (error.response) { 35 | console.error(error.response.status, error.response.data); 36 | return NextResponse.json({ error: error.response.data }, {status:500}); 37 | } else { 38 | console.error(`Error with OpenAI API request: ${error.message}`); 39 | return NextResponse.json({ error: "An error occurred during your request." }, {status:500}); 40 | } 41 | } 42 | } 43 | // This function converts audio data to text using the OpenAI API 44 | async function convertAudioToText(audioData) { 45 | // Convert the audio data to MP3 format 46 | const mp3AudioData = await convertAudioToMp3(audioData); 47 | // Write the MP3 audio data to a file 48 | const outputPath = '/tmp/output.mp3'; 49 | fs.writeFileSync(outputPath, mp3AudioData); 50 | // Transcribe the audio 51 | const response = await openai.createTranscription( 52 | fs.createReadStream(outputPath), 53 | 'whisper-1' 54 | ); 55 | // Delete the temporary file 56 | fs.unlinkSync(outputPath); 57 | // The API response contains the transcribed text 58 | const transcribedText = response.data.text; 59 | return transcribedText; 60 | } 61 | // This function converts audio data to MP3 format using ffmpeg 62 | async function convertAudioToMp3(audioData) { 63 | // Write the audio data to a file 64 | const inputPath = '/tmp/input.webm'; 65 | fs.writeFileSync(inputPath, audioData); 66 | // Convert the audio to MP3 using ffmpeg 67 | const outputPath = '/tmp/output.mp3'; 68 | await execAsync(`ffmpeg -i ${inputPath} ${outputPath}`); 69 | // Read the converted audio data 70 | const mp3AudioData = fs.readFileSync(outputPath); 71 | // Delete the temporary files 72 | fs.unlinkSync(inputPath); 73 | fs.unlinkSync(outputPath); 74 | return mp3AudioData; 75 | } -------------------------------------------------------------------------------- /chatapp/src/app/ttsChat.tsx: -------------------------------------------------------------------------------- 1 | // Import required modules 2 | const Microphone = require("node-microphone"); 3 | const fs = require("fs"); 4 | const ffmpeg = require("fluent-ffmpeg"); 5 | const ffmpegPath = require("ffmpeg-static"); 6 | const readline = require("readline"); 7 | const axios = require("axios"); 8 | const FormData = require("form-data"); 9 | const Speaker = require("speaker"); 10 | const OpenAI = require("openai"); 11 | require("dotenv").config(); 12 | 13 | // Set the path for FFmpeg, used for audio processing 14 | ffmpeg.setFfmpegPath(ffmpegPath); 15 | 16 | // Initialize OpenAI API client with the provided API key 17 | const secretKey = process.env.OPENAI_API_KEY; 18 | const openai = new OpenAI({ 19 | apiKey: secretKey, 20 | }); 21 | 22 | // Variables to store chat history and other components 23 | let chatHistory = []; // To store the conversation history 24 | let mic, outputFile, micStream, rl; // Microphone, output file, microphone stream, and readline interface 25 | 26 | console.log( 27 | `\n# # # # # # # # # # # # # # # # # # # # #\n# Welcome to your AI-powered voice chat #\n# # # # # # # # # # # # # # # # # # # # #\n` 28 | ); 29 | 30 | // These are the main functions 31 | // 1. setupReadlineInterface() 32 | // 2. startRecording() 33 | // 3. stopRecordingAndProcess() 34 | // 4. transcribeAndChat() 35 | // 5. streamedAudio() 36 | 37 | // See diagram for overview of how they interact 38 | // http://www.plantuml.com/plantuml/png/fPJ1ZjCm48RlVefHJY34Fi0Uq5QbYoeMKUqMxQKNaqnJ2tTisHEWF3sUD6jvJSCY4QbLFVdcZ-Vttzn4re67erMwPHVWIyIWV2gPrdXD34r47lmzwiuQmZKnXhrkyTNh1dI41xbPyI9uZwqBdQ7-YPDYpJcViGLrc-1QZ34tk4gNWwRO1lCL4xmyQ9x8RQxN-W7r4Rl5q1cNLOkQKkFkuUqxEF-uXZKPDjgQNmXvqXtTcSX8i7S1FkB91unHaME4OFe3Wzld_lScUgjFq6m4WfLe0Blp-F3WKNzBmpPAN2wVUsj2P2YQAlsHlvvaicd5_kL60hQfeyTG8d8d8rdZasbtz1WCespF3Um7lZKMdtXfg6VAebTNLurIrZaFkGPtQQaWNTfoKLvJ6ilresSmNTNqvToPcPc_V6Hc2nkSBroGPOPaaPb9QdHXHLrfGCcB3qM-KjiKKXW3bDa2gHgAnOu-867GZ23fJND4xoZYZCgpg2QXfQFl67ARd5krY-ST5oGsSen_xP6cbw8i8OP5hmqrempQYF2e3SjnxwTNoF-VTPNr3B-S-OpMsHVlBgIVyCVb0FpZFq5Wf4x9HqdwLp_FPYoyjwRLR1ofUIyMT9BN2dpc0mRO7ZHbUsQi4Vq_nEjtsKYfyN2M7EoRvVmMCZ0h8wFTfA_XQ7y3 39 | 40 | // Function to set up the readline interface for user input 41 | const setupReadlineInterface = () => { 42 | rl = readline.createInterface({ 43 | input: process.stdin, 44 | output: process.stdout, 45 | terminal: true, // Make sure the terminal can capture keypress events 46 | }); 47 | 48 | readline.emitKeypressEvents(process.stdin, rl); 49 | 50 | if (process.stdin.isTTY) { 51 | process.stdin.setRawMode(true); 52 | } 53 | 54 | // Handle keypress events 55 | process.stdin.on("keypress", (str, key) => { 56 | if ( 57 | key && 58 | (key.name.toLowerCase() === "return" || 59 | key.name.toLowerCase() === "enter") 60 | ) { 61 | if (micStream) { 62 | stopRecordingAndProcess(); 63 | } else { 64 | startRecording(); 65 | } 66 | } else if (key && key.ctrl && key.name === "c") { 67 | process.exit(); // Handle ctrl+c for exiting 68 | } else if (key) { 69 | console.log("Exiting application..."); 70 | process.exit(0); 71 | } 72 | }); 73 | 74 | console.log("Press Enter when you're ready to start speaking."); 75 | }; 76 | 77 | // Function to start recording audio from the microphone 78 | const startRecording = () => { 79 | mic = new Microphone(); 80 | outputFile = fs.createWriteStream("output.wav"); 81 | micStream = mic.startRecording(); 82 | 83 | // Write incoming data to the output file 84 | micStream.on("data", (data) => { 85 | outputFile.write(data); 86 | }); 87 | 88 | // Handle microphone errors 89 | micStream.on("error", (error) => { 90 | console.error("Error: ", error); 91 | }); 92 | 93 | console.log("Recording... Press Enter to stop"); 94 | }; 95 | 96 | // Function to stop recording and process the audio 97 | const stopRecordingAndProcess = () => { 98 | mic.stopRecording(); 99 | outputFile.end(); 100 | console.log(`Recording stopped, processing audio...`); 101 | transcribeAndChat(); // Transcribe the audio and initiate chat 102 | }; 103 | 104 | // Default voice setting for text-to-speech 105 | const inputVoice = "echo"; // https://platform.openai.com/docs/guides/text-to-speech/voice-options 106 | const inputModel = "tts-1"; // https://platform.openai.com/docs/guides/text-to-speech/audio-quality 107 | 108 | // Function to convert text to speech and play it using Speaker 109 | async function streamedAudio( 110 | inputText, 111 | model = inputModel, 112 | voice = inputVoice 113 | ) { 114 | const url = "https://api.openai.com/v1/audio/speech"; 115 | const headers = { 116 | Authorization: `Bearer ${secretKey}`, // API key for authentication 117 | }; 118 | 119 | const data = { 120 | model: model, 121 | input: inputText, 122 | voice: voice, 123 | response_format: "mp3", 124 | }; 125 | 126 | try { 127 | // Make a POST request to the OpenAI audio API 128 | const response = await axios.post(url, data, { 129 | headers: headers, 130 | responseType: "stream", 131 | }); 132 | 133 | // Configure speaker settings 134 | const speaker = new Speaker({ 135 | channels: 2, // Stereo audio 136 | bitDepth: 16, 137 | sampleRate: 44100, 138 | }); 139 | 140 | // Convert the response to the desired audio format and play it 141 | ffmpeg(response.data) 142 | .toFormat("s16le") 143 | .audioChannels(2) 144 | .audioFrequency(44100) 145 | .pipe(speaker); 146 | } catch (error) { 147 | // Handle errors from the API or the audio processing 148 | if (error.response) { 149 | console.error( 150 | `Error with HTTP request: ${error.response.status} - ${error.response.statusText}` 151 | ); 152 | } else { 153 | console.error(`Error in streamedAudio: ${error.message}`); 154 | } 155 | } 156 | } 157 | 158 | // Function to transcribe audio to text and send it to the chatbot 159 | async function transcribeAndChat() { 160 | const filePath = "output.wav"; 161 | // note that the file size limitations are 25MB for Whisper 162 | 163 | // Prepare form data for the transcription request 164 | const form = new FormData(); 165 | form.append("file", fs.createReadStream(filePath)); 166 | form.append("model", "whisper-1"); 167 | form.append("response_format", "text"); 168 | 169 | try { 170 | // Post the audio file to OpenAI for transcription 171 | const transcriptionResponse = await axios.post( 172 | "https://api.openai.com/v1/audio/transcriptions", 173 | form, 174 | { 175 | headers: { 176 | ...form.getHeaders(), 177 | Authorization: `Bearer ${secretKey}`, 178 | }, 179 | } 180 | ); 181 | 182 | // Extract transcribed text from the response 183 | const transcribedText = transcriptionResponse.data; 184 | console.log(`>> You said: ${transcribedText}`); 185 | 186 | // Prepare messages for the chatbot, including the transcribed text 187 | const messages = [ 188 | { 189 | role: "system", 190 | content: 191 | "You are a helpful assistant providing concise responses in at most two sentences.", 192 | }, 193 | ...chatHistory, 194 | { role: "user", content: transcribedText }, 195 | ]; 196 | 197 | // Send messages to the chatbot and get the response 198 | const chatResponse = await openai.chat.completions.create({ 199 | messages: messages, 200 | model: "gpt-3.5-turbo", 201 | }); 202 | 203 | // Extract the chat response. 204 | const chatResponseText = chatResponse.choices[0].message.content; 205 | 206 | // Update chat history with the latest interaction 207 | chatHistory.push( 208 | { role: "user", content: transcribedText }, 209 | { role: "assistant", content: chatResponseText } 210 | ); 211 | 212 | // Convert the chat response to speech and play + log it to the terminal 213 | await streamedAudio(chatResponseText); 214 | console.log(`>> Assistant said: ${chatResponseText}`); 215 | 216 | // Reset microphone stream and prompt for new recording 217 | micStream = null; 218 | console.log("Press Enter to speak again, or any other key to quit.\n"); 219 | } catch (error) { 220 | // Handle errors from the transcription or chatbot API 221 | if (error.response) { 222 | console.error( 223 | `Error: ${error.response.status} - ${error.response.statusText}` 224 | ); 225 | } else { 226 | console.error("Error:", error.message); 227 | } 228 | } 229 | } 230 | 231 | // Initialize the readline interface 232 | setupReadlineInterface(); -------------------------------------------------------------------------------- /chatapp/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "chatapp", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "chatapp", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "axios": "^1.6.7", 12 | "next": "14.1.0", 13 | "openai": "^4.26.1", 14 | "react": "^18", 15 | "react-dom": "^18", 16 | "whisper": "^0.2.5" 17 | }, 18 | "devDependencies": { 19 | "@types/node": "^20", 20 | "@types/react": "^18", 21 | "@types/react-dom": "^18", 22 | "autoprefixer": "^10.0.1", 23 | "postcss": "^8", 24 | "tailwindcss": "^3.3.0", 25 | "typescript": "^5" 26 | } 27 | }, 28 | "node_modules/@alloc/quick-lru": { 29 | "version": "5.2.0", 30 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 31 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 32 | "dev": true, 33 | "engines": { 34 | "node": ">=10" 35 | }, 36 | "funding": { 37 | "url": "https://github.com/sponsors/sindresorhus" 38 | } 39 | }, 40 | "node_modules/@isaacs/cliui": { 41 | "version": "8.0.2", 42 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 43 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 44 | "dev": true, 45 | "dependencies": { 46 | "string-width": "^5.1.2", 47 | "string-width-cjs": "npm:string-width@^4.2.0", 48 | "strip-ansi": "^7.0.1", 49 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 50 | "wrap-ansi": "^8.1.0", 51 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 52 | }, 53 | "engines": { 54 | "node": ">=12" 55 | } 56 | }, 57 | "node_modules/@jridgewell/gen-mapping": { 58 | "version": "0.3.3", 59 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 60 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 61 | "dev": true, 62 | "dependencies": { 63 | "@jridgewell/set-array": "^1.0.1", 64 | "@jridgewell/sourcemap-codec": "^1.4.10", 65 | "@jridgewell/trace-mapping": "^0.3.9" 66 | }, 67 | "engines": { 68 | "node": ">=6.0.0" 69 | } 70 | }, 71 | "node_modules/@jridgewell/resolve-uri": { 72 | "version": "3.1.1", 73 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 74 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 75 | "dev": true, 76 | "engines": { 77 | "node": ">=6.0.0" 78 | } 79 | }, 80 | "node_modules/@jridgewell/set-array": { 81 | "version": "1.1.2", 82 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 83 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 84 | "dev": true, 85 | "engines": { 86 | "node": ">=6.0.0" 87 | } 88 | }, 89 | "node_modules/@jridgewell/sourcemap-codec": { 90 | "version": "1.4.15", 91 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 92 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 93 | "dev": true 94 | }, 95 | "node_modules/@jridgewell/trace-mapping": { 96 | "version": "0.3.22", 97 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", 98 | "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", 99 | "dev": true, 100 | "dependencies": { 101 | "@jridgewell/resolve-uri": "^3.1.0", 102 | "@jridgewell/sourcemap-codec": "^1.4.14" 103 | } 104 | }, 105 | "node_modules/@next/env": { 106 | "version": "14.1.0", 107 | "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz", 108 | "integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==" 109 | }, 110 | "node_modules/@next/swc-darwin-arm64": { 111 | "version": "14.1.0", 112 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz", 113 | "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==", 114 | "cpu": [ 115 | "arm64" 116 | ], 117 | "optional": true, 118 | "os": [ 119 | "darwin" 120 | ], 121 | "engines": { 122 | "node": ">= 10" 123 | } 124 | }, 125 | "node_modules/@next/swc-darwin-x64": { 126 | "version": "14.1.0", 127 | "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz", 128 | "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==", 129 | "cpu": [ 130 | "x64" 131 | ], 132 | "optional": true, 133 | "os": [ 134 | "darwin" 135 | ], 136 | "engines": { 137 | "node": ">= 10" 138 | } 139 | }, 140 | "node_modules/@next/swc-linux-arm64-gnu": { 141 | "version": "14.1.0", 142 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz", 143 | "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==", 144 | "cpu": [ 145 | "arm64" 146 | ], 147 | "optional": true, 148 | "os": [ 149 | "linux" 150 | ], 151 | "engines": { 152 | "node": ">= 10" 153 | } 154 | }, 155 | "node_modules/@next/swc-linux-arm64-musl": { 156 | "version": "14.1.0", 157 | "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz", 158 | "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==", 159 | "cpu": [ 160 | "arm64" 161 | ], 162 | "optional": true, 163 | "os": [ 164 | "linux" 165 | ], 166 | "engines": { 167 | "node": ">= 10" 168 | } 169 | }, 170 | "node_modules/@next/swc-linux-x64-gnu": { 171 | "version": "14.1.0", 172 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz", 173 | "integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==", 174 | "cpu": [ 175 | "x64" 176 | ], 177 | "optional": true, 178 | "os": [ 179 | "linux" 180 | ], 181 | "engines": { 182 | "node": ">= 10" 183 | } 184 | }, 185 | "node_modules/@next/swc-linux-x64-musl": { 186 | "version": "14.1.0", 187 | "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.0.tgz", 188 | "integrity": "sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==", 189 | "cpu": [ 190 | "x64" 191 | ], 192 | "optional": true, 193 | "os": [ 194 | "linux" 195 | ], 196 | "engines": { 197 | "node": ">= 10" 198 | } 199 | }, 200 | "node_modules/@next/swc-win32-arm64-msvc": { 201 | "version": "14.1.0", 202 | "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz", 203 | "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==", 204 | "cpu": [ 205 | "arm64" 206 | ], 207 | "optional": true, 208 | "os": [ 209 | "win32" 210 | ], 211 | "engines": { 212 | "node": ">= 10" 213 | } 214 | }, 215 | "node_modules/@next/swc-win32-ia32-msvc": { 216 | "version": "14.1.0", 217 | "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz", 218 | "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==", 219 | "cpu": [ 220 | "ia32" 221 | ], 222 | "optional": true, 223 | "os": [ 224 | "win32" 225 | ], 226 | "engines": { 227 | "node": ">= 10" 228 | } 229 | }, 230 | "node_modules/@next/swc-win32-x64-msvc": { 231 | "version": "14.1.0", 232 | "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz", 233 | "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==", 234 | "cpu": [ 235 | "x64" 236 | ], 237 | "optional": true, 238 | "os": [ 239 | "win32" 240 | ], 241 | "engines": { 242 | "node": ">= 10" 243 | } 244 | }, 245 | "node_modules/@nodelib/fs.scandir": { 246 | "version": "2.1.5", 247 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 248 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 249 | "dev": true, 250 | "dependencies": { 251 | "@nodelib/fs.stat": "2.0.5", 252 | "run-parallel": "^1.1.9" 253 | }, 254 | "engines": { 255 | "node": ">= 8" 256 | } 257 | }, 258 | "node_modules/@nodelib/fs.stat": { 259 | "version": "2.0.5", 260 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 261 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 262 | "dev": true, 263 | "engines": { 264 | "node": ">= 8" 265 | } 266 | }, 267 | "node_modules/@nodelib/fs.walk": { 268 | "version": "1.2.8", 269 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 270 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 271 | "dev": true, 272 | "dependencies": { 273 | "@nodelib/fs.scandir": "2.1.5", 274 | "fastq": "^1.6.0" 275 | }, 276 | "engines": { 277 | "node": ">= 8" 278 | } 279 | }, 280 | "node_modules/@pkgjs/parseargs": { 281 | "version": "0.11.0", 282 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 283 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 284 | "dev": true, 285 | "optional": true, 286 | "engines": { 287 | "node": ">=14" 288 | } 289 | }, 290 | "node_modules/@swc/helpers": { 291 | "version": "0.5.2", 292 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", 293 | "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", 294 | "dependencies": { 295 | "tslib": "^2.4.0" 296 | } 297 | }, 298 | "node_modules/@types/node": { 299 | "version": "20.11.16", 300 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", 301 | "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", 302 | "dependencies": { 303 | "undici-types": "~5.26.4" 304 | } 305 | }, 306 | "node_modules/@types/node-fetch": { 307 | "version": "2.6.11", 308 | "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", 309 | "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", 310 | "dependencies": { 311 | "@types/node": "*", 312 | "form-data": "^4.0.0" 313 | } 314 | }, 315 | "node_modules/@types/prop-types": { 316 | "version": "15.7.11", 317 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", 318 | "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", 319 | "dev": true 320 | }, 321 | "node_modules/@types/react": { 322 | "version": "18.2.55", 323 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", 324 | "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", 325 | "dev": true, 326 | "dependencies": { 327 | "@types/prop-types": "*", 328 | "@types/scheduler": "*", 329 | "csstype": "^3.0.2" 330 | } 331 | }, 332 | "node_modules/@types/react-dom": { 333 | "version": "18.2.18", 334 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", 335 | "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", 336 | "dev": true, 337 | "dependencies": { 338 | "@types/react": "*" 339 | } 340 | }, 341 | "node_modules/@types/scheduler": { 342 | "version": "0.16.8", 343 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", 344 | "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", 345 | "dev": true 346 | }, 347 | "node_modules/abort-controller": { 348 | "version": "3.0.0", 349 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 350 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 351 | "dependencies": { 352 | "event-target-shim": "^5.0.0" 353 | }, 354 | "engines": { 355 | "node": ">=6.5" 356 | } 357 | }, 358 | "node_modules/agentkeepalive": { 359 | "version": "4.5.0", 360 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 361 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 362 | "dependencies": { 363 | "humanize-ms": "^1.2.1" 364 | }, 365 | "engines": { 366 | "node": ">= 8.0.0" 367 | } 368 | }, 369 | "node_modules/ansi-regex": { 370 | "version": "6.0.1", 371 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 372 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 373 | "dev": true, 374 | "engines": { 375 | "node": ">=12" 376 | }, 377 | "funding": { 378 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 379 | } 380 | }, 381 | "node_modules/ansi-styles": { 382 | "version": "6.2.1", 383 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 384 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 385 | "dev": true, 386 | "engines": { 387 | "node": ">=12" 388 | }, 389 | "funding": { 390 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 391 | } 392 | }, 393 | "node_modules/any-promise": { 394 | "version": "1.3.0", 395 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 396 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 397 | "dev": true 398 | }, 399 | "node_modules/anymatch": { 400 | "version": "3.1.3", 401 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 402 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 403 | "dev": true, 404 | "dependencies": { 405 | "normalize-path": "^3.0.0", 406 | "picomatch": "^2.0.4" 407 | }, 408 | "engines": { 409 | "node": ">= 8" 410 | } 411 | }, 412 | "node_modules/arg": { 413 | "version": "5.0.2", 414 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 415 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 416 | "dev": true 417 | }, 418 | "node_modules/asynckit": { 419 | "version": "0.4.0", 420 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 421 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 422 | }, 423 | "node_modules/autoprefixer": { 424 | "version": "10.4.17", 425 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", 426 | "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", 427 | "dev": true, 428 | "funding": [ 429 | { 430 | "type": "opencollective", 431 | "url": "https://opencollective.com/postcss/" 432 | }, 433 | { 434 | "type": "tidelift", 435 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 436 | }, 437 | { 438 | "type": "github", 439 | "url": "https://github.com/sponsors/ai" 440 | } 441 | ], 442 | "dependencies": { 443 | "browserslist": "^4.22.2", 444 | "caniuse-lite": "^1.0.30001578", 445 | "fraction.js": "^4.3.7", 446 | "normalize-range": "^0.1.2", 447 | "picocolors": "^1.0.0", 448 | "postcss-value-parser": "^4.2.0" 449 | }, 450 | "bin": { 451 | "autoprefixer": "bin/autoprefixer" 452 | }, 453 | "engines": { 454 | "node": "^10 || ^12 || >=14" 455 | }, 456 | "peerDependencies": { 457 | "postcss": "^8.1.0" 458 | } 459 | }, 460 | "node_modules/axios": { 461 | "version": "1.6.7", 462 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", 463 | "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", 464 | "dependencies": { 465 | "follow-redirects": "^1.15.4", 466 | "form-data": "^4.0.0", 467 | "proxy-from-env": "^1.1.0" 468 | } 469 | }, 470 | "node_modules/balanced-match": { 471 | "version": "1.0.2", 472 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 473 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 474 | "dev": true 475 | }, 476 | "node_modules/base-64": { 477 | "version": "0.1.0", 478 | "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", 479 | "integrity": "sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==" 480 | }, 481 | "node_modules/binary-extensions": { 482 | "version": "2.2.0", 483 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 484 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 485 | "dev": true, 486 | "engines": { 487 | "node": ">=8" 488 | } 489 | }, 490 | "node_modules/boo": { 491 | "version": "1.2.4", 492 | "resolved": "https://registry.npmjs.org/boo/-/boo-1.2.4.tgz", 493 | "integrity": "sha512-U+pq3vSlL93Wxpsz+o0aulYhZko1BG1sGVQ12k7VdhNHO07cCHOHHwmyB+n3sldyvF0VryIP/L+3i7ELxxaZdA==" 494 | }, 495 | "node_modules/brace-expansion": { 496 | "version": "2.0.1", 497 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 498 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 499 | "dev": true, 500 | "dependencies": { 501 | "balanced-match": "^1.0.0" 502 | } 503 | }, 504 | "node_modules/braces": { 505 | "version": "3.0.2", 506 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 507 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 508 | "dev": true, 509 | "dependencies": { 510 | "fill-range": "^7.0.1" 511 | }, 512 | "engines": { 513 | "node": ">=8" 514 | } 515 | }, 516 | "node_modules/browserslist": { 517 | "version": "4.22.3", 518 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", 519 | "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", 520 | "dev": true, 521 | "funding": [ 522 | { 523 | "type": "opencollective", 524 | "url": "https://opencollective.com/browserslist" 525 | }, 526 | { 527 | "type": "tidelift", 528 | "url": "https://tidelift.com/funding/github/npm/browserslist" 529 | }, 530 | { 531 | "type": "github", 532 | "url": "https://github.com/sponsors/ai" 533 | } 534 | ], 535 | "dependencies": { 536 | "caniuse-lite": "^1.0.30001580", 537 | "electron-to-chromium": "^1.4.648", 538 | "node-releases": "^2.0.14", 539 | "update-browserslist-db": "^1.0.13" 540 | }, 541 | "bin": { 542 | "browserslist": "cli.js" 543 | }, 544 | "engines": { 545 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 546 | } 547 | }, 548 | "node_modules/busboy": { 549 | "version": "1.6.0", 550 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", 551 | "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", 552 | "dependencies": { 553 | "streamsearch": "^1.1.0" 554 | }, 555 | "engines": { 556 | "node": ">=10.16.0" 557 | } 558 | }, 559 | "node_modules/camelcase-css": { 560 | "version": "2.0.1", 561 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 562 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 563 | "dev": true, 564 | "engines": { 565 | "node": ">= 6" 566 | } 567 | }, 568 | "node_modules/caniuse-lite": { 569 | "version": "1.0.30001584", 570 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001584.tgz", 571 | "integrity": "sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==", 572 | "funding": [ 573 | { 574 | "type": "opencollective", 575 | "url": "https://opencollective.com/browserslist" 576 | }, 577 | { 578 | "type": "tidelift", 579 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 580 | }, 581 | { 582 | "type": "github", 583 | "url": "https://github.com/sponsors/ai" 584 | } 585 | ] 586 | }, 587 | "node_modules/cassie": { 588 | "version": "1.4.1", 589 | "resolved": "https://registry.npmjs.org/cassie/-/cassie-1.4.1.tgz", 590 | "integrity": "sha512-lBGoAJCcxpQ0Uh/hRhEoWKNJJ1CSO3qlZvSG7YqJ5S9t/qxBkRL5/lA4+8UvZKTK2FlmAhwapuhdRQk/aUJE6A==", 591 | "deprecated": "Cassie is not actively maintained anymore (bugfixes will still be released). The author has moved to working on data.future. If you want Promises/A+ check out bluebird.", 592 | "dependencies": { 593 | "boo": "~1" 594 | }, 595 | "engines": { 596 | "node": ">=0.4.0" 597 | } 598 | }, 599 | "node_modules/charenc": { 600 | "version": "0.0.2", 601 | "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", 602 | "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", 603 | "engines": { 604 | "node": "*" 605 | } 606 | }, 607 | "node_modules/chokidar": { 608 | "version": "3.6.0", 609 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 610 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 611 | "dev": true, 612 | "dependencies": { 613 | "anymatch": "~3.1.2", 614 | "braces": "~3.0.2", 615 | "glob-parent": "~5.1.2", 616 | "is-binary-path": "~2.1.0", 617 | "is-glob": "~4.0.1", 618 | "normalize-path": "~3.0.0", 619 | "readdirp": "~3.6.0" 620 | }, 621 | "engines": { 622 | "node": ">= 8.10.0" 623 | }, 624 | "funding": { 625 | "url": "https://paulmillr.com/funding/" 626 | }, 627 | "optionalDependencies": { 628 | "fsevents": "~2.3.2" 629 | } 630 | }, 631 | "node_modules/chokidar/node_modules/glob-parent": { 632 | "version": "5.1.2", 633 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 634 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 635 | "dev": true, 636 | "dependencies": { 637 | "is-glob": "^4.0.1" 638 | }, 639 | "engines": { 640 | "node": ">= 6" 641 | } 642 | }, 643 | "node_modules/client-only": { 644 | "version": "0.0.1", 645 | "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", 646 | "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" 647 | }, 648 | "node_modules/color-convert": { 649 | "version": "2.0.1", 650 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 651 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 652 | "dev": true, 653 | "dependencies": { 654 | "color-name": "~1.1.4" 655 | }, 656 | "engines": { 657 | "node": ">=7.0.0" 658 | } 659 | }, 660 | "node_modules/color-name": { 661 | "version": "1.1.4", 662 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 663 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 664 | "dev": true 665 | }, 666 | "node_modules/combined-stream": { 667 | "version": "1.0.8", 668 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 669 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 670 | "dependencies": { 671 | "delayed-stream": "~1.0.0" 672 | }, 673 | "engines": { 674 | "node": ">= 0.8" 675 | } 676 | }, 677 | "node_modules/commander": { 678 | "version": "4.1.1", 679 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 680 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 681 | "dev": true, 682 | "engines": { 683 | "node": ">= 6" 684 | } 685 | }, 686 | "node_modules/cross-spawn": { 687 | "version": "7.0.3", 688 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 689 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 690 | "dev": true, 691 | "dependencies": { 692 | "path-key": "^3.1.0", 693 | "shebang-command": "^2.0.0", 694 | "which": "^2.0.1" 695 | }, 696 | "engines": { 697 | "node": ">= 8" 698 | } 699 | }, 700 | "node_modules/crypt": { 701 | "version": "0.0.2", 702 | "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", 703 | "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", 704 | "engines": { 705 | "node": "*" 706 | } 707 | }, 708 | "node_modules/cssesc": { 709 | "version": "3.0.0", 710 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 711 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 712 | "dev": true, 713 | "bin": { 714 | "cssesc": "bin/cssesc" 715 | }, 716 | "engines": { 717 | "node": ">=4" 718 | } 719 | }, 720 | "node_modules/csstype": { 721 | "version": "3.1.3", 722 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 723 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 724 | "dev": true 725 | }, 726 | "node_modules/delayed-stream": { 727 | "version": "1.0.0", 728 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 729 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 730 | "engines": { 731 | "node": ">=0.4.0" 732 | } 733 | }, 734 | "node_modules/didyoumean": { 735 | "version": "1.2.2", 736 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 737 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 738 | "dev": true 739 | }, 740 | "node_modules/digest-fetch": { 741 | "version": "1.3.0", 742 | "resolved": "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz", 743 | "integrity": "sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==", 744 | "dependencies": { 745 | "base-64": "^0.1.0", 746 | "md5": "^2.3.0" 747 | } 748 | }, 749 | "node_modules/dlv": { 750 | "version": "1.1.3", 751 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 752 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 753 | "dev": true 754 | }, 755 | "node_modules/eastasianwidth": { 756 | "version": "0.2.0", 757 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 758 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 759 | "dev": true 760 | }, 761 | "node_modules/electron-to-chromium": { 762 | "version": "1.4.659", 763 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.659.tgz", 764 | "integrity": "sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==", 765 | "dev": true 766 | }, 767 | "node_modules/emoji-regex": { 768 | "version": "9.2.2", 769 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 770 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 771 | "dev": true 772 | }, 773 | "node_modules/escalade": { 774 | "version": "3.1.2", 775 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 776 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 777 | "dev": true, 778 | "engines": { 779 | "node": ">=6" 780 | } 781 | }, 782 | "node_modules/event-target-shim": { 783 | "version": "5.0.1", 784 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 785 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 786 | "engines": { 787 | "node": ">=6" 788 | } 789 | }, 790 | "node_modules/fast-glob": { 791 | "version": "3.3.2", 792 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", 793 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 794 | "dev": true, 795 | "dependencies": { 796 | "@nodelib/fs.stat": "^2.0.2", 797 | "@nodelib/fs.walk": "^1.2.3", 798 | "glob-parent": "^5.1.2", 799 | "merge2": "^1.3.0", 800 | "micromatch": "^4.0.4" 801 | }, 802 | "engines": { 803 | "node": ">=8.6.0" 804 | } 805 | }, 806 | "node_modules/fast-glob/node_modules/glob-parent": { 807 | "version": "5.1.2", 808 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 809 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 810 | "dev": true, 811 | "dependencies": { 812 | "is-glob": "^4.0.1" 813 | }, 814 | "engines": { 815 | "node": ">= 6" 816 | } 817 | }, 818 | "node_modules/fastq": { 819 | "version": "1.17.1", 820 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 821 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 822 | "dev": true, 823 | "dependencies": { 824 | "reusify": "^1.0.4" 825 | } 826 | }, 827 | "node_modules/fill-range": { 828 | "version": "7.0.1", 829 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 830 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 831 | "dev": true, 832 | "dependencies": { 833 | "to-regex-range": "^5.0.1" 834 | }, 835 | "engines": { 836 | "node": ">=8" 837 | } 838 | }, 839 | "node_modules/flaw": { 840 | "version": "0.1.0", 841 | "resolved": "https://registry.npmjs.org/flaw/-/flaw-0.1.0.tgz", 842 | "integrity": "sha512-NvAz2EUV2aZthmFGVCyTW6Yjj/7owQNcDZy7Usb9eWu/+EDn+IhWdKQXf1pe3ti1Z1fkiIqljlGd4qcr29wjYg==" 843 | }, 844 | "node_modules/follow-redirects": { 845 | "version": "1.15.5", 846 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", 847 | "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", 848 | "funding": [ 849 | { 850 | "type": "individual", 851 | "url": "https://github.com/sponsors/RubenVerborgh" 852 | } 853 | ], 854 | "engines": { 855 | "node": ">=4.0" 856 | }, 857 | "peerDependenciesMeta": { 858 | "debug": { 859 | "optional": true 860 | } 861 | } 862 | }, 863 | "node_modules/foreground-child": { 864 | "version": "3.1.1", 865 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", 866 | "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", 867 | "dev": true, 868 | "dependencies": { 869 | "cross-spawn": "^7.0.0", 870 | "signal-exit": "^4.0.1" 871 | }, 872 | "engines": { 873 | "node": ">=14" 874 | }, 875 | "funding": { 876 | "url": "https://github.com/sponsors/isaacs" 877 | } 878 | }, 879 | "node_modules/form-data": { 880 | "version": "4.0.0", 881 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 882 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 883 | "dependencies": { 884 | "asynckit": "^0.4.0", 885 | "combined-stream": "^1.0.8", 886 | "mime-types": "^2.1.12" 887 | }, 888 | "engines": { 889 | "node": ">= 6" 890 | } 891 | }, 892 | "node_modules/form-data-encoder": { 893 | "version": "1.7.2", 894 | "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", 895 | "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==" 896 | }, 897 | "node_modules/formdata-node": { 898 | "version": "4.4.1", 899 | "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", 900 | "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", 901 | "dependencies": { 902 | "node-domexception": "1.0.0", 903 | "web-streams-polyfill": "4.0.0-beta.3" 904 | }, 905 | "engines": { 906 | "node": ">= 12.20" 907 | } 908 | }, 909 | "node_modules/formdata-node/node_modules/web-streams-polyfill": { 910 | "version": "4.0.0-beta.3", 911 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", 912 | "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", 913 | "engines": { 914 | "node": ">= 14" 915 | } 916 | }, 917 | "node_modules/fraction.js": { 918 | "version": "4.3.7", 919 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 920 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 921 | "dev": true, 922 | "engines": { 923 | "node": "*" 924 | }, 925 | "funding": { 926 | "type": "patreon", 927 | "url": "https://github.com/sponsors/rawify" 928 | } 929 | }, 930 | "node_modules/fsevents": { 931 | "version": "2.3.3", 932 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 933 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 934 | "dev": true, 935 | "hasInstallScript": true, 936 | "optional": true, 937 | "os": [ 938 | "darwin" 939 | ], 940 | "engines": { 941 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 942 | } 943 | }, 944 | "node_modules/function-bind": { 945 | "version": "1.1.2", 946 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 947 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 948 | "dev": true, 949 | "funding": { 950 | "url": "https://github.com/sponsors/ljharb" 951 | } 952 | }, 953 | "node_modules/glob": { 954 | "version": "10.3.10", 955 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", 956 | "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", 957 | "dev": true, 958 | "dependencies": { 959 | "foreground-child": "^3.1.0", 960 | "jackspeak": "^2.3.5", 961 | "minimatch": "^9.0.1", 962 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", 963 | "path-scurry": "^1.10.1" 964 | }, 965 | "bin": { 966 | "glob": "dist/esm/bin.mjs" 967 | }, 968 | "engines": { 969 | "node": ">=16 || 14 >=14.17" 970 | }, 971 | "funding": { 972 | "url": "https://github.com/sponsors/isaacs" 973 | } 974 | }, 975 | "node_modules/glob-parent": { 976 | "version": "6.0.2", 977 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 978 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 979 | "dev": true, 980 | "dependencies": { 981 | "is-glob": "^4.0.3" 982 | }, 983 | "engines": { 984 | "node": ">=10.13.0" 985 | } 986 | }, 987 | "node_modules/graceful-fs": { 988 | "version": "4.2.11", 989 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 990 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 991 | }, 992 | "node_modules/hasown": { 993 | "version": "2.0.0", 994 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 995 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 996 | "dev": true, 997 | "dependencies": { 998 | "function-bind": "^1.1.2" 999 | }, 1000 | "engines": { 1001 | "node": ">= 0.4" 1002 | } 1003 | }, 1004 | "node_modules/humanize-ms": { 1005 | "version": "1.2.1", 1006 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1007 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1008 | "dependencies": { 1009 | "ms": "^2.0.0" 1010 | } 1011 | }, 1012 | "node_modules/is-binary-path": { 1013 | "version": "2.1.0", 1014 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1015 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1016 | "dev": true, 1017 | "dependencies": { 1018 | "binary-extensions": "^2.0.0" 1019 | }, 1020 | "engines": { 1021 | "node": ">=8" 1022 | } 1023 | }, 1024 | "node_modules/is-buffer": { 1025 | "version": "1.1.6", 1026 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1027 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1028 | }, 1029 | "node_modules/is-core-module": { 1030 | "version": "2.13.1", 1031 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 1032 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 1033 | "dev": true, 1034 | "dependencies": { 1035 | "hasown": "^2.0.0" 1036 | }, 1037 | "funding": { 1038 | "url": "https://github.com/sponsors/ljharb" 1039 | } 1040 | }, 1041 | "node_modules/is-extglob": { 1042 | "version": "2.1.1", 1043 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1044 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1045 | "dev": true, 1046 | "engines": { 1047 | "node": ">=0.10.0" 1048 | } 1049 | }, 1050 | "node_modules/is-fullwidth-code-point": { 1051 | "version": "3.0.0", 1052 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1053 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1054 | "dev": true, 1055 | "engines": { 1056 | "node": ">=8" 1057 | } 1058 | }, 1059 | "node_modules/is-glob": { 1060 | "version": "4.0.3", 1061 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1062 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1063 | "dev": true, 1064 | "dependencies": { 1065 | "is-extglob": "^2.1.1" 1066 | }, 1067 | "engines": { 1068 | "node": ">=0.10.0" 1069 | } 1070 | }, 1071 | "node_modules/is-number": { 1072 | "version": "7.0.0", 1073 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1074 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1075 | "dev": true, 1076 | "engines": { 1077 | "node": ">=0.12.0" 1078 | } 1079 | }, 1080 | "node_modules/isexe": { 1081 | "version": "2.0.0", 1082 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1083 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1084 | "dev": true 1085 | }, 1086 | "node_modules/jackspeak": { 1087 | "version": "2.3.6", 1088 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", 1089 | "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", 1090 | "dev": true, 1091 | "dependencies": { 1092 | "@isaacs/cliui": "^8.0.2" 1093 | }, 1094 | "engines": { 1095 | "node": ">=14" 1096 | }, 1097 | "funding": { 1098 | "url": "https://github.com/sponsors/isaacs" 1099 | }, 1100 | "optionalDependencies": { 1101 | "@pkgjs/parseargs": "^0.11.0" 1102 | } 1103 | }, 1104 | "node_modules/jiti": { 1105 | "version": "1.21.0", 1106 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", 1107 | "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", 1108 | "dev": true, 1109 | "bin": { 1110 | "jiti": "bin/jiti.js" 1111 | } 1112 | }, 1113 | "node_modules/js-tokens": { 1114 | "version": "4.0.0", 1115 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1116 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1117 | }, 1118 | "node_modules/lilconfig": { 1119 | "version": "2.1.0", 1120 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 1121 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 1122 | "dev": true, 1123 | "engines": { 1124 | "node": ">=10" 1125 | } 1126 | }, 1127 | "node_modules/lines-and-columns": { 1128 | "version": "1.2.4", 1129 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 1130 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 1131 | "dev": true 1132 | }, 1133 | "node_modules/loose-envify": { 1134 | "version": "1.4.0", 1135 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1136 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1137 | "dependencies": { 1138 | "js-tokens": "^3.0.0 || ^4.0.0" 1139 | }, 1140 | "bin": { 1141 | "loose-envify": "cli.js" 1142 | } 1143 | }, 1144 | "node_modules/lru-cache": { 1145 | "version": "10.2.0", 1146 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", 1147 | "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", 1148 | "dev": true, 1149 | "engines": { 1150 | "node": "14 || >=16.14" 1151 | } 1152 | }, 1153 | "node_modules/md5": { 1154 | "version": "2.3.0", 1155 | "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", 1156 | "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", 1157 | "dependencies": { 1158 | "charenc": "0.0.2", 1159 | "crypt": "0.0.2", 1160 | "is-buffer": "~1.1.6" 1161 | } 1162 | }, 1163 | "node_modules/merge2": { 1164 | "version": "1.4.1", 1165 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1166 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1167 | "dev": true, 1168 | "engines": { 1169 | "node": ">= 8" 1170 | } 1171 | }, 1172 | "node_modules/micromatch": { 1173 | "version": "4.0.5", 1174 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1175 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1176 | "dev": true, 1177 | "dependencies": { 1178 | "braces": "^3.0.2", 1179 | "picomatch": "^2.3.1" 1180 | }, 1181 | "engines": { 1182 | "node": ">=8.6" 1183 | } 1184 | }, 1185 | "node_modules/mime-db": { 1186 | "version": "1.52.0", 1187 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1188 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1189 | "engines": { 1190 | "node": ">= 0.6" 1191 | } 1192 | }, 1193 | "node_modules/mime-types": { 1194 | "version": "2.1.35", 1195 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1196 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1197 | "dependencies": { 1198 | "mime-db": "1.52.0" 1199 | }, 1200 | "engines": { 1201 | "node": ">= 0.6" 1202 | } 1203 | }, 1204 | "node_modules/minimatch": { 1205 | "version": "9.0.3", 1206 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", 1207 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 1208 | "dev": true, 1209 | "dependencies": { 1210 | "brace-expansion": "^2.0.1" 1211 | }, 1212 | "engines": { 1213 | "node": ">=16 || 14 >=14.17" 1214 | }, 1215 | "funding": { 1216 | "url": "https://github.com/sponsors/isaacs" 1217 | } 1218 | }, 1219 | "node_modules/minipass": { 1220 | "version": "7.0.4", 1221 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", 1222 | "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", 1223 | "dev": true, 1224 | "engines": { 1225 | "node": ">=16 || 14 >=14.17" 1226 | } 1227 | }, 1228 | "node_modules/ms": { 1229 | "version": "2.1.3", 1230 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1231 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1232 | }, 1233 | "node_modules/mz": { 1234 | "version": "2.7.0", 1235 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1236 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1237 | "dev": true, 1238 | "dependencies": { 1239 | "any-promise": "^1.0.0", 1240 | "object-assign": "^4.0.1", 1241 | "thenify-all": "^1.0.0" 1242 | } 1243 | }, 1244 | "node_modules/nanoid": { 1245 | "version": "3.3.7", 1246 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1247 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 1248 | "funding": [ 1249 | { 1250 | "type": "github", 1251 | "url": "https://github.com/sponsors/ai" 1252 | } 1253 | ], 1254 | "bin": { 1255 | "nanoid": "bin/nanoid.cjs" 1256 | }, 1257 | "engines": { 1258 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1259 | } 1260 | }, 1261 | "node_modules/next": { 1262 | "version": "14.1.0", 1263 | "resolved": "https://registry.npmjs.org/next/-/next-14.1.0.tgz", 1264 | "integrity": "sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==", 1265 | "dependencies": { 1266 | "@next/env": "14.1.0", 1267 | "@swc/helpers": "0.5.2", 1268 | "busboy": "1.6.0", 1269 | "caniuse-lite": "^1.0.30001579", 1270 | "graceful-fs": "^4.2.11", 1271 | "postcss": "8.4.31", 1272 | "styled-jsx": "5.1.1" 1273 | }, 1274 | "bin": { 1275 | "next": "dist/bin/next" 1276 | }, 1277 | "engines": { 1278 | "node": ">=18.17.0" 1279 | }, 1280 | "optionalDependencies": { 1281 | "@next/swc-darwin-arm64": "14.1.0", 1282 | "@next/swc-darwin-x64": "14.1.0", 1283 | "@next/swc-linux-arm64-gnu": "14.1.0", 1284 | "@next/swc-linux-arm64-musl": "14.1.0", 1285 | "@next/swc-linux-x64-gnu": "14.1.0", 1286 | "@next/swc-linux-x64-musl": "14.1.0", 1287 | "@next/swc-win32-arm64-msvc": "14.1.0", 1288 | "@next/swc-win32-ia32-msvc": "14.1.0", 1289 | "@next/swc-win32-x64-msvc": "14.1.0" 1290 | }, 1291 | "peerDependencies": { 1292 | "@opentelemetry/api": "^1.1.0", 1293 | "react": "^18.2.0", 1294 | "react-dom": "^18.2.0", 1295 | "sass": "^1.3.0" 1296 | }, 1297 | "peerDependenciesMeta": { 1298 | "@opentelemetry/api": { 1299 | "optional": true 1300 | }, 1301 | "sass": { 1302 | "optional": true 1303 | } 1304 | } 1305 | }, 1306 | "node_modules/next/node_modules/postcss": { 1307 | "version": "8.4.31", 1308 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 1309 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 1310 | "funding": [ 1311 | { 1312 | "type": "opencollective", 1313 | "url": "https://opencollective.com/postcss/" 1314 | }, 1315 | { 1316 | "type": "tidelift", 1317 | "url": "https://tidelift.com/funding/github/npm/postcss" 1318 | }, 1319 | { 1320 | "type": "github", 1321 | "url": "https://github.com/sponsors/ai" 1322 | } 1323 | ], 1324 | "dependencies": { 1325 | "nanoid": "^3.3.6", 1326 | "picocolors": "^1.0.0", 1327 | "source-map-js": "^1.0.2" 1328 | }, 1329 | "engines": { 1330 | "node": "^10 || ^12 || >=14" 1331 | } 1332 | }, 1333 | "node_modules/node-domexception": { 1334 | "version": "1.0.0", 1335 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 1336 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 1337 | "funding": [ 1338 | { 1339 | "type": "github", 1340 | "url": "https://github.com/sponsors/jimmywarting" 1341 | }, 1342 | { 1343 | "type": "github", 1344 | "url": "https://paypal.me/jimmywarting" 1345 | } 1346 | ], 1347 | "engines": { 1348 | "node": ">=10.5.0" 1349 | } 1350 | }, 1351 | "node_modules/node-fetch": { 1352 | "version": "2.7.0", 1353 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1354 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1355 | "dependencies": { 1356 | "whatwg-url": "^5.0.0" 1357 | }, 1358 | "engines": { 1359 | "node": "4.x || >=6.0.0" 1360 | }, 1361 | "peerDependencies": { 1362 | "encoding": "^0.1.0" 1363 | }, 1364 | "peerDependenciesMeta": { 1365 | "encoding": { 1366 | "optional": true 1367 | } 1368 | } 1369 | }, 1370 | "node_modules/node-releases": { 1371 | "version": "2.0.14", 1372 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", 1373 | "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", 1374 | "dev": true 1375 | }, 1376 | "node_modules/normalize-path": { 1377 | "version": "3.0.0", 1378 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1379 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1380 | "dev": true, 1381 | "engines": { 1382 | "node": ">=0.10.0" 1383 | } 1384 | }, 1385 | "node_modules/normalize-range": { 1386 | "version": "0.1.2", 1387 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1388 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1389 | "dev": true, 1390 | "engines": { 1391 | "node": ">=0.10.0" 1392 | } 1393 | }, 1394 | "node_modules/object-assign": { 1395 | "version": "4.1.1", 1396 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1397 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1398 | "dev": true, 1399 | "engines": { 1400 | "node": ">=0.10.0" 1401 | } 1402 | }, 1403 | "node_modules/object-hash": { 1404 | "version": "3.0.0", 1405 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1406 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1407 | "dev": true, 1408 | "engines": { 1409 | "node": ">= 6" 1410 | } 1411 | }, 1412 | "node_modules/openai": { 1413 | "version": "4.26.1", 1414 | "resolved": "https://registry.npmjs.org/openai/-/openai-4.26.1.tgz", 1415 | "integrity": "sha512-DvWbjhWbappsFRatOWmu4Dp1/Q4RG9oOz6CfOSjy0/Drb8G+5iAiqWAO4PfpGIkhOOKtvvNfQri2SItl+U7LhQ==", 1416 | "dependencies": { 1417 | "@types/node": "^18.11.18", 1418 | "@types/node-fetch": "^2.6.4", 1419 | "abort-controller": "^3.0.0", 1420 | "agentkeepalive": "^4.2.1", 1421 | "digest-fetch": "^1.3.0", 1422 | "form-data-encoder": "1.7.2", 1423 | "formdata-node": "^4.3.2", 1424 | "node-fetch": "^2.6.7", 1425 | "web-streams-polyfill": "^3.2.1" 1426 | }, 1427 | "bin": { 1428 | "openai": "bin/cli" 1429 | } 1430 | }, 1431 | "node_modules/openai/node_modules/@types/node": { 1432 | "version": "18.19.14", 1433 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.14.tgz", 1434 | "integrity": "sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg==", 1435 | "dependencies": { 1436 | "undici-types": "~5.26.4" 1437 | } 1438 | }, 1439 | "node_modules/optimist": { 1440 | "version": "0.3.7", 1441 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", 1442 | "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", 1443 | "dependencies": { 1444 | "wordwrap": "~0.0.2" 1445 | } 1446 | }, 1447 | "node_modules/path-key": { 1448 | "version": "3.1.1", 1449 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1450 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1451 | "dev": true, 1452 | "engines": { 1453 | "node": ">=8" 1454 | } 1455 | }, 1456 | "node_modules/path-parse": { 1457 | "version": "1.0.7", 1458 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1459 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1460 | "dev": true 1461 | }, 1462 | "node_modules/path-scurry": { 1463 | "version": "1.10.1", 1464 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", 1465 | "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", 1466 | "dev": true, 1467 | "dependencies": { 1468 | "lru-cache": "^9.1.1 || ^10.0.0", 1469 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 1470 | }, 1471 | "engines": { 1472 | "node": ">=16 || 14 >=14.17" 1473 | }, 1474 | "funding": { 1475 | "url": "https://github.com/sponsors/isaacs" 1476 | } 1477 | }, 1478 | "node_modules/picocolors": { 1479 | "version": "1.0.0", 1480 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1481 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1482 | }, 1483 | "node_modules/picomatch": { 1484 | "version": "2.3.1", 1485 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1486 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1487 | "dev": true, 1488 | "engines": { 1489 | "node": ">=8.6" 1490 | }, 1491 | "funding": { 1492 | "url": "https://github.com/sponsors/jonschlinkert" 1493 | } 1494 | }, 1495 | "node_modules/pify": { 1496 | "version": "2.3.0", 1497 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1498 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1499 | "dev": true, 1500 | "engines": { 1501 | "node": ">=0.10.0" 1502 | } 1503 | }, 1504 | "node_modules/pirates": { 1505 | "version": "4.0.6", 1506 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 1507 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 1508 | "dev": true, 1509 | "engines": { 1510 | "node": ">= 6" 1511 | } 1512 | }, 1513 | "node_modules/postcss": { 1514 | "version": "8.4.34", 1515 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.34.tgz", 1516 | "integrity": "sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==", 1517 | "dev": true, 1518 | "funding": [ 1519 | { 1520 | "type": "opencollective", 1521 | "url": "https://opencollective.com/postcss/" 1522 | }, 1523 | { 1524 | "type": "tidelift", 1525 | "url": "https://tidelift.com/funding/github/npm/postcss" 1526 | }, 1527 | { 1528 | "type": "github", 1529 | "url": "https://github.com/sponsors/ai" 1530 | } 1531 | ], 1532 | "dependencies": { 1533 | "nanoid": "^3.3.7", 1534 | "picocolors": "^1.0.0", 1535 | "source-map-js": "^1.0.2" 1536 | }, 1537 | "engines": { 1538 | "node": "^10 || ^12 || >=14" 1539 | } 1540 | }, 1541 | "node_modules/postcss-import": { 1542 | "version": "15.1.0", 1543 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 1544 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 1545 | "dev": true, 1546 | "dependencies": { 1547 | "postcss-value-parser": "^4.0.0", 1548 | "read-cache": "^1.0.0", 1549 | "resolve": "^1.1.7" 1550 | }, 1551 | "engines": { 1552 | "node": ">=14.0.0" 1553 | }, 1554 | "peerDependencies": { 1555 | "postcss": "^8.0.0" 1556 | } 1557 | }, 1558 | "node_modules/postcss-js": { 1559 | "version": "4.0.1", 1560 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 1561 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 1562 | "dev": true, 1563 | "dependencies": { 1564 | "camelcase-css": "^2.0.1" 1565 | }, 1566 | "engines": { 1567 | "node": "^12 || ^14 || >= 16" 1568 | }, 1569 | "funding": { 1570 | "type": "opencollective", 1571 | "url": "https://opencollective.com/postcss/" 1572 | }, 1573 | "peerDependencies": { 1574 | "postcss": "^8.4.21" 1575 | } 1576 | }, 1577 | "node_modules/postcss-load-config": { 1578 | "version": "4.0.2", 1579 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 1580 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 1581 | "dev": true, 1582 | "funding": [ 1583 | { 1584 | "type": "opencollective", 1585 | "url": "https://opencollective.com/postcss/" 1586 | }, 1587 | { 1588 | "type": "github", 1589 | "url": "https://github.com/sponsors/ai" 1590 | } 1591 | ], 1592 | "dependencies": { 1593 | "lilconfig": "^3.0.0", 1594 | "yaml": "^2.3.4" 1595 | }, 1596 | "engines": { 1597 | "node": ">= 14" 1598 | }, 1599 | "peerDependencies": { 1600 | "postcss": ">=8.0.9", 1601 | "ts-node": ">=9.0.0" 1602 | }, 1603 | "peerDependenciesMeta": { 1604 | "postcss": { 1605 | "optional": true 1606 | }, 1607 | "ts-node": { 1608 | "optional": true 1609 | } 1610 | } 1611 | }, 1612 | "node_modules/postcss-load-config/node_modules/lilconfig": { 1613 | "version": "3.0.0", 1614 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", 1615 | "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", 1616 | "dev": true, 1617 | "engines": { 1618 | "node": ">=14" 1619 | } 1620 | }, 1621 | "node_modules/postcss-nested": { 1622 | "version": "6.0.1", 1623 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", 1624 | "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", 1625 | "dev": true, 1626 | "dependencies": { 1627 | "postcss-selector-parser": "^6.0.11" 1628 | }, 1629 | "engines": { 1630 | "node": ">=12.0" 1631 | }, 1632 | "funding": { 1633 | "type": "opencollective", 1634 | "url": "https://opencollective.com/postcss/" 1635 | }, 1636 | "peerDependencies": { 1637 | "postcss": "^8.2.14" 1638 | } 1639 | }, 1640 | "node_modules/postcss-selector-parser": { 1641 | "version": "6.0.15", 1642 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", 1643 | "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", 1644 | "dev": true, 1645 | "dependencies": { 1646 | "cssesc": "^3.0.0", 1647 | "util-deprecate": "^1.0.2" 1648 | }, 1649 | "engines": { 1650 | "node": ">=4" 1651 | } 1652 | }, 1653 | "node_modules/postcss-value-parser": { 1654 | "version": "4.2.0", 1655 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1656 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1657 | "dev": true 1658 | }, 1659 | "node_modules/proxy-from-env": { 1660 | "version": "1.1.0", 1661 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1662 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1663 | }, 1664 | "node_modules/queue-microtask": { 1665 | "version": "1.2.3", 1666 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1667 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1668 | "dev": true, 1669 | "funding": [ 1670 | { 1671 | "type": "github", 1672 | "url": "https://github.com/sponsors/feross" 1673 | }, 1674 | { 1675 | "type": "patreon", 1676 | "url": "https://www.patreon.com/feross" 1677 | }, 1678 | { 1679 | "type": "consulting", 1680 | "url": "https://feross.org/support" 1681 | } 1682 | ] 1683 | }, 1684 | "node_modules/react": { 1685 | "version": "18.2.0", 1686 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1687 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1688 | "dependencies": { 1689 | "loose-envify": "^1.1.0" 1690 | }, 1691 | "engines": { 1692 | "node": ">=0.10.0" 1693 | } 1694 | }, 1695 | "node_modules/react-dom": { 1696 | "version": "18.2.0", 1697 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1698 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1699 | "dependencies": { 1700 | "loose-envify": "^1.1.0", 1701 | "scheduler": "^0.23.0" 1702 | }, 1703 | "peerDependencies": { 1704 | "react": "^18.2.0" 1705 | } 1706 | }, 1707 | "node_modules/read-cache": { 1708 | "version": "1.0.0", 1709 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1710 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1711 | "dev": true, 1712 | "dependencies": { 1713 | "pify": "^2.3.0" 1714 | } 1715 | }, 1716 | "node_modules/readdirp": { 1717 | "version": "3.6.0", 1718 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1719 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1720 | "dev": true, 1721 | "dependencies": { 1722 | "picomatch": "^2.2.1" 1723 | }, 1724 | "engines": { 1725 | "node": ">=8.10.0" 1726 | } 1727 | }, 1728 | "node_modules/resolve": { 1729 | "version": "1.22.8", 1730 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 1731 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 1732 | "dev": true, 1733 | "dependencies": { 1734 | "is-core-module": "^2.13.0", 1735 | "path-parse": "^1.0.7", 1736 | "supports-preserve-symlinks-flag": "^1.0.0" 1737 | }, 1738 | "bin": { 1739 | "resolve": "bin/resolve" 1740 | }, 1741 | "funding": { 1742 | "url": "https://github.com/sponsors/ljharb" 1743 | } 1744 | }, 1745 | "node_modules/reusify": { 1746 | "version": "1.0.4", 1747 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1748 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1749 | "dev": true, 1750 | "engines": { 1751 | "iojs": ">=1.0.0", 1752 | "node": ">=0.10.0" 1753 | } 1754 | }, 1755 | "node_modules/run-parallel": { 1756 | "version": "1.2.0", 1757 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1758 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1759 | "dev": true, 1760 | "funding": [ 1761 | { 1762 | "type": "github", 1763 | "url": "https://github.com/sponsors/feross" 1764 | }, 1765 | { 1766 | "type": "patreon", 1767 | "url": "https://www.patreon.com/feross" 1768 | }, 1769 | { 1770 | "type": "consulting", 1771 | "url": "https://feross.org/support" 1772 | } 1773 | ], 1774 | "dependencies": { 1775 | "queue-microtask": "^1.2.2" 1776 | } 1777 | }, 1778 | "node_modules/scheduler": { 1779 | "version": "0.23.0", 1780 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1781 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1782 | "dependencies": { 1783 | "loose-envify": "^1.1.0" 1784 | } 1785 | }, 1786 | "node_modules/shebang-command": { 1787 | "version": "2.0.0", 1788 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1789 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1790 | "dev": true, 1791 | "dependencies": { 1792 | "shebang-regex": "^3.0.0" 1793 | }, 1794 | "engines": { 1795 | "node": ">=8" 1796 | } 1797 | }, 1798 | "node_modules/shebang-regex": { 1799 | "version": "3.0.0", 1800 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1801 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1802 | "dev": true, 1803 | "engines": { 1804 | "node": ">=8" 1805 | } 1806 | }, 1807 | "node_modules/signal-exit": { 1808 | "version": "4.1.0", 1809 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1810 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1811 | "dev": true, 1812 | "engines": { 1813 | "node": ">=14" 1814 | }, 1815 | "funding": { 1816 | "url": "https://github.com/sponsors/isaacs" 1817 | } 1818 | }, 1819 | "node_modules/source-map-js": { 1820 | "version": "1.0.2", 1821 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1822 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1823 | "engines": { 1824 | "node": ">=0.10.0" 1825 | } 1826 | }, 1827 | "node_modules/streamsearch": { 1828 | "version": "1.1.0", 1829 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", 1830 | "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", 1831 | "engines": { 1832 | "node": ">=10.0.0" 1833 | } 1834 | }, 1835 | "node_modules/string-width": { 1836 | "version": "5.1.2", 1837 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1838 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1839 | "dev": true, 1840 | "dependencies": { 1841 | "eastasianwidth": "^0.2.0", 1842 | "emoji-regex": "^9.2.2", 1843 | "strip-ansi": "^7.0.1" 1844 | }, 1845 | "engines": { 1846 | "node": ">=12" 1847 | }, 1848 | "funding": { 1849 | "url": "https://github.com/sponsors/sindresorhus" 1850 | } 1851 | }, 1852 | "node_modules/string-width-cjs": { 1853 | "name": "string-width", 1854 | "version": "4.2.3", 1855 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1856 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1857 | "dev": true, 1858 | "dependencies": { 1859 | "emoji-regex": "^8.0.0", 1860 | "is-fullwidth-code-point": "^3.0.0", 1861 | "strip-ansi": "^6.0.1" 1862 | }, 1863 | "engines": { 1864 | "node": ">=8" 1865 | } 1866 | }, 1867 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 1868 | "version": "5.0.1", 1869 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1870 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1871 | "dev": true, 1872 | "engines": { 1873 | "node": ">=8" 1874 | } 1875 | }, 1876 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 1877 | "version": "8.0.0", 1878 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1879 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 1880 | "dev": true 1881 | }, 1882 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 1883 | "version": "6.0.1", 1884 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1885 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1886 | "dev": true, 1887 | "dependencies": { 1888 | "ansi-regex": "^5.0.1" 1889 | }, 1890 | "engines": { 1891 | "node": ">=8" 1892 | } 1893 | }, 1894 | "node_modules/strip-ansi": { 1895 | "version": "7.1.0", 1896 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1897 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1898 | "dev": true, 1899 | "dependencies": { 1900 | "ansi-regex": "^6.0.1" 1901 | }, 1902 | "engines": { 1903 | "node": ">=12" 1904 | }, 1905 | "funding": { 1906 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1907 | } 1908 | }, 1909 | "node_modules/strip-ansi-cjs": { 1910 | "name": "strip-ansi", 1911 | "version": "6.0.1", 1912 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1913 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1914 | "dev": true, 1915 | "dependencies": { 1916 | "ansi-regex": "^5.0.1" 1917 | }, 1918 | "engines": { 1919 | "node": ">=8" 1920 | } 1921 | }, 1922 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 1923 | "version": "5.0.1", 1924 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1925 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1926 | "dev": true, 1927 | "engines": { 1928 | "node": ">=8" 1929 | } 1930 | }, 1931 | "node_modules/styled-jsx": { 1932 | "version": "5.1.1", 1933 | "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", 1934 | "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", 1935 | "dependencies": { 1936 | "client-only": "0.0.1" 1937 | }, 1938 | "engines": { 1939 | "node": ">= 12.0.0" 1940 | }, 1941 | "peerDependencies": { 1942 | "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" 1943 | }, 1944 | "peerDependenciesMeta": { 1945 | "@babel/core": { 1946 | "optional": true 1947 | }, 1948 | "babel-plugin-macros": { 1949 | "optional": true 1950 | } 1951 | } 1952 | }, 1953 | "node_modules/sucrase": { 1954 | "version": "3.35.0", 1955 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 1956 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 1957 | "dev": true, 1958 | "dependencies": { 1959 | "@jridgewell/gen-mapping": "^0.3.2", 1960 | "commander": "^4.0.0", 1961 | "glob": "^10.3.10", 1962 | "lines-and-columns": "^1.1.6", 1963 | "mz": "^2.7.0", 1964 | "pirates": "^4.0.1", 1965 | "ts-interface-checker": "^0.1.9" 1966 | }, 1967 | "bin": { 1968 | "sucrase": "bin/sucrase", 1969 | "sucrase-node": "bin/sucrase-node" 1970 | }, 1971 | "engines": { 1972 | "node": ">=16 || 14 >=14.17" 1973 | } 1974 | }, 1975 | "node_modules/supports-preserve-symlinks-flag": { 1976 | "version": "1.0.0", 1977 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1978 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1979 | "dev": true, 1980 | "engines": { 1981 | "node": ">= 0.4" 1982 | }, 1983 | "funding": { 1984 | "url": "https://github.com/sponsors/ljharb" 1985 | } 1986 | }, 1987 | "node_modules/tailwindcss": { 1988 | "version": "3.4.1", 1989 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", 1990 | "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", 1991 | "dev": true, 1992 | "dependencies": { 1993 | "@alloc/quick-lru": "^5.2.0", 1994 | "arg": "^5.0.2", 1995 | "chokidar": "^3.5.3", 1996 | "didyoumean": "^1.2.2", 1997 | "dlv": "^1.1.3", 1998 | "fast-glob": "^3.3.0", 1999 | "glob-parent": "^6.0.2", 2000 | "is-glob": "^4.0.3", 2001 | "jiti": "^1.19.1", 2002 | "lilconfig": "^2.1.0", 2003 | "micromatch": "^4.0.5", 2004 | "normalize-path": "^3.0.0", 2005 | "object-hash": "^3.0.0", 2006 | "picocolors": "^1.0.0", 2007 | "postcss": "^8.4.23", 2008 | "postcss-import": "^15.1.0", 2009 | "postcss-js": "^4.0.1", 2010 | "postcss-load-config": "^4.0.1", 2011 | "postcss-nested": "^6.0.1", 2012 | "postcss-selector-parser": "^6.0.11", 2013 | "resolve": "^1.22.2", 2014 | "sucrase": "^3.32.0" 2015 | }, 2016 | "bin": { 2017 | "tailwind": "lib/cli.js", 2018 | "tailwindcss": "lib/cli.js" 2019 | }, 2020 | "engines": { 2021 | "node": ">=14.0.0" 2022 | } 2023 | }, 2024 | "node_modules/thenify": { 2025 | "version": "3.3.1", 2026 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 2027 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2028 | "dev": true, 2029 | "dependencies": { 2030 | "any-promise": "^1.0.0" 2031 | } 2032 | }, 2033 | "node_modules/thenify-all": { 2034 | "version": "1.6.0", 2035 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2036 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 2037 | "dev": true, 2038 | "dependencies": { 2039 | "thenify": ">= 3.1.0 < 4" 2040 | }, 2041 | "engines": { 2042 | "node": ">=0.8" 2043 | } 2044 | }, 2045 | "node_modules/to-regex-range": { 2046 | "version": "5.0.1", 2047 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2048 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2049 | "dev": true, 2050 | "dependencies": { 2051 | "is-number": "^7.0.0" 2052 | }, 2053 | "engines": { 2054 | "node": ">=8.0" 2055 | } 2056 | }, 2057 | "node_modules/tr46": { 2058 | "version": "0.0.3", 2059 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2060 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2061 | }, 2062 | "node_modules/ts-interface-checker": { 2063 | "version": "0.1.13", 2064 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 2065 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 2066 | "dev": true 2067 | }, 2068 | "node_modules/tslib": { 2069 | "version": "2.6.2", 2070 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 2071 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 2072 | }, 2073 | "node_modules/typescript": { 2074 | "version": "5.3.3", 2075 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", 2076 | "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", 2077 | "dev": true, 2078 | "bin": { 2079 | "tsc": "bin/tsc", 2080 | "tsserver": "bin/tsserver" 2081 | }, 2082 | "engines": { 2083 | "node": ">=14.17" 2084 | } 2085 | }, 2086 | "node_modules/undici-types": { 2087 | "version": "5.26.5", 2088 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2089 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 2090 | }, 2091 | "node_modules/update-browserslist-db": { 2092 | "version": "1.0.13", 2093 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", 2094 | "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", 2095 | "dev": true, 2096 | "funding": [ 2097 | { 2098 | "type": "opencollective", 2099 | "url": "https://opencollective.com/browserslist" 2100 | }, 2101 | { 2102 | "type": "tidelift", 2103 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2104 | }, 2105 | { 2106 | "type": "github", 2107 | "url": "https://github.com/sponsors/ai" 2108 | } 2109 | ], 2110 | "dependencies": { 2111 | "escalade": "^3.1.1", 2112 | "picocolors": "^1.0.0" 2113 | }, 2114 | "bin": { 2115 | "update-browserslist-db": "cli.js" 2116 | }, 2117 | "peerDependencies": { 2118 | "browserslist": ">= 4.21.0" 2119 | } 2120 | }, 2121 | "node_modules/util-deprecate": { 2122 | "version": "1.0.2", 2123 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2124 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2125 | "dev": true 2126 | }, 2127 | "node_modules/web-streams-polyfill": { 2128 | "version": "3.3.2", 2129 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz", 2130 | "integrity": "sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==", 2131 | "engines": { 2132 | "node": ">= 8" 2133 | } 2134 | }, 2135 | "node_modules/webidl-conversions": { 2136 | "version": "3.0.1", 2137 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2138 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2139 | }, 2140 | "node_modules/whatwg-url": { 2141 | "version": "5.0.0", 2142 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2143 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2144 | "dependencies": { 2145 | "tr46": "~0.0.3", 2146 | "webidl-conversions": "^3.0.0" 2147 | } 2148 | }, 2149 | "node_modules/which": { 2150 | "version": "2.0.2", 2151 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2152 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2153 | "dev": true, 2154 | "dependencies": { 2155 | "isexe": "^2.0.0" 2156 | }, 2157 | "bin": { 2158 | "node-which": "bin/node-which" 2159 | }, 2160 | "engines": { 2161 | "node": ">= 8" 2162 | } 2163 | }, 2164 | "node_modules/whisper": { 2165 | "version": "0.2.5", 2166 | "resolved": "https://registry.npmjs.org/whisper/-/whisper-0.2.5.tgz", 2167 | "integrity": "sha512-syuNPaEvjBltZLQnAXmZMDKaigiCV8Vjq/UjOwWRe3sWJo1QHQptrjppAHnx+dmBdPYCF/y++Xy8qKC2MMhAtA==", 2168 | "dependencies": { 2169 | "boo": "~1.2.4", 2170 | "cassie": "~1.4.1", 2171 | "flaw": "~0.1.0", 2172 | "optimist": "~0.3.5" 2173 | }, 2174 | "bin": { 2175 | "whisper": "bin/whisper" 2176 | } 2177 | }, 2178 | "node_modules/wordwrap": { 2179 | "version": "0.0.3", 2180 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2181 | "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", 2182 | "engines": { 2183 | "node": ">=0.4.0" 2184 | } 2185 | }, 2186 | "node_modules/wrap-ansi": { 2187 | "version": "8.1.0", 2188 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 2189 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 2190 | "dev": true, 2191 | "dependencies": { 2192 | "ansi-styles": "^6.1.0", 2193 | "string-width": "^5.0.1", 2194 | "strip-ansi": "^7.0.1" 2195 | }, 2196 | "engines": { 2197 | "node": ">=12" 2198 | }, 2199 | "funding": { 2200 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2201 | } 2202 | }, 2203 | "node_modules/wrap-ansi-cjs": { 2204 | "name": "wrap-ansi", 2205 | "version": "7.0.0", 2206 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2207 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2208 | "dev": true, 2209 | "dependencies": { 2210 | "ansi-styles": "^4.0.0", 2211 | "string-width": "^4.1.0", 2212 | "strip-ansi": "^6.0.0" 2213 | }, 2214 | "engines": { 2215 | "node": ">=10" 2216 | }, 2217 | "funding": { 2218 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2219 | } 2220 | }, 2221 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 2222 | "version": "5.0.1", 2223 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2224 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2225 | "dev": true, 2226 | "engines": { 2227 | "node": ">=8" 2228 | } 2229 | }, 2230 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 2231 | "version": "4.3.0", 2232 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2233 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2234 | "dev": true, 2235 | "dependencies": { 2236 | "color-convert": "^2.0.1" 2237 | }, 2238 | "engines": { 2239 | "node": ">=8" 2240 | }, 2241 | "funding": { 2242 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2243 | } 2244 | }, 2245 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 2246 | "version": "8.0.0", 2247 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2248 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2249 | "dev": true 2250 | }, 2251 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 2252 | "version": "4.2.3", 2253 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2254 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2255 | "dev": true, 2256 | "dependencies": { 2257 | "emoji-regex": "^8.0.0", 2258 | "is-fullwidth-code-point": "^3.0.0", 2259 | "strip-ansi": "^6.0.1" 2260 | }, 2261 | "engines": { 2262 | "node": ">=8" 2263 | } 2264 | }, 2265 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 2266 | "version": "6.0.1", 2267 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2268 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2269 | "dev": true, 2270 | "dependencies": { 2271 | "ansi-regex": "^5.0.1" 2272 | }, 2273 | "engines": { 2274 | "node": ">=8" 2275 | } 2276 | }, 2277 | "node_modules/yaml": { 2278 | "version": "2.3.4", 2279 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", 2280 | "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", 2281 | "dev": true, 2282 | "engines": { 2283 | "node": ">= 14" 2284 | } 2285 | } 2286 | } 2287 | } 2288 | --------------------------------------------------------------------------------