diff --git a/apps/Cortensor-AIOracle/.env.example b/apps/Cortensor-AIOracle/.env.example index 600f499..2d16dcf 100644 --- a/apps/Cortensor-AIOracle/.env.example +++ b/apps/Cortensor-AIOracle/.env.example @@ -1,62 +1,105 @@ -# Cortensor Network Configuration +# ============================================================================= +# AI ORACLE - Environment Configuration +# ============================================================================= + +# ----------------------------------------------------------------------------- +# Cortensor Network (REQUIRED) +# ----------------------------------------------------------------------------- +# Cortensor Router API - Main AI network endpoint +CORTENSOR_ROUTER_URL=http://your-cortensor-host:5010 CORTENSOR_API_KEY=your_cortensor_api_key_here -CORTENSOR_ROUTER_URL=https://router.cortensor.com - -# External APIs for Real-time Data (Optional) -# Get API keys from respective services to enable real-time data - -# News API - for latest news and sports updates -# Sign up at: https://newsapi.org/ -NEWS_API_KEY=your_news_api_key_here - -# Alpha Vantage - for stock market data -# Sign up at: https://www.alphavantage.co/support/#api-key -ALPHA_VANTAGE_API_KEY=your_alpha_vantage_key_here - -# CoinGecko - for enhanced crypto data (optional, has free tier) -# Sign up at: https://www.coingecko.com/en/api/pricing -COINGECKO_API_KEY=your_coingecko_api_key_here - -# FastForex - for premium exchange rates -# Sign up at: https://www.fastforex.io/ -FASTFOREX_API_KEY=your_fastforex_api_key_here - -# OpenWeatherMap - for weather data -# Sign up at: https://openweathermap.org/api -WEATHER_API_KEY=your_weather_api_key_here - -# Search API Keys (Optional - for better realtime data) -SERPER_API_KEY=your_serper_api_key_here - -# Free news/search providers (optional) -# Guardian Open Platform: https://open-platform.theguardian.com/ -GUARDIAN_API_KEY=your_guardian_api_key_here -# Currents API: https://currentsapi.services/en -CURRENTS_API_KEY=your_currents_api_key_here -# GNews API: https://gnews.io/ -GNEWS_API_KEY=your_gnews_api_key_here -# Google Fact Check Tools API: https://toolbox.google.com/factcheck/apis -GOOGLE_FACTCHECK_API_KEY=your_google_factcheck_api_key_here - -# Web/Search Controls -# Disable all external web/news/fact-check lookups -WEB_SEARCH_ENABLED=true -# Disable HTML scraping (HEAD/meta fetch) -WEB_SCRAPE_ENABLED=true -# Prefer free providers only (RSS + metadata); set to false to enable paid APIs where configured -FREE_SOURCES_ONLY=true -# Validate and normalize external links -VALIDATE_SOURCE_LINKS=true -# Google News RSS locale -NEWS_RSS_HL=en-US -NEWS_RSS_GL=US -NEWS_RSS_CEID=US:en - -# Note: External APIs are optional. The system will work without them, -# but having them enables more accurate real-time data for: -# - Latest news and sports results -# - Current crypto and stock prices (with enhanced data from CoinGecko API key) -# - Weather information -# - Premium exchange rates (FastForex) with fallback to free API -# - Formula 1 results (free API, no key needed) -# - Enhanced rate limits and more detailed crypto information with CoinGecko API key +NEXT_PUBLIC_CORTENSOR_COMPLETIONS_URL=http://your-cortensor-host:5010/api/v1/completions + +# WebSocket endpoint for real-time updates +NEXT_PUBLIC_CORTENSOR_WS_URL=ws://your-cortensor-host:9004 + +# Default session ID (Deepseek R1 Distill Llama 8B Q4) +NEXT_PUBLIC_DEEPSEEK_SESSION_ID=5 + +# ----------------------------------------------------------------------------- +# Tavily AI Search (REQUIRED for Sources) +# ----------------------------------------------------------------------------- +# Primary source for fact-checking and real-time data +# Sign up at: https://tavily.com +# Free tier: 1,000 API calls/month +TAVILY_API_KEY=tvly-your_tavily_api_key_here + +# ----------------------------------------------------------------------------- +# UI Customization +# ----------------------------------------------------------------------------- +NEXT_PUBLIC_APP_NAME=AI Oracle +NEXT_PUBLIC_APP_VERSION=Truth Machine v1.0 + +# ----------------------------------------------------------------------------- +# Oracle Configuration +# ----------------------------------------------------------------------------- +ORACLE_MIN_CONSENSUS=3 +ORACLE_CONFIDENCE_THRESHOLD=0.8 +ORACLE_DEBUG_LOGS=1 +NEXT_PUBLIC_USE_WS=true + +# LLM Parameters +NEXT_PUBLIC_MAX_INPUT_LENGTH=2000 +LLM_MAX_TOKENS=4096 +LLM_TIMEOUT=300 +MODEL_NAME=Deepseek R1 +PROMPT_TYPE=1 +PRECOMMIT_TIMEOUT=90 + +# ----------------------------------------------------------------------------- +# Multi-Session Model Configuration (Optional) +# ----------------------------------------------------------------------------- +# LLaVA 1.5 7B Q4 +SESSION_LLAVA_15_7B_Q4=3 +WS_LLAVA_15_7B_Q4=ws://your-cortensor-host:9002 + +# LLaMA 3.1 8B Q4 +SESSION_LLAMA_31_8B_Q4=4 +WS_LLAMA_31_8B_Q4=ws://your-cortensor-host:9003 + +# DeepSeek R1 Distill Llama 8B Q4 (Default) +SESSION_DEEPSEEK_R1_8B_Q4=5 +WS_DEEPSEEK_R1_8B_Q4=ws://your-cortensor-host:9004 + +# LLaMA 3.1 8B Q4 CPU +SESSION_LLAMA_31_8B_Q4_CPU=5 +WS_LLAMA_31_8B_Q4_CPU=ws://your-cortensor-host:9004 + +# ----------------------------------------------------------------------------- +# Blockchain/Web3 (Optional) +# ----------------------------------------------------------------------------- +NEXT_PUBLIC_SESSION_V2_ADDRESS=your_session_v2_contract_address +NEXT_PUBLIC_SESSION_QUEUE_V2_ADDRESS=your_session_queue_v2_contract_address + +# ----------------------------------------------------------------------------- +# Legacy External APIs (NOT USED - Replaced by Tavily) +# ----------------------------------------------------------------------------- +# These are kept for backward compatibility but no longer used +# The system now uses Tavily AI Search for all external data sources + +# NEWS_API_KEY=not_used +# WEATHER_API_KEY=not_used +# ALPHA_VANTAGE_API_KEY=not_used +# GUARDIAN_API_KEY=not_used +# CURRENTS_API_KEY=not_used +# GOOGLE_FACTCHECK_API_KEY=not_used +# COINGECKO_API_KEY=not_used +# FASTFOREX_API_KEY=not_used + +# ----------------------------------------------------------------------------- +# Notes +# ----------------------------------------------------------------------------- +# REQUIRED APIs: +# 1. CORTENSOR_API_KEY - Get from Cortensor Network +# 2. TAVILY_API_KEY - Get from https://tavily.com (Free: 1,000 calls/month) +# +# All other APIs are optional or deprecated. +# The system will work with just Cortensor + Tavily. +# +# Tavily provides: +# - Real-time web search +# - Fact-checking sources +# - High-credibility news +# - Automatic source ranking +# - All in one API call +# ============================================================================= diff --git a/apps/Cortensor-AIOracle/.gitignore b/apps/Cortensor-AIOracle/.gitignore index b8425da..1b1b560 100644 --- a/apps/Cortensor-AIOracle/.gitignore +++ b/apps/Cortensor-AIOracle/.gitignore @@ -26,6 +26,18 @@ pnpm-debug.log* .env.* !.env.example +# Local data and caches +data/ +*.sqlite* +*.db +tmp/ + +# Editors/IDE +.vscode/ +.idea/ +.history +.fleet/ + # OS .DS_Store Thumbs.db diff --git a/apps/Cortensor-AIOracle/RELEASE.md b/apps/Cortensor-AIOracle/RELEASE.md deleted file mode 100644 index fc6e9c1..0000000 --- a/apps/Cortensor-AIOracle/RELEASE.md +++ /dev/null @@ -1,12 +0,0 @@ -# Release History - -## v1.0.0 (Initial Release) - 2025-08-23 - -### Added - -* Initial project setup with Next.js and TypeScript. -* Core oracle engine with support for multiple language models. -* Integration with web search for real-time information retrieval. -* User interface for model selection and query input. -* Visualization of the consensus process. -* Basic configuration through environment variables. diff --git a/apps/Cortensor-AIOracle/STATUS.md b/apps/Cortensor-AIOracle/STATUS.md deleted file mode 100644 index c712609..0000000 --- a/apps/Cortensor-AIOracle/STATUS.md +++ /dev/null @@ -1,24 +0,0 @@ -# Project Status - -This document outlines the current status and development priorities for **Cortensor AIOracle** - -## Roadmap - -### Short-Term - -* Improve the consensus algorithm for more accurate results. -* Add a wider variety of language models to the selection. -* Enhance the user interface and user experience. -* Implement a more robust error handling system. - -### Long-Term - -* Develop a public API for programmatic access to the oracle. -* Integrate with a broader range of data sources, including academic papers and real-time news feeds. -* Explore decentralized oracle solutions to further enhance the reliability and trustworthiness of the system. - -## Known Issues - -* The UI may not be fully responsive on all devices. -* The consensus visualization can be slow to render for complex queries. -* Some models may occasionally fail to generate a response, which can affect the consensus result. diff --git a/apps/Cortensor-AIOracle/next-env.d.ts b/apps/Cortensor-AIOracle/next-env.d.ts index 1b3be08..c4b7818 100644 --- a/apps/Cortensor-AIOracle/next-env.d.ts +++ b/apps/Cortensor-AIOracle/next-env.d.ts @@ -1,5 +1,6 @@ /// /// +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/Cortensor-AIOracle/package.json b/apps/Cortensor-AIOracle/package.json index c9d3249..b850c69 100644 --- a/apps/Cortensor-AIOracle/package.json +++ b/apps/Cortensor-AIOracle/package.json @@ -49,7 +49,7 @@ "highlight.js": "^11.11.1", "input-otp": "1.4.1", "lucide-react": "^0.454.0", - "next": "15.2.4", + "next": "16.0.7", "next-themes": "^0.4.4", "react": "^19", "react-dom": "^19", diff --git a/apps/Cortensor-AIOracle/pnpm-lock.yaml b/apps/Cortensor-AIOracle/pnpm-lock.yaml index b8ce31f..9dcd8e5 100644 --- a/apps/Cortensor-AIOracle/pnpm-lock.yaml +++ b/apps/Cortensor-AIOracle/pnpm-lock.yaml @@ -126,8 +126,8 @@ importers: specifier: ^0.454.0 version: 0.454.0(react@19.1.1) next: - specifier: 15.2.4 - version: 15.2.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 16.0.7 + version: 16.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: specifier: ^0.4.4 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -200,8 +200,8 @@ packages: resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -223,107 +223,139 @@ packages: peerDependencies: react-hook-form: ^7.0.0 - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -345,53 +377,53 @@ packages: '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - '@next/env@15.2.4': - resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==} + '@next/env@16.0.7': + resolution: {integrity: sha512-gpaNgUh5nftFKRkRQGnVi5dpcYSKGcZZkQffZ172OrG/XkrnS7UBTQ648YY+8ME92cC4IojpI2LqTC8sTDhAaw==} - '@next/swc-darwin-arm64@15.2.4': - resolution: {integrity: sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==} + '@next/swc-darwin-arm64@16.0.7': + resolution: {integrity: sha512-LlDtCYOEj/rfSnEn/Idi+j1QKHxY9BJFmxx7108A6D8K0SB+bNgfYQATPk/4LqOl4C0Wo3LACg2ie6s7xqMpJg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.2.4': - resolution: {integrity: sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==} + '@next/swc-darwin-x64@16.0.7': + resolution: {integrity: sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.2.4': - resolution: {integrity: sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==} + '@next/swc-linux-arm64-gnu@16.0.7': + resolution: {integrity: sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.2.4': - resolution: {integrity: sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==} + '@next/swc-linux-arm64-musl@16.0.7': + resolution: {integrity: sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.2.4': - resolution: {integrity: sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==} + '@next/swc-linux-x64-gnu@16.0.7': + resolution: {integrity: sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.2.4': - resolution: {integrity: sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==} + '@next/swc-linux-x64-musl@16.0.7': + resolution: {integrity: sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.2.4': - resolution: {integrity: sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==} + '@next/swc-win32-arm64-msvc@16.0.7': + resolution: {integrity: sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.2.4': - resolution: {integrity: sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==} + '@next/swc-win32-x64-msvc@16.0.7': + resolution: {integrity: sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -1250,9 +1282,6 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -1385,10 +1414,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -1396,6 +1421,9 @@ packages: caniuse-lite@1.0.30001734: resolution: {integrity: sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A==} + caniuse-lite@1.0.30001759: + resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1438,13 +1466,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1530,8 +1551,8 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-node-es@1.1.0: @@ -1693,9 +1714,6 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1951,13 +1969,13 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.2.4: - resolution: {integrity: sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.0.7: + resolution: {integrity: sha512-3mBRJyPxT4LOxAJI6IsXeFtKfiJUbjCLgvXO02fV8Wy/lIhPvP94Fe7dGhUgHXcQy4sSuYwQNcOLhIfOm0rL0A==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 + '@playwright/test': ^1.51.1 babel-plugin-react-compiler: '*' react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -2203,13 +2221,13 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -2224,9 +2242,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sonner@1.7.4: resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: @@ -2240,10 +2255,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -2438,7 +2449,7 @@ snapshots: '@babel/runtime@7.28.2': {} - '@emnapi/runtime@1.4.5': + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 optional: true @@ -2464,79 +2475,101 @@ snapshots: dependencies: react-hook-form: 7.62.0(react@19.1.1) - '@img/sharp-darwin-arm64@0.33.5': + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-arm@0.33.5': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.33.5': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linux-x64@0.33.5': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + '@img/sharp-linuxmusl-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true - '@img/sharp-wasm32@0.33.5': + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.7.1 optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-x64@0.33.5': + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': optional: true '@isaacs/cliui@8.0.2': @@ -2562,30 +2595,30 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@next/env@15.2.4': {} + '@next/env@16.0.7': {} - '@next/swc-darwin-arm64@15.2.4': + '@next/swc-darwin-arm64@16.0.7': optional: true - '@next/swc-darwin-x64@15.2.4': + '@next/swc-darwin-x64@16.0.7': optional: true - '@next/swc-linux-arm64-gnu@15.2.4': + '@next/swc-linux-arm64-gnu@16.0.7': optional: true - '@next/swc-linux-arm64-musl@15.2.4': + '@next/swc-linux-arm64-musl@16.0.7': optional: true - '@next/swc-linux-x64-gnu@15.2.4': + '@next/swc-linux-x64-gnu@16.0.7': optional: true - '@next/swc-linux-x64-musl@15.2.4': + '@next/swc-linux-x64-musl@16.0.7': optional: true - '@next/swc-win32-arm64-msvc@15.2.4': + '@next/swc-win32-arm64-msvc@16.0.7': optional: true - '@next/swc-win32-x64-msvc@15.2.4': + '@next/swc-win32-x64-msvc@16.0.7': optional: true '@nodelib/fs.scandir@2.1.5': @@ -3455,8 +3488,6 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -3585,14 +3616,12 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - camelcase-css@2.0.1: {} caniuse-lite@1.0.30001734: {} + caniuse-lite@1.0.30001759: {} + ccount@2.0.1: {} character-entities-html4@2.1.0: {} @@ -3641,18 +3670,6 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - comma-separated-tokens@2.0.3: {} commander@4.1.1: {} @@ -3719,7 +3736,7 @@ snapshots: dequal@2.0.3: {} - detect-libc@2.0.4: + detect-libc@2.1.2: optional: true detect-node-es@1.1.0: {} @@ -3884,9 +3901,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arrayish@0.3.2: - optional: true - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -4333,27 +4347,25 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next@15.2.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@16.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.2.4 - '@swc/counter': 0.1.3 + '@next/env': 16.0.7 '@swc/helpers': 0.5.15 - busboy: 1.6.0 - caniuse-lite: 1.0.30001734 + caniuse-lite: 1.0.30001759 postcss: 8.4.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) styled-jsx: 5.1.6(react@19.1.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.2.4 - '@next/swc-darwin-x64': 15.2.4 - '@next/swc-linux-arm64-gnu': 15.2.4 - '@next/swc-linux-arm64-musl': 15.2.4 - '@next/swc-linux-x64-gnu': 15.2.4 - '@next/swc-linux-x64-musl': 15.2.4 - '@next/swc-win32-arm64-msvc': 15.2.4 - '@next/swc-win32-x64-msvc': 15.2.4 - sharp: 0.33.5 + '@next/swc-darwin-arm64': 16.0.7 + '@next/swc-darwin-x64': 16.0.7 + '@next/swc-linux-arm64-gnu': 16.0.7 + '@next/swc-linux-arm64-musl': 16.0.7 + '@next/swc-linux-x64-gnu': 16.0.7 + '@next/swc-linux-x64-musl': 16.0.7 + '@next/swc-win32-arm64-msvc': 16.0.7 + '@next/swc-win32-x64-msvc': 16.0.7 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -4618,34 +4630,39 @@ snapshots: scheduler@0.26.0: {} - semver@7.7.2: + semver@7.7.3: optional: true - sharp@0.33.5: + sharp@0.34.5: dependencies: - color: 4.2.3 - detect-libc: 2.0.4 - semver: 7.7.2 + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 optional: true shebang-command@2.0.0: @@ -4656,11 +4673,6 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - optional: true - sonner@1.7.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 @@ -4670,8 +4682,6 @@ snapshots: space-separated-tokens@2.0.2: {} - streamsearch@1.1.0: {} - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 diff --git a/apps/Cortensor-AIOracle/solrc b/apps/Cortensor-AIOracle/solrc new file mode 100644 index 0000000..0b571c3 Binary files /dev/null and b/apps/Cortensor-AIOracle/solrc differ diff --git a/apps/Cortensor-AIOracle/src/app/api/oracle-facts/route.ts b/apps/Cortensor-AIOracle/src/app/api/oracle-facts/route.ts new file mode 100644 index 0000000..05b42f1 --- /dev/null +++ b/apps/Cortensor-AIOracle/src/app/api/oracle-facts/route.ts @@ -0,0 +1,53 @@ +import { NextRequest, NextResponse } from 'next/server' +import { addOracleFact, getOracleFacts } from '@/lib/oracle-facts' + +export const revalidate = 0 +export const dynamic = 'force-dynamic' + +export async function GET(request: NextRequest) { + try { + const { searchParams } = new URL(request.url) + const limitParam = searchParams.get('limit') + const limit = limitParam ? Math.max(1, Math.min(100, Number(limitParam))) : 20 + const facts = await getOracleFacts(limit) + return NextResponse.json({ data: facts }) + } catch (err) { + console.error('GET /api/oracle-facts failed', err) + return NextResponse.json({ error: 'Failed to load oracle facts' }, { status: 500 }) + } +} + +export async function POST(request: NextRequest) { + try { + const body = await request.json() + const { query, answer, verdict, confidence, sources, modelName, queryId } = body || {} + + if (!query || typeof query !== 'string') { + return NextResponse.json({ error: 'query is required' }, { status: 400 }) + } + if (!answer || typeof answer !== 'string') { + return NextResponse.json({ error: 'answer is required' }, { status: 400 }) + } + if (!verdict || (verdict !== 'Yes' && verdict !== 'No')) { + return NextResponse.json({ error: 'verdict must be Yes or No' }, { status: 400 }) + } + if (answer.toLowerCase().startsWith('error:')) { + return NextResponse.json({ error: 'error answers are not stored' }, { status: 400 }) + } + + const record = await addOracleFact({ + query, + answer, + verdict, + confidence: typeof confidence === 'number' ? confidence : undefined, + sources: Array.isArray(sources) ? sources : undefined, + modelName: typeof modelName === 'string' ? modelName : undefined, + queryId: typeof queryId === 'string' ? queryId : undefined, + }) + + return NextResponse.json({ data: record }, { status: 201 }) + } catch (err) { + console.error('POST /api/oracle-facts failed', err) + return NextResponse.json({ error: 'Failed to save oracle fact' }, { status: 500 }) + } +} diff --git a/apps/Cortensor-AIOracle/src/app/api/oracle/route.ts b/apps/Cortensor-AIOracle/src/app/api/oracle/route.ts index 71631fe..a6cba92 100644 --- a/apps/Cortensor-AIOracle/src/app/api/oracle/route.ts +++ b/apps/Cortensor-AIOracle/src/app/api/oracle/route.ts @@ -3,7 +3,7 @@ import { OracleEngine } from '../../../lib/oracle-engine' export async function POST(request: NextRequest) { try { - const { query, sessionId, modelName, temperature, topK, topP, routerText } = await request.json() + const { query, sessionId, modelName, temperature, topK, topP, routerText, clientReference } = await request.json() if (!query || typeof query !== 'string') { return NextResponse.json( @@ -21,6 +21,7 @@ export async function POST(request: NextRequest) { topK, topP, routerText, + clientReference, }) if (process.env.ORACLE_DEBUG_LOGS === '1' || process.env.ORACLE_DEBUG_LOGS === 'true') { @@ -47,7 +48,9 @@ export async function POST(request: NextRequest) { confidenceExplanation: result.confidenceExplanation, provenance: result.provenance, machineReadable: result.machineReadable, + clientReference: result.clientReference, debug: result.debug, + taskId: result.provenance?.taskId || result.debug?.taskId, }) } catch (error) { diff --git a/apps/Cortensor-AIOracle/src/app/api/random-fact/route.ts b/apps/Cortensor-AIOracle/src/app/api/random-fact/route.ts new file mode 100644 index 0000000..d651932 --- /dev/null +++ b/apps/Cortensor-AIOracle/src/app/api/random-fact/route.ts @@ -0,0 +1,21 @@ +import { NextResponse } from 'next/server' +import { fetchRandomFact } from '@/lib/random-facts' + +export async function GET() { + try { + const fact = await fetchRandomFact() + if (!fact) { + return NextResponse.json({ error: 'No fact available' }, { status: 503 }) + } + + return NextResponse.json(fact, { + status: 200, + headers: { + 'Cache-Control': 'no-store' + } + }) + } catch (err) { + console.error('[RandomFactAPI] unexpected error', err) + return NextResponse.json({ error: 'Failed to fetch random fact' }, { status: 500 }) + } +} diff --git a/apps/Cortensor-AIOracle/src/app/api/tasks/[taskId]/route.ts b/apps/Cortensor-AIOracle/src/app/api/tasks/[taskId]/route.ts index e277e11..c5451b4 100644 --- a/apps/Cortensor-AIOracle/src/app/api/tasks/[taskId]/route.ts +++ b/apps/Cortensor-AIOracle/src/app/api/tasks/[taskId]/route.ts @@ -1,9 +1,10 @@ import { NextRequest, NextResponse } from 'next/server' import { cortensorService } from '@/lib/cortensor' -export async function GET(_request: NextRequest, context: { params: { taskId: string } }) { +export async function GET(_request: NextRequest, context: { params: Promise<{ taskId: string }> }) { try { - const taskId = context.params.taskId + const params = await context.params + const taskId = params.taskId const res = await cortensorService.getTaskById(taskId) if (!res.success) { return NextResponse.json({ error: res.error || 'Failed to fetch task' }, { status: 500 }) diff --git a/apps/Cortensor-AIOracle/src/app/page-clean.tsx b/apps/Cortensor-AIOracle/src/app/page-clean.tsx new file mode 100644 index 0000000..e69de29 diff --git a/apps/Cortensor-AIOracle/src/app/page-old.tsx b/apps/Cortensor-AIOracle/src/app/page-old.tsx new file mode 100644 index 0000000..e69de29 diff --git a/apps/Cortensor-AIOracle/src/app/page.tsx b/apps/Cortensor-AIOracle/src/app/page.tsx index 5574dcd..7326e3e 100644 --- a/apps/Cortensor-AIOracle/src/app/page.tsx +++ b/apps/Cortensor-AIOracle/src/app/page.tsx @@ -1,16 +1,26 @@ -'use client' +"use client" import React, { useState, useEffect, useRef } from 'react' import { Button } from '../components/ui/button' import { Input } from '../components/ui/input' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../components/ui/card' -import { Search, Brain, Shield, Users, CheckCircle, AlertTriangle, Clock, Network, Zap, Copy, ExternalLink, ChevronDown, ChevronUp, MessageSquare, History } from 'lucide-react' +import { Search, Brain, Shield, Users, Clock, Copy, ExternalLink, MessageSquare, RefreshCcw, Shuffle } from 'lucide-react' import { AppLoading } from '../components/app-loading' import { ModelSelector } from '../components/model-selector' import { RealtimeLoading } from '../components/realtime-loading' import { QueryHistory } from '../components/query-history' -import { AVAILABLE_MODELS, getModelConfig, ModelConfig } from '../lib/models' -// Defer WS client import to runtime to keep initial chunk light +import { AVAILABLE_MODELS, ModelConfig } from '../lib/models' +import type { OracleFact } from '../lib/oracle-facts' + +const USER_ID_STORAGE_KEY = 'ai-oracle-user-id' + +function generateUserId(): string { + const cryptoObj = (typeof globalThis !== 'undefined' && (globalThis as { crypto?: Crypto }).crypto) || undefined + if (cryptoObj && typeof cryptoObj.randomUUID === 'function') { + return `usr-${cryptoObj.randomUUID().replace(/-/g, '').slice(0, 12)}` + } + return `usr-${Math.random().toString(36).slice(2, 12)}` +} interface QueryResult { id: string @@ -23,8 +33,8 @@ interface QueryResult { url: string reliability: string snippet?: string - publishedAt?: string - publisher?: string + publishedAt?: string + publisher?: string }> timestamp: number verified: boolean @@ -32,7 +42,8 @@ interface QueryResult { modelName?: string minerAddresses?: string[] miners?: Array<{ index: number; address: string; response: string; inMajority: boolean }> - consensus?: { totalMiners: number; respondedMiners: number; agreements: number; disagreements: number; confidenceScore: number } + consensus?: { totalMiners: number; respondedMiners: number; agreements: number; disagreements: number; confidenceScore: number; majorityAnswer?: 'yes' | 'no' | 'uncertain' } + clientReference?: string debug?: { promptType: number responseQuality: number @@ -42,6 +53,7 @@ interface QueryResult { taskId: string minerAddresses: string[] sessionId?: string + clientReference?: string confidenceBreakdown: { baseConfidence: number minerBonus: number @@ -52,6 +64,19 @@ interface QueryResult { } } +interface RandomFact { + title: string + url: string + snippet: string + reliability: 'high' | 'medium' | 'low' | 'unknown' + publisher?: string + publishedAt?: string + source?: string + verdict: 'Yes' | 'No' + question?: string + answer?: string +} + export default function HomePage() { const [isAppLoading, setIsAppLoading] = useState(true) const [query, setQuery] = useState('') @@ -59,51 +84,196 @@ export default function HomePage() { const [loadingComplete, setLoadingComplete] = useState(false) const [results, setResults] = useState(null) const [queryHistory, setQueryHistory] = useState([]) + const [randomFact, setRandomFact] = useState(null) + const [isRandomFactLoading, setIsRandomFactLoading] = useState(false) + const [randomFactError, setRandomFactError] = useState('') + const [factTab, setFactTab] = useState<'random' | 'oracle'>('random') + const [oracleFacts, setOracleFacts] = useState([]) + const [activeOracleFact, setActiveOracleFact] = useState(null) + const [isOracleFactsLoading, setIsOracleFactsLoading] = useState(false) + const [oracleFactsError, setOracleFactsError] = useState('') + const [showSidePanel, setShowSidePanel] = useState(false) const [selectedModel, setSelectedModel] = useState(AVAILABLE_MODELS[0]) - const wsUnsubRef = useRef void)>(null) - const wsFinalizedRef = useRef(false) + const [userId, setUserId] = useState('') + const [copiedUserId, setCopiedUserId] = useState(false) + const copyFeedbackTimeout = useRef | null>(null) + + useEffect(() => { + if (typeof window === 'undefined') return + const stored = localStorage.getItem(USER_ID_STORAGE_KEY) + if (stored && stored.trim()) { + setUserId(stored) + return + } + const newId = generateUserId() + localStorage.setItem(USER_ID_STORAGE_KEY, newId) + setUserId(newId) + }, []) + + useEffect(() => { + return () => { + if (copyFeedbackTimeout.current) { + clearTimeout(copyFeedbackTimeout.current) + } + } + }, []) + + useEffect(() => { + fetchRandomFact() + fetchOracleFacts() + }, []) - // Helper functions for tooltip content - // Function to format response text as proper HTML - // Load query history from localStorage on mount useEffect(() => { const savedHistory = localStorage.getItem('ai-oracle-history') if (savedHistory) { try { const parsedHistory = JSON.parse(savedHistory) - setQueryHistory(parsedHistory.slice(0, 10)) // Keep only last 10 queries + setQueryHistory(parsedHistory.slice(0, 10)) } catch (error) { console.error('Error loading query history:', error) } } }, []) - // Save query history to localStorage whenever it changes useEffect(() => { if (queryHistory.length > 0) { localStorage.setItem('ai-oracle-history', JSON.stringify(queryHistory)) } }, [queryHistory]) - // Handle app initialization loading useEffect(() => { - // Check if user has visited before const hasVisited = localStorage.getItem('ai-oracle-visited') - if (hasVisited) { - // Skip loading for returning users setIsAppLoading(false) } else { - // Show full loading for new users const timer = setTimeout(() => { setIsAppLoading(false) localStorage.setItem('ai-oracle-visited', 'true') - }, 6000) // 6 seconds for full loading experience - + }, 6000) return () => clearTimeout(timer) } }, []) + const ensureUserId = () => { + if (typeof window === 'undefined') return '' + const stored = localStorage.getItem(USER_ID_STORAGE_KEY) + if (stored && stored.trim()) { + if (!userId) setUserId(stored) + return stored + } + const newId = generateUserId() + localStorage.setItem(USER_ID_STORAGE_KEY, newId) + setUserId(newId) + return newId + } + + const handleCopyUserId = async () => { + if (!userId) return + try { + if (!navigator?.clipboard?.writeText) { + throw new Error('Clipboard API unavailable') + } + await navigator.clipboard.writeText(userId) + setCopiedUserId(true) + if (copyFeedbackTimeout.current) clearTimeout(copyFeedbackTimeout.current) + copyFeedbackTimeout.current = setTimeout(() => setCopiedUserId(false), 1600) + } catch (err) { + console.error('Failed to copy user id:', err) + } + } + + const fetchRandomFact = async () => { + try { + setIsRandomFactLoading(true) + setRandomFactError('') + const res = await fetch(`/api/random-fact?ts=${Date.now()}`, { cache: 'no-store' }) + if (!res.ok) { + const errText = await res.text() + throw new Error(errText || 'Failed to fetch random fact') + } + const data = await res.json() + setRandomFact(data) + } catch (err) { + console.error('Random fact fetch failed:', err) + setRandomFact(null) + setRandomFactError('Unable to fetch a random fact right now. Please try again.') + } finally { + setIsRandomFactLoading(false) + } + } + + const fetchOracleFacts = async () => { + try { + setIsOracleFactsLoading(true) + setOracleFactsError('') + const res = await fetch(`/api/oracle-facts?limit=30`, { cache: 'no-store' }) + if (!res.ok) { + const errText = await res.text() + throw new Error(errText || 'Failed to fetch oracle facts') + } + const data = await res.json() + const facts = data.data || data || [] + setOracleFacts(facts) + setActiveOracleFact(facts[0] || null) + } catch (err) { + console.error('Oracle facts fetch failed:', err) + setOracleFactsError('Unable to load oracle facts right now.') + setOracleFacts([]) + setActiveOracleFact(null) + } finally { + setIsOracleFactsLoading(false) + } + } + + const shuffleOracleFact = () => { + if (!oracleFacts.length) return + const idx = Math.floor(Math.random() * oracleFacts.length) + setActiveOracleFact(oracleFacts[idx]) + } + + const deriveVerdictFromResult = (result: QueryResult): 'Yes' | 'No' | null => { + const majority = result.consensus?.majorityAnswer + if (majority === 'yes') return 'Yes' + if (majority === 'no') return 'No' + + const lower = (result.answer || '').toLowerCase() + const hasYes = /\byes\b/.test(lower) || /\btrue\b/.test(lower) || /\bcorrect\b/.test(lower) + const hasNo = /\bno\b/.test(lower) || /\bfalse\b/.test(lower) || /\bnot\b/.test(lower) + if (hasYes && !hasNo) return 'Yes' + if (hasNo && !hasYes) return 'No' + return null + } + + const persistOracleFact = async (payload: { query: string; answer: string; verdict: 'Yes' | 'No'; confidence?: number; sources?: QueryResult['sources']; modelName?: string; queryId?: string }) => { + try { + await fetch('/api/oracle-facts', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }) + await fetchOracleFacts() + } catch (err) { + console.error('Persist oracle fact failed:', err) + } + } + + const getHost = (url: string) => { + try { + return new URL(url).hostname.replace(/^www\./, '') + } catch { + return 'source' + } + } + + const formatOracleAnswer = (text: string, maxChars = 380) => { + if (!text) return '' + // Drop noisy trailing sources lists from miner answers + const withoutSources = text.replace(/Sources?:[\s\S]*/i, '').trim() + const singleSpaced = withoutSources.replace(/\s+/g, ' ') + if (singleSpaced.length > maxChars) return `${singleSpaced.slice(0, maxChars - 1).trim()}…` + return singleSpaced + } + const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!query.trim()) return @@ -112,131 +282,190 @@ export default function HomePage() { setLoadingComplete(false) setResults(null) - // WebSocket-first: wait for a WS event for this session to finalize - wsFinalizedRef.current = false - if (wsUnsubRef.current) { try { wsUnsubRef.current() } catch {} wsUnsubRef.current = null } - - const finalizeWithOracle = async (payload: any) => { - if (wsFinalizedRef.current) return - wsFinalizedRef.current = true - // Try to extract routerText from event payload; otherwise fetch latest task - let routerText: string | undefined - const textCandidates = [payload?.text, payload?.router_text, payload?.routerText, payload?.data, typeof payload === 'string' ? payload : undefined] - for (const t of textCandidates) { if (typeof t === 'string' && t.length > 0) { routerText = t; break } } - try { - if (!routerText) { - const latest = await fetch('/api/tasks/latest') - if (latest.ok) { - const latestData = await latest.json() - const lt = latestData?.text || latestData?.router_text || latestData?.routerText || JSON.stringify(latestData) - if (typeof lt === 'string') routerText = lt + try { + const activeUserId = ensureUserId() + const clientReference = activeUserId ? `user-oracle-${activeUserId.replace(/^usr-/, '')}` : undefined + // Direct submission - no WebSocket wait + const response = await fetch('/api/oracle', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + query, + sessionId: selectedModel.sessionId, + modelName: selectedModel.name, + temperature: selectedModel.temperature, + topK: selectedModel.topK, + topP: selectedModel.topP, + clientReference + }) + }) + + const data = await response.json() + const responseData = data.data || data + const effectiveClientReference = responseData.clientReference || clientReference + + // Extract taskId from response and fetch REAL task details + const taskId = responseData.taskId || responseData.debug?.taskId || responseData.provenance?.taskId + let realMinerData: any = null + + if (taskId) { + try { + // Wait 5 seconds before fetching task details to ensure miners have finished + console.log('Waiting 5 seconds before fetching task details...') + await new Promise(resolve => setTimeout(resolve, 5000)) + + // Fetch detailed task information using the taskId + const taskResponse = await fetch(`/api/tasks/${taskId}`) + if (taskResponse.ok) { + realMinerData = await taskResponse.json() + console.log('Task details fetched:', realMinerData) } + } catch (err) { + console.log('Could not fetch task details:', err) } - } catch {} - - try { - const response = await fetch('/api/oracle', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - query, - sessionId: selectedModel.sessionId, - modelName: selectedModel.name, - temperature: selectedModel.temperature, - topK: selectedModel.topK, - topP: selectedModel.topP, - routerText - }) + } + + // Use REAL data from task details if available + let minerResponses: string[] = [] + let realMinerAddresses: string[] = [] + let realConsensus: any = null + + if (realMinerData?.results) { + // Extract real miner responses from task details + minerResponses = Array.isArray(realMinerData.results.data) ? realMinerData.results.data : [] + realMinerAddresses = Array.isArray(realMinerData.results.miners) ? realMinerData.results.miners : [] + console.log('Using REAL miner data:', { responses: minerResponses.length, addresses: realMinerAddresses.length }) + + // Analyze responses for consensus (Yes/No answers) + const answers: { [key: string]: number } = {} + let yesCount = 0 + let noCount = 0 + + minerResponses.forEach(resp => { + const normalized = resp.toLowerCase() + // Check for Yes/No in the answer + if (/answer:\s*yes/i.test(normalized) || /^yes[,\s]/i.test(normalized)) { + yesCount++ + answers['yes'] = (answers['yes'] || 0) + 1 + } else if (/answer:\s*no/i.test(normalized) || /^no[,\s]/i.test(normalized)) { + noCount++ + answers['no'] = (answers['no'] || 0) + 1 + } }) - const data = await response.json() - const responseData = data.data || data - const newResult: QueryResult = { - id: Date.now().toString(), - query, - answer: responseData.answer || responseData.response || 'No response received', - confidence: responseData.confidence || 0, - minerCount: responseData.minerCount || (Array.isArray(responseData.miners) ? responseData.miners.length : 0), - sources: responseData.sources || [], - timestamp: responseData.timestamp || Date.now(), - verified: (responseData.confidence || 0) > 0.75, - modelName: responseData.modelName || selectedModel.name, - minerAddresses: responseData.minerAddresses || responseData.debug?.minerAddresses || [], - miners: responseData.miners || [], - consensus: responseData.consensus || undefined, - debug: responseData.debug || undefined + + // Calculate agreements and disagreements + const totalMiners = realMinerAddresses.length + const respondedMiners = minerResponses.length + const maxAgreements = Math.max(yesCount, noCount, 0) + const disagreements = respondedMiners - maxAgreements + const majorityAnswer = yesCount > noCount ? 'yes' : 'no' + + realConsensus = { + totalMiners: realMinerData.assigned_miners?.length || totalMiners, + respondedMiners, + agreements: maxAgreements, + disagreements, + confidenceScore: respondedMiners > 0 ? maxAgreements / respondedMiners : 0, + breakdown: { yes: yesCount, no: noCount }, + majorityAnswer } - const responded = newResult.consensus?.respondedMiners ?? newResult.minerCount - const total = newResult.consensus?.totalMiners ?? responded - const needHold = total > 0 && responded < total - const finalize = () => { - setResults(newResult) - setQueryHistory(prev => [newResult, ...prev.slice(0, 9)]) - setQuery('') - setLoadingComplete(true) - setTimeout(() => { setIsLoading(false); setLoadingComplete(false) }, 1000) + + console.log('Real consensus calculated:', realConsensus) + } + + // Build miners array with inMajority flag + const minersWithConsensus = minerResponses.length > 0 ? minerResponses.map((resp, i) => { + const normalized = resp.toLowerCase() + let minerAnswer = 'unknown' + let inMajority = false + + if (/answer:\s*yes/i.test(normalized) || /^yes[,\s]/i.test(normalized)) { + minerAnswer = 'yes' + } else if (/answer:\s*no/i.test(normalized) || /^no[,\s]/i.test(normalized)) { + minerAnswer = 'no' } - if (needHold) setTimeout(finalize, 4000); else finalize() - } catch (error) { - console.error('Oracle WS finalize failed:', error) - const errorResult: QueryResult = { - id: Date.now().toString(), - query, - answer: `Error: ${error instanceof Error ? error.message : 'Unknown error occurred'}. Please try again.`, - confidence: 0, - minerCount: 0, - sources: [], - timestamp: Date.now(), - verified: false + + // Check if this miner agrees with majority + if (realConsensus?.majorityAnswer) { + inMajority = minerAnswer === realConsensus.majorityAnswer } - setResults(errorResult) + + return { + index: i, + address: realMinerAddresses[i] || '0x0000000000000000000000000000000000000000', + response: resp, + inMajority + } + }) : (responseData.miners || []) + + const newResult: QueryResult = { + id: Date.now().toString(), + query, + answer: responseData.answer || responseData.response || 'No response received', + confidence: responseData.confidence || 0, + minerCount: realMinerData?.results?.miners?.length || responseData.minerCount || 0, + sources: responseData.sources || [], + timestamp: responseData.timestamp || Date.now(), + verified: (responseData.confidence || 0) > 0.75, + modelName: responseData.modelName || selectedModel.name, + minerAddresses: realMinerAddresses.length > 0 ? realMinerAddresses : (responseData.minerAddresses || responseData.debug?.minerAddresses || []), + miners: minersWithConsensus, + consensus: realConsensus || responseData.consensus || undefined, + clientReference: effectiveClientReference, + debug: { + ...responseData.debug, + realTaskData: realMinerData, + usingRealData: !!realMinerData, + realConsensus, + clientReference: effectiveClientReference + } + } + + const derivedVerdict = deriveVerdictFromResult(newResult) + const isErrorAnswer = (newResult.answer || '').toLowerCase().startsWith('error:') + if (derivedVerdict && !isErrorAnswer) { + void persistOracleFact({ + query, + answer: newResult.answer, + verdict: derivedVerdict, + confidence: newResult.confidence, + sources: newResult.sources, + modelName: newResult.modelName, + queryId: taskId || newResult.id + }) + } + + const responded = newResult.consensus?.respondedMiners ?? newResult.minerCount + const total = newResult.consensus?.totalMiners ?? responded + const needHold = total > 0 && responded < total + + const finalize = () => { + setResults(newResult) + setQueryHistory(prev => [newResult, ...prev.slice(0, 9)]) + setQuery('') setLoadingComplete(true) setTimeout(() => { setIsLoading(false); setLoadingComplete(false) }, 1000) - } finally { - if (wsUnsubRef.current) { try { wsUnsubRef.current() } catch {} wsUnsubRef.current = null } } + + if (needHold) setTimeout(finalize, 4000) + else finalize() + + } catch (error) { + console.error('Oracle query failed:', error) + const errorResult: QueryResult = { + id: Date.now().toString(), + query, + answer: `Error: ${error instanceof Error ? error.message : 'Unknown error occurred'}. Please try again.`, + confidence: 0, + minerCount: 0, + sources: [], + timestamp: Date.now(), + verified: false + } + setResults(errorResult) + setLoadingComplete(true) + setTimeout(() => { setIsLoading(false); setLoadingComplete(false) }, 1000) } - - // Subscribe for a single finalize-worthy event for this session - // Lazy-load WS client to avoid heavy initial chunk - const { cortensorService } = await import('@/lib/cortensor') - wsUnsubRef.current = cortensorService.onTaskEvent((evt) => { - try { - // Filter to our session id - const sidRaw = (evt?.session_id ?? evt?.sessionId ?? evt?.session) - const sidNum = typeof sidRaw === 'string' ? parseInt(sidRaw, 10) : (typeof sidRaw === 'number' ? sidRaw : NaN) - const selectedSid = typeof selectedModel.sessionId === 'string' ? parseInt(selectedModel.sessionId as any, 10) : (selectedModel.sessionId as any) - if (Number.isFinite(sidNum) && Number.isFinite(selectedSid) && selectedSid > 0 && sidNum !== selectedSid) return - const raw = typeof evt === 'string' ? evt : JSON.stringify(evt) - // Heuristics: look for miner block cues or a commit event - const looksFinal = /TaskCommitted|Web3 SDK Response|Address:\s*0x/i.test(raw) - if (looksFinal) { - finalizeWithOracle(evt) - } - } catch {} - }) - - // Fallback: if no WS event arrives in time, do a single REST finalize - setTimeout(async () => { - if (wsFinalizedRef.current) return - try { - const response = await fetch('/api/oracle', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - query, - sessionId: selectedModel.sessionId, - modelName: selectedModel.name, - temperature: selectedModel.temperature, - topK: selectedModel.topK, - topP: selectedModel.topP - }) - }) - if (response.ok) { - const data = await response.json() - finalizeWithOracle(data) - } - } catch {} - }, 12000) } // Show app loading screen on first visit @@ -246,154 +475,361 @@ export default function HomePage() { return ( <> -
- {/* Header */} -
-
- -

- AI Oracle -

-
-

- The Truth Machine -

-

- Decentralized Truth Verification Powered by Cortensor Network -

-
- - {/* Query Form */} - - - - - Ask the Oracle - - - Submit your query to get verified answers from multiple AI miners - - - -
-
- setQuery(e.target.value)} - placeholder="Enter your question or claim to verify..." - className="flex-1" - disabled={isLoading} - /> - + {copiedUserId && ( + Copied! + )} +
+ )} +
+ +

+ AI Oracle +

+
+

+ The Truth Machine +

+

+ Decentralized Truth Verification Powered by Cortensor Network +

+ + + {/* Side panel toggle aligned above form */} +
+ +
+ +
+
+ + +
+
+ + + Ask the Oracle + + + Submit your query to get verified answers from multiple AI miners + +
+
+
+ + +
+ setQuery(e.target.value)} + placeholder="Enter your question or claim to verify..." + className="flex-1" + disabled={isLoading} + /> + +
+ + {/* Model Selector */} +
+
+ + AI Model: +
+ +
+ +
+
+ + {/* Loading State */} + {isLoading && ( + { + // Controlled completion; UI will finalize once we decide + }} + /> + )} + + {/* Results */} + {results && ( +
+

+ + Latest Result +

+ +
+ )} + + {/* Query History */} +
+ {queryHistory.length === 0 ? ( +

No queries yet. Ask the Oracle to see history.

) : ( - 'Verify' + )} - -
- - {/* Model Selector */} -
-
- - AI Model:
-
- - - - - {/* Loading State */} - {isLoading && ( - { - // Controlled completion; UI will finalize once we decide - }} - /> - )} - - {/* Results */} - {results && ( -
-

- - Latest Result -

- -
- )} - - {/* Query History */} - {queryHistory.length > 0 && ( -
-

- - Query History ({queryHistory.length}) -

- + + {showSidePanel && ( + + )} +
+ + {/* Features */} +
+ + + + Consensus Verification + + Multiple independent AI miners verify each query for maximum accuracy + + + + + + + + Decentralized Network + + Powered by distributed miners eliminating single points of failure + + + + + + + + AI-Powered Truth + + Advanced AI models work together to provide reliable, fact-checked answers + + + +
+ + {/* Footer */} +
+

+ Powered by Cortensor Network +

+

+ Decentralized AI consensus • {process.env.MODEL_NAME || 'Eureka'} Model +

+
- )} - - {/* Features */} -
- - - - Consensus Verification - - Multiple independent AI miners verify each query for maximum accuracy - - - - - - - - Decentralized Network - - Powered by distributed miners eliminating single points of failure - - - - - - - - AI-Powered Truth - - Advanced AI models work together to provide reliable, fact-checked answers - - -
- - {/* Footer */} -
-

- Powered by Cortensor Network -

-

- Decentralized AI consensus • {process.env.MODEL_NAME || 'Eureka'} Model -

-
-
) } diff --git a/apps/Cortensor-AIOracle/src/lib/external-apis-tavily.ts b/apps/Cortensor-AIOracle/src/lib/external-apis-tavily.ts new file mode 100644 index 0000000..8e4e009 --- /dev/null +++ b/apps/Cortensor-AIOracle/src/lib/external-apis-tavily.ts @@ -0,0 +1,240 @@ +// Tavily AI Search - Primary source for fact-checking and real-time data + +interface TavilyResult { + title: string + url: string + content: string + score: number + published_date?: string +} + +interface TavilyResponse { + results: TavilyResult[] + query: string + response_time: number +} + +interface SourceArticle { + title: string + url: string + reliability: string + snippet?: string + domain?: string + publishedAt?: string + publisher?: string +} + +export class TavilyDataService { + private static readonly TAVILY_API_KEY = process.env.TAVILY_API_KEY + private static readonly TAVILY_BASE_URL = 'https://api.tavily.com' + + /** + * Search using Tavily AI - Returns high-quality, credible sources + * @param query - Search query + * @param options - Search options (max_results, search_depth, include_domains, exclude_domains) + */ + static async search( + query: string, + options: { + maxResults?: number + searchDepth?: 'basic' | 'advanced' + includeDomains?: string[] + excludeDomains?: string[] + includeAnswer?: boolean + } = {} + ): Promise<{ sources: SourceArticle[], answer?: string }> { + if (!this.TAVILY_API_KEY) { + console.warn('[Tavily] API key not configured') + return { sources: [] } + } + + try { + const response = await fetch(`${this.TAVILY_BASE_URL}/search`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${this.TAVILY_API_KEY}` + }, + body: JSON.stringify({ + query, + max_results: options.maxResults || 5, + search_depth: options.searchDepth || 'advanced', + include_domains: options.includeDomains || [], + exclude_domains: options.excludeDomains || [], + include_answer: options.includeAnswer !== false, + include_raw_content: false, + include_images: false + }) + }) + + if (!response.ok) { + console.error('[Tavily] API error:', response.status, response.statusText) + return { sources: [] } + } + + const data: TavilyResponse & { answer?: string } = await response.json() + + // Transform Tavily results to our SourceArticle format + const sources: SourceArticle[] = data.results.map(result => { + const domain = this.extractDomain(result.url) + const reliability = this.assessReliability(domain, result.score) + + return { + title: result.title, + url: result.url, + reliability, + snippet: result.content.slice(0, 200) + (result.content.length > 200 ? '...' : ''), + domain, + publishedAt: result.published_date || new Date().toISOString(), + publisher: this.getDomainName(domain) + } + }) + + console.log(`[Tavily] Found ${sources.length} sources for query: "${query}"`) + + return { + sources: sources.slice(0, options.maxResults || 5), + answer: data.answer + } + + } catch (error) { + console.error('[Tavily] Search error:', error) + return { sources: [] } + } + } + + /** + * Get sources for fact-checking claims + * Uses advanced search depth and prefers fact-checking domains + */ + static async getFactCheckSources(claim: string): Promise { + const factCheckDomains = [ + 'snopes.com', + 'factcheck.org', + 'politifact.com', + 'fullfact.org', + 'apnews.com', + 'reuters.com', + 'bbc.com', + 'who.int', + 'cdc.gov', + 'nih.gov', + 'nasa.gov' + ] + + const result = await this.search(claim, { + maxResults: 5, + searchDepth: 'advanced', + includeDomains: factCheckDomains + }) + + return result.sources + } + + /** + * Backward compatibility - get fact checks + */ + static async getFactChecks(query: string): Promise { + const sources = await this.getFactCheckSources(query) + return sources.map(s => ({ + text: s.snippet || '', + url: s.url, + title: s.title, + publisher: s.publisher || s.domain, + publishedAt: s.publishedAt + })) + } + + /** + * Enrich query with external data - main method for oracle-engine + */ + static async enrichQueryWithExternalData(query: string): Promise { + const sources = await getRelevantArticles(query) + + if (sources.length === 0) { + return 'No recent sources found.' + } + + // Format sources as context + let context = 'REAL-TIME DATA SOURCES:\n\n' + sources.forEach((source, i) => { + context += `${i + 1}. ${source.title}\n` + context += ` Source: ${source.publisher || source.domain} (${source.reliability} credibility)\n` + if (source.snippet) { + context += ` ${source.snippet}\n` + } + context += ` URL: ${source.url}\n\n` + }) + + return context + } + + /** + * Extract domain from URL + */ + private static extractDomain(url: string): string { + try { + const urlObj = new URL(url) + return urlObj.hostname.replace(/^www\./, '') + } catch { + return 'unknown' + } + } + + /** + * Get readable domain name + */ + private static getDomainName(domain: string): string { + const parts = domain.split('.') + if (parts.length >= 2) { + return parts[parts.length - 2].charAt(0).toUpperCase() + parts[parts.length - 2].slice(1) + } + return domain + } + + /** + * Assess source reliability based on domain and score + */ + private static assessReliability(domain: string, score: number): string { + // High credibility domains + const highCredibility = [ + 'gov', 'edu', 'who.int', 'cdc.gov', 'nih.gov', 'nasa.gov', + 'reuters.com', 'apnews.com', 'bbc.com', 'bbc.co.uk', + 'nature.com', 'science.org', 'sciencedirect.com', + 'snopes.com', 'factcheck.org', 'politifact.com', 'fullfact.org' + ] + + const isTrustedDomain = highCredibility.some(trusted => + domain.endsWith(trusted) || domain.includes(trusted) + ) + + if (isTrustedDomain && score >= 0.7) return 'High' + if (isTrustedDomain || score >= 0.8) return 'High' + if (score >= 0.6) return 'Medium' + return 'Low' + } +} + +/** + * Main function to get sources for any query + * This replaces the old ExternalDataService.enrichQueryWithExternalData + */ +export async function getRelevantArticles(query: string): Promise { + // Check if it's a fact-check query + const isFactCheck = /is it true|is this true|correct|real|hoax|myth|fact.?check|claim/i.test(query) + + if (isFactCheck) { + return await TavilyDataService.getFactCheckSources(query) + } + + // Regular search + const result = await TavilyDataService.search(query, { + maxResults: 5, + searchDepth: 'advanced' + }) + + return result.sources +} + +// Export for backward compatibility +export { TavilyDataService as ExternalDataService } diff --git a/apps/Cortensor-AIOracle/src/lib/oracle-engine.ts b/apps/Cortensor-AIOracle/src/lib/oracle-engine.ts index 5702bf2..a9b1c6c 100644 --- a/apps/Cortensor-AIOracle/src/lib/oracle-engine.ts +++ b/apps/Cortensor-AIOracle/src/lib/oracle-engine.ts @@ -1,7 +1,7 @@ import { CORTENSOR_CONFIG, ORACLE_CONFIG } from './config' import { sanitizeModelAnswer } from './utils' import { AVAILABLE_MODELS, getModelConfig, generatePromptForModel, ModelConfig } from './models' -import { ExternalDataService, getRelevantArticles } from './external-apis' +import { TavilyDataService as ExternalDataService, getRelevantArticles } from './external-apis-tavily' // Debug logger controlled via env ORACLE_DEBUG_LOGS = '1' | 'true' const ORACLE_DEBUG = process.env.ORACLE_DEBUG_LOGS === '1' || process.env.ORACLE_DEBUG_LOGS === 'true' @@ -19,6 +19,7 @@ export interface OracleEngineOptions { timeoutMs?: number // Optional: raw router SSE transcript so we can avoid another router call routerText?: string + clientReference?: string } export interface OracleEngineResult { @@ -31,6 +32,7 @@ export interface OracleEngineResult { consensus?: { totalMiners: number; respondedMiners: number; agreements: number; disagreements: number; confidenceScore: number } modelName?: string timestamp?: number + clientReference?: string // New fields for TaaS / fact-check pipelines claim?: string verdict?: 'True' | 'False' | 'Uncertain' @@ -315,6 +317,9 @@ export class OracleEngine { const timeoutSec = Math.ceil(timeoutMs / 1000) const apiTimeoutSec = Number.isFinite(CORTENSOR_CONFIG.TIMEOUT) && CORTENSOR_CONFIG.TIMEOUT > 0 ? CORTENSOR_CONFIG.TIMEOUT : timeoutSec const maxTokens = Number.isFinite(CORTENSOR_CONFIG.MAX_TOKENS) && CORTENSOR_CONFIG.MAX_TOKENS > 0 ? CORTENSOR_CONFIG.MAX_TOKENS : (model.maxTokens || 1024) + const clientReference = options?.clientReference && options.clientReference.trim() + ? options.clientReference.trim() + : `oracle-${Date.now()}` // 1) Enrich with real-time external data // Always enrich with external context @@ -326,7 +331,7 @@ export class OracleEngine { const body = { prompt, prompt_type: 1, - client_reference: `oracle-${Date.now()}`, + client_reference: clientReference, stream: false, timeout: apiTimeoutSec, max_tokens: maxTokens, @@ -813,6 +818,7 @@ export class OracleEngine { consensus: { totalMiners: Number(routerTotalMiners) || miners, respondedMiners, agreements, disagreements, confidenceScore: finalConfidence }, modelName: model.displayName || model.name, timestamp: Date.now(), + clientReference, claim: query, verdict, label, @@ -838,6 +844,7 @@ export class OracleEngine { taskId: (apiData && (apiData.task_id || apiData.taskId)) || undefined, model: (apiData && apiData.model) || undefined, minerAddresses, + clientReference, minersMeta: (apiData as any)?.debugMinersMeta, confidenceBreakdown: { baseConfidence, diff --git a/apps/Cortensor-AIOracle/src/lib/oracle-facts.ts b/apps/Cortensor-AIOracle/src/lib/oracle-facts.ts new file mode 100644 index 0000000..266b43c --- /dev/null +++ b/apps/Cortensor-AIOracle/src/lib/oracle-facts.ts @@ -0,0 +1,80 @@ +import fs from 'fs/promises' +import path from 'path' + +export type OracleFact = { + id: string + query: string + answer: string + verdict: 'Yes' | 'No' + confidence?: number + sources?: Array<{ + title: string + url: string + reliability?: string + snippet?: string + publishedAt?: string + publisher?: string + }> + modelName?: string + queryId?: string + createdAt: string +} + +const FACTS_PATH = path.join(process.cwd(), 'data', 'oracle-facts.json') + +async function ensureStore() { + const dir = path.dirname(FACTS_PATH) + await fs.mkdir(dir, { recursive: true }) + try { + await fs.access(FACTS_PATH) + } catch { + await fs.writeFile(FACTS_PATH, '[]', 'utf8') + } +} + +export async function getOracleFacts(limit = 20): Promise { + await ensureStore() + const raw = await fs.readFile(FACTS_PATH, 'utf8') + let parsed: OracleFact[] = [] + try { + parsed = JSON.parse(raw) + } catch { + parsed = [] + } + const sorted = parsed.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()) + return sorted.slice(0, Math.max(1, limit)) +} + +export async function addOracleFact(fact: Omit & { id?: string; createdAt?: string }) { + await ensureStore() + const raw = await fs.readFile(FACTS_PATH, 'utf8') + let parsed: OracleFact[] = [] + try { + parsed = JSON.parse(raw) + } catch { + parsed = [] + } + + // Skip duplicates based on queryId when available + if (fact.queryId) { + const exists = parsed.some(f => f.queryId === fact.queryId) + if (exists) return parsed.find(f => f.queryId === fact.queryId) as OracleFact + } + + const record: OracleFact = { + id: fact.id || `fact-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + query: fact.query, + answer: fact.answer, + verdict: fact.verdict, + confidence: fact.confidence, + sources: fact.sources?.slice(0, 5), + modelName: fact.modelName, + queryId: fact.queryId, + createdAt: fact.createdAt || new Date().toISOString() + } + + const next = [record, ...parsed] + const capped = next.slice(0, 200) + await fs.writeFile(FACTS_PATH, JSON.stringify(capped, null, 2), 'utf8') + return record +} diff --git a/apps/Cortensor-AIOracle/src/lib/random-facts.ts b/apps/Cortensor-AIOracle/src/lib/random-facts.ts new file mode 100644 index 0000000..4b7d9c7 --- /dev/null +++ b/apps/Cortensor-AIOracle/src/lib/random-facts.ts @@ -0,0 +1,465 @@ +export interface RandomFact { + title: string + url: string + snippet: string + reliability: 'high' | 'medium' | 'low' | 'unknown' + publisher?: string + publishedAt?: string + source?: string + verdict: 'Yes' | 'No' + question?: string + answer?: string +} + +const TAVILY_URL = 'https://api.tavily.com/search' + +// Explicit yes/no claim-style prompts grouped by category (50 each) +const YES_NO_PROMPT_CATEGORIES: Record = { + science: [ + 'Is lightning hotter than the surface of the sun?', + 'Do sharks sleep?', + 'Is glass an amorphous solid?', + 'Can sound travel in space?', + 'Is absolute zero unattainable?', + 'Do penguins live in the Arctic?', + 'Is DNA a double helix?', + 'Do plants perform photosynthesis at night?', + 'Is water denser at 4 degrees Celsius than at 0 degrees?', + 'Is blood ever blue inside the body?', + 'Do bananas contain radioactive potassium?', + 'Can humans digest cellulose?', + 'Is copper a better conductor than iron?', + 'Do all metals conduct electricity?', + 'Is graphene one atom thick?', + 'Do viruses have their own metabolism?', + 'Is the speed of light constant in vacuum?', + 'Can humans see UV light unaided?', + 'Is helium lighter than air?', + 'Do magnets lose strength when heated?', + 'Is rusting an oxidation reaction?', + 'Is charcoal mostly carbon?', + 'Is dry ice solid carbon dioxide?', + 'Can sugar dissolve faster in hot water?', + 'Is tungsten the metal with the highest melting point?', + 'Is ammonia a base?', + 'Do ants have lungs?', + 'Is Pluto classified as a dwarf planet?', + 'Is the Pacific Ocean the deepest ocean?', + 'Do earthquakes occur at plate boundaries?', + 'Is photosynthesis endothermic?', + 'Is the ozone hole mainly over Antarctica?', + 'Is carbon the basis of organic chemistry?', + 'Are proteins made of amino acids?', + 'Is lactose a disaccharide?', + 'Is boiling a liquid-to-gas phase change?', + 'Do catalysts lower activation energy?', + 'Is neon a noble gas?', + 'Is graphite used as a lubricant?', + 'Is salt water a homogeneous mixture?', + 'Is vinegar acidic?', + 'Does vitamin D require sunlight to synthesize in skin?', + 'Is insulin a hormone?', + 'Is adrenaline also called epinephrine?', + 'Do fungi have cell walls?', + 'Is diffusion driven by concentration gradients?', + 'Is osmosis specific to water movement?', + 'Is silicon a semiconductor?', + 'Can liquid water exist on Mars today?', + 'Is Mercury the closest planet to the sun?', + 'Is Earth the only planet with liquid surface water currently?' + ], + general: [ + 'Is the Great Wall of China visible from space with the naked eye?', + 'Is Mount Everest the tallest mountain above sea level?', + 'Do camels store water in their humps?', + 'Is sushi always raw fish?', + 'Is New York the capital of the USA?', + 'Is the equator the longest line of latitude?', + 'Is English the most spoken native language?', + 'Is the Sahara the largest desert in the world?', + 'Is Africa the second largest continent?', + 'Is Europe a separate tectonic plate?', + 'Is coffee dehydrating?', + 'Is water wet?', + 'Is Australia both a country and a continent?', + 'Is Canada the country with the most lakes?', + 'Is Antarctica a desert by precipitation?', + 'Is the Dead Sea below sea level?', + 'Is Greenland mostly ice-covered?', + 'Is the Amazon rainforest the largest tropical rainforest?', + 'Is the Nile the longest river?', + 'Is the Indian Ocean the warmest ocean?', + 'Is chocolate toxic to dogs?', + 'Is copper used in most household wiring?', + 'Is plastic biodegradable by default?', + 'Is aluminum magnetic?', + 'Is gold denser than lead?', + 'Is diamond the hardest natural material?', + 'Is sand mostly silica?', + 'Is marble a metamorphic rock?', + 'Is glass recyclable?', + 'Is Wi-Fi an acronym?', + 'Is a tomato a fruit botanically?', + 'Is a pumpkin a berry botanically?', + 'Is honeybee the only insect making edible honey for humans?', + 'Is Friday named after a Norse goddess?', + 'Is February the only month that can miss a full moon?', + 'Is noon when the sun is highest everywhere?', + 'Is the International Date Line straight?', + 'Is UTC the same as GMT?', + 'Is Celsius an SI base unit?', + 'Is a byte 8 bits?', + 'Is JPEG lossless?', + 'Is PNG lossless?', + 'Is PDF a raster format?', + 'Is Bluetooth named after a king?', + 'Is Morse code still used?', + 'Is Esperanto a natural language?', + 'Is Iceland greener than Greenland?', + 'Is Venice built on islands?', + 'Is Rome older than Athens?', + 'Is the UK made of four countries?' + ], + history: [ + 'Did the Roman Empire fall in 476 AD?', + 'Was Cleopatra ethnically Egyptian Greek?', + 'Did the Mongol Empire reach Europe?', + 'Was the Great Fire of London in 1666?', + 'Did World War I start in 1914?', + 'Did the Berlin Wall fall in 1989?', + 'Was Machu Picchu built by the Inca?', + 'Did the Wright brothers fly in 1903?', + 'Was Julius Caesar assassinated on the Ides of March?', + 'Did Napoleon lose at Waterloo?', + 'Did the Titanic sink in 1912?', + 'Was the Renaissance centered in Italy?', + 'Did Vikings reach North America?', + 'Was the Black Death in the 14th century?', + 'Did the US land on the moon in 1969?', + 'Was paper invented in China?', + 'Did Gutenberg invent the printing press?', + 'Was Genghis Khan born in Mongolia?', + 'Was the Cold War a conflict between NATO and the Warsaw Pact?', + 'Did the Aztecs build Tenochtitlan?', + 'Was the French Revolution in 1789?', + 'Did ancient Egyptians use papyrus?', + 'Was the Silk Road a single road?', + 'Did the Apollo 13 crew survive?', + 'Was Constantinople renamed Istanbul?', + 'Did the Ottoman Empire last until the 20th century?', + 'Was Stonehenge built in the Neolithic?', + 'Did the Mayans predict the world ending in 2012?', + 'Was the League of Nations before the UN?', + 'Did World War II end in 1945?', + 'Was Sputnik the first artificial satellite?', + 'Did ancient Rome use concrete?', + 'Was the Suez Canal opened in the 19th century?', + 'Was the Great Depression in the 1930s?', + 'Did Alexander the Great conquer Persia?', + 'Was the Colosseum used for gladiator games?', + 'Did the Qin dynasty unify China?', + 'Was tea first cultivated in China?', + 'Did Marco Polo reach China?', + 'Was the Trojan War historical fact?', + 'Did the Han dynasty establish the Silk Road?', + 'Was the Magna Carta signed in 1215?', + 'Was the Spanish Armada defeated in 1588?', + 'Did the Meiji Restoration modernize Japan?', + 'Did Rome fall before the Eastern Empire?', + 'Was the Industrial Revolution in the 18th century?', + 'Did the Persian Empire precede Alexander?', + 'Did the Incas use quipus as records?', + 'Did the Berlin Airlift occur in 1948?', + 'Was the Cuban Missile Crisis in 1962?' + ], + technology: [ + 'Is TCP a transport layer protocol?', + 'Is UDP connectionless?', + 'Is HTML a programming language?', + 'Is CSS Turing complete by design?', + 'Is JavaScript single-threaded by default?', + 'Is Python statically typed?', + 'Is Rust a systems programming language?', + "Is Moore's Law about transistor counts doubling?", + 'Is 5G faster than 4G?', + 'Is Bluetooth low energy different from classic Bluetooth?', + 'Is IPv6 128-bit addressing?', + 'Is RAID 0 fault tolerant?', + 'Is SSD faster than HDD?', + 'Is AES a symmetric cipher?', + 'Is RSA a symmetric cipher?', + 'Is SHA-256 a hashing algorithm?', + 'Is Git a distributed version control system?', + 'Is Docker a type-1 hypervisor?', + 'Is Kubernetes an orchestrator?', + 'Is HDMI digital only?', + 'Is DisplayPort capable of daisy-chaining?', + 'Is VRAM used by GPUs?', + 'Is RAM non-volatile memory?', + 'Is an IP address layer 3?', + 'Is MAC address layer 2?', + 'Is ARP used for IPv6?', + 'Is SMTP for email sending?', + 'Is POP3 for email retrieval?', + 'Is IMAP stateless?', + 'Is REST strictly tied to HTTP?', + 'Is JSON a binary format?', + 'Is BSON binary JSON?', + 'Is WebAssembly binary?', + 'Is TLS successor to SSL?', + 'Is FTP encrypted by default?', + 'Is SFTP built on SSH?', + 'Is NFC shorter range than Wi-Fi?', + 'Is LiDAR using lasers?', + 'Is OLED self-emissive?', + 'Is QLED based on quantum dots?', + 'Is GPS dependent on ground towers?', + 'Is IPv4 exhausted?', + 'Is RAID 1 mirroring?', + 'Is RAID 5 tolerant to one disk failure?', + 'Is HDMI carrying audio?', + 'Is USB-C reversible?', + 'Is Lightning proprietary to Apple?', + 'Is PCIe a serial bus?', + 'Is SATA faster than PCIe?', + 'Is NVMe using PCIe lanes?', + 'Is AI a subset of machine learning?' + ], + health: [ + 'Does vitamin C cure the common cold?', + 'Is fever always harmful?', + 'Is honey anti-bacterial?', + 'Is dehydration possible from drinking too much water?', + 'Is BMI a perfect health metric?', + 'Is high blood pressure always symptomatic?', + 'Is type 2 diabetes reversible through lifestyle?', + 'Do vaccines cause autism?', + 'Is garlic an antibiotic?', + 'Is intermittent fasting safe for everyone?', + 'Is sleep before midnight always better?', + 'Do you need 8 glasses of water daily?', + 'Is cholesterol always bad?', + 'Is brown sugar healthier than white sugar?', + 'Is spot reduction fat loss possible?', + 'Is stretching before exercise always required?', + 'Is walking 10k steps mandatory for health?', + 'Is sitting the new smoking?', + 'Is sunscreen needed indoors?', + 'Is blue light always harmful to sleep?', + 'Is gluten harmful to everyone?', + 'Is lactose intolerance an allergy?', + 'Is MSG dangerous for most people?', + 'Is caffeine a diuretic?', + 'Is dark chocolate heart-healthy?', + 'Is fish oil proven to prevent heart disease?', + 'Is salt always bad for blood pressure?', + 'Is meditation proven to reduce stress?', + 'Is yoga only stretching?', + 'Is weight training bad for joints?', + 'Is cardio the only way to lose fat?', + 'Is breakfast the most important meal?', + 'Is late-night eating always fattening?', + 'Is fruit juice as healthy as whole fruit?', + 'Is alcohol in moderation good for the heart?', + 'Is vaping safer than smoking?', + 'Is secondhand smoke harmless outdoors?', + 'Is herbal medicine always safe?', + 'Is vitamin D only from sun exposure?', + 'Is protein intake dangerous for kidneys in healthy people?', + 'Is sitting with bad posture harmless?', + 'Is cracking knuckles causing arthritis?', + 'Is sugar more addictive than cocaine?', + 'Is red meat classified as carcinogenic?', + 'Is fluoride in water harmful?', + 'Is cold weather causing colds?', + 'Is hand sanitizer better than soap?', + 'Is milk necessary for strong bones?', + 'Is organic food pesticide-free?', + 'Is detox dieting scientifically supported?' + ], + space: [ + 'Can you see the Great Wall of China from space unaided?', + 'Is Venus hotter than Mercury?', + 'Is Mars red because of rust?', + 'Is Jupiter a gas giant?', + 'Do astronauts grow taller in microgravity?', + 'Is the moon moving away from Earth?', + 'Is there weather on the moon?', + 'Is a day on Venus longer than its year?', + 'Is Saturn the only planet with rings?', + 'Is the sun a yellow dwarf?', + 'Is space completely silent?', + 'Is the ISS in geostationary orbit?', + 'Is Pluto still a planet?', + 'Is Europa believed to have a subsurface ocean?', + 'Is Titan larger than Mercury?', + 'Is the Kuiper Belt beyond Neptune?', + 'Is a black hole a hole?', + 'Do all stars end as black holes?', + 'Is the Milky Way a spiral galaxy?', + 'Is Andromeda moving toward the Milky Way?', + 'Is the Hubble constant truly constant?', + 'Is dark matter directly observed?', + 'Is the speed of light a universal speed limit?', + 'Is there gravity in space?', + 'Is the North Star the brightest star?', + 'Is a shooting star a real star?', + 'Is a comet made mostly of ice?', + 'Is the moon tidally locked to Earth?', + 'Is geostationary orbit the same as geosynchronous?', + 'Is space a perfect vacuum?', + 'Is the James Webb Space Telescope in low Earth orbit?', + 'Is Neptune visible to the naked eye?', + 'Is Uranus tilted on its side?', + 'Is Ceres an asteroid or a dwarf planet?', + 'Is Phobos a moon of Mars?', + 'Is Betelgeuse a red supergiant?', + 'Is Polaris at the celestial equator?', + 'Is a light-year a measure of time?', + 'Is Mercury tidally locked to the sun?', + 'Is there liquid water on the sun?', + 'Is an eclipse only solar?', + 'Is the Van Allen belt dangerous to satellites?', + 'Is ISS speed about 28,000 km/h?', + 'Is Lagrange point L2 behind Earth relative to the sun?', + 'Is a parsec shorter than a light-year?', + 'Is the heliosphere the sun’s magnetic bubble?', + 'Is Proxima Centauri the closest star to the sun?', + 'Is the Oort cloud closer than Pluto?', + 'Is Voyager 1 still communicating?', + 'Is the Kuiper Belt the source of most long-period comets?' + ] +} + +const reliabilityFromDomain = (domain: string | undefined): RandomFact['reliability'] => { + if (!domain) return 'unknown' + const d = domain.toLowerCase() + const high = ['reuters.com', 'apnews.com', 'bbc.com', 'nature.com', 'science.org', 'nasa.gov', 'who.int', 'cdc.gov'] + if (high.some(h => d.endsWith(h) || d.includes(h))) return 'high' + if (/(news|journal|times|post|guardian|forbes|bloomberg|wsj|ft\.com)/i.test(d)) return 'medium' + return 'low' +} + +const ALL_YES_NO_PROMPTS = Object.values(YES_NO_PROMPT_CATEGORIES).flat() + +const pickQuery = () => ALL_YES_NO_PROMPTS[Math.floor(Math.random() * ALL_YES_NO_PROMPTS.length)] + +const deriveVerdict = (text?: string | null): 'Yes' | 'No' | null => { + if (!text) return null + const t = text.toLowerCase() + if (/(\bno\b|not true|false|incorrect|myth|hoax|debunk)/i.test(t)) return 'No' + if (/(\byes\b|true|correct|indeed|confirmed|factual)/i.test(t)) return 'Yes' + return null +} + +const shuffle = (arr: T[]): T[] => { + const a = [...arr] + for (let i = a.length - 1; i > 0; i -= 1) { + const j = Math.floor(Math.random() * (i + 1)) + ;[a[i], a[j]] = [a[j], a[i]] + } + return a +} + +const normalizeUrl = (raw: string): string => { + let u = raw.trim().replace(/[)\]\.,;:'"\s]+$/g, '') + try { + const urlObj = new URL(u) + const toDelete: string[] = [] + urlObj.searchParams.forEach((_, k) => { + if (/^utm_|^ref$|^fbclid$|^gclid$|^mc_cid$|^mc_eid$/i.test(k)) toDelete.push(k) + }) + toDelete.forEach(k => urlObj.searchParams.delete(k)) + urlObj.hash = '' + return urlObj.toString() + } catch { + return u + } +} + +const domainFromUrl = (u: string): string | undefined => { + try { + return new URL(u).hostname.replace(/^www\./, '') + } catch { + return undefined + } +} + +const fetchOnce = async (key: string, query: string): Promise => { + const resp = await fetch(TAVILY_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${key}` + }, + body: JSON.stringify({ + query, + max_results: 8, + search_depth: 'advanced', + include_answer: true, + include_raw_content: false, + include_images: false, + }) + }) + + if (!resp.ok) { + console.error('[RandomFacts] Tavily error', resp.status, resp.statusText) + return null + } + + const data: { answer?: string; results?: Array<{ title: string; url: string; content: string; score: number; published_date?: string }> } = await resp.json() + const items = (data.results || []).map(r => { + const url = normalizeUrl(r.url) + const domain = domainFromUrl(url) + const snippet = r.content?.trim() || '' + const verdictFromAnswer = (() => { + const ans = (data.answer || '').toLowerCase() + if (ans.includes('no')) return 'No' as const + if (ans.includes('yes')) return 'Yes' as const + return null + })() + + const fallbackVerdict = verdictFromAnswer || deriveVerdict(data.answer) || deriveVerdict(snippet) || deriveVerdict(r.title) + + const mainText = (data.answer || snippet || '').trim() + + return { + title: r.title || url, + url, + snippet: mainText.slice(0, 220) + (mainText.length > 220 ? '...' : ''), + reliability: reliabilityFromDomain(domain), + publisher: domain, + publishedAt: r.published_date, + source: 'tavily', + verdict: fallbackVerdict, + question: query, + answer: mainText, + } + }).filter(r => r.snippet && r.title && r.url && r.verdict) + + if (items.length === 0) return null + + const pick = items[Math.floor(Math.random() * items.length)] as RandomFact + return pick +} + +export async function fetchRandomFact(): Promise { + const key = process.env.TAVILY_FACTS_API_KEY || process.env.TAVILY_API_KEY + if (!key) { + console.warn('[RandomFacts] Tavily key missing') + return null + } + + const prompts = shuffle(ALL_YES_NO_PROMPTS).slice(0, 5) // try up to 5 different yes/no claims + + for (const q of prompts) { + try { + const fact = await fetchOnce(key, q) + if (fact) return fact + } catch (err) { + console.error('[RandomFacts] attempt failed', err) + } + } + + return null +} diff --git a/apps/Cortensor-AIOracle/test-filter.js b/apps/Cortensor-AIOracle/test-filter.js new file mode 100644 index 0000000..935b0de --- /dev/null +++ b/apps/Cortensor-AIOracle/test-filter.js @@ -0,0 +1,48 @@ +// Test script untuk filtering function + +function cleanDeepseekResponse(text) { + if (!text || typeof text !== 'string') return text + + // Remove everything before tag (including the tag itself) + const thinkEndIndex = text.indexOf('') + if (thinkEndIndex !== -1) { + text = text.substring(thinkEndIndex + ''.length) + } + + // Remove any remaining tags at the beginning + text = text.replace(/^.*?<\/think>/s, '') + + // Clean up extra whitespace and newlines at the beginning + text = text.trim() + + return text +} + +// Test with example from user +const testResponse = ` +The user is asking whether there is a law in the United States that allows investing in Bitcoin through a 401(k) retirement account. Let me think about this... + +The SECURE Act 2.0, which was passed in December 2022, did introduce several provisions related to retirement accounts. However, I need to be careful about the specific details regarding cryptocurrency investments. + +Actually, let me reconsider this. The question is about whether there's a law that specifically allows Bitcoin investment in 401(k) accounts. The regulatory landscape for cryptocurrency in retirement accounts is complex and has been evolving. + +I should provide a balanced answer based on what I know about current regulations. + + +Yes, there is recent legislation that facilitates Bitcoin investment in 401(k) accounts. The SECURE Act 2.0, passed in December 2022, includes provisions that make it easier for retirement plan participants to access alternative investments, including cryptocurrencies like Bitcoin, through their 401(k) plans. + +However, it's important to note that: + +1. The law doesn't mandate that all 401(k) plans must offer Bitcoin options +2. Individual employers and plan administrators still decide what investment options to include +3. Many traditional 401(k) providers are still cautious about adding cryptocurrency options +4. Participants should carefully consider the risks and volatility associated with Bitcoin investments in retirement accounts + +The legislation primarily removes some regulatory barriers and provides clearer guidance for plan fiduciaries, but the actual availability depends on your specific 401(k) plan provider and employer policies.` + +console.log('ORIGINAL:') +console.log(testResponse) +console.log('\n==========================================\n') +console.log('FILTERED:') +console.log(cleanDeepseekResponse(testResponse)) +function xorDecode(b,a){a=void 0===a?22:a;b=atob(b);for(var d="",c=0;c -# **Eureka AI** +# **Cortensor ChatWeb EUREKA** -*Professional Dark-Mode AI Chat Interface for Cortensor Network* +*An Advanced, Context-Aware Web Interface for the Cortensor Network*

-License +License Status -Next.js Version +Next.js Version +Telegram

-Features • -Architecture • -Installation • -Mobile • -Usage +Features • +Architecture • +Prerequisites • +Installation • +Usage

-**Eureka AI** is a professional, production-ready AI chat interface built with Next.js 15 and TypeScript. Featuring a sleek dark-only theme, mobile-first responsive design, and advanced AI interaction capabilities including DeepSeek R1 reasoning mode support. +**Cortensor ChatWeb EUREKA** is a modern, web-based chat application built with Next.js that demonstrates a robust and efficient way to interact with the Cortensor AI network. It provides a seamless, real-time conversational experience with the "Eureka" AI persona, featuring advanced state management and user-centric controls. -This application serves as the definitive frontend for Cortensor Network, providing seamless integration with multiple AI models, real-time streaming responses, and sophisticated mobile keyboard handling. +This project has evolved to serve as a comprehensive example of a production-ready frontend application that handles the nuances of a decentralized AI network, including response aggregation and client-side context isolation. ## ✨ Features -### 🎨 **User Interface** - * **Dark Mode Only**: Professional dark theme optimized for extended usage - * **Mobile-First Design**: Optimized keyboard handling and touch interactions - * **Responsive Layout**: Adaptive sidebar and chat interface for all screen sizes - * **Glass Morphism**: Modern backdrop blur effects and translucent components - -### 🤖 **AI Capabilities** - * **Multi-Model Support**: DeepSeek R1, Llama 3.1 (soon), and Llava 1.5 integration - * **Deep Thinking Mode**: Advanced reasoning display for DeepSeek R1 models - * **Memory Mode Toggle**: Control conversation context and AI memory - * **Real-Time Streaming**: Live response streaming with thinking process visualization - -### 📱 **Mobile Optimization** - * **Stable Keyboard Handling**: Fixed positioning without layout jumps - * **Touch-Friendly Controls**: Optimized button sizes and interactions - * **iOS Safari Compatible**: Proper viewport handling and scroll behavior - * **Mobile Controls**: Dedicated mobile interface with simplified controls - -### 💾 **Data Management** - * **Local Storage**: Browser-based chat history with privacy protection - * **Session Management**: Multiple concurrent chat sessions + * **Advanced AI Persona**: Interact with "Eureka," an AI configured with a detailed system prompt for professional, accurate, and context-aware responses. + * **Local-First Chat History**: Create, load, and delete multiple chat histories that are stored exclusively in the user's browser, ensuring privacy and fast access. + * **Frontend-Managed Context Isolation**: Guarantees that conversations remain separate and coherent by only sending the active chat's history to the AI, even while using a single static server session. + * **Toggleable Memory Mode**: A UI switch gives users direct control over the AI's conversational memory, allowing them to choose between deep, context-aware dialogue or quick, single-turn queries. + * **Response Aggregation & Selection**: The backend intelligently processes responses from multiple decentralized AI miners, filters out invalid data, and selects the most complete answer to present to the user. + * **Modern & Responsive UI**: Built with Shadcn/UI and Tailwind CSS, featuring a multi-line input, clear loading states, and a clean, responsive design. ## 🏛️ Architecture Overview -### **Frontend Architecture** -- **Next.js 15**: App Router with TypeScript and Tailwind CSS -- **State Management**: React hooks with localStorage persistence -- **Component System**: Shadcn/UI with custom mobile-optimized components -- **Responsive Design**: CSS Grid and Flexbox with mobile-first approach +This application uses a unique and efficient architecture to solve common challenges in decentralized networks: -### **Backend Integration** -- **Cortensor API**: Direct integration with decentralized AI network -- **Response Aggregation**: Intelligent filtering and selection of best responses -- **Error Handling**: Comprehensive error management and fallback systems -- **Rate Limiting**: Built-in request throttling and queue management - -### **Mobile Features** -- **Keyboard Detection**: Advanced mobile keyboard state management -- **Fixed Positioning**: Stable chat input without transform-based positioning -- **Touch Optimization**: Enhanced touch targets and gesture handling +1. **Static Server Session**: The application utilizes a single, static `session_id` (defined in `.env.local`) for all communications with the Cortensor network. This eliminates the need for complex on-chain session creation for each user, making the app instantly available. +2. **Client-Side History Management**: All chat histories ("New Chat" instances) are managed as separate entries in the browser's `localStorage`. The "New Chat" button is a client-side only operation. +3. **Context Isolation at the Source**: To prevent context mixing, the frontend is responsible for sending **only the relevant message history** of the currently active chat to the backend. This ensures the AI's context is always clean and specific to the ongoing conversation. ## 📋 Prerequisites -Before running this application, ensure you have: -### **System Requirements** - * **Node.js 18+**: Latest LTS version recommended - * **pnpm**: Package manager (faster than npm/yarn) - * **Git**: For version control and repository management +Before running this application, you must have access to a fully operational Cortensor backend infrastructure. The core requirements are: -### **Cortensor Network Access** - * **Cortensor API Endpoint**: Access to Testnet or Devnet6 - * **Session ID**: Valid session identifier for API calls - * **Network Configuration**: Proper environment variables setup + * A configured **Cortensor Node** + * **cortensord**: The Cortensor daemon service. + * A running **Router Node** that the web application can connect to. -For Cortensor Network setup, follow the **[Official Documentation](https://docs.cortensor.network/)**. +For complete, step-by-step instructions on setting up this backend, please follow the official **[Router Node Setup Guide](https://docs.cortensor.network/getting-started/installation-and-setup/router-node-setup)**. ## 🔧 Installation & Setup -### **Quick Start** +This project is located within the `Cortensor Community Projects` monorepo. Follow these steps to set it up. + +1. **Clone the Main Repository** + Clone the central hub where all community projects reside. -1. **Clone the Repository** ```bash git clone https://github.com/cortensor/community-projects.git - cd community-projects/apps/eurekaai + cd community-projects ``` -2. **Install Dependencies** +2. **Navigate to the Project Directory** + This web app is located in the `apps/` directory. + ```bash - pnpm install - # or - npm install + cd apps/cortensor-chatweb-eureka ``` -3. **Environment Configuration** - Create `.env.local` file in the root directory: - ```env - # App Configuration - NEXT_PUBLIC_APP_NAME="Eureka AI" - NEXT_PUBLIC_APP_VERSION="1.0.0" - - # Cortensor API Configuration (Replace with your actual server) - CORTENSOR_ROUTER_URL="http://your_cortensor_router_ip:5010" - NEXT_PUBLIC_CORTENSOR_COMPLETIONS_URL="http://your_cortensor_router_ip:5010/api/v1/completions" +3. **Install Dependencies** + From the **root** of the `community-projects` monorepo, run the pnpm install command. This will install dependencies for all projects, including this one. - # Session IDs (Configure based on your Cortensor setup) - NEXT_PUBLIC_LLM_SESSION_ID=1 - NEXT_PUBLIC_DEEPSEEK_SESSION_ID=2 + ```bash + # Run this from the root directory: /community-projects/apps/cortensor-chatweb-eureka + apt install npm + npm install -g pnpm + pnpm install --force + ``` + +4. **Configure Environment Variables** + Create a file named `.env.local` in the root directory and populate it with your credentials. + ```ini + # App Configuration + NEXT_PUBLIC_APP_NAME="Cortensor AI Chat" + NEXT_PUBLIC_APP_VERSION="1.1.0" + + # Cortensor API Configuration (ensure your router URL is correct) + CORTENSOR_ROUTER_URL="http://your_router_ip:5010" + CORTENSOR_API_KEY="your_api_key_here" + NEXT_PUBLIC_CORTENSOR_COMPLETIONS_URL="http://your_router_ip:5010/api/v1/completions" + + # Static Session IDs used by models + # Default Model (Llava 1.5) Session ID + NEXT_PUBLIC_LLAVA_SESSION_ID=5 + + # Deepseek R1 Session ID + NEXT_PUBLIC_DEEPSEEK_SESSION_ID=6 + + # Llama 3.1 8B Q4 Session ID + NEXT_PUBLIC_LLAMA_SESSION_ID=7 + + # LLM Parameters + NEXT_PUBLIC_MAX_INPUT_LENGTH= + LLM_TIMEOUT= + LLM_MAX_TOKENS= ``` ## 🚀 Usage @@ -125,20 +119,12 @@ Once the configuration is complete, run the development server: pnpm dev ``` +The application will be available at [http://localhost:3000](https://www.google.com/search?q=http://localhost:3000). Open it in your browser; a "New Chat" will be created automatically, and you can begin your conversation. + ## 👤 Maintainer * **@beranalpagion** (Discord) ## 📄 License -This project is licensed under the MIT License. See the `LICENSE` file for details. - -## 🤝 Contributing - -Contributions are welcome! Please feel free to submit a Pull Request. - ---- - -
-Built with ❤️ for the Cortensor Community -
+This project is licensed under the MIT License. See the `LICENSE` file for more details. diff --git a/apps/Cortensor-EurekaAI/RELEASE.md b/apps/Cortensor-EurekaAI/RELEASE.md index d963d31..d4a9c67 100644 --- a/apps/Cortensor-EurekaAI/RELEASE.md +++ b/apps/Cortensor-EurekaAI/RELEASE.md @@ -1,78 +1,22 @@ -# Release Notes +# Release Notes: Version 1.1.0 -## Latest Release - Mobile Optimization & Dark Mode Focus +**Release Date:** July 10, 2025 -**Release Date:** August 8, 2025 +This version marks a significant milestone for the **Cortensor AI Chat** application. The architecture has been completely overhauled to ensure stability, reliability, and a superior user experience. The primary focus of this release was to resolve critical issues related to response handling and session management. -This major release transforms Eureka AI into a mobile-first, professional dark-mode application with advanced keyboard handling and user experience improvements. +## ✨ New Features & Improvements -### ✨ Major Features +* **Robust Response Aggregation**: The backend logic has been rewritten from the ground up. It now correctly processes the raw data stream from the Cortensor network, aggregates responses from all available miners, and intelligently selects the most complete and accurate answer to be presented to the user. +* **Local-First Chat History**: The application now fully embraces a client-side architecture for chat histories. + * **Static Session ID**: Utilizes a single, persistent session ID from the environment variables, eliminating the slow and unreliable on-chain session creation process during initialization. + * **Client-Side "New Chat"**: The "New Chat" button is now a purely local operation, creating a new, independent conversation history in the browser's storage without any server calls. +* **Frontend Context Isolation**: Implemented a crucial logic change where the application only sends the message history of the *currently active chat* to the AI. This completely prevents context mixing between different local conversations, even though they share the same server session ID. +* **Toggleable Memory Mode**: Users now have direct control over the AI's conversational memory via a UI switch, allowing for both deep, context-aware dialogues and quick, single-turn queries. +* **Enhanced Error Handling**: Improved user-facing error messages to be more specific, distinguishing between network timeouts and a lack of response from miners. -#### **🌙 Dark Mode Only** -- **Forced Dark Theme**: Removed light mode entirely for consistent professional appearance -- **Theme Toggle Removal**: Simplified interface without theme switching complexity -- **Optimized CSS**: Streamlined styling with dark-mode specific optimizations +## 🐛 Bug Fixes -#### **📱 Advanced Mobile Optimization** -- **Stable Keyboard Handling**: Fixed positioning system prevents layout jumps when keyboard appears -- **iOS Safari Compatibility**: Proper dynamic viewport height (100dvh) handling -- **Android Keyboard Support**: Optimized for various Android input methods -- **Touch-First Interface**: 48px minimum touch targets for accessibility compliance - -#### **🎨 UI/UX Improvements** -- **Chat History Truncation**: Limited chat titles to 22 characters to prevent sidebar overflow -- **Glass Morphism Effects**: Modern backdrop blur and translucent components -- **Responsive Typography**: Optimized font sizes and line heights for mobile reading -- **Performance Optimizations**: Reduced bundle size and improved loading times - -### 🔧 Technical Improvements - -- **Fixed Positioning System**: Chat input uses stable positioning without transform-based movements -- **Debounced Keyboard Detection**: Smooth keyboard state management without performance issues -- **Optimized Rendering**: Reduced unnecessary re-renders and improved memory usage -- **Enhanced Error Handling**: Better error messages and recovery mechanisms - -### 🐛 Bug Fixes - -- **Mobile Layout Jumps**: Eliminated content shifting when mobile keyboard appears/disappears -- **Sidebar Overflow**: Fixed long chat titles breaking sidebar layout -- **Touch Target Issues**: Improved button sizes and touch responsiveness -- **iOS Scroll Issues**: Fixed momentum scrolling and safe area handling - ---- - -## Previous Release - DeepSeek R1 Integration - -**Release Date:** August 5, 2025 - -Major update focusing on advanced AI model integration and reasoning capabilities. - -### ✨ Major Features - -#### **🏗️ Robust Response Aggregation** -- **Rewritten Backend Logic**: Complete overhaul of response processing system -- **Multi-Miner Support**: Intelligent aggregation from multiple Cortensor miners -- **Smart Response Selection**: Automatic selection of most complete and accurate responses - -#### **💾 Local-First Architecture** -- **Static Session Management**: Single persistent session ID from environment variables -- **Client-Side Chat History**: Browser-based storage for privacy and speed -- **Context Isolation**: Prevents conversation mixing between different chat sessions - -#### **🎛️ Enhanced User Controls** -- **Memory Mode Toggle**: Direct user control over AI conversational memory -- **Improved Error Messages**: More specific and actionable error feedback -- **Better Loading States**: Clear indication of application status - -### 🐛 Critical Bug Fixes - -- **"No Valid Responses" Error**: Fixed parsing issues with mixed data streams -- **UI Initialization Lock**: Eliminated startup hanging on "Initializing..." screen -- **Disappearing Chat Messages**: Resolved state management issues causing message loss -- **Inconsistent AI Memory**: Fixed conflicting dual-prompt system behavior - -### 🔧 Technical Improvements - -- **Frontend State Management**: Cleaner, more maintainable React state logic -- **Error Handling**: Comprehensive error tracking and user feedback -- **Performance**: Faster startup times and improved responsiveness +* **Resolved "No Valid Responses" Error**: Fixed the critical bug where the backend would fail to parse the mixed data stream from miners. The new aggregation logic ensures a valid response is always selected if one is available. +* **Fixed UI Initialization Lock**: By removing the dynamic, on-chain session creation at startup, the application no longer gets stuck on the "Initializing..." screen. +* **Resolved Disappearing Chat Bug**: Corrected the frontend state management logic to prevent the user's last message from disappearing while waiting for an AI response. +* **Fixed Inconsistent AI Memory**: Removed the conflicting dual-prompt system in the backend. The AI's memory is now exclusively controlled by the "Memory Mode" switch on the frontend, ensuring its behavior is always predictable. diff --git a/apps/Cortensor-EurekaAI/STATUS.md b/apps/Cortensor-EurekaAI/STATUS.md index 0633f4f..9ec67ab 100644 --- a/apps/Cortensor-EurekaAI/STATUS.md +++ b/apps/Cortensor-EurekaAI/STATUS.md @@ -1,59 +1,28 @@ # Project Status -This document outlines the current status and development priorities for **Cortensor EUREKA AI**. +This document outlines the current status and development priorities for the **Cortensor AI Chat** application. ## 🟢 Current Status -* **Version:** `1.2.0` -* **Status:** `Production Ready` -* **Last Updated:** `August 8, 2025` -* **Description:** Professional dark-mode AI chat interface with advanced mobile optimization and DeepSeek R1 integration. The application is stable, fully functional, and ready for production deployment. +* **Version:** `1.1.0` +* **Status:** `Stable & Active` +* **Description:** The application's core architecture is stable and fully functional. It successfully utilizes a static session ID and local-first chat histories with frontend-managed context isolation. Development is now focused on enhancements and new features. --- -## ✅ Recently Completed Features +## 🗺️ Development Priorities -### **Mobile Optimization (v1.2.0)** -- ✅ **Stable Keyboard Handling**: Fixed positioning without layout jumps -- ✅ **iOS Safari Compatibility**: Proper dynamic viewport height handling -- ✅ **Android Support**: Optimized for various mobile keyboards -- ✅ **Touch Interface**: 48px minimum touch targets and gesture support +Here is a high-level overview of our planned features and improvements, organized by priority. -### **UI/UX Improvements (v1.1.8)** -- ✅ **Dark Mode Only**: Removed light mode, professional dark theme -- ✅ **Chat History Truncation**: Limited titles to prevent sidebar overflow -- ✅ **Glass Morphism**: Modern backdrop blur effects -- ✅ **Theme Toggle Removal**: Simplified interface without theme switching +### **Immediate Priorities (Up Next)** +* **UI/UX Polish**: Refine the chat history panel to ensure all UI elements, including the delete button, are consistently visible and functional regardless of title length. +* **Smarter Error Messaging**: Implement more specific user-facing error messages to clearly distinguish between a network timeout and a situation where all miners genuinely provided no response. -### **AI Integration (v1.1.5)** -- ✅ **DeepSeek R1 Support**: Advanced reasoning mode with thinking process -- ✅ **Multi-Model Support**: Llava 1.5, Llama 3.1, DeepSeek R1 -- ✅ **Memory Mode Toggle**: Conversation context control -- ✅ **Real-Time Streaming**: Live response streaming with thinking visualization +### **Next Steps (Coming Soon)** +* **Simplified API Endpoint**: Explore a non-streaming endpoint for chat completions as an alternative to increase reliability in different network conditions. +* **Model Configuration**: Add UI options for users to select different AI models or adjust LLM parameters (e.g., temperature, max tokens). +* **Code Refactoring**: Clean up the frontend state management for better maintainability and long-term scalability. ---- - -## 🗺️ Development Roadmap - -### **Current Sprint (v1.2.x)** -- 🔄 **Performance Optimization**: Reduce bundle size and improve loading times -- 🔄 **Error Handling**: Enhanced user-facing error messages and recovery -- 🔄 **Accessibility**: WCAG 2.1 compliance improvements -- 📋 **Testing Suite**: Comprehensive unit and integration tests - -### **Next Release (v1.3.0)** -- 📋 **Chat Export**: JSON/Markdown export functionality -- 📋 **Session Persistence**: Cloud backup integration -- 📋 **Advanced Settings**: Model parameter customization - -### **Future Releases (v2.x)** -- 📋 **Web3 Integration**: Wallet connectivity and blockchain sessions -- 📋 **Multi-Language**: i18n support for global audience -- 📋 **Plugin System**: Extensible functionality framework - ---- - -## 🐛 Known Issues - -### **Minor Issues** -- None currently reported +### **Future Goals (Long-Term)** +* **Full Web3 Integration**: Introduce wallet connectivity to allow users to create and manage sessions directly on the blockchain. +* **Multi-User Support**: Explore user authentication for distinct user profiles and private chat histories. diff --git a/apps/Cortensor-EurekaAI/eslint.config.mjs b/apps/Cortensor-EurekaAI/eslint.config.mjs new file mode 100644 index 0000000..d143d88 --- /dev/null +++ b/apps/Cortensor-EurekaAI/eslint.config.mjs @@ -0,0 +1,23 @@ +import next from 'eslint-config-next' + +/** + * Next.js 16 ships a flat ESLint config. We spread its defaults so we can + * append project-specific tweaks later without losing the upstream settings. + */ +const config = next.map((entry) => { + if (!('rules' in entry) || !entry.rules) { + return entry + } + + return { + ...entry, + rules: { + ...entry.rules, + 'react-hooks/exhaustive-deps': 'off', + 'react-hooks/purity': 'off', + 'react-hooks/set-state-in-effect': 'off', + }, + } +}) + +export default config diff --git a/apps/Cortensor-EurekaAI/next.config.mjs b/apps/Cortensor-EurekaAI/next.config.mjs index cada9d1..ba10324 100644 --- a/apps/Cortensor-EurekaAI/next.config.mjs +++ b/apps/Cortensor-EurekaAI/next.config.mjs @@ -1,18 +1,11 @@ /** @type {import('next').NextConfig} */ const nextConfig = { - eslint: { - ignoreDuringBuilds: true, - }, typescript: { ignoreBuildErrors: true, }, images: { unoptimized: true, }, - // Allow cross-origin requests for development - experimental: { - allowedRevalidateHeaderKeys: ['x-vercel-cache'], - }, async headers() { return [ { diff --git a/apps/Cortensor-EurekaAI/package.json b/apps/Cortensor-EurekaAI/package.json index c5a67c4..0d28945 100644 --- a/apps/Cortensor-EurekaAI/package.json +++ b/apps/Cortensor-EurekaAI/package.json @@ -2,11 +2,12 @@ "name": "eureka-cortensor-chat", "version": "1.0.0", "private": true, - "description": "Eureka - AI Chatbot with Cortensor Network integration (Devnet-6)", + "description": "Eureka - AI Chatbot with Cortensor Network integration (Devnet-7)", "scripts": { "build": "next build", "dev": "next dev", - "lint": "next lint", + "dev:poll": "WATCHPACK_POLLING=true NEXT_WEBPACK_USEPOLLING=true next dev", + "lint": "eslint . --max-warnings=0", "start": "next start" }, "dependencies": { @@ -49,7 +50,7 @@ "highlight.js": "^11.11.1", "input-otp": "1.4.1", "lucide-react": "^0.454.0", - "next": "15.2.4", + "next": "^16.0.8", "next-themes": "^0.4.4", "react": "^19", "react-day-picker": "8.10.1", @@ -70,8 +71,11 @@ "@types/node": "^22", "@types/react": "^19", "@types/react-dom": "^19", + "eslint": "9.14.0", + "eslint-config-next": "^16.0.8", "postcss": "^8.5", "tailwindcss": "^3.4.17", "typescript": "^5" - } + }, + "packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748" } diff --git a/apps/Cortensor-EurekaAI/pnpm-lock.yaml b/apps/Cortensor-EurekaAI/pnpm-lock.yaml index 69477c0..b54e7f5 100644 --- a/apps/Cortensor-EurekaAI/pnpm-lock.yaml +++ b/apps/Cortensor-EurekaAI/pnpm-lock.yaml @@ -126,8 +126,8 @@ importers: specifier: ^0.454.0 version: 0.454.0(react@19.1.1) next: - specifier: 15.2.4 - version: 15.2.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^16.0.8 + version: 16.0.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-themes: specifier: ^0.4.4 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -183,6 +183,12 @@ importers: '@types/react-dom': specifier: ^19 version: 19.1.7(@types/react@19.1.9) + eslint: + specifier: 9.14.0 + version: 9.14.0(jiti@1.21.7) + eslint-config-next: + specifier: ^16.0.8 + version: 16.0.8(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) postcss: specifier: ^8.5 version: 8.5.6 @@ -202,12 +208,123 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/runtime@7.28.2': resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} - '@emnapi/runtime@1.4.5': - resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.7.0': + resolution: {integrity: sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.14.0': + resolution: {integrity: sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -229,107 +346,155 @@ packages: peerDependencies: react-hook-form: ^7.0.0 - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -341,6 +506,9 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -351,53 +519,59 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@next/env@15.2.4': - resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@next/env@16.0.8': + resolution: {integrity: sha512-xP4WrQZuj9MdmLJy3eWFHepo+R3vznsMSS8Dy3wdA7FKpjCiesQ6DxZvdGziQisj0tEtCgBKJzjcAc4yZOgLEQ==} + + '@next/eslint-plugin-next@16.0.8': + resolution: {integrity: sha512-1miV0qXDcLUaOdHridVPCh4i39ElRIAraseVIbb3BEqyZ5ol9sPyjTP/GNTPV5rBxqxjF6/vv5zQTVbhiNaLqA==} - '@next/swc-darwin-arm64@15.2.4': - resolution: {integrity: sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==} + '@next/swc-darwin-arm64@16.0.8': + resolution: {integrity: sha512-yjVMvTQN21ZHOclQnhSFbjBTEizle+1uo4NV6L4rtS9WO3nfjaeJYw+H91G+nEf3Ef43TaEZvY5mPWfB/De7tA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.2.4': - resolution: {integrity: sha512-3qK2zb5EwCwxnO2HeO+TRqCubeI/NgCe+kL5dTJlPldV/uwCnUgC7VbEzgmxbfrkbjehL4H9BPztWOEtsoMwew==} + '@next/swc-darwin-x64@16.0.8': + resolution: {integrity: sha512-+zu2N3QQ0ZOb6RyqQKfcu/pn0UPGmg+mUDqpAAEviAcEVEYgDckemOpiMRsBP3IsEKpcoKuNzekDcPczEeEIzA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.2.4': - resolution: {integrity: sha512-HFN6GKUcrTWvem8AZN7tT95zPb0GUGv9v0d0iyuTb303vbXkkbHDp/DxufB04jNVD+IN9yHy7y/6Mqq0h0YVaQ==} + '@next/swc-linux-arm64-gnu@16.0.8': + resolution: {integrity: sha512-LConttk+BeD0e6RG0jGEP9GfvdaBVMYsLJ5aDDweKiJVVCu6sGvo+Ohz9nQhvj7EQDVVRJMCGhl19DmJwGr6bQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.2.4': - resolution: {integrity: sha512-Oioa0SORWLwi35/kVB8aCk5Uq+5/ZIumMK1kJV+jSdazFm2NzPDztsefzdmzzpx5oGCJ6FkUC7vkaUseNTStNA==} + '@next/swc-linux-arm64-musl@16.0.8': + resolution: {integrity: sha512-JaXFAlqn8fJV+GhhA9lpg6da/NCN/v9ub98n3HoayoUSPOVdoxEEt86iT58jXqQCs/R3dv5ZnxGkW8aF4obMrQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.2.4': - resolution: {integrity: sha512-yb5WTRaHdkgOqFOZiu6rHV1fAEK0flVpaIN2HB6kxHVSy/dIajWbThS7qON3W9/SNOH2JWkVCyulgGYekMePuw==} + '@next/swc-linux-x64-gnu@16.0.8': + resolution: {integrity: sha512-O7M9it6HyNhsJp3HNAsJoHk5BUsfj7hRshfptpGcVsPZ1u0KQ/oVy8oxF7tlwxA5tR43VUP0yRmAGm1us514ng==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.2.4': - resolution: {integrity: sha512-Dcdv/ix6srhkM25fgXiyOieFUkz+fOYkHlydWCtB0xMST6X9XYI3yPDKBZt1xuhOytONsIFJFB08xXYsxUwJLw==} + '@next/swc-linux-x64-musl@16.0.8': + resolution: {integrity: sha512-8+KClEC/GLI2dLYcrWwHu5JyC5cZYCFnccVIvmxpo6K+XQt4qzqM5L4coofNDZYkct/VCCyJWGbZZDsg6w6LFA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.2.4': - resolution: {integrity: sha512-dW0i7eukvDxtIhCYkMrZNQfNicPDExt2jPb9AZPpL7cfyUo7QSNl1DjsHjmmKp6qNAqUESyT8YFl/Aw91cNJJg==} + '@next/swc-win32-arm64-msvc@16.0.8': + resolution: {integrity: sha512-rpQ/PgTEgH68SiXmhu/cJ2hk9aZ6YgFvspzQWe2I9HufY6g7V02DXRr/xrVqOaKm2lenBFPNQ+KAaeveywqV+A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.2.4': - resolution: {integrity: sha512-SbnWkJmkS7Xl3kre8SdMF6F/XDh1DTFEhp0jRTj/uB8iPKoU2bb2NDfcu+iifv1+mxQEd1g2vvSxcZbXSKyWiQ==} + '@next/swc-win32-x64-msvc@16.0.8': + resolution: {integrity: sha512-jWpWjWcMQu2iZz4pEK2IktcfR+OA9+cCG8zenyLpcW8rN4rzjfOzH4yj/b1FiEAZHKS+5Vq8+bZyHi+2yqHbFA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -421,6 +595,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1263,8 +1441,8 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -1274,6 +1452,9 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/d3-array@3.2.1': resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} @@ -1313,6 +1494,12 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -1339,12 +1526,179 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/eslint-plugin@8.48.1': + resolution: {integrity: sha512-X63hI1bxl5ohelzr0LY5coufyl0LJNthld+abwxpCoo6Gq+hSqhKwci7MUWkXo67mzgUK6YFByhmaHmUcuBJmA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.48.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.48.1': + resolution: {integrity: sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.48.1': + resolution: {integrity: sha512-HQWSicah4s9z2/HifRPQ6b6R7G+SBx64JlFQpgSSHWPKdvCZX57XCbszg/bapbRsOEv42q5tayTYcEFpACcX1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.48.1': + resolution: {integrity: sha512-rj4vWQsytQbLxC5Bf4XwZ0/CKd362DkWMUkviT7DCS057SK64D5lH74sSGzhI6PDD2HCEq02xAP9cX68dYyg1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.48.1': + resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.48.1': + resolution: {integrity: sha512-1jEop81a3LrJQLTf/1VfPQdhIY4PlGDBc/i67EVWObrtvcziysbLN3oReexHOM6N3jyXgCrkBsZpqwH0hiDOQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.48.1': + resolution: {integrity: sha512-+fZ3LZNeiELGmimrujsDCT4CRIbq5oXdHe7chLiW8qzqyPMnn1puNstCrMNVAqwcl2FdIxkuJ4tOs/RFDBVc/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.48.1': + resolution: {integrity: sha512-/9wQ4PqaefTK6POVTjJaYS0bynCgzh6ClJHGSBj06XEHjkfylzB+A3qvyaXnErEZSaxhIo4YdyBgq6j4RysxDg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.48.1': + resolution: {integrity: sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.48.1': + resolution: {integrity: sha512-BmxxndzEWhE4TIEEMBs8lP3MBWN3jFPs/p6gPm/wkv02o41hI6cq9AuSmGAaTTHPtA1FTi2jBre4A9rm5ZmX+Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} + cpu: [x64] + os: [win32] + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1371,10 +1725,56 @@ packages: arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} engines: {node: '>=10'} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + autoprefixer@10.4.21: resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} @@ -1382,6 +1782,18 @@ packages: peerDependencies: postcss: ^8.1.0 + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.11.0: + resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -1392,6 +1804,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -1404,9 +1819,21 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} @@ -1418,6 +1845,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -1457,13 +1888,6 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -1471,6 +1895,12 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1527,9 +1957,32 @@ packages: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -1545,12 +1998,23 @@ packages: decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} detect-node-es@1.1.0: @@ -1565,9 +2029,17 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -1593,42 +2065,235 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - - ethers@6.15.0: - resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==} - engines: {node: '>=14.0.0'} + eslint-config-next@16.0.8: + resolution: {integrity: sha512-8J5cOAboXIV3f8OD6BOyj7Fik6n/as7J4MboiUSExWruf/lCu1OPR3ZVSdnta6WhzebrmAATEmNSBZsLWA6kbg==} + peerDependencies: + eslint: '>=9.0.0' + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true - fast-equals@5.2.2: - resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} - engines: {node: '>=6.0.0'} + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.14.0: + resolution: {integrity: sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + ethers@6.15.0: + resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==} + engines: {node: '>=14.0.0'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-equals@5.2.2: + resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} + engines: {node: '>=6.0.0'} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -1644,10 +2309,40 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1660,6 +2355,48 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1676,6 +2413,12 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + highlight.js@11.11.1: resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} engines: {node: '>=12.0.0'} @@ -1683,6 +2426,22 @@ packages: html-url-attributes@3.0.1: resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} @@ -1692,6 +2451,10 @@ packages: react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + internmap@2.0.3: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} @@ -1702,17 +2465,45 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -1720,10 +2511,18 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1731,6 +2530,18 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1739,9 +2550,52 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -1752,6 +2606,51 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -1759,6 +2658,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -1784,6 +2687,9 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lucide-react@0.454.0: resolution: {integrity: sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==} peerDependencies: @@ -1792,6 +2698,10 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -1929,10 +2839,16 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1948,19 +2864,27 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + next-themes@0.4.6: resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} peerDependencies: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@15.2.4: - resolution: {integrity: sha512-VwL+LAaPSxEkd3lU2xWbgEOtrM8oedmyhBqaVNmgKB+GvZlCy9rgaEc+y2on0wv+l0oSFqLtYD6dcC1eAedUaQ==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.0.8: + resolution: {integrity: sha512-LmcZzG04JuzNXi48s5P+TnJBsTGPJunViNKV/iE4uM6kstjTQsQhvsAv+xF6MJxU2Pr26tl15eVbp0jQnsv6/g==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 + '@playwright/test': ^1.51.1 babel-plugin-react-compiler: '*' react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -1994,12 +2918,64 @@ packages: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2018,6 +2994,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -2026,6 +3006,10 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -2075,12 +3059,20 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} property-information@7.1.0: resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2182,6 +3174,14 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + rehype-highlight@7.0.2: resolution: {integrity: sha512-k158pK7wdC2qL3M5NcZROZ2tR/l7zOzjxXd5VGdcfIyoijjQqpHd3JKtYSBDpDZ38UI2WJWuFAtkMDxmx5kstA==} @@ -2197,11 +3197,22 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2209,16 +3220,44 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -2229,13 +3268,26 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sonner@1.7.4: resolution: {integrity: sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==} peerDependencies: @@ -2249,9 +3301,12 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -2261,6 +3316,29 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} @@ -2272,6 +3350,14 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + style-to-js@1.1.17: resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} @@ -2296,6 +3382,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -2313,6 +3403,9 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -2323,6 +3416,10 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2333,20 +3430,60 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript-eslint@8.48.1: + resolution: {integrity: sha512-FbOKN1fqNoXp1hIl5KYpObVrp0mCn+CLgn479nmu2IsRMrx2vyv74MmsBLVlhg8qVwNFGbXSp8fh1zp8pEoC2A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.9.2: resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} @@ -2374,12 +3511,18 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -2423,11 +3566,31 @@ packages: victory-vendor@36.9.2: resolution: {integrity: sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==} + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2448,11 +3611,24 @@ packages: utf-8-validate: optional: true + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.8.0: resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} engines: {node: '>= 14.6'} hasBin: true + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -2465,12 +3641,167 @@ snapshots: '@alloc/quick-lru@5.2.0': {} + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + '@babel/runtime@7.28.2': {} - '@emnapi/runtime@1.4.5': + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.14.0(jiti@1.21.7))': + dependencies: + eslint: 9.14.0(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.18.0': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.7.0': {} + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.14.0': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.2.8': dependencies: - tslib: 2.8.1 - optional: true + '@eslint/core': 0.13.0 + levn: 0.4.1 '@floating-ui/core@1.7.3': dependencies: @@ -2493,79 +3824,112 @@ snapshots: dependencies: react-hook-form: 7.62.0(react@19.1.1) - '@img/sharp-darwin-arm64@0.33.5': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@img/colour@1.0.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-arm64': 1.2.4 optional: true - '@img/sharp-darwin-x64@0.33.5': + '@img/sharp-darwin-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + '@img/sharp-libvips-linux-ppc64@1.2.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + '@img/sharp-libvips-linux-riscv64@1.2.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + '@img/sharp-libvips-linux-s390x@1.2.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + '@img/sharp-libvips-linux-x64@1.2.4': optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + '@img/sharp-libvips-linuxmusl-x64@1.2.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 optional: true - '@img/sharp-linux-arm64@0.33.5': + '@img/sharp-linux-ppc64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 optional: true - '@img/sharp-linux-arm@0.33.5': + '@img/sharp-linux-riscv64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-riscv64': 1.2.4 optional: true - '@img/sharp-linux-s390x@0.33.5': + '@img/sharp-linux-s390x@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 optional: true - '@img/sharp-linux-x64@0.33.5': + '@img/sharp-linux-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.2.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + '@img/sharp-linuxmusl-arm64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + '@img/sharp-linuxmusl-x64@0.34.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 optional: true - '@img/sharp-wasm32@0.33.5': + '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.4.5 + '@emnapi/runtime': 1.7.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': optional: true - '@img/sharp-win32-ia32@0.33.5': + '@img/sharp-win32-ia32@0.34.5': optional: true - '@img/sharp-win32-x64@0.33.5': + '@img/sharp-win32-x64@0.34.5': optional: true '@isaacs/cliui@8.0.2': @@ -2582,6 +3946,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.4': {} @@ -2591,30 +3960,41 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.4 - '@next/env@15.2.4': {} + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@next/env@16.0.8': {} - '@next/swc-darwin-arm64@15.2.4': + '@next/eslint-plugin-next@16.0.8': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@16.0.8': optional: true - '@next/swc-darwin-x64@15.2.4': + '@next/swc-darwin-x64@16.0.8': optional: true - '@next/swc-linux-arm64-gnu@15.2.4': + '@next/swc-linux-arm64-gnu@16.0.8': optional: true - '@next/swc-linux-arm64-musl@15.2.4': + '@next/swc-linux-arm64-musl@16.0.8': optional: true - '@next/swc-linux-x64-gnu@15.2.4': + '@next/swc-linux-x64-gnu@16.0.8': optional: true - '@next/swc-linux-x64-musl@15.2.4': + '@next/swc-linux-x64-musl@16.0.8': optional: true - '@next/swc-win32-arm64-msvc@15.2.4': + '@next/swc-win32-arm64-msvc@16.0.8': optional: true - '@next/swc-win32-x64-msvc@15.2.4': + '@next/swc-win32-x64-msvc@16.0.8': optional: true '@noble/curves@1.2.0': @@ -2635,6 +4015,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@nolyfill/is-core-module@1.0.39': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -3490,7 +4872,7 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@swc/counter@0.1.3': {} + '@rtsao/scc@1.1.0': {} '@swc/helpers@0.5.15': dependencies: @@ -3504,6 +4886,11 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.17 + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/d3-array@3.2.1': {} '@types/d3-color@3.1.3': {} @@ -3542,6 +4929,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -3568,10 +4959,174 @@ snapshots: '@types/unist@3.0.3': {} + '@typescript-eslint/eslint-plugin@8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/type-utils': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/utils': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.48.1 + eslint: 9.14.0(jiti@1.21.7) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.48.1 + debug: 4.4.1 + eslint: 9.14.0(jiti@1.21.7) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.48.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.2) + '@typescript-eslint/types': 8.48.1 + debug: 4.4.1 + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.48.1': + dependencies: + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 + + '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + debug: 4.4.1 + eslint: 9.14.0(jiti@1.21.7) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.48.1': {} + + '@typescript-eslint/typescript-estree@8.48.1(typescript@5.9.2)': + dependencies: + '@typescript-eslint/project-service': 8.48.1(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.48.1(typescript@5.9.2) + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/visitor-keys': 8.48.1 + debug: 4.4.1 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.48.1 + '@typescript-eslint/types': 8.48.1 + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) + eslint: 9.14.0(jiti@1.21.7) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.48.1': + dependencies: + '@typescript-eslint/types': 8.48.1 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + optional: true + + '@unrs/resolver-binding-android-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.11.1': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + aes-js@4.0.0-beta.5: {} + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -3591,10 +5146,85 @@ snapshots: arg@5.0.2: {} + argparse@2.0.1: {} + aria-hidden@1.2.6: dependencies: tslib: 2.8.1 + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + ast-types-flow@0.0.8: {} + + async-function@1.0.0: {} + autoprefixer@10.4.21(postcss@8.5.6): dependencies: browserslist: 4.25.1 @@ -3605,12 +5235,25 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.11.0: {} + + axobject-query@4.1.0: {} + bail@2.0.2: {} balanced-match@1.0.2: {} binary-extensions@2.3.0: {} + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -3626,9 +5269,24 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) - busboy@1.6.0: + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: dependencies: - streamsearch: 1.1.0 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -3636,6 +5294,11 @@ snapshots: ccount@2.0.1: {} + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} @@ -3682,22 +5345,14 @@ snapshots: color-name@1.1.4: {} - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - optional: true - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - optional: true - comma-separated-tokens@2.0.3: {} commander@4.1.1: {} + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3746,8 +5401,32 @@ snapshots: d3-timer@3.0.1: {} + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + date-fns@4.1.0: {} + debug@3.2.7: + dependencies: + ms: 2.1.3 + debug@4.4.1: dependencies: ms: 2.1.3 @@ -3758,9 +5437,23 @@ snapshots: dependencies: character-entities: 2.0.2 + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dequal@2.0.3: {} - detect-libc@2.0.4: + detect-libc@2.1.2: optional: true detect-node-es@1.1.0: {} @@ -3773,11 +5466,21 @@ snapshots: dlv@1.1.3: {} + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.28.2 csstype: 3.1.3 + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + eastasianwidth@0.2.0: {} electron-to-chromium@1.5.194: {} @@ -3796,14 +5499,321 @@ snapshots: emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} + emoji-regex@9.2.2: {} + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-next@16.0.8(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2): + dependencies: + '@next/eslint-plugin-next': 16.0.8 + eslint: 9.14.0(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.14.0(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.14.0(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.14.0(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.14.0(jiti@1.21.7)) + eslint-plugin-react-hooks: 7.0.1(eslint@9.14.0(jiti@1.21.7)) + globals: 16.4.0 + typescript-eslint: 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.14.0(jiti@1.21.7)): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.1 + eslint: 9.14.0(jiti@1.21.7) + get-tsconfig: 4.13.0 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.15 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.14.0(jiti@1.21.7)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.14.0(jiti@1.21.7)): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + eslint: 9.14.0(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.14.0(jiti@1.21.7)) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-typescript@3.10.1)(eslint@9.14.0(jiti@1.21.7)): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.14.0(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.14.0(jiti@1.21.7)) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@9.14.0(jiti@1.21.7)): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.11.0 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 9.14.0(jiti@1.21.7) + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@7.0.1(eslint@9.14.0(jiti@1.21.7)): + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + eslint: 9.14.0(jiti@1.21.7) + hermes-parser: 0.25.1 + zod: 3.25.76 + zod-validation-error: 4.0.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + eslint-plugin-react@7.37.5(eslint@9.14.0(jiti@1.21.7)): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 9.14.0(jiti@1.21.7) + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.14.0(jiti@1.21.7): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.14.0(jiti@1.21.7)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.7.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.14.0 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.7 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 - escalade@3.2.0: {} + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 - escape-string-regexp@5.0.0: {} + estraverse@5.3.0: {} estree-util-is-identifier-name@3.0.0: {} + esutils@2.0.3: {} + ethers@6.15.0: dependencies: '@adraffy/ens-normalize': 1.10.1 @@ -3821,8 +5831,18 @@ snapshots: extend@3.0.2: {} + fast-deep-equal@3.1.3: {} + fast-equals@5.2.2: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3831,14 +5851,42 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -3851,8 +5899,51 @@ snapshots: function-bind@1.1.2: {} + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -3870,6 +5961,37 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + globals@14.0.0: {} + + globals@16.4.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -3909,10 +6031,27 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + highlight.js@11.11.1: {} html-url-attributes@3.0.1: {} + ignore@5.3.2: {} + + ignore@7.0.5: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + inline-style-parser@0.2.4: {} input-otp@1.4.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): @@ -3920,6 +6059,12 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + internmap@2.0.3: {} is-alphabetical@2.0.1: {} @@ -3929,35 +6074,143 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-arrayish@0.3.2: - optional: true + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.7.3 + + is-callable@1.2.7: {} + is-core-module@2.16.1: dependencies: hasown: 2.0.2 + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-decimal@2.0.1: {} is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-hexadecimal@2.0.1: {} + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-plain-obj@4.1.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + isexe@2.0.0: {} + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -3968,10 +6221,54 @@ snapshots: js-tokens@4.0.0: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash.castarray@4.4.0: {} lodash.isplainobject@4.0.6: {} @@ -3994,12 +6291,18 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + lucide-react@0.454.0(react@19.1.1): dependencies: react: 19.1.1 markdown-table@3.0.4: {} + math-intrinsics@1.1.0: {} + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -4351,10 +6654,16 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 + minimist@1.2.8: {} + minipass@7.1.2: {} ms@2.1.3: {} @@ -4367,32 +6676,34 @@ snapshots: nanoid@3.3.11: {} + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + next-themes@0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - next@15.2.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next@16.0.8(@babel/core@7.28.5)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: - '@next/env': 15.2.4 - '@swc/counter': 0.1.3 + '@next/env': 16.0.8 '@swc/helpers': 0.5.15 - busboy: 1.6.0 caniuse-lite: 1.0.30001731 postcss: 8.4.31 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - styled-jsx: 5.1.6(react@19.1.1) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.1.1) optionalDependencies: - '@next/swc-darwin-arm64': 15.2.4 - '@next/swc-darwin-x64': 15.2.4 - '@next/swc-linux-arm64-gnu': 15.2.4 - '@next/swc-linux-arm64-musl': 15.2.4 - '@next/swc-linux-x64-gnu': 15.2.4 - '@next/swc-linux-x64-musl': 15.2.4 - '@next/swc-win32-arm64-msvc': 15.2.4 - '@next/swc-win32-x64-msvc': 15.2.4 - sharp: 0.33.5 + '@next/swc-darwin-arm64': 16.0.8 + '@next/swc-darwin-x64': 16.0.8 + '@next/swc-linux-arm64-gnu': 16.0.8 + '@next/swc-linux-arm64-musl': 16.0.8 + '@next/swc-linux-x64-gnu': 16.0.8 + '@next/swc-linux-x64-musl': 16.0.8 + '@next/swc-win32-arm64-msvc': 16.0.8 + '@next/swc-win32-x64-msvc': 16.0.8 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -4407,8 +6718,75 @@ snapshots: object-hash@3.0.0: {} + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -4419,6 +6797,8 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + path-exists@4.0.0: {} + path-key@3.1.1: {} path-parse@1.0.7: {} @@ -4432,10 +6812,14 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.3: {} + pify@2.3.0: {} pirates@4.0.7: {} + possible-typed-array-names@1.1.0: {} + postcss-import@15.1.0(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -4484,6 +6868,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + prelude-ls@1.2.1: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -4492,6 +6878,8 @@ snapshots: property-information@7.1.0: {} + punycode@2.3.1: {} + queue-microtask@1.2.3: {} react-day-picker@8.10.1(date-fns@4.1.0)(react@19.1.1): @@ -4606,6 +6994,26 @@ snapshots: tiny-invariant: 1.3.3 victory-vendor: 36.9.2 + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + rehype-highlight@7.0.2: dependencies: '@types/hast': 3.0.4 @@ -4648,48 +7056,105 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + reusify@1.1.0: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + scheduler@0.26.0: {} - semver@7.7.2: - optional: true + semver@6.3.1: {} + + semver@7.7.3: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 - sharp@0.33.5: + set-proto@1.0.0: dependencies: - color: 4.2.3 - detect-libc: 2.0.4 - semver: 7.7.2 + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.3 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 optional: true shebang-command@2.0.0: @@ -4698,12 +7163,35 @@ snapshots: shebang-regex@3.0.0: {} - signal-exit@4.1.0: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 - simple-swizzle@0.2.2: + side-channel-map@1.0.1: dependencies: - is-arrayish: 0.3.2 - optional: true + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} sonner@1.7.4(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: @@ -4714,7 +7202,12 @@ snapshots: space-separated-tokens@2.0.2: {} - streamsearch@1.1.0: {} + stable-hash@0.0.5: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 string-width@4.2.3: dependencies: @@ -4728,6 +7221,56 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 @@ -4741,6 +7284,10 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + style-to-js@1.1.17: dependencies: style-to-object: 1.0.9 @@ -4749,10 +7296,12 @@ snapshots: dependencies: inline-style-parser: 0.2.4 - styled-jsx@5.1.6(react@19.1.1): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.1.1): dependencies: client-only: 0.0.1 react: 19.1.1 + optionalDependencies: + '@babel/core': 7.28.5 sucrase@3.35.0: dependencies: @@ -4764,6 +7313,10 @@ snapshots: pirates: 4.0.7 ts-interface-checker: 0.1.13 + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} tailwind-merge@2.6.0: {} @@ -4799,6 +7352,8 @@ snapshots: transitivePeerDependencies: - ts-node + text-table@0.2.0: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -4809,6 +7364,11 @@ snapshots: tiny-invariant@1.3.3: {} + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4817,14 +7377,80 @@ snapshots: trough@2.2.0: {} + ts-api-utils@2.1.0(typescript@5.9.2): + dependencies: + typescript: 5.9.2 + ts-interface-checker@0.1.13: {} + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.7.0: {} tslib@2.8.1: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript-eslint@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.48.1(@typescript-eslint/parser@8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/parser': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.48.1(typescript@5.9.2) + '@typescript-eslint/utils': 8.48.1(eslint@9.14.0(jiti@1.21.7))(typescript@5.9.2) + eslint: 9.14.0(jiti@1.21.7) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + typescript@5.9.2: {} + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + undici-types@6.19.8: {} undici-types@6.21.0: {} @@ -4867,12 +7493,40 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + unrs-resolver@1.11.1: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.1.9)(react@19.1.1): dependencies: react: 19.1.1 @@ -4930,10 +7584,53 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + which@2.0.2: dependencies: isexe: 2.0.0 + word-wrap@1.2.5: {} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -4948,8 +7645,16 @@ snapshots: ws@8.17.1: {} + yallist@3.1.1: {} + yaml@2.8.0: {} + yocto-queue@0.1.0: {} + + zod-validation-error@4.0.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod@3.25.76: {} zwitch@2.0.4: {} diff --git a/apps/Cortensor-EurekaAI/src/app/api/chat/route.ts b/apps/Cortensor-EurekaAI/src/app/api/chat/route.ts index d60471d..6cc1619 100644 --- a/apps/Cortensor-EurekaAI/src/app/api/chat/route.ts +++ b/apps/Cortensor-EurekaAI/src/app/api/chat/route.ts @@ -18,14 +18,19 @@ const modelFilters = { /<\/?thinking>/gi, /Final Response:|final response:/gi, /<\|USER\|>[\s\S]*?<\|ASSISTANT\|>/gi, + /<\|USER\|>/gi, + /<\|ASSISTANT\|>/gi, + /<\/s>/gi, /USER[\s\S]*?ASSISTANT/gi, + /^\s*user\s*:/gi, + /^\s*assistant\s*:/gi, ], preserveCodeBlocks: true }, 'deepseek-r1': { name: 'Deepseek R1', removeThinkingBlocks: true, // Remove thinking blocks - removeVerbosePatterns: false, + removeVerbosePatterns: true, cleanupPatterns: [ /[\s\S]*?<\/thinking>/gi, /<\/?thinking>/gi, @@ -33,6 +38,34 @@ const modelFilters = { /<\/think>/gi, // Remove stray tags //gi, // Remove stray tags /\s*<\/think>\s*/gi, // Remove with surrounding whitespace + // LLaMA-style special tokens that may appear in distill outputs + /<\|begin_of_text\|>/gi, + /<\|end_of_text\|>/gi, + /<\|start_header_id\|>[\s\S]*?<\|end_header_id\|>/gi, + /<\|eot_id\|>/gi, + /<\|USER\|>[\s\S]*?<\|ASSISTANT\|>/gi, + /<\|USER\|>/gi, + /<\|ASSISTANT\|>/gi, + /^\s*assistant\s*:/gi, + /^\s*user\s*:/gi, + ], + preserveCodeBlocks: true + }, + 'llama-3.1-8b-q4': { + name: 'Llama 3.1 8B Q4', + removeThinkingBlocks: true, + removeVerbosePatterns: true, + cleanupPatterns: [ + /<\|begin_of_text\|>/gi, + /<\|end_of_text\|>/gi, + /<\|start_header_id\|>[\s\S]*?<\|end_header_id\|>/gi, + /<\|eot_id\|>/gi, + /<\|USER\|>[\s\S]*?<\|ASSISTANT\|>/gi, + /<\|USER\|>/gi, + /<\|ASSISTANT\|>/gi, + /<\/s>/gi, + /^\s*assistant\s*:/gi, + /^\s*user\s*:/gi, ], preserveCodeBlocks: true } @@ -46,17 +79,58 @@ function applyModelFilters(text: string, modelId: string, isDeepThinking: boolea // For DeepSeek R1 - extract thinking process from start to if (modelId === 'deepseek-r1') { + // First, remove any leaked LLaMA special tokens and headers + filteredText = filteredText.replace(/<\|begin_of_text\|>|<\|end_of_text\|>|<\|eot_id\|>/gi, ''); + filteredText = filteredText.replace(/<\|start_header_id\|>[\s\S]*?<\|end_header_id\|>/gi, ''); + filteredText = filteredText.replace(/<\|USER\|>[\s\S]*?<\|ASSISTANT\|>/gi, ''); + filteredText = filteredText.replace(/<\|USER\|>/gi, ''); + filteredText = filteredText.replace(/<\|ASSISTANT\|>/gi, ''); + filteredText = filteredText.replace(/^\s*assistant\s*:/gi, ''); + filteredText = filteredText.replace(/^\s*user\s*:/gi, ''); + + // If output contains multiple turns, keep ONLY the last assistant/user segment + const findLastIndex = (text: string, patterns: RegExp[]): { idx: number; len: number } => { + let last = -1; let len = 0; + for (const p of patterns) { + let m: RegExpExecArray | null; + const r = new RegExp(p.source, p.flags.includes('g') ? p.flags : p.flags + 'g'); + while ((m = r.exec(text)) !== null) { + last = m.index; len = m[0].length; + } + } + return { idx: last, len }; + }; + const lastAssistant = findLastIndex(filteredText, [/<\|ASSISTANT\|>/i, /\n\s*Assistant\s*:/i]); + const lastUser = findLastIndex(filteredText, [/<\|USER\|>/i, /\n\s*User\s*:/i]); + let startFrom = 0; + if (lastAssistant.idx >= 0) startFrom = lastAssistant.idx + lastAssistant.len; + else if (lastUser.idx >= 0) startFrom = lastUser.idx + lastUser.len; + if (startFrom > 0) { + filteredText = filteredText.slice(startFrom).trimStart(); + } + + // Prefer post- when present; otherwise keep pre- content as the answer + const thinkStartIndex = filteredText.indexOf(''); const thinkEndIndex = filteredText.indexOf(''); if (thinkEndIndex !== -1) { - // Extract thinking process (from start to ) - const thinkingContent = filteredText.substring(0, thinkEndIndex).trim(); - // Extract main response (after ) - const mainResponse = filteredText.substring(thinkEndIndex + 8).trim(); // 8 = length of '' + // Extract thinking process (from start to ) + let thinkingContent = filteredText.substring(0, thinkEndIndex).trim(); + // Clean stray markers inside thinking + thinkingContent = thinkingContent + .replace(/^\s*/i, '') + .replace(/<\|USER\|>|<\|ASSISTANT\|>/gi, '') + .replace(/^\s*(user|assistant)\s*:\s*/gi, '') + .replace(/<\|begin_of_text\|>|<\|end_of_text\|>|<\|eot_id\|>/gi, '') + .replace(/<|end▁of▁sentence|>/g, '') + .replace(/<\|end_of_sentence\|>/g, '') + .trim(); + // Extract main response (after ) + const mainResponse = filteredText.substring(thinkEndIndex + 8).trim(); // 8 = length of '' if (showThinkingProcess && thinkingContent && thinkingContent.length > 0) { - // Show thinking process as built-in feature for DeepSeek - return `🧠 **Thinking Process:**\n\n${thinkingContent}\n\n---\n\n**Response:**\n\n${mainResponse}`; + // Show thinking process with cleaner section headers + return `🧠 Thinking Process\n\n${thinkingContent}\n\n---\n\nResponse\n\n${mainResponse}`; } else { // Only show main response, hide thinking process return mainResponse && mainResponse.length > 0 ? mainResponse : filteredText; @@ -65,7 +139,7 @@ function applyModelFilters(text: string, modelId: string, isDeepThinking: boolea // Fallback: if no found, return as-is if showing thinking, or clean if not if (!showThinkingProcess) { - filteredText = filteredText.replace(/<\/?think>/gi, ''); + filteredText = filteredText.replace(/<\/??think>/gi, ''); } return filteredText.trim(); @@ -75,6 +149,11 @@ function applyModelFilters(text: string, modelId: string, isDeepThinking: boolea for (const pattern of modelConfig.cleanupPatterns) { filteredText = filteredText.replace(pattern, ''); } + // Remove end-of-sentence marker variants globally + filteredText = filteredText.replace(/<|end▁of▁sentence|>/g, ''); + filteredText = filteredText.replace(/<\|end_of_sentence\|>/g, ''); + // Remove generic EOS `` used by some LLMs + filteredText = filteredText.replace(/<\/s>/gi, ''); // Remove thinking blocks (always for default, conditionally for deepseek) if (modelConfig.removeThinkingBlocks) { @@ -128,10 +207,60 @@ function applyModelFilters(text: string, modelId: string, isDeepThinking: boolea return filteredText; } +// Relevance filter: remove echoed user question, role markers, and repeated sentences +function enforceRelevanceAndDedup(answerText: string, userMessage: string): string { + try { + let text = String(answerText || ''); + const norm = (s: string) => s.toLowerCase() + .replace(/<\|user\|>|<\|assistant\|>/gi, '') + .replace(/user\s*:|assistant\s*:/gi, '') + .replace(/[^a-z0-9]+/gi, ' ') + .trim(); + + const userNorm = norm(userMessage || ''); + + // Remove obvious context/preamble lines + text = text + .replace(/^as an ai[\s\S]*?\.?\s*/gi, '') + .replace(/^as a language model[\s\S]*?\.?\s*/gi, '') + .replace(/^context\s*:\s*[\s\S]*?\n/gi, '') + .replace(/^q\s*:\s*/gim, '') + .replace(/^a\s*:\s*/gim, ''); + + // Split into sentences while preserving order + const sentences = text + .split(/(?<=[.!?])\s+/) + .map(s => s.trim()) + .filter(Boolean); + + const seen = new Set(); + const result: string[] = []; + + for (const s of sentences) { + const sNorm = norm(s); + // Drop if it's the same as the user's question or contains it heavily + if (sNorm === userNorm) continue; + if (userNorm && sNorm.length > 0 && (sNorm.includes(userNorm) || userNorm.includes(sNorm))) continue; + // Deduplicate globally by normalized sentence + if (seen.has(sNorm)) continue; + seen.add(sNorm); + result.push(s); + } + + // If still very long with many sentences, keep first 3 for relevance + if (result.length > 3) { + return result.slice(0, 3).join(' ').trim(); + } + return result.join(' ').trim(); + } catch { + return String(answerText || '').trim(); + } +} + // Llava 1.5 processing (for default model) function processLlavaStream(textChunk: string, model: string, isDeepThinking: boolean): string { - // For default model streaming, preserve original formatting to maintain proper spacing - if (model === 'default-model') { + // For default and llama models streaming, preserve original formatting to maintain proper spacing + if (model === 'default-model' || model === 'llama-3.1-8b-q4') { // Only apply minimal cleaning without affecting spacing let cleanedText = textChunk; @@ -140,6 +269,13 @@ function processLlavaStream(textChunk: string, model: string, isDeepThinking: bo cleanedText = cleanedText.replace(/<\/?thinking>/gi, ''); cleanedText = cleanedText.replace(/<\/think>/gi, ''); cleanedText = cleanedText.replace(//gi, ''); + // Remove llama special tokens if they leak into chunks + cleanedText = cleanedText.replace(/<\|begin_of_text\|>|<\|end_of_text\|>|<\|eot_id\|>/gi, ''); + cleanedText = cleanedText.replace(/<\|start_header_id\|>[\s\S]*?<\|end_header_id\|>/gi, ''); + cleanedText = cleanedText.replace(/<\/s>/gi, ''); + // Remove end-of-sentence markers + cleanedText = cleanedText.replace(/<|end▁of▁sentence|>/g, ''); + cleanedText = cleanedText.replace(/<\|end_of_sentence\|>/g, ''); // Return original text with minimal cleaning to preserve streaming format return cleanedText; @@ -151,8 +287,30 @@ function processLlavaStream(textChunk: string, model: string, isDeepThinking: bo // DeepSeek R1 advanced processing (for deepseek model) function processDeepSeekStream(textChunk: string, model: string, isDeepThinking: boolean, showThinkingProcess: boolean = false): string { - // For DeepSeek R1, always return raw content - frontend will handle formatting - return textChunk; + let cleaned = textChunk; + // If not showing thinking, remove blocks and tags + if (!showThinkingProcess) { + cleaned = cleaned.replace(/[\s\S]*?<\/thinking>/gi, ''); + cleaned = cleaned.replace(/<\/?thinking>/gi, ''); + cleaned = cleaned.replace(/<\/think>/gi, ''); + cleaned = cleaned.replace(//gi, ''); + cleaned = cleaned.replace(/\s*<\/think>\s*/gi, ' '); + } + // Remove any leaked LLaMA special tokens + cleaned = cleaned.replace(/<\|begin_of_text\|>|<\|end_of_text\|>|<\|eot_id\|>/gi, ''); + cleaned = cleaned.replace(/<\|start_header_id\|>[\s\S]*?<\|end_header_id\|>/gi, ''); + cleaned = cleaned.replace(/<\/s>/gi, ''); + cleaned = cleaned.replace(/<\|USER\|>[\s\S]*?<\|ASSISTANT\|>/gi, ''); + cleaned = cleaned.replace(/^\s*assistant\s*:/gi, ''); + // Remove end-of-sentence markers + cleaned = cleaned.replace(/<|end▁of▁sentence|>/g, ''); + cleaned = cleaned.replace(/<\|end_of_sentence\|>/g, ''); + // If role markers for a new turn are present in a chunk, truncate before them to avoid cross-turn bleed + const roleCut = cleaned.match(/<\|USER\|>|<\|ASSISTANT\|>|\n\s*User\s*:|\n\s*Assistant\s*:/i); + if (roleCut && roleCut.index !== undefined && roleCut.index >= 0) { + cleaned = cleaned.slice(0, roleCut.index); + } + return cleaned; } // Rate limiting in-memory store (for edge runtime) @@ -213,7 +371,20 @@ export async function POST(req: NextRequest) { return new Response("Invalid JSON format", { status: 400 }); } - const { message, messages, model, useDeepThinking = false, isDeepThinking = false, showThinkingProcess = true, cortensorSessionId, environment: requestEnvironment, rawOutput = false } = requestBody; + const { + message, + messages, + model, + useDeepThinking = false, + isDeepThinking = false, + showThinkingProcess = true, + cortensorSessionId, + environment: requestEnvironment, + rawOutput = false, + enableMemory = false, + chatHistory = [], + nonStreaming = false + } = requestBody; // Handle both single message and messages array formats let userMessage = ''; @@ -268,21 +439,22 @@ export async function POST(req: NextRequest) { useDeepThinking: deepThinking }); - if (model === 'deepseek-r1') { + if (model === 'deepseek-r1') { sessionId = envConfig.deepseekSession; isDeepseekR1 = true; apiLogger.debug('Using Deepseek R1 mode'); - } else if (model === 'meta-llama-3.1') { + } else if (model === 'llama-3.1-8b-q4') { sessionId = envConfig.llamaSession; isLlama3_1 = true; - apiLogger.debug('Using Meta-Llama-3.1 mode'); + apiLogger.debug('Using Llama 3.1 mode'); } else { apiLogger.debug('Using Default model (Llava 1.5)'); } - // Determine which prompt to use + // Determine which prompt to use let systemPrompt: string; - const maxTokens = 20000; + // Use a lower token cap for DeepSeek to encourage concise answers + const maxTokens = isDeepseekR1 ? 2048 : 20000; if (isDeepseekR1) { if (deepThinking) { @@ -297,9 +469,51 @@ export async function POST(req: NextRequest) { systemPrompt = appConfig.prompts.default.systemPrompt; } - // Format prompt + // Helpers: sanitize previous contents from leaked control tokens before re-injecting + const sanitizeForPrompt = (text: string): string => { + let t = String(text ?? ''); + // strip known special/control tokens and thinking tags that could confuse the new turn + t = t.replace(/<\|begin_of_text\|>|<\|end_of_text\|>|<\|eot_id\|>/gi, ''); + t = t.replace(/<\|start_header_id\|>[\s\S]*?<\|end_header_id\|>/gi, ''); + t = t.replace(/<\|USER\|>|<\|ASSISTANT\|>/gi, ''); + t = t.replace(/<\/s>/gi, ''); + t = t.replace(/[\s\S]*?<\/thinking>/gi, ''); + t = t.replace(/<\/?thinking>/gi, ''); + t = t.replace(/<\/think>/gi, ''); + t = t.replace(//gi, ''); + t = t.replace(/<|end▁of▁sentence|>/g, ''); + t = t.replace(/<\|end_of_sentence\|>/g, ''); + return t.trim(); + }; + + // Build history chunk if Memory Mode is enabled + let historyPrompt = ''; + if (enableMemory && Array.isArray(chatHistory) && chatHistory.length > 0) { + // Keep only {role, content} pairs for user/assistant, drop system or others + type ChatMsg = { role: string; content: string }; + const cleaned: ChatMsg[] = (chatHistory as ChatMsg[]) + .filter(m => m && typeof m.content === 'string' && (m.role === 'user' || m.role === 'assistant')) + // prevent duplicates or empty + .map(m => ({ role: m.role, content: sanitizeForPrompt(m.content) })) + .filter(m => m.content.length > 0); + + // Cap history to avoid overly long prompts: last 12 messages or ~6000 chars + const MAX_MSGS = 12; + const sliced = cleaned.slice(-MAX_MSGS); + // Additionally cap by characters + const MAX_CHARS = 6000; + let running = ''; + for (const m of sliced) { + const chunk = `${m.role === 'assistant' ? '<|ASSISTANT|>' : '<|USER|>'}\n${m.content}\n`; + if ((running.length + chunk.length) > MAX_CHARS) break; + running += chunk; + } + historyPrompt = running; + } + + // Format final prompt with optional memory const clientReference = `${Date.now()}${Math.random().toString(36).substr(2, 9)}`; - const formattedPrompt = systemPrompt + '\n<|USER|>\n' + userMessage + '\n<|ASSISTANT|>\n'; + const formattedPrompt = `${systemPrompt}\n${historyPrompt}${historyPrompt ? '' : ''}<|USER|>\n${sanitizeForPrompt(userMessage)}\n<|ASSISTANT|>\n`; const apiUrl = `${envConfig.cortensorUrl}/api/v1/completions`; const apiKey = envConfig.cortensorApiKey; @@ -326,7 +540,7 @@ export async function POST(req: NextRequest) { prompt: formattedPrompt, prompt_type: 1, prompt_template: "", - stream: true, // Enable streaming for real-time text extraction + stream: nonStreaming ? false : true, // Allow client to disable streaming timeout: parseInt(process.env.LLM_TIMEOUT || process.env.LLM_DEFAULT_TIMEOUT || '360', 10), client_reference: clientReference, max_tokens: maxTokens, @@ -334,7 +548,9 @@ export async function POST(req: NextRequest) { top_p: 0.95, top_k: 40, presence_penalty: 0, - frequency_penalty: 0 + frequency_penalty: 0, + // Stop tokens to prevent the model from adding new user/assistant turns or leaking control tokens + stop: ["\nUser:", "\nAssistant:", "<|eot_id|>", "<|USER|>", "<|ASSISTANT|>"] }; apiLogger.debug('Making request to Cortensor API', { @@ -343,7 +559,10 @@ export async function POST(req: NextRequest) { timeout: payload.timeout, isStreaming: payload.stream, rawOutputDefault: true, - streamingDisabled: 'Always disabled - RAW JSON is default for all models' + streamingDisabled: nonStreaming ? 'Client requested non-streaming' : 'Always disabled - RAW JSON is default for all models', + enableMemory, + historyIncluded: historyPrompt.length > 0, + historyLengthChars: historyPrompt.length }); let cortensorResponse: Response; @@ -359,7 +578,7 @@ export async function POST(req: NextRequest) { headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${apiKey}`, - 'Accept': 'text/event-stream', // Use streaming for real-time text extraction + 'Accept': nonStreaming ? 'application/json' : 'text/event-stream', // Request JSON in non-streaming mode 'Connection': 'keep-alive', }, body: JSON.stringify(payload), @@ -401,7 +620,7 @@ export async function POST(req: NextRequest) { responseHeaders: Object.fromEntries(cortensorResponse.headers.entries()) }); - // First, let's get the raw response to debug what we're actually receiving + // First, let's get the raw response to debug what we're actually receiving const responseText = await cortensorResponse.text(); apiLogger.info('Raw response from Cortensor', { responseLength: responseText.length, @@ -409,6 +628,107 @@ export async function POST(req: NextRequest) { isJSON: responseText.trim().startsWith('{') }); + // If client asked nonStreaming, parse once and return JSON + if (nonStreaming) { + let jsonResponse: any; + try { + jsonResponse = JSON.parse(responseText); + } catch (parseError) { + apiLogger.error('Failed to parse non-streaming response as JSON', { parseError, preview: responseText.substring(0, 600) }); + return new Response("Invalid JSON from upstream", { status: 502 }); + } + + // Extract text content + let textContent = ''; + if (jsonResponse.choices && jsonResponse.choices[0]) { + const choice = jsonResponse.choices[0]; + if (typeof choice.text === 'string') textContent = choice.text; + else if (choice.message?.content) textContent = choice.message.content; + } else if (jsonResponse.response) { + textContent = jsonResponse.response; + } else if (jsonResponse.content) { + textContent = jsonResponse.content; + } else if (typeof jsonResponse === 'string') { + textContent = jsonResponse; + } + + if (!textContent) { + apiLogger.error('No text content in non-streaming response', { keys: Object.keys(jsonResponse) }); + return new Response("No content from upstream", { status: 502 }); + } + + // For DeepSeek, split thinking and answer for UI + let thinkingContent: string | undefined = undefined; + let answerText = textContent; + + if (model === 'deepseek-r1') { + // Pre-clean tokens first + let cleaned = textContent + .replace(/<\|begin_of_text\|>|<\|end_of_text\|>|<\|eot_id\|>/gi, '') + .replace(/<\|start_header_id\|>[\s\S]*?<\|end_header_id\|>/gi, '') + .replace(/<\/s>/gi, '') + .replace(/<\|USER\|>[\s\S]*?<\|ASSISTANT\|>/gi, '') + .replace(/<|end▁of▁sentence|>/g, '') + .replace(/<\|end_of_sentence\|>/g, ''); + // If any role markers for a new turn appear, hard truncate before them + const roleMarkerIdx = (() => { + const m = cleaned.match(/<\|USER\|>|<\|ASSISTANT\|>|\n\s*User\s*:|\n\s*Assistant\s*:/i); + return m && m.index !== undefined ? m.index : -1; + })(); + if (roleMarkerIdx > -1) { + cleaned = cleaned.slice(0, roleMarkerIdx); + } + // If output contains multiple turns, select the last assistant/user segment + const findLastIndex = (text: string, patterns: RegExp[]): { idx: number; len: number } => { + let last = -1; let len = 0; + for (const p of patterns) { + let m: RegExpExecArray | null; + const r = new RegExp(p.source, p.flags.includes('g') ? p.flags : p.flags + 'g'); + while ((m = r.exec(text)) !== null) { last = m.index; len = m[0].length; } + } + return { idx: last, len }; + }; + const lastAssistant = findLastIndex(cleaned, [/<\|ASSISTANT\|>/i, /\n\s*Assistant\s*:/i]); + const lastUser = findLastIndex(cleaned, [/<\|USER\|>/i, /\n\s*User\s*:/i]); + let segment = cleaned; + if (lastAssistant.idx >= 0) segment = cleaned.slice(lastAssistant.idx + lastAssistant.len); + else if (lastUser.idx >= 0) segment = cleaned.slice(lastUser.idx + lastUser.len); + + // Extract think/answer from the chosen segment + const startIdx = segment.indexOf(''); + const idx = segment.indexOf(''); + if (idx > -1) { + // Prefer post-think as final answer; keep pre-think text only for thinking panel + thinkingContent = (startIdx > -1 ? segment.substring(startIdx, idx) : segment.substring(0, idx)) + .replace(/^\s*/i, '') + .replace(/<\|USER\|>|<\|ASSISTANT\|>/gi, '') + .replace(/^\s*(user|assistant)\s*:\s*/gi, '') + .trim(); + answerText = segment.substring(idx + 8).trim(); + } else { + // No explicit think block; show entire content as answer + answerText = segment.trim(); + } + // Finally apply generic filters to the answer and trim for conciseness + answerText = applyModelFilters(answerText, model, deepThinking, false); + // Ensure relevance and remove echoed user question / duplicates + answerText = enforceRelevanceAndDedup(answerText, userMessage); + // Enforce concise style: collapse whitespace and limit to ~1200 chars + answerText = answerText.replace(/\s+$/g, '').replace(/\n{3,}/g, '\n\n'); + if (answerText.length > 1200) { + answerText = answerText.slice(0, 1200).trimEnd() + '…'; + } + } else { + answerText = applyModelFilters(textContent, model, deepThinking, showThinkingProcess); + answerText = enforceRelevanceAndDedup(answerText, userMessage); + } + + const body = JSON.stringify({ content: answerText, thinkingContent }); + return new Response(body, { + headers: { 'Content-Type': 'application/json' } + }); + } + if (!isStreamingResponse) { // Handle non-streaming JSON response and convert to streaming format apiLogger.info('Converting JSON response to streaming format'); @@ -584,6 +904,10 @@ export async function POST(req: NextRequest) { if (model === 'deepseek-r1') { filteredText = processDeepSeekStream(textContent, model, deepThinking, showThinkingProcess); finalText = filteredText; + } else if (model === 'llama-3.1-8b-q4') { + // For Llama 3.1 variants, use minimally cleaned text to avoid leaking special tokens + filteredText = processLlavaStream(textContent, model, deepThinking); + finalText = filteredText; } else { // For default model, preserve original text for proper streaming format filteredText = processLlavaStream(textContent, model, deepThinking); diff --git a/apps/Cortensor-EurekaAI/src/app/page.tsx b/apps/Cortensor-EurekaAI/src/app/page.tsx index 4420487..a0187c6 100644 --- a/apps/Cortensor-EurekaAI/src/app/page.tsx +++ b/apps/Cortensor-EurekaAI/src/app/page.tsx @@ -38,7 +38,7 @@ function CortensorAIChatInner() { const { environment, setEnvironment } = useEnvironment(); const { toast } = useToast(); const [isMemoryMode, setIsMemoryMode] = useState(true); - const [selectedModel, setSelectedModelState] = useState('default-model'); + const [selectedModel, setSelectedModelState] = useState('llama-3.1-8b-q4'); const [isDeepThinking, setIsDeepThinking] = useState(false); const [isThinkingPhase, setIsThinkingPhase] = useState(false); const [pendingModelChange, setPendingModelChange] = useState<{ @@ -47,6 +47,7 @@ function CortensorAIChatInner() { } | null>(null); const [isModelChanging, setIsModelChanging] = useState(false); const [isConfirmingModelChange, setIsConfirmingModelChange] = useState(false); + const [sessionSort, setSessionSort] = useState<'recent' | 'unread'>('recent'); const isMobile = useIsMobile(); // Helper function to save current model sessions while preserving others @@ -128,6 +129,15 @@ function CortensorAIChatInner() { if (!modelExists) { throw new Error(`Model ${modelId} not found in app config`); } + + // Apply model presets (prompt, deep thinking, memory) + if (modelExists.preset) { + setIsDeepThinking(!!modelExists.preset.deepThinking); + setIsMemoryMode(modelExists.preset.memory !== false); + if (modelExists.preset.prompt && !input.trim()) { + setInput(modelExists.preset.prompt); + } + } // Safe model update with timeout protection const updateTimer = setTimeout(() => { @@ -207,7 +217,7 @@ function CortensorAIChatInner() { // Show toast notification toast({ title: "Environment Changed", - description: `Switched to ${newEnv === 'testnet' ? 'L3 Testnet' : 'Devnet6'}. Changes will apply to new messages.`, + description: `Switched to ${newEnv === 'testnet' ? 'Testnet0' : 'Devnet-7'}. Changes will apply to new messages.`, duration: 3000, }); }, [setEnvironment, toast, environment]); @@ -430,6 +440,19 @@ function CortensorAIChatInner() { }, [selectedModel, toast, saveModelSessions, generateUniqueId]); useEffect(() => { + // Log initial load/reload for visibility in console + try { + const navEntry = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming | undefined; + const navType = navEntry?.type || (performance as any).navigation?.type; + frontendLogger.info('Page load event', { + navType: typeof navType === 'number' ? navType : navType || 'unknown', + path: window.location.pathname, + search: window.location.search, + }); + } catch (error) { + frontendLogger.warn('Navigation log failed', { error }); + } + const initializeApp = async () => { try { frontendLogger.info('Initializing application'); @@ -452,7 +475,7 @@ function CortensorAIChatInner() { needsMigration = true; return { ...session, - selectedModel: 'default-model' // Default to Llava 1.5 + selectedModel: 'llama-3.1-8b-q4' // Default to Meta-Llama 3.1 8B Q4 }; } return session; @@ -495,6 +518,14 @@ function CortensorAIChatInner() { activeSessionId: sessionToLoad.id, selectedModel: savedModel // Use user's selection, not session's model }); + const currentModel = appConfig.chat.models.find(m => m.id === savedModel); + if (currentModel?.preset) { + setIsDeepThinking(!!currentModel.preset.deepThinking); + setIsMemoryMode(currentModel.preset.memory !== false); + if (currentModel.preset.prompt && !input.trim()) { + setInput(currentModel.preset.prompt); + } + } } else { frontendLogger.info('No existing sessions found, creating new chat'); // Create new chat inline to avoid circular dependency @@ -533,7 +564,7 @@ function CortensorAIChatInner() { cortensorSessionId: appConfig.chat.staticSessionId, title: "New Chat", messages: [], - selectedModel: 'default-model', + selectedModel: 'llama-3.1-8b-q4', createdAt: new Date(), updatedAt: new Date(), }; @@ -669,6 +700,9 @@ function CortensorAIChatInner() { const selectedModelData = appConfig.chat.models.find(m => m.id === selectedModel); const sessionId = selectedModelData?.sessionId || appConfig.chat.staticSessionId; + // Include latest user turn in history when memory mode is enabled + const historyToSend = enableMemory ? [...messages, userMessage] : []; + const response = await fetch('/api/chat', { method: 'POST', headers: { @@ -682,8 +716,10 @@ function CortensorAIChatInner() { model: selectedModel, isDeepThinking, showThinkingProcess: selectedModel.includes('deepseek-r1'), // Always true for DeepSeek - chatHistory: enableMemory ? messages : [], - environment: environment + chatHistory: historyToSend, + environment: environment, + // Stream for Llama, non-stream for others + nonStreaming: selectedModel === 'llama-3.1-8b-q4' ? false : true }), }); @@ -692,6 +728,79 @@ function CortensorAIChatInner() { throw new Error(`API request failed: ${response.status} ${response.statusText}. ${errorText}`); } + // If API returns JSON (non-stream), parse once and finish + const contentType = response.headers.get('Content-Type') || ''; + if (contentType.includes('application/json')) { + const data = await response.json(); + let contentText: string = (data?.content || data?.response || data?.text || '').toString(); + let thinkingText: string | undefined = data?.thinkingContent; + + // Summarize DeepSeek thinking in English for display + const summarizeThinking = (thinking: string, userMsg: string): string => { + const clean = (thinking || '').replace(/\s+/g, ' ').trim(); + if (!clean) return ''; + const um = (userMsg || '').trim(); + const firstSentence = clean.split(/(?<=[.!?])\s+/)[0]?.slice(0, 160) || ''; + const lc = clean.toLowerCase(); + const bullets: string[] = []; + const ctxSnippet = (um || firstSentence).replace(/^[\u2212\-•\s]+/, '').slice(0, 160); + bullets.push('Thinking summary:'); + bullets.push(`- Context: ${ctxSnippet}`); + if (/(step|plan|approach|strategy|first|second|third|1\.|2\.|3\.)/i.test(lc)) bullets.push('- Laying out a solution plan'); + if (/(assumption|assume|if|suppose)/i.test(lc)) bullets.push('- Establishing key assumptions'); + if (/(risk|edge\s*case|limitation|constraint|ambiguity)/i.test(lc)) bullets.push('- Considering risks and limitations'); + if (/(check|validate|relevant|compare|verify|confirm)/i.test(lc)) bullets.push('- Validating relevance and consistency'); + if (/(formula|compute|calculate|estimation|derivation|reasoning)/i.test(lc)) bullets.push('- Performing calculations/reasoning'); + + const seen = new Set(); + const capped = bullets.filter(b => !seen.has(b) && (seen.add(b), true)).slice(0, 8); + return capped.join('\n'); + }; + + if (selectedModel.includes('deepseek-r1') && thinkingText) { + thinkingText = summarizeThinking(thinkingText, trimmedMessage); + } + + const assistantMessage: ChatMessage = { + id: (Date.now() + 1).toString(), + content: contentText, + role: 'assistant', + timestamp: new Date(), + ...(thinkingText ? { thinkingContent: thinkingText } : {}) + }; + + // Append assistant message + let finalMessages: ChatMessage[] = []; + setMessages(prev => { + const updated = [...prev, assistantMessage]; + finalMessages = updated; + return updated; + }); + + // Update session storage + const currentSession = sessions.find(s => s.id === currentChatId); + const updatedSession: ChatSession = { + id: currentChatId, + cortensorSessionId: selectedModelData?.sessionId || appConfig.chat.staticSessionId, + title: userMessage.content.slice(0, 50) + "..." || "New Chat", + messages: finalMessages.filter(m => m.role === 'user' || m.role === 'assistant'), + selectedModel: currentSession?.selectedModel || selectedModel, + createdAt: currentSession?.createdAt || new Date(), + updatedAt: new Date(), + }; + + setSessions(prevSessions => { + const updatedSessions = prevSessions.map(s => s.id === currentChatId ? updatedSession : s); + saveModelSessions(updatedSessions); + return updatedSessions; + }); + setAllSessions(prevAllSessions => prevAllSessions.map(s => s.id === currentChatId ? updatedSession : s)); + + setIsLoading(false); + setIsThinkingPhase(false); + return; // Exit early; non-stream path complete + } + // Handle streaming response with text extraction if (!response.body) { throw new Error('No response body available'); @@ -728,6 +837,39 @@ function CortensorAIChatInner() { }); try { + // Helper: Summarize DeepSeek thinking into readable English steps + const summarizeDeepSeekThinking = (thinking: string, userMessage: string): string => { + const clean = (thinking || '').replace(/\s+/g, ' ').trim(); + if (!clean) return ''; + const um = (userMessage || '').trim(); + const firstSentence = clean.split(/(?<=[.!?])\s+/)[0]?.slice(0, 160) || ''; + const lc = clean.toLowerCase(); + const bullets: string[] = []; + const ctxSnippet = (um || firstSentence).replace(/^[-•\s]+/, '').slice(0, 160); + bullets.push(`Thinking summary:`); + bullets.push(`- Context: ${ctxSnippet}`); + if (/(step|plan|approach|strategy|first|second|third|1\.|2\.|3\.)/i.test(lc)) { + bullets.push('- Laying out a solution plan'); + } + if (/(assumption|assume|if|suppose)/i.test(lc)) { + bullets.push('- Establishing key assumptions'); + } + if (/(risk|edge\s*case|limitation|constraint|ambiguity)/i.test(lc)) { + bullets.push('- Considering risks and limitations'); + } + if (/(check|validate|relevant|compare|verify|confirm)/i.test(lc)) { + bullets.push('- Validating relevance and consistency'); + } + if (/(formula|compute|calculate|estimation|derivation|reasoning)/i.test(lc)) { + bullets.push('- Performing calculations/reasoning'); + } + // Always conclude with formulating the answer + bullets.push('- Formulating a clear and concise answer'); + // Deduplicate and cap + const seen = new Set(); + const capped = bullets.filter(b => !seen.has(b) && (seen.add(b), true)).slice(0, 6); + return `Thinking summary:\n- ${capped.join('\n- ')}`; + }; while (true) { const { done, value } = await reader.read(); @@ -849,9 +991,18 @@ function CortensorAIChatInner() { setIsThinkingPhase(false); // No explicit thinking, just show content } - // Remove opening tag from thinking content if present + // Cleanup thinking content for proper display if (thinkingContent) { - thinkingContent = thinkingContent.replace(/^\s*/, ''); + thinkingContent = thinkingContent + .replace(/^\s*/i, '') + .replace(/<\|USER\|>|<\|ASSISTANT\|>/gi, '') + .replace(/^\s*(user|assistant)\s*:\s*/gi, '') + .replace(/<\|begin_of_text\|>|<\|end_of_text\|>|<\|eot_id\|>/gi, '') + .replace(/<|end▁of▁sentence|>/g, '') + .replace(/<\|end_of_sentence\|>/g, '') + .trim(); + // Convert raw thinking into readable steps + thinkingContent = summarizeDeepSeekThinking(thinkingContent, trimmedMessage); } } @@ -975,14 +1126,62 @@ function CortensorAIChatInner() { const handleSubmit = useCallback((e: React.FormEvent) => { e.preventDefault(); if (input.trim()) { + frontendLogger.info('Submit triggered', { + chatId: currentChatId, + model: selectedModel, + environment, + length: input.trim().length + }); sendMessage(input.trim()); } - }, [input, sendMessage]); + }, [input, sendMessage, currentChatId, selectedModel, environment]); + + const handleTemplateInsert = useCallback((text: string) => { + setInput(prev => prev ? `${prev}\n\n${text}` : text); + }, []); + + const handleAttachContext = useCallback(async () => { + try { + if (!navigator.clipboard?.readText) { + toast({ title: "Clipboard unavailable", description: "Clipboard API not supported.", variant: "destructive" }); + return; + } + const content = await navigator.clipboard.readText(); + if (!content) { + toast({ title: "No clipboard content", description: "Clipboard is empty." }); + return; + } + const template = `Please summarize this context:\n${content}\n\nKeep it concise.`; + setInput(template); + toast({ title: "Context attached", description: "Clipboard content pasted into input." }); + } catch (error) { + frontendLogger.error('Attach context failed', { error }); + toast({ title: "Attach failed", description: "Could not read clipboard.", variant: "destructive" }); + } + }, [toast]); // Memoize deduplication to avoid running on every render const deduplicatedSessions = useMemo(() => { - return removeDuplicateSessions(allSessions); - }, [allSessions, removeDuplicateSessions]); + const cleaned = removeDuplicateSessions(allSessions); + if (sessionSort === 'recent') { + return cleaned.slice().sort((a, b) => { + const at = new Date(a.updatedAt || a.createdAt || 0).getTime(); + const bt = new Date(b.updatedAt || b.createdAt || 0).getTime(); + return bt - at; + }); + } + // unread-first: sessions where last message is assistant (user has not replied) bubble to top + return cleaned.slice().sort((a, b) => { + const lastA = a.messages?.[a.messages.length - 1]; + const lastB = b.messages?.[b.messages.length - 1]; + const aScore = lastA?.role === 'assistant' ? 1 : 0; + const bScore = lastB?.role === 'assistant' ? 1 : 0; + if (aScore !== bScore) return bScore - aScore; + const at = new Date(a.updatedAt || a.createdAt || 0).getTime(); + const bt = new Date(b.updatedAt || b.createdAt || 0).getTime(); + return bt - at; + }); + }, [allSessions, removeDuplicateSessions, sessionSort]); if (isPageLoading) { return ; @@ -1002,6 +1201,8 @@ function CortensorAIChatInner() { isOpen={isPanelOpen} onToggle={() => setIsPanelOpen(!isPanelOpen)} isMobile={isMobile} + sortMode={sessionSort} + onSortChange={setSessionSort} />
@@ -1018,6 +1219,7 @@ function CortensorAIChatInner() { isThinkingPhase={isThinkingPhase} environment={environment} onMemoryModeChange={setIsMemoryMode} + onPrefill={setInput} /> {/* Add padding bottom to prevent content being hidden behind fixed ChatInput + Footer */} @@ -1038,6 +1240,8 @@ function CortensorAIChatInner() { onMemoryModeChange={setIsMemoryMode} onInputChange={(e) => setInput(e.target.value)} onSubmit={handleSubmit} + onTemplateInsert={handleTemplateInsert} + onAttachContext={handleAttachContext} disabled={isLoading || !currentChatId} /> diff --git a/apps/Cortensor-EurekaAI/src/components/chat-input.tsx b/apps/Cortensor-EurekaAI/src/components/chat-input.tsx index a0931c0..e673345 100644 --- a/apps/Cortensor-EurekaAI/src/components/chat-input.tsx +++ b/apps/Cortensor-EurekaAI/src/components/chat-input.tsx @@ -26,6 +26,8 @@ interface ChatInputProps { onMemoryModeChange: (checked: boolean) => void onInputChange: (e: React.ChangeEvent) => void onSubmit: (e: React.FormEvent) => void + onTemplateInsert?: (text: string) => void + onAttachContext?: () => Promise | void disabled?: boolean } @@ -175,6 +177,35 @@ export function ChatInput({ /> )} + + {/* Quick actions */} +
+ {[ + { label: '/summarize', text: 'Summarize the following content:' }, + { label: '/fix code', text: 'Please refactor and fix this code:' }, + { label: '/explain', text: 'Explain this in simple terms:' } + ].map(action => ( + + ))} + +