diff --git a/.gitignore b/.gitignore index 8c84652ac421e836d9ca3349f82378a17b4042c8..102513bea51d13eea05c4dab66fa74c611cd9247 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,85 @@ +# Environment/Virtual Environment venv/ -__pycache__/ -*.pyc +.venv/ +env/ .env +.env.local +.env.*.local + +# Python artifacts +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Testing .pytest_cache/ -Roadmap.html +.coverage +htmlcov/ +.noserc +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.nox/ + +# Node.js / Dashboard +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* +dashboard/node_modules/ +dashboard/dist/ +dashboard/build/ +dashboard/.env +dashboard/.env.local + +# Databases & Persistence +data/*.db +data/*.db-shm +data/*.db-wal +codelens.db +*.sqlite3 + +# OS Specific .DS_Store +.DS_Store? +**/._* **/.DS_Store -*.egg-info/ -dist/ -build/ +Thumbs.db +ehthumbs.db + +# IDEs .idea/ .vscode/ +*.swp +*.swo +.project +.pydevproject +.settings/ +.history/ -# Persistence -data/*.db -data/*.db-shm -data/*.db-wal +# Project Specific Reference Docs +# (Per user request to exclude from commits) +files/ +Roadmap.html diff --git a/GET_STARTED.md b/GET_STARTED.md new file mode 100644 index 0000000000000000000000000000000000000000..783d7710e909293199b8fc0ea23218aff51cc9f3 --- /dev/null +++ b/GET_STARTED.md @@ -0,0 +1,89 @@ +# ๐Ÿš€ Getting Started with CodeLens. + +Welcome to **CodeLens.**, a production-grade AI agent evaluation environment. This guide will help you get up and running in less than 2 minutes. + +--- + +## 1. Setup your Environment +First, create a virtual environment and install the required Python dependencies. + +```bash +# Create and activate virtual environment +python3 -m venv venv && source venv/bin/activate + +# Install dependencies +pip install -r requirements.txt +``` + +--- + +## 2. Initialize the Database +CodeLens uses SQLite for persistence. You must initialize the database before running the server for the first time. + +```bash +# Initialize the codelens.db with 30 baseline scenarios +python scripts/migrate.py init +``` + +--- + +## 3. Launch the System +Start the FastAPI server. This serves both the **Agent API** and the **Interactive Dashboard**. + +```bash +# Run the server +PYTHONPATH=. python app.py +``` + +--- + +## 4. Open the Dashboard +Once the server is running, you can access the CodeLens Dashboard at: + +๐Ÿ‘‰ **[http://localhost:7860/dashboard](http://localhost:7860/dashboard)** + +From here, you can see the top-10 leaderboard and monitor live agent evaluations. + +--- + +## 5. Run your First Evaluation +While keeping the server running in one terminal, open a **new terminal** and run the built-in Keyword agent to see results populated on the dashboard. + +```bash +# Activate venv in the new terminal first! +source venv/bin/activate + +# Run evaluation +python scripts/evaluate.py --agent keyword +``` + +--- + +## ๐Ÿงช Running Tests +To verify everything is working perfectly, you can run the full 155-test suite: + +```bash +PYTHONPATH=. pytest tests/ -v +``` + +--- + +## \ud83d\udee0 Troubleshooting Common Errors + +### 1. `ModuleNotFoundError: No module named 'requests'` +This happens if you haven't activated the virtual environment in your current terminal tab. +- **Fix**: Run `source venv/bin/activate` in every new terminal window. + +### 2. `Usage: python3 scripts/migrate.py [init|reset]` +The migration script requires an argument to proceed. +- **Fix**: Run `python scripts/migrate.py init` specifically. + +### 3. Logo not appearing in Dashboard +If the logo shows a broken image placeholder: +- **Fix**: Re-run the server with `PYTHONPATH=. python app.py`. The backend now has optimized routing to serve the `logo.svg`. + +--- + +> [!TIP] +> If you ever want to reset the database and start fresh with original scenarios, run: +> `python scripts/migrate.py reset` diff --git a/README.md b/README.md index c2a03fad0ab5ba50e2e537325db122722c5b7765..d7c9b8813d6689a6aecfb79532564083eb4d75d9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ -# AgentOrg CodeReview OpenEnv +

+ CodeLens. +

+ +# CodeLens > **Can an AI agent catch the SQL injection that caused the $100M breach โ€” before it ships?** This environment trains and evaluates agents on realistic Python code reviews grounded in real-world incident patterns. Unlike toy examples, every scenario is calibrated against actual production failure modes: payment mutations without idempotency keys, JWT verification bypassed for "dev convenience," pickle deserialization opening RCE vectors. -[![OpenEnv](https://img.shields.io/badge/OpenEnv-1.0-blue)](https://huggingface.co/) [![Python 3.11](https://img.shields.io/badge/python-3.11-green)](https://python.org) [![FastAPI](https://img.shields.io/badge/FastAPI-0.109-red)](https://fastapi.tiangolo.com) +[![CodeLens](https://img.shields.io/badge/CodeLens-1.0-blue)](https://huggingface.co/) [![Python 3.11](https://img.shields.io/badge/python-3.11-green)](https://python.org) [![FastAPI](https://img.shields.io/badge/FastAPI-0.109-red)](https://fastapi.tiangolo.com) --- @@ -94,12 +98,12 @@ WS /ws/events โ†’ real-time step event stream ``` . -โ”œโ”€โ”€ inference.py # Root inference script (OpenEnv spec required) +โ”œโ”€โ”€ inference.py # Root inference script (CodeLens spec required) โ”œโ”€โ”€ app.py # FastAPI entry point -โ”œโ”€โ”€ openenv.yaml # OpenEnv spec manifest +โ”œโ”€โ”€ codelens.yaml # CodeLens spec manifest โ”œโ”€โ”€ Dockerfile # HuggingFace Spaces deployment โ”œโ”€โ”€ requirements.txt -โ”œโ”€โ”€ codereview_env/ +โ”œโ”€โ”€ codelens_env/ โ”‚ โ”œโ”€โ”€ env.py # Episode state machine with incremental rewards โ”‚ โ”œโ”€โ”€ models.py # Pydantic models (Observation, Action, StateResult...) โ”‚ โ”œโ”€โ”€ scenario_bank.py # 30 scenarios with service metadata @@ -115,30 +119,32 @@ WS /ws/events โ†’ real-time step event stream --- -## Quick Start - -### 1. Install +## \ud83d\ude80 Quick Start +### 1. Setup Environment ```bash python3 -m venv venv && source venv/bin/activate pip install -r requirements.txt ``` -### 2. Start the Environment Server +### 2. Initialize Database +```bash +# This creates the codelens.db with all standard scenarios +python scripts/migrate.py init +``` +### 3. Launch CodeLens ```bash PYTHONPATH=. python app.py -# Server runs on http://localhost:7860 +# API and Dashboard are now live at http://localhost:7860/dashboard ``` -### 3. Run Tests - +### 4. Run Evaluation (Baseline) +In a new terminal: ```bash -PYTHONPATH=. pytest tests/ -v +python scripts/evaluate.py --agent keyword ``` -### 4. Run Inference Script (OpenEnv spec format) - ```bash export API_BASE_URL="https://api.openai.com/v1" export MODEL_NAME="gpt-4o" @@ -178,10 +184,10 @@ Output format: ## Docker / HuggingFace Spaces ```bash -docker build -t codereview-openenv . +docker build -t codelens-env . docker run -p 7860:7860 \ -e PYTHONPATH=/app \ - codereview-openenv + codelens-env ``` The server starts automatically via `python app.py`. @@ -197,4 +203,4 @@ The server starts automatically via `python app.py`. - **Blast Radius Context** โ€” `affected_users`, `service_criticality`, `blast_radius` in every observation - **WebSocket Stream** โ€” Real-time step event broadcasting on `/ws/events` - **Leaderboard** โ€” In-memory top-10 tracking per task -- **Full OpenEnv Spec** โ€” `/reset`, `/step`, `/state`, `/result` + `[START]`/`[STEP]`/`[END]` stdout format +- **Full CodeLens Spec** โ€” `/reset`, `/step`, `/state`, `/result` + `[START]`/`[STEP]`/`[END]` stdout format diff --git a/app.py b/app.py index 2ac0abf54559e51b3d297ad391fa65924da98799..5c0038961e63a89094a53ecbd1aa6dc94e8a02ff 100644 --- a/app.py +++ b/app.py @@ -2,25 +2,29 @@ import uuid import logging import asyncio import json -from typing import Dict, List, Optional +from typing import Dict, List, Optional, AsyncGenerator from datetime import datetime, timezone +from contextlib import asynccontextmanager from fastapi import FastAPI, HTTPException, WebSocket, WebSocketDisconnect, Depends, Security, Query, BackgroundTasks, Request -from fastapi.responses import JSONResponse +from fastapi.responses import JSONResponse, FileResponse from fastapi.exceptions import RequestValidationError from fastapi.security.api_key import APIKeyHeader +from fastapi.staticfiles import StaticFiles +from fastapi.middleware.cors import CORSMiddleware from pydantic import BaseModel from slowapi import Limiter, _rate_limit_exceeded_handler from slowapi.util import get_remote_address from slowapi.errors import RateLimitExceeded from sqlmodel import Session +import os -from codereview_env.models import ( +from codelens_env.models import ( TaskId, Action, ResetResult, StepResult, EpisodeResult, ActionRecord ) -from codereview_env.env import CodeReviewEnv -from codereview_env.config import get_settings -from codereview_env.database import ( +from codelens_env.env import CodeLensEnv +from codelens_env.config import get_settings +from codelens_env.database import ( create_db_and_tables, get_session, save_episode, get_episode, get_leaderboard_db, submit_leaderboard, get_stats, LeaderboardRecord @@ -32,17 +36,45 @@ logging.basicConfig( level=getattr(logging, settings.log_level), format="%(asctime)s [%(levelname)s] %(name)s: %(message)s" ) -logger = logging.getLogger("codereview_env") +logger = logging.getLogger("codelens_env") + +# โ”€โ”€ Lifespan โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup + create_db_and_tables() + cleanup_task = asyncio.create_task(cleanup_expired_episodes()) + logger.info(f"CodeLens API started โ€” DB at {settings.db_path}") + + yield + + # Shutdown + cleanup_task.cancel() + try: + await cleanup_task + except asyncio.CancelledError: + pass + logger.info("CodeLens API shutting down") # โ”€โ”€ App Initialization โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ app = FastAPI( - title="AgentOrg CodeReview OpenEnv API", + title="CodeLens API", description=( "AI Senior Code Reviewer evaluation environment. " "Trains agents to detect bugs, security vulnerabilities, and architectural issues " "in realistic Python PRs." ), version="1.0.0", + lifespan=lifespan, +) + +# โ”€โ”€ CORS Middleware โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +app.add_middleware( + CORSMiddleware, + allow_origins=["*"] if settings.app_env == "development" else [f"http://localhost:{settings.app_port}"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], ) # โ”€โ”€ Rate Limiting โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -60,7 +92,7 @@ async def verify_api_key(api_key: str = Security(API_KEY_HEADER)): raise HTTPException(status_code=403, detail="Invalid or missing API key") # โ”€โ”€ Storage & TTL โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -episodes: Dict[str, CodeReviewEnv] = {} +episodes: Dict[str, CodeLensEnv] = {} episode_timestamps: Dict[str, datetime] = {} async def cleanup_expired_episodes(): @@ -78,11 +110,6 @@ async def cleanup_expired_episodes(): if expired: logger.info(f"Cleaned up {len(expired)} expired episodes") -@app.on_event("startup") -async def startup_event(): - create_db_and_tables() - asyncio.create_task(cleanup_expired_episodes()) - logger.info(f"CodeReview API started \u2014 DB at {settings.db_path}") # โ”€โ”€ Models โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ class ResetRequest(BaseModel): @@ -146,14 +173,15 @@ def health_check(): "env_ready": True, "env": settings.app_env, "active_episodes": len(episodes), - "auth_enabled": settings.api_key_enabled + "auth_enabled": settings.api_key_enabled, + "dashboard_url": "/dashboard" } @app.post("/reset", response_model=ResetResponse) @limiter.limit(f"{settings.rate_limit_per_minute}/minute") def reset_env(request: Request, req: ResetRequest, _: None = Depends(verify_api_key)): episode_id = str(uuid.uuid4()) - env = CodeReviewEnv() + env = CodeLensEnv() result = env.reset(req.task_id, req.seed) episodes[episode_id] = env episode_timestamps[episode_id] = datetime.now(timezone.utc) @@ -297,6 +325,27 @@ async def websocket_endpoint(websocket: WebSocket): finally: clients.discard(websocket) +# โ”€โ”€ Dashboard โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +static_dir = os.path.join(os.path.dirname(__file__), "static", "dashboard") +if os.path.exists(static_dir): + app.mount("/dashboard/assets", StaticFiles(directory=os.path.join(static_dir, "assets")), name="dashboard-assets") + +@app.get("/dashboard", include_in_schema=False) +@app.get("/dashboard/{full_path:path}", include_in_schema=False) +def dashboard(full_path: str = ""): + """Serve the React dashboard SPA (index.html for all sub-paths).""" + # 1. Check if the requested full_path is a specific static file (e.g. logo.svg) + if full_path: + static_file = os.path.join(os.path.dirname(__file__), "static", "dashboard", full_path) + if os.path.exists(static_file) and os.path.isfile(static_file): + return FileResponse(static_file) + + # 2. Fallback to index.html for SPA routing + html_path = os.path.join(os.path.dirname(__file__), "static", "dashboard", "index.html") + if not os.path.exists(html_path): + raise HTTPException(status_code=404, detail="Dashboard not found. Run: cd dashboard && npm run build") + return FileResponse(html_path) + if __name__ == "__main__": import uvicorn uvicorn.run(app, host=settings.app_host, port=settings.app_port) diff --git a/assets/logo.svg b/assets/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..5cedda39b400e36a41f9c051d6577539534cae03 --- /dev/null +++ b/assets/logo.svg @@ -0,0 +1,3 @@ + + Codelens. + diff --git a/openenv.yaml b/codelens.yaml similarity index 97% rename from openenv.yaml rename to codelens.yaml index adf8e9d1ae8f3d822797e8be2ce3ebf22edc4b47..74a62fe435e8285ae9df1070f291b2dc51ac9ddc 100644 --- a/openenv.yaml +++ b/codelens.yaml @@ -1,5 +1,5 @@ version: "1.0" -name: "agentorg-codereview" +name: "codelens-codelens" description: > AI Senior Code Reviewer evaluation environment โ€” trains agents to detect bugs, security vulnerabilities, and architectural issues in realistic Python PRs. @@ -9,7 +9,7 @@ base_url: "http://localhost:7860" api_version: "v1" tags: - - openenv + - codelens - code-review - security - software-engineering diff --git a/codelens_env/__init__.py b/codelens_env/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..819ed08e9be9b4b9c9d7cd0533e3ef3ce1cb2e4b --- /dev/null +++ b/codelens_env/__init__.py @@ -0,0 +1 @@ +"""CodeLens Environment package.""" diff --git a/codereview_env/config.py b/codelens_env/config.py similarity index 94% rename from codereview_env/config.py rename to codelens_env/config.py index 6c46a347cd825f11c878788541282dcad5fe75d0..6ad430c9027f2ea819729d0f95ef1e4f3124813c 100644 --- a/codereview_env/config.py +++ b/codelens_env/config.py @@ -19,7 +19,7 @@ class Settings(BaseSettings): rate_limit_per_minute: int = 60 # requests per minute per IP # Persistence - db_path: str = "./data/codereview.db" + db_path: str = "./data/codelens.db" db_echo: bool = False # Set True to log all SQL queries @lru_cache diff --git a/codereview_env/database.py b/codelens_env/database.py similarity index 97% rename from codereview_env/database.py rename to codelens_env/database.py index 425fce9947f6a1823ebda0c375c78061d61be85f..373f258d182eb56500f534ea939e442335baa0c8 100644 --- a/codereview_env/database.py +++ b/codelens_env/database.py @@ -2,8 +2,8 @@ from pathlib import Path from sqlmodel import SQLModel, Field, Session, create_engine, select from typing import Optional, List, Tuple import json -from codereview_env.config import get_settings -from codereview_env.models import EpisodeResult, TaskId +from codelens_env.config import get_settings +from codelens_env.models import EpisodeResult, TaskId def get_engine(): settings = get_settings() diff --git a/codereview_env/env.py b/codelens_env/env.py similarity index 95% rename from codereview_env/env.py rename to codelens_env/env.py index 93f43487cf72de87b4b57b6dc434ed3e98e1c02f..ac759a2df72bc7f7c8278f969e9667858a369fb0 100644 --- a/codereview_env/env.py +++ b/codelens_env/env.py @@ -1,15 +1,15 @@ from datetime import datetime, timezone from typing import List, Optional, Set -from codereview_env.models import ( +from codelens_env.models import ( TaskId, Action, Observation, StepResult, ResetResult, ActionType, ActionRecord, EpisodeResult, Severity, GroundTruthIssue ) -from codereview_env.scenarios import get_scenario -from codereview_env.graders.bug_grader import grade_bug_detection -from codereview_env.graders.security_grader import grade_security_audit -from codereview_env.graders.arch_grader import grade_architectural_review +from codelens_env.scenarios import get_scenario +from codelens_env.graders.bug_grader import grade_bug_detection +from codelens_env.graders.security_grader import grade_security_audit +from codelens_env.graders.arch_grader import grade_architectural_review -class CodeReviewEnv: +class CodeLensEnv: MAX_NOISE_BUDGET = 5 TASK_MAX_STEPS = { TaskId.BUG_DETECTION: 10, diff --git a/codereview_env/graders/__init__.py b/codelens_env/graders/__init__.py similarity index 100% rename from codereview_env/graders/__init__.py rename to codelens_env/graders/__init__.py diff --git a/codereview_env/graders/arch_grader.py b/codelens_env/graders/arch_grader.py similarity index 96% rename from codereview_env/graders/arch_grader.py rename to codelens_env/graders/arch_grader.py index f484a87219cfa83cefa8c4599c3ca3d6be35717a..998774312edc9e2689d176c95004ccb024c1ea11 100644 --- a/codereview_env/graders/arch_grader.py +++ b/codelens_env/graders/arch_grader.py @@ -1,5 +1,5 @@ from typing import List -from codereview_env.models import Scenario, ActionRecord, Category, ActionType, Verdict +from codelens_env.models import Scenario, ActionRecord, Category, ActionType, Verdict def grade_architectural_review(scenario: Scenario, history: List[ActionRecord]) -> float: if not history: diff --git a/codereview_env/graders/bug_grader.py b/codelens_env/graders/bug_grader.py similarity index 96% rename from codereview_env/graders/bug_grader.py rename to codelens_env/graders/bug_grader.py index fe79e529f8c7242cef5930f4a60f7f3642ace9a8..56168f53ec1407811b8a324b29da7049df868d04 100644 --- a/codereview_env/graders/bug_grader.py +++ b/codelens_env/graders/bug_grader.py @@ -1,5 +1,5 @@ from typing import List -from codereview_env.models import Scenario, ActionRecord, Category, Severity, ActionType +from codelens_env.models import Scenario, ActionRecord, Category, Severity, ActionType def grade_bug_detection(scenario: Scenario, history: List[ActionRecord]) -> float: if not history: diff --git a/codereview_env/graders/grader_utils.py b/codelens_env/graders/grader_utils.py similarity index 95% rename from codereview_env/graders/grader_utils.py rename to codelens_env/graders/grader_utils.py index a19da0752568b5a41f357ff8d3bef441e7a8bc22..17bcad2c7525f4410492f163c4b43e0898bc2c91 100644 --- a/codereview_env/graders/grader_utils.py +++ b/codelens_env/graders/grader_utils.py @@ -1,5 +1,5 @@ from typing import List, Optional -from codereview_env.models import GroundTruthIssue, Action +from codelens_env.models import GroundTruthIssue, Action def keyword_overlap(body: str, keywords: List[str]) -> float: """Returns 0.0โ€“1.0 confidence score based on keyword coverage.""" diff --git a/codereview_env/graders/security_grader.py b/codelens_env/graders/security_grader.py similarity index 92% rename from codereview_env/graders/security_grader.py rename to codelens_env/graders/security_grader.py index 4aac9741ec33d22bef2dc9b4eda59626a1300228..d0bd614626cfdf3b0c0f66115d000e60a441cd1c 100644 --- a/codereview_env/graders/security_grader.py +++ b/codelens_env/graders/security_grader.py @@ -1,5 +1,5 @@ from typing import List -from codereview_env.models import Scenario, ActionRecord, Category, Severity, ActionType +from codelens_env.models import Scenario, ActionRecord, Category, Severity, ActionType def grade_security_audit(scenario: Scenario, history: List[ActionRecord]) -> float: if not history: @@ -42,7 +42,7 @@ def grade_security_audit(scenario: Scenario, history: List[ActionRecord]) -> flo body_lower = (action.body or "").lower() match_count = sum(1 for kw in truth.keywords if kw.lower() in body_lower) - kw_threshold = max(4, len(truth.keywords)) + kw_threshold = len(truth.keywords) if truth.keywords else 1 kw_score = match_count / kw_threshold issue_score = 0.7 * sev_score + 0.3 * kw_score diff --git a/codereview_env/models.py b/codelens_env/models.py similarity index 100% rename from codereview_env/models.py rename to codelens_env/models.py diff --git a/codereview_env/scenarios.py b/codelens_env/scenarios.py similarity index 99% rename from codereview_env/scenarios.py rename to codelens_env/scenarios.py index 338650fbed37d46f833697e9e87ef85e824f1cf7..a38e1112f75cb6205cda2fa6e0717ce2a6327051 100644 --- a/codereview_env/scenarios.py +++ b/codelens_env/scenarios.py @@ -1,4 +1,4 @@ -from codereview_env.models import Scenario, FileChanged, GroundTruthIssue, Category, Severity, TaskId, Verdict +from codelens_env.models import Scenario, FileChanged, GroundTruthIssue, Category, Severity, TaskId, Verdict def get_scenario(task_id: TaskId, seed: int) -> Scenario: scenarios = [s for s in ALL_SCENARIOS if s.task_id == task_id] diff --git a/codereview_env/__init__.py b/codereview_env/__init__.py deleted file mode 100644 index 64b64f20847d5786b409b7b945e29ebd0c60ad2b..0000000000000000000000000000000000000000 --- a/codereview_env/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""AgentOrg CodeReview Environment package.""" diff --git a/dashboard/index.html b/dashboard/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1e6b43120ead80193147c871dc5aa513f1e4dfa0 --- /dev/null +++ b/dashboard/index.html @@ -0,0 +1,14 @@ + + + + + + CodeLens Dashboard + + + + +
+ + + diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..680a65bb17a7626b938dea332700b778a2891674 --- /dev/null +++ b/dashboard/package-lock.json @@ -0,0 +1,2558 @@ +{ + "name": "codelens-dashboard", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "codelens-dashboard", + "version": "0.1.0", + "dependencies": { + "@fontsource/inter": "^5.1.0", + "@tanstack/react-query": "^5.0.0", + "clsx": "^2.1.0", + "lucide-react": "^0.475.0", + "react": "^18.3.0", + "react-dom": "^18.3.0", + "zustand": "^5.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.0", + "@types/node": "^25.5.2", + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.0", + "tailwindcss": "^4.1.0", + "typescript": "^5.7.0", + "vite": "^6.2.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fontsource/inter": { + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/@fontsource/inter/-/inter-5.2.8.tgz", + "integrity": "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.96.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.96.2.tgz", + "integrity": "sha512-hzI6cTVh4KNRk8UtoIBS7Lv9g6BnJPXvBKsvYH1aGWvv0347jT3BnSvztOE+kD76XGvZnRC/t6qdW1CaIfwCeA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.96.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.96.2.tgz", + "integrity": "sha512-sYyzzJT4G0g02azzJ8o55VFFV31XvFpdUpG+unxS0vSaYsJnSPKGoI6WdPwUucJL1wpgGfwfmntNX/Ub1uOViA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.96.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.2.tgz", + "integrity": "sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz", + "integrity": "sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001785", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001785.tgz", + "integrity": "sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.331", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz", + "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.475.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz", + "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zustand": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/dashboard/package.json b/dashboard/package.json new file mode 100644 index 0000000000000000000000000000000000000000..d22e696e041bbf5c5e735275a0451e6f76d14f66 --- /dev/null +++ b/dashboard/package.json @@ -0,0 +1,30 @@ +{ + "name": "codelens-dashboard", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@fontsource/inter": "^5.1.0", + "@tanstack/react-query": "^5.0.0", + "clsx": "^2.1.0", + "lucide-react": "^0.475.0", + "react": "^18.3.0", + "react-dom": "^18.3.0", + "zustand": "^5.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.0", + "@types/node": "^25.5.2", + "@types/react": "^18.3.0", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.0", + "tailwindcss": "^4.1.0", + "typescript": "^5.7.0", + "vite": "^6.2.0" + } +} diff --git a/dashboard/public/favicon.svg b/dashboard/public/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..e5d60508f18d89fef7331ea1fdc821baefafc218 --- /dev/null +++ b/dashboard/public/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/dashboard/public/logo.svg b/dashboard/public/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..5cedda39b400e36a41f9c051d6577539534cae03 --- /dev/null +++ b/dashboard/public/logo.svg @@ -0,0 +1,3 @@ + + Codelens. + diff --git a/dashboard/src/App.js b/dashboard/src/App.js new file mode 100644 index 0000000000000000000000000000000000000000..0ee216dc82af795b19e010dd54485ae274e2952b --- /dev/null +++ b/dashboard/src/App.js @@ -0,0 +1,11 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +import Header from "./components/Header"; +import StatsRow from "./components/StatsRow"; +import Leaderboard from "./components/Leaderboard"; +import EventFeed from "./components/EventFeed"; +import { useWebSocket } from "./hooks/useWebSocket"; +const App = () => { + useWebSocket(); + return (_jsx("div", { className: "min-h-screen", style: { backgroundColor: "var(--color-bg)" }, children: _jsxs("div", { className: "max-w-7xl mx-auto px-6 py-10 space-y-10", children: [_jsx(Header, {}), _jsx(StatsRow, {}), _jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-3 gap-8", children: [_jsx("div", { className: "lg:col-span-2", children: _jsx(Leaderboard, {}) }), _jsx("div", { className: "lg:col-span-1", children: _jsx(EventFeed, {}) })] })] }) })); +}; +export default App; diff --git a/dashboard/src/App.tsx b/dashboard/src/App.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9a4e1f75ff2b8ffd51b7c8678b412a4b248ae968 --- /dev/null +++ b/dashboard/src/App.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import Header from "./components/Header"; +import StatsRow from "./components/StatsRow"; +import Leaderboard from "./components/Leaderboard"; +import EventFeed from "./components/EventFeed"; +import { useWebSocket } from "./hooks/useWebSocket"; + +const App: React.FC = () => { + useWebSocket(); + + return ( +
+
+
+ +
+
+ +
+
+ +
+
+
+
+ ); +}; + +export default App; diff --git a/dashboard/src/api.js b/dashboard/src/api.js new file mode 100644 index 0000000000000000000000000000000000000000..11ce3d5014eb830ce5cd6a3f79c9c9f56b4359ad --- /dev/null +++ b/dashboard/src/api.js @@ -0,0 +1,6 @@ +const BASE = import.meta.env.DEV ? "/api" : ""; +export const fetchHealth = () => fetch(`${BASE}/health`).then(r => r.json()); +export const fetchStats = () => fetch(`${BASE}/stats`).then(r => r.json()); +export const fetchLeaderboard = (taskId, limit = 10) => fetch(`${BASE}/leaderboard?task_id=${taskId}&limit=${limit}`) + .then(r => r.json()) + .then(data => data.entries || []); diff --git a/dashboard/src/api.ts b/dashboard/src/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..eccad1994238f2f65930c84ca453b9f4d153d3c6 --- /dev/null +++ b/dashboard/src/api.ts @@ -0,0 +1,10 @@ +import { HealthResponse, StatsResponse, LeaderboardEntry, TaskId } from "./types"; + +const BASE = import.meta.env.DEV ? "/api" : ""; + +export const fetchHealth = (): Promise => fetch(`${BASE}/health`).then(r => r.json()); +export const fetchStats = (): Promise => fetch(`${BASE}/stats`).then(r => r.json()); +export const fetchLeaderboard = (taskId: TaskId, limit = 10): Promise => + fetch(`${BASE}/leaderboard?task_id=${taskId}&limit=${limit}`) + .then(r => r.json()) + .then(data => data.entries || []); diff --git a/dashboard/src/components/EventFeed.js b/dashboard/src/components/EventFeed.js new file mode 100644 index 0000000000000000000000000000000000000000..dfa23fbfb8520f6e62d06e8481a8ada7f0c0a8b8 --- /dev/null +++ b/dashboard/src/components/EventFeed.js @@ -0,0 +1,9 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +import { Zap, Trash2 } from "lucide-react"; +import { useEventStore } from "../stores/eventStore"; +import EventRow from "./EventRow"; +const EventFeed = () => { + const { events, clear, connected } = useEventStore(); + return (_jsxs("div", { className: "bg-white rounded-3xl overflow-hidden flex flex-col h-[600px]", style: { border: "1px solid var(--color-border)" }, children: [_jsxs("div", { className: "px-7 py-5 flex items-center justify-between", style: { borderBottom: "1px solid var(--color-border)" }, children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: `p-2 rounded-xl ${connected ? "bg-amber-50" : "bg-zinc-100"}`, children: _jsx(Zap, { className: `w-5 h-5 ${connected ? "text-amber-600" : "text-zinc-400"}` }) }), _jsx("h2", { className: "text-lg font-extrabold tracking-tight", style: { color: "var(--color-heading)" }, children: "Live Feed" })] }), _jsx("button", { onClick: clear, className: "p-2.5 hover:bg-zinc-100 rounded-xl transition-colors", style: { color: "var(--color-muted)" }, title: "Clear Feed", children: _jsx(Trash2, { className: "w-4 h-4" }) })] }), _jsxs("div", { className: "flex-1 overflow-auto p-5 space-y-3", children: [!connected && (_jsxs("div", { className: "flex flex-col items-center justify-center h-full space-y-4 text-center", children: [_jsx("div", { className: "p-5 bg-zinc-50 rounded-2xl", children: _jsx(Zap, { className: "w-10 h-10 text-zinc-200 animate-pulse" }) }), _jsx("p", { className: "text-[11px] uppercase tracking-[0.15em] font-bold", style: { color: "var(--color-muted)" }, children: "Connecting to live stream..." })] })), connected && events.length === 0 && (_jsxs("div", { className: "flex flex-col items-center justify-center h-full space-y-4 text-center", children: [_jsx("div", { className: "p-5 bg-zinc-50 rounded-2xl", children: _jsx(Zap, { className: "w-10 h-10 text-zinc-200" }) }), _jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[11px] font-bold uppercase tracking-[0.15em]", style: { color: "var(--color-muted)" }, children: "Monitoring activity" }), _jsx("p", { className: "text-[11px] max-w-[180px] leading-relaxed", style: { color: "var(--color-muted)" }, children: "Evaluation events will appear here in real-time." })] })] })), events.map((event, idx) => (_jsx(EventRow, { event: event }, idx)))] })] })); +}; +export default EventFeed; diff --git a/dashboard/src/components/EventFeed.tsx b/dashboard/src/components/EventFeed.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3d13ce9970789eec149470deb278e99a07252d57 --- /dev/null +++ b/dashboard/src/components/EventFeed.tsx @@ -0,0 +1,74 @@ +import React from "react"; +import { Zap, Trash2 } from "lucide-react"; +import { useEventStore } from "../stores/eventStore"; +import EventRow from "./EventRow"; + +const EventFeed: React.FC = () => { + const { events, clear, connected } = useEventStore(); + + return ( +
+ {/* Header */} +
+
+
+ +
+

+ Live Feed +

+
+ +
+ + {/* Content */} +
+ {!connected && ( +
+
+ +
+

+ Connecting to live stream... +

+
+ )} + + {connected && events.length === 0 && ( +
+
+ +
+
+

+ Monitoring activity +

+

+ Evaluation events will appear here in real-time. +

+
+
+ )} + + {events.map((event, idx) => ( + + ))} +
+
+ ); +}; + +export default EventFeed; diff --git a/dashboard/src/components/EventRow.js b/dashboard/src/components/EventRow.js new file mode 100644 index 0000000000000000000000000000000000000000..9d0556f635e63894e4bd4eccd7458f1a6c908375 --- /dev/null +++ b/dashboard/src/components/EventRow.js @@ -0,0 +1,19 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +import { clsx } from "clsx"; +const EventRow = ({ event }) => { + const time = new Date(event.timestamp).toLocaleTimeString([], { + hour12: false, + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }); + return (_jsxs("div", { className: "rounded-2xl p-4 transition-all duration-200 hover:shadow-sm animate-fade-slide-in", style: { + backgroundColor: "#fafafa", + border: "1px solid var(--color-border)", + }, children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsx("span", { className: "text-[10px] tabular-nums font-bold uppercase tracking-wider", style: { color: "var(--color-muted)" }, children: time }), _jsx("span", { className: "text-[10px] font-mono font-bold bg-indigo-50 text-indigo-600 px-2 py-0.5 rounded-md", children: event.episode_id.slice(0, 8) })] }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-sm font-semibold capitalize truncate max-w-[140px]", style: { color: "var(--color-heading)" }, children: event.type }), _jsxs("span", { className: clsx("text-xs font-bold font-mono px-2.5 py-1 rounded-full", event.reward > 0 + ? "text-emerald-700 bg-emerald-50" + : event.reward < 0 + ? "text-red-600 bg-red-50" + : "text-zinc-500 bg-zinc-100"), children: [event.reward > 0 ? "+" : "", event.reward.toFixed(2)] })] })] })); +}; +export default EventRow; diff --git a/dashboard/src/components/EventRow.tsx b/dashboard/src/components/EventRow.tsx new file mode 100644 index 0000000000000000000000000000000000000000..de5e547556c89714a9bae306ecd2acbaabf8dedb --- /dev/null +++ b/dashboard/src/components/EventRow.tsx @@ -0,0 +1,61 @@ +import React from "react"; +import { WsEvent } from "../types"; +import { clsx } from "clsx"; + +interface EventRowProps { + event: WsEvent; +} + +const EventRow: React.FC = ({ event }) => { + const time = new Date(event.timestamp).toLocaleTimeString([], { + hour12: false, + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }); + + return ( +
+
+ + {time} + + + {event.episode_id.slice(0, 8)} + +
+
+ + {event.type} + + 0 + ? "text-emerald-700 bg-emerald-50" + : event.reward < 0 + ? "text-red-600 bg-red-50" + : "text-zinc-500 bg-zinc-100" + )} + > + {event.reward > 0 ? "+" : ""} + {event.reward.toFixed(2)} + +
+
+ ); +}; + +export default EventRow; diff --git a/dashboard/src/components/Header.js b/dashboard/src/components/Header.js new file mode 100644 index 0000000000000000000000000000000000000000..734b9d7b50f844c4a5371a96cedbb1c5be030334 --- /dev/null +++ b/dashboard/src/components/Header.js @@ -0,0 +1,17 @@ +import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime"; +import { useQuery } from "@tanstack/react-query"; +import { Wifi, WifiOff } from "lucide-react"; +import { fetchHealth } from "../api"; +import { clsx } from "clsx"; +const Header = () => { + const { data: health } = useQuery({ + queryKey: ["health"], + queryFn: fetchHealth, + refetchInterval: 10_000, + }); + const isConnected = health?.status === "ok"; + return (_jsxs("header", { className: "flex items-center justify-between pb-2", children: [_jsx("div", { className: "flex items-center gap-6", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("img", { src: "/dashboard/logo.svg", className: "h-[38px] w-auto", alt: "CodeLens." }), _jsx("div", { className: "h-5 w-px bg-zinc-200 hidden sm:block mx-2" }), _jsx("p", { className: "text-[10px] font-mono font-bold uppercase tracking-[0.3em] hidden sm:block pt-1 opacity-40 group-hover:opacity-60 transition-opacity", style: { color: "var(--color-heading)" }, children: "Evaluation" })] }) }), _jsx("div", { className: clsx("flex items-center gap-2 px-4 py-2 rounded-full text-xs font-semibold tracking-wide uppercase transition-all", isConnected + ? "bg-emerald-50 text-emerald-600 ring-1 ring-emerald-200" + : "bg-red-50 text-red-500 ring-1 ring-red-200"), children: isConnected ? (_jsxs(_Fragment, { children: [_jsx(Wifi, { className: "w-3.5 h-3.5" }), _jsx("span", { children: "Connected" })] })) : (_jsxs(_Fragment, { children: [_jsx(WifiOff, { className: "w-3.5 h-3.5" }), _jsx("span", { children: "Offline" })] })) })] })); +}; +export default Header; diff --git a/dashboard/src/components/Header.tsx b/dashboard/src/components/Header.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b325e6aca9d8c80c4ee7fcda579ee5a0e605fb0c --- /dev/null +++ b/dashboard/src/components/Header.tsx @@ -0,0 +1,51 @@ +import React from "react"; +import { useQuery } from "@tanstack/react-query"; +import { Wifi, WifiOff } from "lucide-react"; +import { fetchHealth } from "../api"; +import { clsx } from "clsx"; + +const Header: React.FC = () => { + const { data: health } = useQuery({ + queryKey: ["health"], + queryFn: fetchHealth, + refetchInterval: 10_000, + }); + + const isConnected = health?.status === "ok"; + + return ( +
+
+
+ {/* Logo Replacement */} + CodeLens. +
+

+ Evaluation +

+
+
+ +
+ {isConnected ? ( + <> + + Connected + + ) : ( + <> + + Offline + + )} +
+
+ ); +}; + +export default Header; diff --git a/dashboard/src/components/Leaderboard.js b/dashboard/src/components/Leaderboard.js new file mode 100644 index 0000000000000000000000000000000000000000..4f0d2e24107de377afe902eca84aac479b3fa08b --- /dev/null +++ b/dashboard/src/components/Leaderboard.js @@ -0,0 +1,23 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +import { useState } from "react"; +import { useQuery } from "@tanstack/react-query"; +import { Trophy, RefreshCw } from "lucide-react"; +import { fetchLeaderboard } from "../api"; +import LeaderboardTable from "./LeaderboardTable"; +import { clsx } from "clsx"; +const Leaderboard = () => { + const [activeTab, setActiveTab] = useState("bug_detection"); + const { data: entries, isLoading, refetch, isRefetching } = useQuery({ + queryKey: ["leaderboard", activeTab], + queryFn: () => fetchLeaderboard(activeTab), + }); + const tabs = [ + { id: "bug_detection", label: "Bug Detection" }, + { id: "security_audit", label: "Security Audit" }, + { id: "architectural_review", label: "Arch. Review" }, + ]; + return (_jsxs("div", { className: "bg-white rounded-3xl overflow-hidden flex flex-col h-[600px]", style: { border: "1px solid var(--color-border)" }, children: [_jsxs("div", { className: "px-7 py-5 flex items-center justify-between", style: { borderBottom: "1px solid var(--color-border)" }, children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 bg-amber-50 rounded-xl", children: _jsx(Trophy, { className: "w-5 h-5 text-amber-600" }) }), _jsx("h2", { className: "text-lg font-extrabold tracking-tight", style: { color: "var(--color-heading)" }, children: "Leaderboard" })] }), _jsx("button", { onClick: () => refetch(), disabled: isLoading || isRefetching, className: "p-2.5 hover:bg-zinc-100 rounded-xl transition-colors disabled:opacity-40", style: { color: "var(--color-muted)" }, children: _jsx(RefreshCw, { className: clsx("w-4 h-4", (isLoading || isRefetching) && "animate-spin") }) })] }), _jsx("div", { className: "px-7", style: { borderBottom: "1px solid var(--color-border)" }, children: _jsx("div", { className: "flex gap-6 overflow-x-auto", children: tabs.map((tab) => (_jsxs("button", { onClick: () => setActiveTab(tab.id), className: clsx("py-3.5 text-sm font-semibold transition-all relative whitespace-nowrap", activeTab === tab.id + ? "text-zinc-900" + : "text-zinc-400 hover:text-zinc-600"), children: [tab.label, activeTab === tab.id && (_jsx("div", { className: "absolute bottom-0 left-0 right-0 h-[2px] bg-zinc-900 rounded-full" }))] }, tab.id))) }) }), _jsx("div", { className: "flex-1 overflow-auto", children: isLoading ? (_jsxs("div", { className: "flex items-center justify-center h-full gap-3", style: { color: "var(--color-muted)" }, children: [_jsx(RefreshCw, { className: "w-5 h-5 animate-spin" }), _jsx("span", { className: "text-sm font-medium", children: "Loading entries..." })] })) : entries && entries.length > 0 ? (_jsx(LeaderboardTable, { entries: entries })) : (_jsxs("div", { className: "flex flex-col items-center justify-center h-full space-y-4", children: [_jsx("div", { className: "p-5 bg-zinc-50 rounded-2xl", children: _jsx(Trophy, { className: "w-10 h-10 text-zinc-200" }) }), _jsx("p", { className: "text-xs font-bold uppercase tracking-[0.15em]", style: { color: "var(--color-muted)" }, children: "No rankings yet" })] })) })] })); +}; +export default Leaderboard; diff --git a/dashboard/src/components/Leaderboard.tsx b/dashboard/src/components/Leaderboard.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7bc23a177f2965524a7b0aa5a51eb648bb96f713 --- /dev/null +++ b/dashboard/src/components/Leaderboard.tsx @@ -0,0 +1,98 @@ +import React, { useState } from "react"; +import { useQuery } from "@tanstack/react-query"; +import { Trophy, RefreshCw } from "lucide-react"; +import { TaskId } from "../types"; +import { fetchLeaderboard } from "../api"; +import LeaderboardTable from "./LeaderboardTable"; +import { clsx } from "clsx"; + +const Leaderboard: React.FC = () => { + const [activeTab, setActiveTab] = useState("bug_detection"); + + const { data: entries, isLoading, refetch, isRefetching } = useQuery({ + queryKey: ["leaderboard", activeTab], + queryFn: () => fetchLeaderboard(activeTab), + }); + + const tabs: { id: TaskId; label: string }[] = [ + { id: "bug_detection", label: "Bug Detection" }, + { id: "security_audit", label: "Security Audit" }, + { id: "architectural_review", label: "Arch. Review" }, + ]; + + return ( +
+ {/* Header */} +
+
+
+ +
+

+ Leaderboard +

+
+ +
+ + {/* Tabs */} +
+
+ {tabs.map((tab) => ( + + ))} +
+
+ + {/* Content */} +
+ {isLoading ? ( +
+ + Loading entries... +
+ ) : entries && entries.length > 0 ? ( + + ) : ( +
+
+ +
+

+ No rankings yet +

+
+ )} +
+
+ ); +}; + +export default Leaderboard; diff --git a/dashboard/src/components/LeaderboardTable.js b/dashboard/src/components/LeaderboardTable.js new file mode 100644 index 0000000000000000000000000000000000000000..94012f33e26d833886ee1d8e7e8e7c53e7bf951a --- /dev/null +++ b/dashboard/src/components/LeaderboardTable.js @@ -0,0 +1,11 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +import ScoreBadge from "./ScoreBadge"; +const LeaderboardTable = ({ entries }) => { + return (_jsxs("table", { className: "w-full text-left border-collapse", children: [_jsx("thead", { children: _jsxs("tr", { style: { borderBottom: "1px solid var(--color-border)" }, children: [_jsx("th", { className: "px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em]", style: { color: "var(--color-muted)" }, children: "Rank" }), _jsx("th", { className: "px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em]", style: { color: "var(--color-muted)" }, children: "Agent" }), _jsx("th", { className: "px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em] text-center", style: { color: "var(--color-muted)" }, children: "Score" }), _jsx("th", { className: "px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em] text-right", style: { color: "var(--color-muted)" }, children: "Seed" }), _jsx("th", { className: "px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em] text-right", style: { color: "var(--color-muted)" }, children: "Submitted" })] }) }), _jsx("tbody", { children: entries.map((entry, idx) => (_jsxs("tr", { className: "group hover:bg-zinc-50/80 transition-colors tabular-nums", style: { borderBottom: "1px solid var(--color-border)" }, children: [_jsx("td", { className: "px-7 py-5", children: idx < 3 ? (_jsx("span", { className: ` + inline-flex items-center justify-center w-7 h-7 rounded-lg text-xs font-extrabold + ${idx === 0 ? "bg-amber-50 text-amber-600" : ""} + ${idx === 1 ? "bg-zinc-100 text-zinc-500" : ""} + ${idx === 2 ? "bg-orange-50 text-orange-500" : ""} + `, children: entry.rank })) : (_jsx("span", { className: "text-sm font-semibold pl-2", style: { color: "var(--color-muted)" }, children: entry.rank })) }), _jsx("td", { className: "px-7 py-5", children: _jsx("span", { className: "font-semibold group-hover:text-zinc-900 transition-colors", style: { color: "var(--color-heading)" }, children: entry.agent_name }) }), _jsx("td", { className: "px-7 py-5 text-center", children: _jsx(ScoreBadge, { score: entry.score }) }), _jsx("td", { className: "px-7 py-5 text-right text-sm font-mono", style: { color: "var(--color-muted)" }, children: entry.seed }), _jsx("td", { className: "px-7 py-5 text-right text-xs", style: { color: "var(--color-muted)" }, children: new Date(entry.submitted_at).toLocaleDateString() })] }, idx))) })] })); +}; +export default LeaderboardTable; diff --git a/dashboard/src/components/LeaderboardTable.tsx b/dashboard/src/components/LeaderboardTable.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c89694de8862281254705108b225f7b70bf9704a --- /dev/null +++ b/dashboard/src/components/LeaderboardTable.tsx @@ -0,0 +1,77 @@ +import React from "react"; +import { LeaderboardEntry } from "../types"; +import ScoreBadge from "./ScoreBadge"; + +interface LeaderboardTableProps { + entries: LeaderboardEntry[]; +} + +const LeaderboardTable: React.FC = ({ entries }) => { + return ( + + + + + + + + + + + + {entries.map((entry, idx) => ( + + + + + + + + ))} + +
+ Rank + + Agent + + Score + + Seed + + Submitted +
+ {idx < 3 ? ( + + {entry.rank} + + ) : ( + + {entry.rank} + + )} + + + {entry.agent_name} + + + + + {entry.seed} + + {new Date(entry.submitted_at).toLocaleDateString()} +
+ ); +}; + +export default LeaderboardTable; diff --git a/dashboard/src/components/ScoreBadge.js b/dashboard/src/components/ScoreBadge.js new file mode 100644 index 0000000000000000000000000000000000000000..c49de434aadf71976f837cadb95e742b663b549e --- /dev/null +++ b/dashboard/src/components/ScoreBadge.js @@ -0,0 +1,11 @@ +import { jsx as _jsx } from "react/jsx-runtime"; +import { clsx } from "clsx"; +const ScoreBadge = ({ score }) => { + const colorClass = score >= 0.8 + ? "text-emerald-700 bg-emerald-50 ring-1 ring-emerald-200" + : score >= 0.5 + ? "text-amber-700 bg-amber-50 ring-1 ring-amber-200" + : "text-red-600 bg-red-50 ring-1 ring-red-200"; + return (_jsx("span", { className: clsx("inline-flex items-center px-3 py-1 rounded-full text-xs font-bold tabular-nums", colorClass), children: score.toFixed(2) })); +}; +export default ScoreBadge; diff --git a/dashboard/src/components/ScoreBadge.tsx b/dashboard/src/components/ScoreBadge.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e08ccf89bc7ba02df30cffaaa89049626d696085 --- /dev/null +++ b/dashboard/src/components/ScoreBadge.tsx @@ -0,0 +1,28 @@ +import React from "react"; +import { clsx } from "clsx"; + +interface ScoreBadgeProps { + score: number; +} + +const ScoreBadge: React.FC = ({ score }) => { + const colorClass = + score >= 0.8 + ? "text-emerald-700 bg-emerald-50 ring-1 ring-emerald-200" + : score >= 0.5 + ? "text-amber-700 bg-amber-50 ring-1 ring-amber-200" + : "text-red-600 bg-red-50 ring-1 ring-red-200"; + + return ( + + {score.toFixed(2)} + + ); +}; + +export default ScoreBadge; diff --git a/dashboard/src/components/StatCard.js b/dashboard/src/components/StatCard.js new file mode 100644 index 0000000000000000000000000000000000000000..48c738736cad3f804278ab034047a5c1720c3042 --- /dev/null +++ b/dashboard/src/components/StatCard.js @@ -0,0 +1,5 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +const StatCard = ({ label, value, icon, iconBg }) => { + return (_jsxs("div", { className: "bg-white rounded-3xl p-7 transition-all duration-200 hover:shadow-lg hover:-translate-y-0.5 group", style: { border: "1px solid var(--color-border)" }, children: [_jsxs("div", { className: "flex items-start justify-between mb-5", children: [_jsx("p", { className: "text-[11px] font-bold uppercase tracking-[0.12em]", style: { color: "var(--color-muted)" }, children: label }), _jsx("div", { className: `p-2.5 rounded-xl transition-transform group-hover:scale-110 ${iconBg}`, children: icon })] }), _jsx("h3", { className: "text-4xl font-extrabold tracking-tight tabular-nums", style: { color: "var(--color-heading)" }, children: value })] })); +}; +export default StatCard; diff --git a/dashboard/src/components/StatCard.tsx b/dashboard/src/components/StatCard.tsx new file mode 100644 index 0000000000000000000000000000000000000000..2603fb13d1696f53224d2adc56f845ca145f9b0d --- /dev/null +++ b/dashboard/src/components/StatCard.tsx @@ -0,0 +1,37 @@ +import React from "react"; + +interface StatCardProps { + label: string; + value: string | number; + icon: React.ReactNode; + iconBg: string; +} + +const StatCard: React.FC = ({ label, value, icon, iconBg }) => { + return ( +
+
+

+ {label} +

+
+ {icon} +
+
+

+ {value} +

+
+ ); +}; + +export default StatCard; diff --git a/dashboard/src/components/StatsRow.js b/dashboard/src/components/StatsRow.js new file mode 100644 index 0000000000000000000000000000000000000000..ef99858b04db16088dc7da037e04bb7e4ae39a52 --- /dev/null +++ b/dashboard/src/components/StatsRow.js @@ -0,0 +1,19 @@ +import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; +import { useQuery } from "@tanstack/react-query"; +import { Trophy, Zap, Activity } from "lucide-react"; +import { fetchStats, fetchHealth } from "../api"; +import StatCard from "./StatCard"; +const StatsRow = () => { + const { data: stats } = useQuery({ + queryKey: ["stats"], + queryFn: fetchStats, + refetchInterval: 30_000, + }); + const { data: health } = useQuery({ + queryKey: ["health"], + queryFn: fetchHealth, + refetchInterval: 10_000, + }); + return (_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-6", children: [_jsx(StatCard, { label: "Total Episodes", value: stats?.total_episodes ?? 0, icon: _jsx(Trophy, { className: "w-5 h-5 text-amber-600" }), iconBg: "bg-amber-50" }), _jsx(StatCard, { label: "Avg. Score", value: stats?.avg_score?.toFixed(2) ?? "0.00", icon: _jsx(Zap, { className: "w-5 h-5 text-blue-600" }), iconBg: "bg-blue-50" }), _jsx(StatCard, { label: "Active Episodes", value: health?.active_episodes ?? 0, icon: _jsx(Activity, { className: "w-5 h-5 text-emerald-600" }), iconBg: "bg-emerald-50" })] })); +}; +export default StatsRow; diff --git a/dashboard/src/components/StatsRow.tsx b/dashboard/src/components/StatsRow.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1b833259f7f73b67e4d7aa05a792ffd5592f8c6c --- /dev/null +++ b/dashboard/src/components/StatsRow.tsx @@ -0,0 +1,44 @@ +import React from "react"; +import { useQuery } from "@tanstack/react-query"; +import { Trophy, Zap, Activity } from "lucide-react"; +import { fetchStats, fetchHealth } from "../api"; +import StatCard from "./StatCard"; + +const StatsRow: React.FC = () => { + const { data: stats } = useQuery({ + queryKey: ["stats"], + queryFn: fetchStats, + refetchInterval: 30_000, + }); + + const { data: health } = useQuery({ + queryKey: ["health"], + queryFn: fetchHealth, + refetchInterval: 10_000, + }); + + return ( +
+ } + iconBg="bg-amber-50" + /> + } + iconBg="bg-blue-50" + /> + } + iconBg="bg-emerald-50" + /> +
+ ); +}; + +export default StatsRow; diff --git a/dashboard/src/hooks/useWebSocket.js b/dashboard/src/hooks/useWebSocket.js new file mode 100644 index 0000000000000000000000000000000000000000..4de4297890e7cc3a563fba492b9d1d9636782d2a --- /dev/null +++ b/dashboard/src/hooks/useWebSocket.js @@ -0,0 +1,56 @@ +import { useEffect, useRef } from "react"; +import { useEventStore } from "../stores/eventStore"; +export function useWebSocket() { + const { push, setConnected } = useEventStore(); + const reconnectTimeout = useRef(null); + useEffect(() => { + let socket = null; + let isMounted = true; + function connect() { + if (reconnectTimeout.current) + clearTimeout(reconnectTimeout.current); + const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; + const host = import.meta.env.DEV ? "localhost:7860" : window.location.host; + const url = `${protocol}//${host}/ws/events`; + socket = new WebSocket(url); + socket.onopen = () => { + if (!isMounted) + return; + setConnected(true); + console.log("WebSocket connected"); + }; + socket.onmessage = (event) => { + if (!isMounted) + return; + try { + const data = JSON.parse(event.data); + push({ + ...data, + timestamp: new Date().toISOString(), + }); + } + catch (err) { + console.error("Failed to parse WS message", err); + } + }; + socket.onclose = () => { + if (!isMounted) + return; + setConnected(false); + console.log("WebSocket closed, reconnecting in 3s..."); + reconnectTimeout.current = setTimeout(connect, 3000); + }; + socket.onerror = (err) => { + console.error("WebSocket error", err); + socket?.close(); + }; + } + connect(); + return () => { + isMounted = false; + if (reconnectTimeout.current) + clearTimeout(reconnectTimeout.current); + socket?.close(); + }; + }, [push, setConnected]); +} diff --git a/dashboard/src/hooks/useWebSocket.ts b/dashboard/src/hooks/useWebSocket.ts new file mode 100644 index 0000000000000000000000000000000000000000..41ccf7e27fa2f4daf63a4c9a4842550f15b9b4fe --- /dev/null +++ b/dashboard/src/hooks/useWebSocket.ts @@ -0,0 +1,61 @@ +import { useEffect, useRef } from "react"; +import { useEventStore } from "../stores/eventStore"; + +export function useWebSocket() { + const { push, setConnected } = useEventStore(); + const reconnectTimeout = useRef(null); + + useEffect(() => { + let socket: WebSocket | null = null; + let isMounted = true; + + function connect() { + if (reconnectTimeout.current) clearTimeout(reconnectTimeout.current); + + const protocol = window.location.protocol === "https:" ? "wss:" : "ws:"; + const host = import.meta.env.DEV ? "localhost:7860" : window.location.host; + const url = `${protocol}//${host}/ws/events`; + + socket = new WebSocket(url); + + socket.onopen = () => { + if (!isMounted) return; + setConnected(true); + console.log("WebSocket connected"); + }; + + socket.onmessage = (event) => { + if (!isMounted) return; + try { + const data = JSON.parse(event.data); + push({ + ...data, + timestamp: new Date().toISOString(), + }); + } catch (err) { + console.error("Failed to parse WS message", err); + } + }; + + socket.onclose = () => { + if (!isMounted) return; + setConnected(false); + console.log("WebSocket closed, reconnecting in 3s..."); + reconnectTimeout.current = setTimeout(connect, 3000); + }; + + socket.onerror = (err) => { + console.error("WebSocket error", err); + socket?.close(); + }; + } + + connect(); + + return () => { + isMounted = false; + if (reconnectTimeout.current) clearTimeout(reconnectTimeout.current); + socket?.close(); + }; + }, [push, setConnected]); +} diff --git a/dashboard/src/index.css b/dashboard/src/index.css new file mode 100644 index 0000000000000000000000000000000000000000..f5e0de49ed570eaa085e4101e6d202eab2b49fae --- /dev/null +++ b/dashboard/src/index.css @@ -0,0 +1,57 @@ +@import "tailwindcss"; + +:root { + --color-bg: #f4f4f5; /* zinc-100 โ€” soft warm gray */ + --color-surface: #ffffff; /* pure white cards */ + --color-border: #e4e4e7; /* zinc-200 โ€” subtle borders */ + --color-heading: #09090b; /* zinc-950 โ€” near-black headings */ + --color-body: #52525b; /* zinc-600 โ€” body text */ + --color-muted: #a1a1aa; /* zinc-400 โ€” muted/secondary */ + --color-accent: #6366f1; /* indigo-500 */ + --color-success: #22c55e; /* green-500 */ + --color-warning: #f59e0b; /* amber-500 */ + --color-danger: #ef4444; /* red-500 */ +} + +* { + box-sizing: border-box; +} + +body { + background-color: var(--color-bg); + color: var(--color-body); + font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Elegant scrollbar */ +::-webkit-scrollbar { + width: 6px; +} +::-webkit-scrollbar-track { + background: transparent; +} +::-webkit-scrollbar-thumb { + background: #d4d4d8; + border-radius: 999px; +} +::-webkit-scrollbar-thumb:hover { + background: #a1a1aa; +} + +/* Smooth fade-in for event rows */ +@keyframes fadeSlideIn { + from { + opacity: 0; + transform: translateY(-8px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.animate-fade-slide-in { + animation: fadeSlideIn 0.3s ease-out forwards; +} diff --git a/dashboard/src/main.js b/dashboard/src/main.js new file mode 100644 index 0000000000000000000000000000000000000000..15181a04dd395d189181125be9be8e2113a62298 --- /dev/null +++ b/dashboard/src/main.js @@ -0,0 +1,18 @@ +import { jsx as _jsx } from "react/jsx-runtime"; +import React from "react"; +import ReactDOM from "react-dom/client"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import "@fontsource/inter/400.css"; +import "@fontsource/inter/600.css"; +import "@fontsource/inter/700.css"; +import "./index.css"; +import App from "./App"; +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, + retry: 1, + }, + }, +}); +ReactDOM.createRoot(document.getElementById("root")).render(_jsx(React.StrictMode, { children: _jsx(QueryClientProvider, { client: queryClient, children: _jsx(App, {}) }) })); diff --git a/dashboard/src/main.tsx b/dashboard/src/main.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3256a7e4c25dbe5d55a3df25c8224cbf1b74cf66 --- /dev/null +++ b/dashboard/src/main.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import "@fontsource/inter/400.css"; +import "@fontsource/inter/600.css"; +import "@fontsource/inter/700.css"; +import "./index.css"; +import App from "./App"; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + refetchOnWindowFocus: false, + retry: 1, + }, + }, +}); + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + +); diff --git a/dashboard/src/stores/eventStore.js b/dashboard/src/stores/eventStore.js new file mode 100644 index 0000000000000000000000000000000000000000..3cd812d79cecb18fcbf18b6b8ecb3c54837e8117 --- /dev/null +++ b/dashboard/src/stores/eventStore.js @@ -0,0 +1,8 @@ +import { create } from "zustand"; +export const useEventStore = create((set) => ({ + events: [], + connected: false, + push: (e) => set((s) => ({ events: [e, ...s.events].slice(0, 20) })), + clear: () => set({ events: [] }), + setConnected: (v) => set({ connected: v }), +})); diff --git a/dashboard/src/stores/eventStore.ts b/dashboard/src/stores/eventStore.ts new file mode 100644 index 0000000000000000000000000000000000000000..8b645eb9747be9d775b4fc58c9ce83c4f208b65f --- /dev/null +++ b/dashboard/src/stores/eventStore.ts @@ -0,0 +1,18 @@ +import { create } from "zustand"; +import { WsEvent } from "../types"; + +interface EventStore { + events: WsEvent[]; + connected: boolean; + push: (e: WsEvent) => void; + clear: () => void; + setConnected: (v: boolean) => void; +} + +export const useEventStore = create((set) => ({ + events: [], + connected: false, + push: (e) => set((s) => ({ events: [e, ...s.events].slice(0, 20) })), + clear: () => set({ events: [] }), + setConnected: (v) => set({ connected: v }), +})); diff --git a/dashboard/src/types.js b/dashboard/src/types.js new file mode 100644 index 0000000000000000000000000000000000000000..cb0ff5c3b541f646105198ee23ac0fc3d805023e --- /dev/null +++ b/dashboard/src/types.js @@ -0,0 +1 @@ +export {}; diff --git a/dashboard/src/types.ts b/dashboard/src/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..92bdbf7d828540bf88ac15b401a085ccf6c70e8b --- /dev/null +++ b/dashboard/src/types.ts @@ -0,0 +1,27 @@ +export interface HealthResponse { + status: string; + active_episodes: number; + dashboard_url: string; +} + +export interface StatsResponse { + total_episodes: number; + avg_score: number; +} + +export interface LeaderboardEntry { + rank: number; + agent_name: string; + score: number; + seed: number; + submitted_at: string; +} + +export type TaskId = "bug_detection" | "security_audit" | "architectural_review"; + +export interface WsEvent { + episode_id: string; + type: string; + reward: number; + timestamp: string; +} diff --git a/dashboard/src/vite-env.d.ts b/dashboard/src/vite-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..11f02fe2a0061d6e6e1f271b21da95423b448b32 --- /dev/null +++ b/dashboard/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/dashboard/tsconfig.json b/dashboard/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..1234d83c4b2bcfe67deb906c9249fc8188390db3 --- /dev/null +++ b/dashboard/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "types": ["vite/client", "node"] + }, + "include": ["src"] +} diff --git a/dashboard/tsconfig.tsbuildinfo b/dashboard/tsconfig.tsbuildinfo new file mode 100644 index 0000000000000000000000000000000000000000..f2829701d46de4b277bcd29baceb90648dead81f --- /dev/null +++ b/dashboard/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/app.tsx","./src/api.ts","./src/main.tsx","./src/types.ts","./src/vite-env.d.ts","./src/components/eventfeed.tsx","./src/components/eventrow.tsx","./src/components/header.tsx","./src/components/leaderboard.tsx","./src/components/leaderboardtable.tsx","./src/components/scorebadge.tsx","./src/components/statcard.tsx","./src/components/statsrow.tsx","./src/hooks/usewebsocket.ts","./src/stores/eventstore.ts"],"version":"5.9.3"} \ No newline at end of file diff --git a/dashboard/vite.config.ts b/dashboard/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..baaf90ad0e11502d9f408ae31b145835ee11aa56 --- /dev/null +++ b/dashboard/vite.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; + +export default defineConfig({ + plugins: [react(), tailwindcss()], + base: "/dashboard/", + build: { + outDir: "../static/dashboard", // FastAPI serves this + emptyOutDir: true, + }, + server: { + proxy: { + "/api": { target: "http://localhost:7860", changeOrigin: true, rewrite: (p) => p.replace(/^\/api/, "") }, + "/ws": { target: "ws://localhost:7860", ws: true }, + }, + }, +}); diff --git a/inference.py b/inference.py index 2827de49c3e9413c3675e04241efc58c654be44b..0a8533763063060d005fa43c69f702cc6eb4c45d 100644 --- a/inference.py +++ b/inference.py @@ -1,13 +1,13 @@ """ -OpenEnv Inference Script โ€” AgentOrg CodeReview Environment +CodeLens Inference Script โ€” CodeLens Environment ========================================================== Required env vars: API_BASE_URL โ€” OpenAI-compatible base URL (e.g. https://api.openai.com/v1) MODEL_NAME โ€” Model identifier (e.g. gpt-4o, gpt-3.5-turbo) HF_TOKEN โ€” Hugging Face token (used as api_key for OpenAI client) - ENV_URL โ€” CodeReview env URL (default: http://localhost:7860) + ENV_URL โ€” CodeLens env URL (default: http://localhost:7860) -Output format (stdout, per OpenEnv spec): +Output format (stdout, per CodeLens spec): [START] task= env= model= [STEP] step= action= reward= done= error= [END] success= steps= score= rewards= @@ -16,10 +16,11 @@ Output format (stdout, per OpenEnv spec): import os import sys import json +import time import requests from openai import OpenAI -# โ”€โ”€ Environment Variables (exact names required by OpenEnv spec) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ Environment Variables (exact names required by CodeLens spec) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ API_BASE_URL = os.environ.get("API_BASE_URL", "https://api.openai.com/v1") MODEL_NAME = os.environ.get("MODEL_NAME", "gpt-3.5-turbo") HF_TOKEN = os.environ.get("HF_TOKEN", "dummy") @@ -35,7 +36,7 @@ SEEDS = [0, 1, 2] # Run each task on 3 seeds for robust baseline client = OpenAI(api_key=HF_TOKEN, base_url=API_BASE_URL) -# โ”€โ”€ Structured log helpers (mandatory OpenEnv format) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +# โ”€โ”€ Structured log helpers (mandatory CodeLens format) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ def log_start(task: str, env: str, model: str): print(f"[START] task={task} env={env} model={model}", flush=True) @@ -121,16 +122,32 @@ Output a single JSON action object. If you've already flagged the main issues, s def call_llm(messages: list) -> dict: - """Call the LLM and parse its JSON response into an action dict.""" - response = client.chat.completions.create( - model=MODEL_NAME, - messages=messages, - temperature=0.1, - max_tokens=512, - response_format={"type": "json_object"}, - ) - content = response.choices[0].message.content.strip() - return json.loads(content) + """Call the LLM with retries and parse its JSON response.""" + last_err = None + for attempt in range(3): + try: + response = client.chat.completions.create( + model=MODEL_NAME, + messages=messages, + temperature=0.1, + max_tokens=600, + response_format={"type": "json_object"}, + ) + content = response.choices[0].message.content.strip() + + # Robust JSON extract (some models might still use markdown) + if "```json" in content: + content = content.split("```json")[1].split("```")[0].strip() + elif "```" in content: + content = content.split("```")[1].split("```")[0].strip() + + return json.loads(content) + except Exception as e: + last_err = e + if attempt < 2: + time.sleep(2 ** attempt) + + raise last_err or Exception("LLM call failed after retries") def sanitize_action(action_dict: dict, task_id: str) -> dict: @@ -267,7 +284,7 @@ def run_episode(task_id: str, seed: int) -> dict: def main(): """Run all tasks across multiple seeds and print a summary.""" print("=" * 60, flush=True) - print(f"AgentOrg CodeReview OpenEnv Baseline", flush=True) + print(f"CodeLens Baseline", flush=True) print(f"Model: {MODEL_NAME}", flush=True) print(f"EnvURL: {ENV_URL}", flush=True) print("=" * 60, flush=True) diff --git a/pyproject.toml b/pyproject.toml index a28f46f86d1ab40e4e06e0e8683a7a12c20dec26..4af2eb5ee6ff613b0b8e4d49f0a4db3f5403e6ea 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.coverage.run] -source = ["codereview_env", "app"] +source = ["codelens_env", "app"] omit = ["tests/*", "scripts/*", "*/migrations/*"] [tool.coverage.report] diff --git a/requirements.txt b/requirements.txt index 9bc7f10bc2d15d9efd7c4551a0c45117ef31806b..aa93371eb5365d0ab01800aad151f433483676f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,3 +12,4 @@ python-dotenv==1.0.1 sqlmodel==0.0.16 aiosqlite==0.20.0 pytest-cov==4.1.0 +aiofiles==23.2.1 diff --git a/results.json b/results.json index 64fef7b443c4b74750475f12666899ad1da4390b..bb51e206c500005fc58b1becff88f498bb5cd09a 100644 --- a/results.json +++ b/results.json @@ -1,6 +1,6 @@ [ { - "episode_id": "d35a5286-23e7-4a53-a34c-6ca93f4e7134", + "episode_id": "0d8d0a22-2a81-48a1-8dbe-c9662da7dc2b", "task_id": "bug_detection", "seed": 0, "final_score": 0.0, @@ -9,10 +9,10 @@ "issues_total": 1, "noise_penalties": 0, "terminated_reason": "terminal_action", - "duration_seconds": 0.01 + "duration_seconds": 0.03 }, { - "episode_id": "9c81d2b3-f0dd-4efc-915e-4b7dfcf355ef", + "episode_id": "6ddc5a56-86c1-43f2-8839-b6ad9eac2ad9", "task_id": "bug_detection", "seed": 1, "final_score": 0.0, @@ -21,10 +21,10 @@ "issues_total": 1, "noise_penalties": 0, "terminated_reason": "terminal_action", - "duration_seconds": 0.01 + "duration_seconds": 0.02 }, { - "episode_id": "38fba47b-2915-4fba-89ef-865834bcc67b", + "episode_id": "df00496e-0e19-4049-82d9-6a0f2a1e8f2a", "task_id": "bug_detection", "seed": 2, "final_score": 0.9167, @@ -33,10 +33,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.06 }, { - "episode_id": "ce85c7b9-2c34-4d29-96e6-83b66da4c4a2", + "episode_id": "26837a97-d3ad-4fd7-8e74-d0d713b9b137", "task_id": "bug_detection", "seed": 3, "final_score": 0.9167, @@ -45,10 +45,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.04 }, { - "episode_id": "03b43be8-968b-4d35-8cb6-4a4a7211061d", + "episode_id": "41b3e01d-5498-42a1-a3f9-44bb87f542b6", "task_id": "bug_detection", "seed": 4, "final_score": 0.8267, @@ -60,7 +60,7 @@ "duration_seconds": 0.03 }, { - "episode_id": "1acad7bc-2374-4d70-95ad-f5536ecc22a6", + "episode_id": "8331b8bf-f397-49be-bc07-62bb0bdddd5c", "task_id": "bug_detection", "seed": 5, "final_score": 0.0, @@ -69,10 +69,10 @@ "issues_total": 1, "noise_penalties": 0, "terminated_reason": "terminal_action", - "duration_seconds": 0.01 + "duration_seconds": 0.02 }, { - "episode_id": "fa84dd18-e38c-412d-a252-206a514fc352", + "episode_id": "22341ab4-ea27-416b-ba40-53f93b6090c9", "task_id": "bug_detection", "seed": 6, "final_score": 0.0, @@ -81,10 +81,10 @@ "issues_total": 1, "noise_penalties": 0, "terminated_reason": "terminal_action", - "duration_seconds": 0.01 + "duration_seconds": 0.02 }, { - "episode_id": "c43cf6db-d5ca-4c45-871d-1a0bc64602fa", + "episode_id": "9fc11809-6ba4-4bf6-b00e-9b8ffc61218f", "task_id": "bug_detection", "seed": 7, "final_score": 0.0, @@ -96,7 +96,7 @@ "duration_seconds": 0.02 }, { - "episode_id": "7dcff1f7-41f4-483f-8fab-caa6d62f5b66", + "episode_id": "dce54792-7fba-4e8c-8feb-404aa655172f", "task_id": "bug_detection", "seed": 8, "final_score": 0.9167, @@ -105,10 +105,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.04 }, { - "episode_id": "b379af5c-4096-45fd-95fe-534a0bf4a7af", + "episode_id": "be559f48-b216-49b9-8f3d-ad9b50da3751", "task_id": "bug_detection", "seed": 9, "final_score": 0.0, @@ -117,10 +117,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "ee70e3aa-fbaf-4a2e-8b5e-fc62a8a93192", + "episode_id": "b2029cb1-c72e-438a-bd96-98a0aa9bc141", "task_id": "security_audit", "seed": 0, "final_score": 0.0, @@ -129,22 +129,22 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "c9df9d0e-1719-4fbd-b6e8-3b5c5663a0a2", + "episode_id": "e383f50e-5797-40d9-9f54-aa4142247a6e", "task_id": "security_audit", "seed": 1, - "final_score": 0.85, + "final_score": 1.0, "steps_taken": 6, "issues_found": 1, "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.04 }, { - "episode_id": "fbf2c333-8b32-4ab8-b260-bdeb2ccda91b", + "episode_id": "6560439d-9050-4c94-96b1-c31111081c2e", "task_id": "security_audit", "seed": 2, "final_score": 0.0, @@ -153,22 +153,22 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.04 + "duration_seconds": 0.03 }, { - "episode_id": "4fd0a956-7b46-4819-b59d-5e54bec65311", + "episode_id": "d9a9d12d-384c-4dd2-86cb-b55ea7604e60", "task_id": "security_audit", "seed": 3, - "final_score": 0.775, + "final_score": 0.85, "steps_taken": 6, "issues_found": 1, "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.03 + "duration_seconds": 0.04 }, { - "episode_id": "ee98565e-4fc1-430c-8463-c0bcd801f107", + "episode_id": "463b8d96-ad63-472f-ad93-f20c99afe96e", "task_id": "security_audit", "seed": 4, "final_score": 0.0, @@ -180,7 +180,7 @@ "duration_seconds": 0.03 }, { - "episode_id": "7a5a3689-5f55-4f1c-8c8d-81cfaa1e35e6", + "episode_id": "15e9c92a-559a-4ba6-b75b-b12ac6055f91", "task_id": "security_audit", "seed": 5, "final_score": 0.0, @@ -189,10 +189,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.06 }, { - "episode_id": "1a2c2666-389e-4835-8aab-7e7ff63a2511", + "episode_id": "38bd8513-7511-4a2f-8642-fc23f50b61bd", "task_id": "security_audit", "seed": 6, "final_score": 0.0, @@ -201,10 +201,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "9e78465a-b7d6-4ca8-8aae-761a2e55be82", + "episode_id": "8a6e48fd-1b17-475f-b495-a1cd8ce2e70c", "task_id": "security_audit", "seed": 7, "final_score": 0.0, @@ -213,10 +213,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "e59ee756-fbf1-4aa1-ac42-d1cb23079d88", + "episode_id": "3ec40833-ce55-4a63-ad90-55b2e35370d1", "task_id": "security_audit", "seed": 8, "final_score": 0.0, @@ -225,10 +225,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "f573727f-ac41-47ba-bcb9-55495da61615", + "episode_id": "87fa57a3-27f3-4f9b-a0ad-008ff9b4c7f2", "task_id": "security_audit", "seed": 9, "final_score": 0.0, @@ -237,10 +237,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "0c368016-4685-4699-abf0-d74337a3ea8d", + "episode_id": "8a878e69-51c2-4992-8276-616cbc798efd", "task_id": "architectural_review", "seed": 0, "final_score": 0.0, @@ -249,10 +249,10 @@ "issues_total": 1, "noise_penalties": 0, "terminated_reason": "terminal_action", - "duration_seconds": 0.01 + "duration_seconds": 0.02 }, { - "episode_id": "5dbf1824-e62b-4491-aaf2-c6ec3a2ae597", + "episode_id": "c85766aa-d231-4998-8d95-b4dbbfd5aea6", "task_id": "architectural_review", "seed": 1, "final_score": 0.059, @@ -261,10 +261,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.04 }, { - "episode_id": "b2249f5c-8e6a-4ee4-b973-2dd428613a7c", + "episode_id": "29122fdb-ed30-4a46-8b04-4aa8c2025e6c", "task_id": "architectural_review", "seed": 2, "final_score": 0.661, @@ -273,10 +273,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.04 }, { - "episode_id": "0e58c8c0-efa1-4c16-9002-6d48e8f82439", + "episode_id": "1388c816-8e96-4014-b255-81382e9353ba", "task_id": "architectural_review", "seed": 3, "final_score": 0.658, @@ -285,10 +285,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "69cf00eb-5a20-4347-9887-f9806026a66b", + "episode_id": "adee24d2-cb77-48b6-b00b-72c39d7d7c7e", "task_id": "architectural_review", "seed": 4, "final_score": 0.058, @@ -297,10 +297,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "233ff87c-475f-4485-bd76-9abab4d2a304", + "episode_id": "12508a15-eb46-4628-b750-cde1b5f91828", "task_id": "architectural_review", "seed": 5, "final_score": 0.657, @@ -309,10 +309,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.04 }, { - "episode_id": "89210c97-a95a-49c8-a9d1-8dbe6db92238", + "episode_id": "520fb8ad-58fe-48fa-8a96-89e552e12924", "task_id": "architectural_review", "seed": 6, "final_score": 0.059, @@ -321,10 +321,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "80c89d9d-92e9-4fbc-9a4f-401848c92cce", + "episode_id": "86982fa4-cee7-48fc-b8d1-347a2f650f6d", "task_id": "architectural_review", "seed": 7, "final_score": 0.664, @@ -333,10 +333,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.04 }, { - "episode_id": "325d65a3-94e7-40f8-90a6-d93bac2cbd9e", + "episode_id": "086e541a-776e-4ac6-b44e-1eeb76d88b4e", "task_id": "architectural_review", "seed": 8, "final_score": 0.039, @@ -345,10 +345,10 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 }, { - "episode_id": "d94abdb2-90c6-424a-9a26-e798a2ea9b13", + "episode_id": "3bcd91ce-0d0d-48c5-ab25-bc8534906f5b", "task_id": "architectural_review", "seed": 9, "final_score": 0.075, @@ -357,6 +357,6 @@ "issues_total": 1, "noise_penalties": 5, "terminated_reason": "noise_exhausted", - "duration_seconds": 0.02 + "duration_seconds": 0.03 } ] \ No newline at end of file diff --git a/scripts/baseline.py b/scripts/baseline.py index 2537b5d49cab6f1d4b3199754401d3a98389d759..1a32e886ae5350af2f662ababafbe0f9e7f45b44 100644 --- a/scripts/baseline.py +++ b/scripts/baseline.py @@ -255,7 +255,7 @@ def save_results(results: list, output_path: str): writer.writerows(results) def main(): - parser = argparse.ArgumentParser(description="AgentOrg CodeReview Baseline Agent") + parser = argparse.ArgumentParser(description="CodeLens Baseline Agent") parser.add_argument("--url", default="http://localhost:7860") parser.add_argument("--task", default="bug_detection", choices=["bug_detection", "security_audit", "architectural_review"]) diff --git a/scripts/evaluate.py b/scripts/evaluate.py index 4322ee5569146bf9d52386c9e749af112d827e92..9fd5ce6b6ba10664c961cc008610b43d9278d33f 100644 --- a/scripts/evaluate.py +++ b/scripts/evaluate.py @@ -70,7 +70,7 @@ def print_summary(results: list): print("="*60) def main(): - parser = argparse.ArgumentParser(description="Batch evaluation of all 30 CodeReview scenarios") + parser = argparse.ArgumentParser(description="Batch evaluation of all 30 CodeLens scenarios") parser.add_argument("--url", default="http://localhost:7860") parser.add_argument("--agent", default="keyword", choices=["keyword", "llm"]) parser.add_argument("--api-key", default="") diff --git a/scripts/migrate.py b/scripts/migrate.py index efa320e989f34b5a58966eb8165623315060cd9e..ab9a93302999a9766f38c419a91f1f8103dff051 100644 --- a/scripts/migrate.py +++ b/scripts/migrate.py @@ -1,12 +1,12 @@ #!/usr/bin/env python3 -"""Initialize or reset the CodeReview database.""" +"""Initialize or reset the CodeLens database.""" import sys import os -# Ensure PYTHONPATH is set so we can import codereview_env +# Ensure PYTHONPATH is set so we can import codelens_env sys.path.append(os.getcwd()) -from codereview_env.database import create_db_and_tables, get_engine -from codereview_env.config import get_settings +from codelens_env.database import create_db_and_tables, get_engine +from codelens_env.config import get_settings from sqlmodel import SQLModel def init(): diff --git a/scripts/validate.py b/scripts/validate.py index b7092da04a4a55a28d66e699e667e6b1de657da5..cb989a22876f048f39b3576181a1a86bad5ec705 100644 --- a/scripts/validate.py +++ b/scripts/validate.py @@ -1,10 +1,10 @@ import sys -from codereview_env.models import TaskId -from codereview_env.env import CodeReviewEnv +from codelens_env.models import TaskId +from codelens_env.env import CodeLensEnv def validate_environment(): - print("=== OpenEnv Validation Suite ===") - env = CodeReviewEnv() + print("=== CodeLens Validation Suite ===") + env = CodeLensEnv() tasks = [TaskId.BUG_DETECTION, TaskId.SECURITY_AUDIT, TaskId.ARCHITECTURAL_REVIEW] total_scenarios = 30 diff --git a/static/dashboard/assets/index-B0pKs5gM.css b/static/dashboard/assets/index-B0pKs5gM.css new file mode 100644 index 0000000000000000000000000000000000000000..6a4ab0e619589538025314cd1055ac5e66474f7d --- /dev/null +++ b/static/dashboard/assets/index-B0pKs5gM.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/dashboard/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2) format("woff2"),url(/dashboard/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/dashboard/assets/inter-cyrillic-400-normal-obahsSVq.woff2) format("woff2"),url(/dashboard/assets/inter-cyrillic-400-normal-HOLc17fK.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/dashboard/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2) format("woff2"),url(/dashboard/assets/inter-greek-ext-400-normal-KugGGMne.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/dashboard/assets/inter-greek-400-normal-B4URO6DV.woff2) format("woff2"),url(/dashboard/assets/inter-greek-400-normal-q2sYcFCs.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2) format("woff2"),url(/dashboard/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/dashboard/assets/inter-latin-ext-400-normal-C1nco2VV.woff2) format("woff2"),url(/dashboard/assets/inter-latin-ext-400-normal-77YHD8bZ.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/dashboard/assets/inter-latin-400-normal-C38fXH4l.woff2) format("woff2"),url(/dashboard/assets/inter-latin-400-normal-CyCys3Eg.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/dashboard/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2) format("woff2"),url(/dashboard/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/dashboard/assets/inter-cyrillic-600-normal-CWCymEST.woff2) format("woff2"),url(/dashboard/assets/inter-cyrillic-600-normal-4D_pXhcN.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/dashboard/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2) format("woff2"),url(/dashboard/assets/inter-greek-ext-600-normal-B8X0CLgF.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/dashboard/assets/inter-greek-600-normal-plRanbMR.woff2) format("woff2"),url(/dashboard/assets/inter-greek-600-normal-BZpKdvQh.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2) format("woff2"),url(/dashboard/assets/inter-vietnamese-600-normal-BuLX-rYi.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/dashboard/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2) format("woff2"),url(/dashboard/assets/inter-latin-ext-600-normal-CIVaiw4L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/dashboard/assets/inter-latin-600-normal-LgqL8muc.woff2) format("woff2"),url(/dashboard/assets/inter-latin-600-normal-CiBQ2DWP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/dashboard/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2) format("woff2"),url(/dashboard/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/dashboard/assets/inter-cyrillic-700-normal-CjBOestx.woff2) format("woff2"),url(/dashboard/assets/inter-cyrillic-700-normal-DrXBdSj3.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/dashboard/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2) format("woff2"),url(/dashboard/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/dashboard/assets/inter-greek-700-normal-C3JjAnD8.woff2) format("woff2"),url(/dashboard/assets/inter-greek-700-normal-BUv2fZ6O.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/dashboard/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2) format("woff2"),url(/dashboard/assets/inter-vietnamese-700-normal-BZaoP0fm.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/dashboard/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2) format("woff2"),url(/dashboard/assets/inter-latin-ext-700-normal-TidjK2hL.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/dashboard/assets/inter-latin-700-normal-Yt3aPRUw.woff2) format("woff2"),url(/dashboard/assets/inter-latin-700-normal-BLAVimhd.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-orange-50:oklch(98% .016 73.684);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-blue-50:oklch(97% .014 254.604);--color-blue-600:oklch(54.6% .245 262.881);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-600:oklch(51.1% .262 276.966);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-900:oklch(21% .006 285.885);--color-white:#fff;--spacing:.25rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.relative{position:relative}.right-0{right:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.table{display:table}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-7{height:calc(var(--spacing) * 7)}.h-10{height:calc(var(--spacing) * 10)}.h-\[2px\]{height:2px}.h-\[38px\]{height:38px}.h-\[600px\]{height:600px}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-7{width:calc(var(--spacing) * 7)}.w-10{width:calc(var(--spacing) * 10)}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[140px\]{max-width:140px}.max-w-\[180px\]{max-width:180px}.flex-1{flex:1}.border-collapse{border-collapse:collapse}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-red-50{background-color:var(--color-red-50)}.bg-white{background-color:var(--color-white)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-900{background-color:var(--color-zinc-900)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-7{padding:calc(var(--spacing) * 7)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.3em\]{--tw-tracking:.3em;letter-spacing:.3em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-blue-600{color:var(--color-blue-600)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-indigo-600{color:var(--color-indigo-600)}.text-orange-500{color:var(--color-orange-500)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-900{color:var(--color-zinc-900)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-40{opacity:.4}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-amber-200{--tw-ring-color:var(--color-amber-200)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-red-200{--tw-ring-color:var(--color-red-200)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}@media(hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:text-zinc-900:is(:where(.group):hover *){color:var(--color-zinc-900)}.group-hover\:opacity-60:is(:where(.group):hover *){opacity:.6}.hover\:-translate-y-0\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:bg-zinc-50\/80:hover{background-color:#fafafacc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-50\/80:hover{background-color:color-mix(in oklab,var(--color-zinc-50) 80%,transparent)}}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:text-zinc-600:hover{color:var(--color-zinc-600)}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.disabled\:opacity-40:disabled{opacity:.4}@media(min-width:40rem){.sm\:block{display:block}}@media(min-width:48rem){.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:64rem){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}:root{--color-bg:#f4f4f5;--color-surface:#fff;--color-border:#e4e4e7;--color-heading:#09090b;--color-body:#52525b;--color-muted:#a1a1aa;--color-accent:#6366f1;--color-success:#22c55e;--color-warning:#f59e0b;--color-danger:#ef4444}*{box-sizing:border-box}body{background-color:var(--color-bg);color:var(--color-body);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,sans-serif}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:#d4d4d8;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:#a1a1aa}@keyframes fadeSlideIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.animate-fade-slide-in{animation:.3s ease-out forwards fadeSlideIn}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}} diff --git a/static/dashboard/assets/index-DPI5XFJq.js b/static/dashboard/assets/index-DPI5XFJq.js new file mode 100644 index 0000000000000000000000000000000000000000..896e65c00d4929355e413fcf77982d20bc922a69 --- /dev/null +++ b/static/dashboard/assets/index-DPI5XFJq.js @@ -0,0 +1,100 @@ +var hf=o=>{throw TypeError(o)};var Vo=(o,s,u)=>s.has(o)||hf("Cannot "+u);var h=(o,s,u)=>(Vo(o,s,"read from private field"),u?u.call(o):s.get(o)),q=(o,s,u)=>s.has(o)?hf("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(o):s.set(o,u),z=(o,s,u,c)=>(Vo(o,s,"write to private field"),c?c.call(o,u):s.set(o,u),u),re=(o,s,u)=>(Vo(o,s,"access private method"),u);var Vi=(o,s,u,c)=>({set _(y){z(o,s,y,u)},get _(){return h(o,s,c)}});(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const y of document.querySelectorAll('link[rel="modulepreload"]'))c(y);new MutationObserver(y=>{for(const S of y)if(S.type==="childList")for(const R of S.addedNodes)R.tagName==="LINK"&&R.rel==="modulepreload"&&c(R)}).observe(document,{childList:!0,subtree:!0});function u(y){const S={};return y.integrity&&(S.integrity=y.integrity),y.referrerPolicy&&(S.referrerPolicy=y.referrerPolicy),y.crossOrigin==="use-credentials"?S.credentials="include":y.crossOrigin==="anonymous"?S.credentials="omit":S.credentials="same-origin",S}function c(y){if(y.ep)return;y.ep=!0;const S=u(y);fetch(y.href,S)}})();function qf(o){return o&&o.__esModule&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o}var Wo={exports:{}},Sl={},$o={exports:{}},b={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var pf;function sp(){if(pf)return b;pf=1;var o=Symbol.for("react.element"),s=Symbol.for("react.portal"),u=Symbol.for("react.fragment"),c=Symbol.for("react.strict_mode"),y=Symbol.for("react.profiler"),S=Symbol.for("react.provider"),R=Symbol.for("react.context"),N=Symbol.for("react.forward_ref"),O=Symbol.for("react.suspense"),A=Symbol.for("react.memo"),V=Symbol.for("react.lazy"),F=Symbol.iterator;function W(m){return m===null||typeof m!="object"?null:(m=F&&m[F]||m["@@iterator"],typeof m=="function"?m:null)}var G={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ne=Object.assign,B={};function Q(m,E,J){this.props=m,this.context=E,this.refs=B,this.updater=J||G}Q.prototype.isReactComponent={},Q.prototype.setState=function(m,E){if(typeof m!="object"&&typeof m!="function"&&m!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,m,E,"setState")},Q.prototype.forceUpdate=function(m){this.updater.enqueueForceUpdate(this,m,"forceUpdate")};function le(){}le.prototype=Q.prototype;function he(m,E,J){this.props=m,this.context=E,this.refs=B,this.updater=J||G}var ee=he.prototype=new le;ee.constructor=he,ne(ee,Q.prototype),ee.isPureReactComponent=!0;var L=Array.isArray,ce=Object.prototype.hasOwnProperty,fe={current:null},Ce={key:!0,ref:!0,__self:!0,__source:!0};function Z(m,E,J){var te,oe={},ue=null,ye=null;if(E!=null)for(te in E.ref!==void 0&&(ye=E.ref),E.key!==void 0&&(ue=""+E.key),E)ce.call(E,te)&&!Ce.hasOwnProperty(te)&&(oe[te]=E[te]);var pe=arguments.length-2;if(pe===1)oe.children=J;else if(1>>1,E=j[m];if(0>>1;my(oe,I))uey(ye,oe)?(j[m]=ye,j[ue]=I,m=ue):(j[m]=oe,j[te]=I,m=te);else if(uey(ye,I))j[m]=ye,j[ue]=I,m=ue;else break e}}return Y}function y(j,Y){var I=j.sortIndex-Y.sortIndex;return I!==0?I:j.id-Y.id}if(typeof performance=="object"&&typeof performance.now=="function"){var S=performance;o.unstable_now=function(){return S.now()}}else{var R=Date,N=R.now();o.unstable_now=function(){return R.now()-N}}var O=[],A=[],V=1,F=null,W=3,G=!1,ne=!1,B=!1,Q=typeof setTimeout=="function"?setTimeout:null,le=typeof clearTimeout=="function"?clearTimeout:null,he=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function ee(j){for(var Y=u(A);Y!==null;){if(Y.callback===null)c(A);else if(Y.startTime<=j)c(A),Y.sortIndex=Y.expirationTime,s(O,Y);else break;Y=u(A)}}function L(j){if(B=!1,ee(j),!ne)if(u(O)!==null)ne=!0,nt(ce);else{var Y=u(A);Y!==null&&Pe(L,Y.startTime-j)}}function ce(j,Y){ne=!1,B&&(B=!1,le(Z),Z=-1),G=!0;var I=W;try{for(ee(Y),F=u(O);F!==null&&(!(F.expirationTime>Y)||j&&!Ve());){var m=F.callback;if(typeof m=="function"){F.callback=null,W=F.priorityLevel;var E=m(F.expirationTime<=Y);Y=o.unstable_now(),typeof E=="function"?F.callback=E:F===u(O)&&c(O),ee(Y)}else c(O);F=u(O)}if(F!==null)var J=!0;else{var te=u(A);te!==null&&Pe(L,te.startTime-Y),J=!1}return J}finally{F=null,W=I,G=!1}}var fe=!1,Ce=null,Z=-1,ve=5,we=-1;function Ve(){return!(o.unstable_now()-wej||125m?(j.sortIndex=I,s(A,j),u(O)===null&&j===u(A)&&(B?(le(Z),Z=-1):B=!0,Pe(L,I-m))):(j.sortIndex=E,s(O,j),ne||G||(ne=!0,nt(ce))),j},o.unstable_shouldYield=Ve,o.unstable_wrapCallback=function(j){var Y=W;return function(){var I=W;W=Y;try{return j.apply(this,arguments)}finally{W=I}}}})(Go)),Go}var wf;function cp(){return wf||(wf=1,qo.exports=ap()),qo.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Sf;function fp(){if(Sf)return ut;Sf=1;var o=du(),s=cp();function u(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),O=Object.prototype.hasOwnProperty,A=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,V={},F={};function W(e){return O.call(F,e)?!0:O.call(V,e)?!1:A.test(e)?F[e]=!0:(V[e]=!0,!1)}function G(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function ne(e,t,n,r){if(t===null||typeof t>"u"||G(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function B(e,t,n,r,l,i,a){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=a}var Q={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Q[e]=new B(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Q[t]=new B(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){Q[e]=new B(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Q[e]=new B(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Q[e]=new B(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){Q[e]=new B(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){Q[e]=new B(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){Q[e]=new B(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){Q[e]=new B(e,5,!1,e.toLowerCase(),null,!1,!1)});var le=/[\-:]([a-z])/g;function he(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(le,he);Q[t]=new B(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(le,he);Q[t]=new B(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(le,he);Q[t]=new B(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){Q[e]=new B(e,1,!1,e.toLowerCase(),null,!1,!1)}),Q.xlinkHref=new B("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){Q[e]=new B(e,1,!1,e.toLowerCase(),null,!0,!0)});function ee(e,t,n,r){var l=Q.hasOwnProperty(t)?Q[t]:null;(l!==null?l.type!==0:r||!(2f||l[a]!==i[f]){var d=` +`+l[a].replace(" at new "," at ");return e.displayName&&d.includes("")&&(d=d.replace("",e.displayName)),d}while(1<=a&&0<=f);break}}}finally{J=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?E(e):""}function oe(e){switch(e.tag){case 5:return E(e.type);case 16:return E("Lazy");case 13:return E("Suspense");case 19:return E("SuspenseList");case 0:case 2:case 15:return e=te(e.type,!1),e;case 11:return e=te(e.type.render,!1),e;case 1:return e=te(e.type,!0),e;default:return""}}function ue(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Ce:return"Fragment";case fe:return"Portal";case ve:return"Profiler";case Z:return"StrictMode";case We:return"Suspense";case $e:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Ve:return(e.displayName||"Context")+".Consumer";case we:return(e._context.displayName||"Context")+".Provider";case Ze:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Je:return t=e.displayName||null,t!==null?t:ue(e.type)||"Memo";case nt:t=e._payload,e=e._init;try{return ue(e(t))}catch{}}return null}function ye(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ue(t);case 8:return t===Z?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function pe(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function ke(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function ft(e){var t=ke(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var l=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(a){r=""+a,i.call(this,a)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(a){r=""+a},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Ml(e){e._valueTracker||(e._valueTracker=ft(e))}function gu(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ke(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Fl(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Yi(e,t){var n=t.checked;return I({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function wu(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=pe(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Su(e,t){t=t.checked,t!=null&&ee(e,"checked",t,!1)}function Xi(e,t){Su(e,t);var n=pe(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Zi(e,t.type,n):t.hasOwnProperty("defaultValue")&&Zi(e,t.type,pe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function xu(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Zi(e,t,n){(t!=="number"||Fl(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Lr=Array.isArray;function Jn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l"+t.valueOf().toString()+"",t=Ll.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ir(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Dr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},cd=["Webkit","ms","Moz","O"];Object.keys(Dr).forEach(function(e){cd.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Dr[t]=Dr[e]})});function Pu(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Dr.hasOwnProperty(e)&&Dr[e]?(""+t).trim():t+"px"}function Ru(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,l=Pu(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}var fd=I({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function es(e,t){if(t){if(fd[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(u(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(u(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(u(61))}if(t.style!=null&&typeof t.style!="object")throw Error(u(62))}}function ts(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var ns=null;function rs(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ls=null,bn=null,er=null;function ju(e){if(e=il(e)){if(typeof ls!="function")throw Error(u(280));var t=e.stateNode;t&&(t=li(t),ls(e.stateNode,e.type,t))}}function Tu(e){bn?er?er.push(e):er=[e]:bn=e}function Ou(){if(bn){var e=bn,t=er;if(er=bn=null,ju(e),t)for(e=0;e>>=0,e===0?32:31-(kd(e)/Ed|0)|0}var Ql=64,Hl=4194304;function Hr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Bl(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,i=e.pingedLanes,a=n&268435455;if(a!==0){var f=a&~l;f!==0?r=Hr(f):(i&=a,i!==0&&(r=Hr(i)))}else a=n&~l,a!==0?r=Hr(a):i!==0&&(r=Hr(i));if(r===0)return 0;if(t!==0&&t!==r&&(t&l)===0&&(l=r&-r,i=t&-t,l>=i||l===16&&(i&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Br(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-_t(t),e[t]=n}function Pd(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Xr),ia=" ",sa=!1;function oa(e,t){switch(e){case"keyup":return th.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ua(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var rr=!1;function rh(e,t){switch(e){case"compositionend":return ua(t);case"keypress":return t.which!==32?null:(sa=!0,ia);case"textInput":return e=t.data,e===ia&&sa?null:e;default:return null}}function lh(e,t){if(rr)return e==="compositionend"||!ks&&oa(e,t)?(e=bu(),ql=vs=nn=null,rr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ma(n)}}function ya(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ya(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function ga(){for(var e=window,t=Fl();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Fl(e.document)}return t}function _s(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function hh(e){var t=ga(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&ya(n.ownerDocument.documentElement,n)){if(r!==null&&_s(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var l=n.textContent.length,i=Math.min(r.start,l);r=r.end===void 0?i:Math.min(r.end,l),!e.extend&&i>r&&(l=r,r=i,i=l),l=va(n,i);var a=va(n,r);l&&a&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,lr=null,Ns=null,el=null,Ps=!1;function wa(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Ps||lr==null||lr!==Fl(r)||(r=lr,"selectionStart"in r&&_s(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),el&&br(el,r)||(el=r,r=ti(Ns,"onSelect"),0ar||(e.current=As[ar],As[ar]=null,ar--)}function ge(e,t){ar++,As[ar]=e.current,e.current=t}var on={},Ke=sn(on),rt=sn(!1),Tn=on;function cr(e,t){var n=e.type.contextTypes;if(!n)return on;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},i;for(i in n)l[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function lt(e){return e=e.childContextTypes,e!=null}function ii(){xe(rt),xe(Ke)}function Fa(e,t,n){if(Ke.current!==on)throw Error(u(168));ge(Ke,t),ge(rt,n)}function La(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(u(108,ye(e)||"Unknown",l));return I({},n,r)}function si(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||on,Tn=Ke.current,ge(Ke,e),ge(rt,rt.current),!0}function Ia(e,t,n){var r=e.stateNode;if(!r)throw Error(u(169));n?(e=La(e,t,Tn),r.__reactInternalMemoizedMergedChildContext=e,xe(rt),xe(Ke),ge(Ke,e)):xe(rt),ge(rt,n)}var Bt=null,oi=!1,Qs=!1;function Da(e){Bt===null?Bt=[e]:Bt.push(e)}function _h(e){oi=!0,Da(e)}function un(){if(!Qs&&Bt!==null){Qs=!0;var e=0,t=me;try{var n=Bt;for(me=1;e>=a,l-=a,Vt=1<<32-_t(t)+l|n<X?(Ue=K,K=null):Ue=K.sibling;var ae=k(v,K,g[X],P);if(ae===null){K===null&&(K=Ue);break}e&&K&&ae.alternate===null&&t(v,K),p=i(ae,p,X),$===null?H=ae:$.sibling=ae,$=ae,K=Ue}if(X===g.length)return n(v,K),Ee&&zn(v,X),H;if(K===null){for(;XX?(Ue=K,K=null):Ue=K.sibling;var yn=k(v,K,ae.value,P);if(yn===null){K===null&&(K=Ue);break}e&&K&&yn.alternate===null&&t(v,K),p=i(yn,p,X),$===null?H=yn:$.sibling=yn,$=yn,K=Ue}if(ae.done)return n(v,K),Ee&&zn(v,X),H;if(K===null){for(;!ae.done;X++,ae=g.next())ae=_(v,ae.value,P),ae!==null&&(p=i(ae,p,X),$===null?H=ae:$.sibling=ae,$=ae);return Ee&&zn(v,X),H}for(K=r(v,K);!ae.done;X++,ae=g.next())ae=T(K,v,X,ae.value,P),ae!==null&&(e&&ae.alternate!==null&&K.delete(ae.key===null?X:ae.key),p=i(ae,p,X),$===null?H=ae:$.sibling=ae,$=ae);return e&&K.forEach(function(ip){return t(v,ip)}),Ee&&zn(v,X),H}function Oe(v,p,g,P){if(typeof g=="object"&&g!==null&&g.type===Ce&&g.key===null&&(g=g.props.children),typeof g=="object"&&g!==null){switch(g.$$typeof){case ce:e:{for(var H=g.key,$=p;$!==null;){if($.key===H){if(H=g.type,H===Ce){if($.tag===7){n(v,$.sibling),p=l($,g.props.children),p.return=v,v=p;break e}}else if($.elementType===H||typeof H=="object"&&H!==null&&H.$$typeof===nt&&Va(H)===$.type){n(v,$.sibling),p=l($,g.props),p.ref=sl(v,$,g),p.return=v,v=p;break e}n(v,$);break}else t(v,$);$=$.sibling}g.type===Ce?(p=Qn(g.props.children,v.mode,P,g.key),p.return=v,v=p):(P=Li(g.type,g.key,g.props,null,v.mode,P),P.ref=sl(v,p,g),P.return=v,v=P)}return a(v);case fe:e:{for($=g.key;p!==null;){if(p.key===$)if(p.tag===4&&p.stateNode.containerInfo===g.containerInfo&&p.stateNode.implementation===g.implementation){n(v,p.sibling),p=l(p,g.children||[]),p.return=v,v=p;break e}else{n(v,p);break}else t(v,p);p=p.sibling}p=Uo(g,v.mode,P),p.return=v,v=p}return a(v);case nt:return $=g._init,Oe(v,p,$(g._payload),P)}if(Lr(g))return D(v,p,g,P);if(Y(g))return U(v,p,g,P);fi(v,g)}return typeof g=="string"&&g!==""||typeof g=="number"?(g=""+g,p!==null&&p.tag===6?(n(v,p.sibling),p=l(p,g),p.return=v,v=p):(n(v,p),p=Do(g,v.mode,P),p.return=v,v=p),a(v)):n(v,p)}return Oe}var pr=Wa(!0),$a=Wa(!1),di=sn(null),hi=null,mr=null,Ks=null;function qs(){Ks=mr=hi=null}function Gs(e){var t=di.current;xe(di),e._currentValue=t}function Ys(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function vr(e,t){hi=e,Ks=mr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(it=!0),e.firstContext=null)}function wt(e){var t=e._currentValue;if(Ks!==e)if(e={context:e,memoizedValue:t,next:null},mr===null){if(hi===null)throw Error(u(308));mr=e,hi.dependencies={lanes:0,firstContext:e}}else mr=mr.next=e;return t}var Mn=null;function Xs(e){Mn===null?Mn=[e]:Mn.push(e)}function Ka(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Xs(t)):(n.next=l.next,l.next=n),t.interleaved=n,$t(e,r)}function $t(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var an=!1;function Zs(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function qa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Kt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function cn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(se&2)!==0){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,$t(e,n)}return l=r.interleaved,l===null?(t.next=t,Xs(r)):(t.next=l.next,l.next=t),r.interleaved=t,$t(e,n)}function pi(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,fs(e,n)}}function Ga(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var a={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?l=i=a:i=i.next=a,n=n.next}while(n!==null);i===null?l=i=t:i=i.next=t}else l=i=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function mi(e,t,n,r){var l=e.updateQueue;an=!1;var i=l.firstBaseUpdate,a=l.lastBaseUpdate,f=l.shared.pending;if(f!==null){l.shared.pending=null;var d=f,w=d.next;d.next=null,a===null?i=w:a.next=w,a=d;var C=e.alternate;C!==null&&(C=C.updateQueue,f=C.lastBaseUpdate,f!==a&&(f===null?C.firstBaseUpdate=w:f.next=w,C.lastBaseUpdate=d))}if(i!==null){var _=l.baseState;a=0,C=w=d=null,f=i;do{var k=f.lane,T=f.eventTime;if((r&k)===k){C!==null&&(C=C.next={eventTime:T,lane:0,tag:f.tag,payload:f.payload,callback:f.callback,next:null});e:{var D=e,U=f;switch(k=t,T=n,U.tag){case 1:if(D=U.payload,typeof D=="function"){_=D.call(T,_,k);break e}_=D;break e;case 3:D.flags=D.flags&-65537|128;case 0:if(D=U.payload,k=typeof D=="function"?D.call(T,_,k):D,k==null)break e;_=I({},_,k);break e;case 2:an=!0}}f.callback!==null&&f.lane!==0&&(e.flags|=64,k=l.effects,k===null?l.effects=[f]:k.push(f))}else T={eventTime:T,lane:k,tag:f.tag,payload:f.payload,callback:f.callback,next:null},C===null?(w=C=T,d=_):C=C.next=T,a|=k;if(f=f.next,f===null){if(f=l.shared.pending,f===null)break;k=f,f=k.next,k.next=null,l.lastBaseUpdate=k,l.shared.pending=null}}while(!0);if(C===null&&(d=_),l.baseState=d,l.firstBaseUpdate=w,l.lastBaseUpdate=C,t=l.shared.interleaved,t!==null){l=t;do a|=l.lane,l=l.next;while(l!==t)}else i===null&&(l.shared.lanes=0);In|=a,e.lanes=a,e.memoizedState=_}}function Ya(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=no.transition;no.transition={};try{e(!1),t()}finally{me=n,no.transition=r}}function pc(){return St().memoizedState}function jh(e,t,n){var r=pn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},mc(e))vc(t,n);else if(n=Ka(e,t,n,r),n!==null){var l=et();Ot(n,e,r,l),yc(n,t,r)}}function Th(e,t,n){var r=pn(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(mc(e))vc(t,l);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var a=t.lastRenderedState,f=i(a,n);if(l.hasEagerState=!0,l.eagerState=f,Nt(f,a)){var d=t.interleaved;d===null?(l.next=l,Xs(t)):(l.next=d.next,d.next=l),t.interleaved=l;return}}catch{}finally{}n=Ka(e,t,l,r),n!==null&&(l=et(),Ot(n,e,r,l),yc(n,t,r))}}function mc(e){var t=e.alternate;return e===Ne||t!==null&&t===Ne}function vc(e,t){cl=gi=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function yc(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,fs(e,n)}}var xi={readContext:wt,useCallback:qe,useContext:qe,useEffect:qe,useImperativeHandle:qe,useInsertionEffect:qe,useLayoutEffect:qe,useMemo:qe,useReducer:qe,useRef:qe,useState:qe,useDebugValue:qe,useDeferredValue:qe,useTransition:qe,useMutableSource:qe,useSyncExternalStore:qe,useId:qe,unstable_isNewReconciler:!1},Oh={readContext:wt,useCallback:function(e,t){return It().memoizedState=[e,t===void 0?null:t],e},useContext:wt,useEffect:sc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,wi(4194308,4,ac.bind(null,t,e),n)},useLayoutEffect:function(e,t){return wi(4194308,4,e,t)},useInsertionEffect:function(e,t){return wi(4,2,e,t)},useMemo:function(e,t){var n=It();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=It();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=jh.bind(null,Ne,e),[r.memoizedState,e]},useRef:function(e){var t=It();return e={current:e},t.memoizedState=e},useState:lc,useDebugValue:ao,useDeferredValue:function(e){return It().memoizedState=e},useTransition:function(){var e=lc(!1),t=e[0];return e=Rh.bind(null,e[1]),It().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Ne,l=It();if(Ee){if(n===void 0)throw Error(u(407));n=n()}else{if(n=t(),De===null)throw Error(u(349));(Ln&30)!==0||ba(r,t,n)}l.memoizedState=n;var i={value:n,getSnapshot:t};return l.queue=i,sc(tc.bind(null,r,i,e),[e]),r.flags|=2048,hl(9,ec.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=It(),t=De.identifierPrefix;if(Ee){var n=Wt,r=Vt;n=(r&~(1<<32-_t(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=fl++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=a.createElement(n,{is:r.is}):(e=a.createElement(n),n==="select"&&(a=e,r.multiple?a.multiple=!0:r.size&&(a.size=r.size))):e=a.createElementNS(e,n),e[Ft]=t,e[ll]=r,Dc(e,t,!1,!1),t.stateNode=e;e:{switch(a=ts(n,r),n){case"dialog":Se("cancel",e),Se("close",e),l=r;break;case"iframe":case"object":case"embed":Se("load",e),l=r;break;case"video":case"audio":for(l=0;lxr&&(t.flags|=128,r=!0,pl(i,!1),t.lanes=4194304)}else{if(!r)if(e=vi(a),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),pl(i,!0),i.tail===null&&i.tailMode==="hidden"&&!a.alternate&&!Ee)return Ge(t),null}else 2*Te()-i.renderingStartTime>xr&&n!==1073741824&&(t.flags|=128,r=!0,pl(i,!1),t.lanes=4194304);i.isBackwards?(a.sibling=t.child,t.child=a):(n=i.last,n!==null?n.sibling=a:t.child=a,i.last=a)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=Te(),t.sibling=null,n=_e.current,ge(_e,r?n&1|2:n&1),t):(Ge(t),null);case 22:case 23:return Fo(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(mt&1073741824)!==0&&(Ge(t),t.subtreeFlags&6&&(t.flags|=8192)):Ge(t),null;case 24:return null;case 25:return null}throw Error(u(156,t.tag))}function Ah(e,t){switch(Bs(t),t.tag){case 1:return lt(t.type)&&ii(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return yr(),xe(rt),xe(Ke),to(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return bs(t),null;case 13:if(xe(_e),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(u(340));hr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return xe(_e),null;case 4:return yr(),null;case 10:return Gs(t.type._context),null;case 22:case 23:return Fo(),null;case 24:return null;default:return null}}var _i=!1,Ye=!1,Qh=typeof WeakSet=="function"?WeakSet:Set,M=null;function wr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){Re(e,t,r)}else n.current=null}function ko(e,t,n){try{n()}catch(r){Re(e,t,r)}}var Qc=!1;function Hh(e,t){if(Ms=$l,e=ga(),_s(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var l=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var a=0,f=-1,d=-1,w=0,C=0,_=e,k=null;t:for(;;){for(var T;_!==n||l!==0&&_.nodeType!==3||(f=a+l),_!==i||r!==0&&_.nodeType!==3||(d=a+r),_.nodeType===3&&(a+=_.nodeValue.length),(T=_.firstChild)!==null;)k=_,_=T;for(;;){if(_===e)break t;if(k===n&&++w===l&&(f=a),k===i&&++C===r&&(d=a),(T=_.nextSibling)!==null)break;_=k,k=_.parentNode}_=T}n=f===-1||d===-1?null:{start:f,end:d}}else n=null}n=n||{start:0,end:0}}else n=null;for(Fs={focusedElem:e,selectionRange:n},$l=!1,M=t;M!==null;)if(t=M,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,M=e;else for(;M!==null;){t=M;try{var D=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(D!==null){var U=D.memoizedProps,Oe=D.memoizedState,v=t.stateNode,p=v.getSnapshotBeforeUpdate(t.elementType===t.type?U:Rt(t.type,U),Oe);v.__reactInternalSnapshotBeforeUpdate=p}break;case 3:var g=t.stateNode.containerInfo;g.nodeType===1?g.textContent="":g.nodeType===9&&g.documentElement&&g.removeChild(g.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(u(163))}}catch(P){Re(t,t.return,P)}if(e=t.sibling,e!==null){e.return=t.return,M=e;break}M=t.return}return D=Qc,Qc=!1,D}function ml(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var i=l.destroy;l.destroy=void 0,i!==void 0&&ko(t,n,i)}l=l.next}while(l!==r)}}function Ni(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Eo(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Hc(e){var t=e.alternate;t!==null&&(e.alternate=null,Hc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ft],delete t[ll],delete t[Us],delete t[Eh],delete t[Ch])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Bc(e){return e.tag===5||e.tag===3||e.tag===4}function Vc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Bc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Co(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=ri));else if(r!==4&&(e=e.child,e!==null))for(Co(e,t,n),e=e.sibling;e!==null;)Co(e,t,n),e=e.sibling}function _o(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(_o(e,t,n),e=e.sibling;e!==null;)_o(e,t,n),e=e.sibling}var Qe=null,jt=!1;function fn(e,t,n){for(n=n.child;n!==null;)Wc(e,t,n),n=n.sibling}function Wc(e,t,n){if(Mt&&typeof Mt.onCommitFiberUnmount=="function")try{Mt.onCommitFiberUnmount(Al,n)}catch{}switch(n.tag){case 5:Ye||wr(n,t);case 6:var r=Qe,l=jt;Qe=null,fn(e,t,n),Qe=r,jt=l,Qe!==null&&(jt?(e=Qe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Qe.removeChild(n.stateNode));break;case 18:Qe!==null&&(jt?(e=Qe,n=n.stateNode,e.nodeType===8?Ds(e.parentNode,n):e.nodeType===1&&Ds(e,n),qr(e)):Ds(Qe,n.stateNode));break;case 4:r=Qe,l=jt,Qe=n.stateNode.containerInfo,jt=!0,fn(e,t,n),Qe=r,jt=l;break;case 0:case 11:case 14:case 15:if(!Ye&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var i=l,a=i.destroy;i=i.tag,a!==void 0&&((i&2)!==0||(i&4)!==0)&&ko(n,t,a),l=l.next}while(l!==r)}fn(e,t,n);break;case 1:if(!Ye&&(wr(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(f){Re(n,t,f)}fn(e,t,n);break;case 21:fn(e,t,n);break;case 22:n.mode&1?(Ye=(r=Ye)||n.memoizedState!==null,fn(e,t,n),Ye=r):fn(e,t,n);break;default:fn(e,t,n)}}function $c(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Qh),t.forEach(function(r){var l=Xh.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function Tt(e,t){var n=t.deletions;if(n!==null)for(var r=0;rl&&(l=a),r&=~i}if(r=l,r=Te()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Vh(r/1960))-r,10e?16:e,hn===null)var r=!1;else{if(e=hn,hn=null,Oi=0,(se&6)!==0)throw Error(u(331));var l=se;for(se|=4,M=e.current;M!==null;){var i=M,a=i.child;if((M.flags&16)!==0){var f=i.deletions;if(f!==null){for(var d=0;dTe()-Ro?Un(e,0):Po|=n),ot(e,t)}function lf(e,t){t===0&&((e.mode&1)===0?t=1:(t=Hl,Hl<<=1,(Hl&130023424)===0&&(Hl=4194304)));var n=et();e=$t(e,t),e!==null&&(Br(e,t,n),ot(e,n))}function Yh(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),lf(e,n)}function Xh(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(u(314))}r!==null&&r.delete(t),lf(e,n)}var sf;sf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||rt.current)it=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return it=!1,Dh(e,t,n);it=(e.flags&131072)!==0}else it=!1,Ee&&(t.flags&1048576)!==0&&Ua(t,ai,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Ci(e,t),e=t.pendingProps;var l=cr(t,Ke.current);vr(t,n),l=lo(null,t,r,e,l,n);var i=io();return t.flags|=1,typeof l=="object"&&l!==null&&typeof l.render=="function"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,lt(r)?(i=!0,si(t)):i=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Zs(t),l.updater=ki,t.stateNode=l,l._reactInternals=t,fo(t,r,e,n),t=vo(null,t,r,!0,i,n)):(t.tag=0,Ee&&i&&Hs(t),be(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Ci(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Jh(r),e=Rt(r,e),l){case 0:t=mo(null,t,r,e,n);break e;case 1:t=Oc(null,t,r,e,n);break e;case 11:t=Nc(null,t,r,e,n);break e;case 14:t=Pc(null,t,r,Rt(r.type,e),n);break e}throw Error(u(306,r,""))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Rt(r,l),mo(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Rt(r,l),Oc(e,t,r,l,n);case 3:e:{if(zc(t),e===null)throw Error(u(387));r=t.pendingProps,i=t.memoizedState,l=i.element,qa(e,t),mi(t,r,null,n);var a=t.memoizedState;if(r=a.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:a.cache,pendingSuspenseBoundaries:a.pendingSuspenseBoundaries,transitions:a.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){l=gr(Error(u(423)),t),t=Mc(e,t,r,n,l);break e}else if(r!==l){l=gr(Error(u(424)),t),t=Mc(e,t,r,n,l);break e}else for(pt=ln(t.stateNode.containerInfo.firstChild),ht=t,Ee=!0,Pt=null,n=$a(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(hr(),r===l){t=qt(e,t,n);break e}be(e,t,r,n)}t=t.child}return t;case 5:return Xa(t),e===null&&Ws(t),r=t.type,l=t.pendingProps,i=e!==null?e.memoizedProps:null,a=l.children,Ls(r,l)?a=null:i!==null&&Ls(r,i)&&(t.flags|=32),Tc(e,t),be(e,t,a,n),t.child;case 6:return e===null&&Ws(t),null;case 13:return Fc(e,t,n);case 4:return Js(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=pr(t,null,r,n):be(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Rt(r,l),Nc(e,t,r,l,n);case 7:return be(e,t,t.pendingProps,n),t.child;case 8:return be(e,t,t.pendingProps.children,n),t.child;case 12:return be(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,i=t.memoizedProps,a=l.value,ge(di,r._currentValue),r._currentValue=a,i!==null)if(Nt(i.value,a)){if(i.children===l.children&&!rt.current){t=qt(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var f=i.dependencies;if(f!==null){a=i.child;for(var d=f.firstContext;d!==null;){if(d.context===r){if(i.tag===1){d=Kt(-1,n&-n),d.tag=2;var w=i.updateQueue;if(w!==null){w=w.shared;var C=w.pending;C===null?d.next=d:(d.next=C.next,C.next=d),w.pending=d}}i.lanes|=n,d=i.alternate,d!==null&&(d.lanes|=n),Ys(i.return,n,t),f.lanes|=n;break}d=d.next}}else if(i.tag===10)a=i.type===t.type?null:i.child;else if(i.tag===18){if(a=i.return,a===null)throw Error(u(341));a.lanes|=n,f=a.alternate,f!==null&&(f.lanes|=n),Ys(a,n,t),a=i.sibling}else a=i.child;if(a!==null)a.return=i;else for(a=i;a!==null;){if(a===t){a=null;break}if(i=a.sibling,i!==null){i.return=a.return,a=i;break}a=a.return}i=a}be(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,vr(t,n),l=wt(l),r=r(l),t.flags|=1,be(e,t,r,n),t.child;case 14:return r=t.type,l=Rt(r,t.pendingProps),l=Rt(r.type,l),Pc(e,t,r,l,n);case 15:return Rc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:Rt(r,l),Ci(e,t),t.tag=1,lt(r)?(e=!0,si(t)):e=!1,vr(t,n),wc(t,r,l),fo(t,r,l,n),vo(null,t,r,!0,e,n);case 19:return Ic(e,t,n);case 22:return jc(e,t,n)}throw Error(u(156,t.tag))};function of(e,t){return Au(e,t)}function Zh(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function kt(e,t,n,r){return new Zh(e,t,n,r)}function Io(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Jh(e){if(typeof e=="function")return Io(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Ze)return 11;if(e===Je)return 14}return 2}function vn(e,t){var n=e.alternate;return n===null?(n=kt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Li(e,t,n,r,l,i){var a=2;if(r=e,typeof e=="function")Io(e)&&(a=1);else if(typeof e=="string")a=5;else e:switch(e){case Ce:return Qn(n.children,l,i,t);case Z:a=8,l|=8;break;case ve:return e=kt(12,n,t,l|2),e.elementType=ve,e.lanes=i,e;case We:return e=kt(13,n,t,l),e.elementType=We,e.lanes=i,e;case $e:return e=kt(19,n,t,l),e.elementType=$e,e.lanes=i,e;case Pe:return Ii(n,l,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case we:a=10;break e;case Ve:a=9;break e;case Ze:a=11;break e;case Je:a=14;break e;case nt:a=16,r=null;break e}throw Error(u(130,e==null?e:typeof e,""))}return t=kt(a,n,t,l),t.elementType=e,t.type=r,t.lanes=i,t}function Qn(e,t,n,r){return e=kt(7,e,r,t),e.lanes=n,e}function Ii(e,t,n,r){return e=kt(22,e,r,t),e.elementType=Pe,e.lanes=n,e.stateNode={isHidden:!1},e}function Do(e,t,n){return e=kt(6,e,null,t),e.lanes=n,e}function Uo(e,t,n){return t=kt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function bh(e,t,n,r,l){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=cs(0),this.expirationTimes=cs(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=cs(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Ao(e,t,n,r,l,i,a,f,d){return e=new bh(e,t,n,f,d),t===1?(t=1,i===!0&&(t|=8)):t=0,i=kt(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Zs(i),e}function ep(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(o)}catch(s){console.error(s)}}return o(),Ko.exports=fp(),Ko.exports}var kf;function hp(){if(kf)return Wi;kf=1;var o=dp();return Wi.createRoot=o.createRoot,Wi.hydrateRoot=o.hydrateRoot,Wi}var pp=hp();const mp=qf(pp);var zl=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(o){return this.listeners.add(o),this.onSubscribe(),()=>{this.listeners.delete(o),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Bn,wn,Er,Df,vp=(Df=class extends zl{constructor(){super();q(this,Bn);q(this,wn);q(this,Er);z(this,Er,s=>{if(typeof window<"u"&&window.addEventListener){const u=()=>s();return window.addEventListener("visibilitychange",u,!1),()=>{window.removeEventListener("visibilitychange",u)}}})}onSubscribe(){h(this,wn)||this.setEventListener(h(this,Er))}onUnsubscribe(){var s;this.hasListeners()||((s=h(this,wn))==null||s.call(this),z(this,wn,void 0))}setEventListener(s){var u;z(this,Er,s),(u=h(this,wn))==null||u.call(this),z(this,wn,s(c=>{typeof c=="boolean"?this.setFocused(c):this.onFocus()}))}setFocused(s){h(this,Bn)!==s&&(z(this,Bn,s),this.onFocus())}onFocus(){const s=this.isFocused();this.listeners.forEach(u=>{u(s)})}isFocused(){var s;return typeof h(this,Bn)=="boolean"?h(this,Bn):((s=globalThis.document)==null?void 0:s.visibilityState)!=="hidden"}},Bn=new WeakMap,wn=new WeakMap,Er=new WeakMap,Df),hu=new vp,yp={setTimeout:(o,s)=>setTimeout(o,s),clearTimeout:o=>clearTimeout(o),setInterval:(o,s)=>setInterval(o,s),clearInterval:o=>clearInterval(o)},Sn,fu,Uf,gp=(Uf=class{constructor(){q(this,Sn,yp);q(this,fu,!1)}setTimeoutProvider(o){z(this,Sn,o)}setTimeout(o,s){return h(this,Sn).setTimeout(o,s)}clearTimeout(o){h(this,Sn).clearTimeout(o)}setInterval(o,s){return h(this,Sn).setInterval(o,s)}clearInterval(o){h(this,Sn).clearInterval(o)}},Sn=new WeakMap,fu=new WeakMap,Uf),Hn=new gp;function wp(o){setTimeout(o,0)}var Sp=typeof window>"u"||"Deno"in globalThis;function ct(){}function xp(o,s){return typeof o=="function"?o(s):o}function Xo(o){return typeof o=="number"&&o>=0&&o!==1/0}function Gf(o,s){return Math.max(o+(s||0)-Date.now(),0)}function Pn(o,s){return typeof o=="function"?o(s):o}function Ct(o,s){return typeof o=="function"?o(s):o}function Ef(o,s){const{type:u="all",exact:c,fetchStatus:y,predicate:S,queryKey:R,stale:N}=o;if(R){if(c){if(s.queryHash!==pu(R,s.options))return!1}else if(!Cl(s.queryKey,R))return!1}if(u!=="all"){const O=s.isActive();if(u==="active"&&!O||u==="inactive"&&O)return!1}return!(typeof N=="boolean"&&s.isStale()!==N||y&&y!==s.state.fetchStatus||S&&!S(s))}function Cf(o,s){const{exact:u,status:c,predicate:y,mutationKey:S}=o;if(S){if(!s.options.mutationKey)return!1;if(u){if(El(s.options.mutationKey)!==El(S))return!1}else if(!Cl(s.options.mutationKey,S))return!1}return!(c&&s.state.status!==c||y&&!y(s))}function pu(o,s){return((s==null?void 0:s.queryKeyHashFn)||El)(o)}function El(o){return JSON.stringify(o,(s,u)=>Jo(u)?Object.keys(u).sort().reduce((c,y)=>(c[y]=u[y],c),{}):u)}function Cl(o,s){return o===s?!0:typeof o!=typeof s?!1:o&&s&&typeof o=="object"&&typeof s=="object"?Object.keys(s).every(u=>Cl(o[u],s[u])):!1}var kp=Object.prototype.hasOwnProperty;function Yf(o,s,u=0){if(o===s)return o;if(u>500)return s;const c=_f(o)&&_f(s);if(!c&&!(Jo(o)&&Jo(s)))return s;const S=(c?o:Object.keys(o)).length,R=c?s:Object.keys(s),N=R.length,O=c?new Array(N):{};let A=0;for(let V=0;V{Hn.setTimeout(s,o)})}function bo(o,s,u){return typeof u.structuralSharing=="function"?u.structuralSharing(o,s):u.structuralSharing!==!1?Yf(o,s):s}function Cp(o,s,u=0){const c=[...o,s];return u&&c.length>u?c.slice(1):c}function _p(o,s,u=0){const c=[s,...o];return u&&c.length>u?c.slice(0,-1):c}var mu=Symbol();function Xf(o,s){return!o.queryFn&&(s!=null&&s.initialPromise)?()=>s.initialPromise:!o.queryFn||o.queryFn===mu?()=>Promise.reject(new Error(`Missing queryFn: '${o.queryHash}'`)):o.queryFn}function Zf(o,s){return typeof o=="function"?o(...s):!!o}function Np(o,s,u){let c=!1,y;return Object.defineProperty(o,"signal",{enumerable:!0,get:()=>(y??(y=s()),c||(c=!0,y.aborted?u():y.addEventListener("abort",u,{once:!0})),y)}),o}var _l=(()=>{let o=()=>Sp;return{isServer(){return o()},setIsServer(s){o=s}}})();function eu(){let o,s;const u=new Promise((y,S)=>{o=y,s=S});u.status="pending",u.catch(()=>{});function c(y){Object.assign(u,y),delete u.resolve,delete u.reject}return u.resolve=y=>{c({status:"fulfilled",value:y}),o(y)},u.reject=y=>{c({status:"rejected",reason:y}),s(y)},u}var Pp=wp;function Rp(){let o=[],s=0,u=N=>{N()},c=N=>{N()},y=Pp;const S=N=>{s?o.push(N):y(()=>{u(N)})},R=()=>{const N=o;o=[],N.length&&y(()=>{c(()=>{N.forEach(O=>{u(O)})})})};return{batch:N=>{let O;s++;try{O=N()}finally{s--,s||R()}return O},batchCalls:N=>(...O)=>{S(()=>{N(...O)})},schedule:S,setNotifyFunction:N=>{u=N},setBatchNotifyFunction:N=>{c=N},setScheduler:N=>{y=N}}}var Be=Rp(),Cr,xn,_r,Af,jp=(Af=class extends zl{constructor(){super();q(this,Cr,!0);q(this,xn);q(this,_r);z(this,_r,s=>{if(typeof window<"u"&&window.addEventListener){const u=()=>s(!0),c=()=>s(!1);return window.addEventListener("online",u,!1),window.addEventListener("offline",c,!1),()=>{window.removeEventListener("online",u),window.removeEventListener("offline",c)}}})}onSubscribe(){h(this,xn)||this.setEventListener(h(this,_r))}onUnsubscribe(){var s;this.hasListeners()||((s=h(this,xn))==null||s.call(this),z(this,xn,void 0))}setEventListener(s){var u;z(this,_r,s),(u=h(this,xn))==null||u.call(this),z(this,xn,s(this.setOnline.bind(this)))}setOnline(s){h(this,Cr)!==s&&(z(this,Cr,s),this.listeners.forEach(c=>{c(s)}))}isOnline(){return h(this,Cr)}},Cr=new WeakMap,xn=new WeakMap,_r=new WeakMap,Af),qi=new jp;function Tp(o){return Math.min(1e3*2**o,3e4)}function Jf(o){return(o??"online")==="online"?qi.isOnline():!0}var tu=class extends Error{constructor(o){super("CancelledError"),this.revert=o==null?void 0:o.revert,this.silent=o==null?void 0:o.silent}};function bf(o){let s=!1,u=0,c;const y=eu(),S=()=>y.status!=="pending",R=B=>{var Q;if(!S()){const le=new tu(B);W(le),(Q=o.onCancel)==null||Q.call(o,le)}},N=()=>{s=!0},O=()=>{s=!1},A=()=>hu.isFocused()&&(o.networkMode==="always"||qi.isOnline())&&o.canRun(),V=()=>Jf(o.networkMode)&&o.canRun(),F=B=>{S()||(c==null||c(),y.resolve(B))},W=B=>{S()||(c==null||c(),y.reject(B))},G=()=>new Promise(B=>{var Q;c=le=>{(S()||A())&&B(le)},(Q=o.onPause)==null||Q.call(o)}).then(()=>{var B;c=void 0,S()||(B=o.onContinue)==null||B.call(o)}),ne=()=>{if(S())return;let B;const Q=u===0?o.initialPromise:void 0;try{B=Q??o.fn()}catch(le){B=Promise.reject(le)}Promise.resolve(B).then(F).catch(le=>{var fe;if(S())return;const he=o.retry??(_l.isServer()?0:3),ee=o.retryDelay??Tp,L=typeof ee=="function"?ee(u,le):ee,ce=he===!0||typeof he=="number"&&uA()?void 0:G()).then(()=>{s?W(le):ne()})})};return{promise:y,status:()=>y.status,cancel:R,continue:()=>(c==null||c(),y),cancelRetry:N,continueRetry:O,canStart:V,start:()=>(V()?ne():G().then(ne),y)}}var Vn,Qf,ed=(Qf=class{constructor(){q(this,Vn)}destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),Xo(this.gcTime)&&z(this,Vn,Hn.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(o){this.gcTime=Math.max(this.gcTime||0,o??(_l.isServer()?1/0:300*1e3))}clearGcTimeout(){h(this,Vn)&&(Hn.clearTimeout(h(this,Vn)),z(this,Vn,void 0))}},Vn=new WeakMap,Qf),Wn,Nr,Et,$n,Ae,Pl,Kn,vt,td,Yt,Hf,Op=(Hf=class extends ed{constructor(s){super();q(this,vt);q(this,Wn);q(this,Nr);q(this,Et);q(this,$n);q(this,Ae);q(this,Pl);q(this,Kn);z(this,Kn,!1),z(this,Pl,s.defaultOptions),this.setOptions(s.options),this.observers=[],z(this,$n,s.client),z(this,Et,h(this,$n).getQueryCache()),this.queryKey=s.queryKey,this.queryHash=s.queryHash,z(this,Wn,Rf(this.options)),this.state=s.state??h(this,Wn),this.scheduleGc()}get meta(){return this.options.meta}get promise(){var s;return(s=h(this,Ae))==null?void 0:s.promise}setOptions(s){if(this.options={...h(this,Pl),...s},this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){const u=Rf(this.options);u.data!==void 0&&(this.setState(Pf(u.data,u.dataUpdatedAt)),z(this,Wn,u))}}optionalRemove(){!this.observers.length&&this.state.fetchStatus==="idle"&&h(this,Et).remove(this)}setData(s,u){const c=bo(this.state.data,s,this.options);return re(this,vt,Yt).call(this,{data:c,type:"success",dataUpdatedAt:u==null?void 0:u.updatedAt,manual:u==null?void 0:u.manual}),c}setState(s,u){re(this,vt,Yt).call(this,{type:"setState",state:s,setStateOptions:u})}cancel(s){var c,y;const u=(c=h(this,Ae))==null?void 0:c.promise;return(y=h(this,Ae))==null||y.cancel(s),u?u.then(ct).catch(ct):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return h(this,Wn)}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(s=>Ct(s.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===mu||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0?this.observers.some(s=>Pn(s.options.staleTime,this)==="static"):!1}isStale(){return this.getObserversCount()>0?this.observers.some(s=>s.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(s=0){return this.state.data===void 0?!0:s==="static"?!1:this.state.isInvalidated?!0:!Gf(this.state.dataUpdatedAt,s)}onFocus(){var u;const s=this.observers.find(c=>c.shouldFetchOnWindowFocus());s==null||s.refetch({cancelRefetch:!1}),(u=h(this,Ae))==null||u.continue()}onOnline(){var u;const s=this.observers.find(c=>c.shouldFetchOnReconnect());s==null||s.refetch({cancelRefetch:!1}),(u=h(this,Ae))==null||u.continue()}addObserver(s){this.observers.includes(s)||(this.observers.push(s),this.clearGcTimeout(),h(this,Et).notify({type:"observerAdded",query:this,observer:s}))}removeObserver(s){this.observers.includes(s)&&(this.observers=this.observers.filter(u=>u!==s),this.observers.length||(h(this,Ae)&&(h(this,Kn)||re(this,vt,td).call(this)?h(this,Ae).cancel({revert:!0}):h(this,Ae).cancelRetry()),this.scheduleGc()),h(this,Et).notify({type:"observerRemoved",query:this,observer:s}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||re(this,vt,Yt).call(this,{type:"invalidate"})}async fetch(s,u){var O,A,V,F,W,G,ne,B,Q,le,he,ee;if(this.state.fetchStatus!=="idle"&&((O=h(this,Ae))==null?void 0:O.status())!=="rejected"){if(this.state.data!==void 0&&(u!=null&&u.cancelRefetch))this.cancel({silent:!0});else if(h(this,Ae))return h(this,Ae).continueRetry(),h(this,Ae).promise}if(s&&this.setOptions(s),!this.options.queryFn){const L=this.observers.find(ce=>ce.options.queryFn);L&&this.setOptions(L.options)}const c=new AbortController,y=L=>{Object.defineProperty(L,"signal",{enumerable:!0,get:()=>(z(this,Kn,!0),c.signal)})},S=()=>{const L=Xf(this.options,u),fe=(()=>{const Ce={client:h(this,$n),queryKey:this.queryKey,meta:this.meta};return y(Ce),Ce})();return z(this,Kn,!1),this.options.persister?this.options.persister(L,fe,this):L(fe)},N=(()=>{const L={fetchOptions:u,options:this.options,queryKey:this.queryKey,client:h(this,$n),state:this.state,fetchFn:S};return y(L),L})();(A=this.options.behavior)==null||A.onFetch(N,this),z(this,Nr,this.state),(this.state.fetchStatus==="idle"||this.state.fetchMeta!==((V=N.fetchOptions)==null?void 0:V.meta))&&re(this,vt,Yt).call(this,{type:"fetch",meta:(F=N.fetchOptions)==null?void 0:F.meta}),z(this,Ae,bf({initialPromise:u==null?void 0:u.initialPromise,fn:N.fetchFn,onCancel:L=>{L instanceof tu&&L.revert&&this.setState({...h(this,Nr),fetchStatus:"idle"}),c.abort()},onFail:(L,ce)=>{re(this,vt,Yt).call(this,{type:"failed",failureCount:L,error:ce})},onPause:()=>{re(this,vt,Yt).call(this,{type:"pause"})},onContinue:()=>{re(this,vt,Yt).call(this,{type:"continue"})},retry:N.options.retry,retryDelay:N.options.retryDelay,networkMode:N.options.networkMode,canRun:()=>!0}));try{const L=await h(this,Ae).start();if(L===void 0)throw new Error(`${this.queryHash} data is undefined`);return this.setData(L),(G=(W=h(this,Et).config).onSuccess)==null||G.call(W,L,this),(B=(ne=h(this,Et).config).onSettled)==null||B.call(ne,L,this.state.error,this),L}catch(L){if(L instanceof tu){if(L.silent)return h(this,Ae).promise;if(L.revert){if(this.state.data===void 0)throw L;return this.state.data}}throw re(this,vt,Yt).call(this,{type:"error",error:L}),(le=(Q=h(this,Et).config).onError)==null||le.call(Q,L,this),(ee=(he=h(this,Et).config).onSettled)==null||ee.call(he,this.state.data,L,this),L}finally{this.scheduleGc()}}},Wn=new WeakMap,Nr=new WeakMap,Et=new WeakMap,$n=new WeakMap,Ae=new WeakMap,Pl=new WeakMap,Kn=new WeakMap,vt=new WeakSet,td=function(){return this.state.fetchStatus==="paused"&&this.state.status==="pending"},Yt=function(s){const u=c=>{switch(s.type){case"failed":return{...c,fetchFailureCount:s.failureCount,fetchFailureReason:s.error};case"pause":return{...c,fetchStatus:"paused"};case"continue":return{...c,fetchStatus:"fetching"};case"fetch":return{...c,...nd(c.data,this.options),fetchMeta:s.meta??null};case"success":const y={...c,...Pf(s.data,s.dataUpdatedAt),dataUpdateCount:c.dataUpdateCount+1,...!s.manual&&{fetchStatus:"idle",fetchFailureCount:0,fetchFailureReason:null}};return z(this,Nr,s.manual?y:void 0),y;case"error":const S=s.error;return{...c,error:S,errorUpdateCount:c.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:c.fetchFailureCount+1,fetchFailureReason:S,fetchStatus:"idle",status:"error",isInvalidated:!0};case"invalidate":return{...c,isInvalidated:!0};case"setState":return{...c,...s.state}}};this.state=u(this.state),Be.batch(()=>{this.observers.forEach(c=>{c.onQueryUpdate()}),h(this,Et).notify({query:this,type:"updated",action:s})})},Hf);function nd(o,s){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:Jf(s.networkMode)?"fetching":"paused",...o===void 0&&{error:null,status:"pending"}}}function Pf(o,s){return{data:o,dataUpdatedAt:s??Date.now(),error:null,isInvalidated:!1,status:"success"}}function Rf(o){const s=typeof o.initialData=="function"?o.initialData():o.initialData,u=s!==void 0,c=u?typeof o.initialDataUpdatedAt=="function"?o.initialDataUpdatedAt():o.initialDataUpdatedAt:0;return{data:s,dataUpdateCount:0,dataUpdatedAt:u?c??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:u?"success":"pending",fetchStatus:"idle"}}var at,ie,Rl,tt,qn,Pr,Xt,kn,jl,Rr,jr,Gn,Yn,En,Tr,de,kl,nu,ru,lu,iu,su,ou,uu,rd,Bf,zp=(Bf=class extends zl{constructor(s,u){super();q(this,de);q(this,at);q(this,ie);q(this,Rl);q(this,tt);q(this,qn);q(this,Pr);q(this,Xt);q(this,kn);q(this,jl);q(this,Rr);q(this,jr);q(this,Gn);q(this,Yn);q(this,En);q(this,Tr,new Set);this.options=u,z(this,at,s),z(this,kn,null),z(this,Xt,eu()),this.bindMethods(),this.setOptions(u)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(h(this,ie).addObserver(this),jf(h(this,ie),this.options)?re(this,de,kl).call(this):this.updateResult(),re(this,de,iu).call(this))}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return au(h(this,ie),this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return au(h(this,ie),this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,re(this,de,su).call(this),re(this,de,ou).call(this),h(this,ie).removeObserver(this)}setOptions(s){const u=this.options,c=h(this,ie);if(this.options=h(this,at).defaultQueryOptions(s),this.options.enabled!==void 0&&typeof this.options.enabled!="boolean"&&typeof this.options.enabled!="function"&&typeof Ct(this.options.enabled,h(this,ie))!="boolean")throw new Error("Expected enabled to be a boolean or a callback that returns a boolean");re(this,de,uu).call(this),h(this,ie).setOptions(this.options),u._defaulted&&!Zo(this.options,u)&&h(this,at).getQueryCache().notify({type:"observerOptionsUpdated",query:h(this,ie),observer:this});const y=this.hasListeners();y&&Tf(h(this,ie),c,this.options,u)&&re(this,de,kl).call(this),this.updateResult(),y&&(h(this,ie)!==c||Ct(this.options.enabled,h(this,ie))!==Ct(u.enabled,h(this,ie))||Pn(this.options.staleTime,h(this,ie))!==Pn(u.staleTime,h(this,ie)))&&re(this,de,nu).call(this);const S=re(this,de,ru).call(this);y&&(h(this,ie)!==c||Ct(this.options.enabled,h(this,ie))!==Ct(u.enabled,h(this,ie))||S!==h(this,En))&&re(this,de,lu).call(this,S)}getOptimisticResult(s){const u=h(this,at).getQueryCache().build(h(this,at),s),c=this.createResult(u,s);return Fp(this,c)&&(z(this,tt,c),z(this,Pr,this.options),z(this,qn,h(this,ie).state)),c}getCurrentResult(){return h(this,tt)}trackResult(s,u){return new Proxy(s,{get:(c,y)=>(this.trackProp(y),u==null||u(y),y==="promise"&&(this.trackProp("data"),!this.options.experimental_prefetchInRender&&h(this,Xt).status==="pending"&&h(this,Xt).reject(new Error("experimental_prefetchInRender feature flag is not enabled"))),Reflect.get(c,y))})}trackProp(s){h(this,Tr).add(s)}getCurrentQuery(){return h(this,ie)}refetch({...s}={}){return this.fetch({...s})}fetchOptimistic(s){const u=h(this,at).defaultQueryOptions(s),c=h(this,at).getQueryCache().build(h(this,at),u);return c.fetch().then(()=>this.createResult(c,u))}fetch(s){return re(this,de,kl).call(this,{...s,cancelRefetch:s.cancelRefetch??!0}).then(()=>(this.updateResult(),h(this,tt)))}createResult(s,u){var ve;const c=h(this,ie),y=this.options,S=h(this,tt),R=h(this,qn),N=h(this,Pr),A=s!==c?s.state:h(this,Rl),{state:V}=s;let F={...V},W=!1,G;if(u._optimisticResults){const we=this.hasListeners(),Ve=!we&&jf(s,u),Ze=we&&Tf(s,c,u,y);(Ve||Ze)&&(F={...F,...nd(V.data,s.options)}),u._optimisticResults==="isRestoring"&&(F.fetchStatus="idle")}let{error:ne,errorUpdatedAt:B,status:Q}=F;G=F.data;let le=!1;if(u.placeholderData!==void 0&&G===void 0&&Q==="pending"){let we;S!=null&&S.isPlaceholderData&&u.placeholderData===(N==null?void 0:N.placeholderData)?(we=S.data,le=!0):we=typeof u.placeholderData=="function"?u.placeholderData((ve=h(this,jr))==null?void 0:ve.state.data,h(this,jr)):u.placeholderData,we!==void 0&&(Q="success",G=bo(S==null?void 0:S.data,we,u),W=!0)}if(u.select&&G!==void 0&&!le)if(S&&G===(R==null?void 0:R.data)&&u.select===h(this,jl))G=h(this,Rr);else try{z(this,jl,u.select),G=u.select(G),G=bo(S==null?void 0:S.data,G,u),z(this,Rr,G),z(this,kn,null)}catch(we){z(this,kn,we)}h(this,kn)&&(ne=h(this,kn),G=h(this,Rr),B=Date.now(),Q="error");const he=F.fetchStatus==="fetching",ee=Q==="pending",L=Q==="error",ce=ee&&he,fe=G!==void 0,Z={status:Q,fetchStatus:F.fetchStatus,isPending:ee,isSuccess:Q==="success",isError:L,isInitialLoading:ce,isLoading:ce,data:G,dataUpdatedAt:F.dataUpdatedAt,error:ne,errorUpdatedAt:B,failureCount:F.fetchFailureCount,failureReason:F.fetchFailureReason,errorUpdateCount:F.errorUpdateCount,isFetched:s.isFetched(),isFetchedAfterMount:F.dataUpdateCount>A.dataUpdateCount||F.errorUpdateCount>A.errorUpdateCount,isFetching:he,isRefetching:he&&!ee,isLoadingError:L&&!fe,isPaused:F.fetchStatus==="paused",isPlaceholderData:W,isRefetchError:L&&fe,isStale:vu(s,u),refetch:this.refetch,promise:h(this,Xt),isEnabled:Ct(u.enabled,s)!==!1};if(this.options.experimental_prefetchInRender){const we=Z.data!==void 0,Ve=Z.status==="error"&&!we,Ze=Je=>{Ve?Je.reject(Z.error):we&&Je.resolve(Z.data)},We=()=>{const Je=z(this,Xt,Z.promise=eu());Ze(Je)},$e=h(this,Xt);switch($e.status){case"pending":s.queryHash===c.queryHash&&Ze($e);break;case"fulfilled":(Ve||Z.data!==$e.value)&&We();break;case"rejected":(!Ve||Z.error!==$e.reason)&&We();break}}return Z}updateResult(){const s=h(this,tt),u=this.createResult(h(this,ie),this.options);if(z(this,qn,h(this,ie).state),z(this,Pr,this.options),h(this,qn).data!==void 0&&z(this,jr,h(this,ie)),Zo(u,s))return;z(this,tt,u);const c=()=>{if(!s)return!0;const{notifyOnChangeProps:y}=this.options,S=typeof y=="function"?y():y;if(S==="all"||!S&&!h(this,Tr).size)return!0;const R=new Set(S??h(this,Tr));return this.options.throwOnError&&R.add("error"),Object.keys(h(this,tt)).some(N=>{const O=N;return h(this,tt)[O]!==s[O]&&R.has(O)})};re(this,de,rd).call(this,{listeners:c()})}onQueryUpdate(){this.updateResult(),this.hasListeners()&&re(this,de,iu).call(this)}},at=new WeakMap,ie=new WeakMap,Rl=new WeakMap,tt=new WeakMap,qn=new WeakMap,Pr=new WeakMap,Xt=new WeakMap,kn=new WeakMap,jl=new WeakMap,Rr=new WeakMap,jr=new WeakMap,Gn=new WeakMap,Yn=new WeakMap,En=new WeakMap,Tr=new WeakMap,de=new WeakSet,kl=function(s){re(this,de,uu).call(this);let u=h(this,ie).fetch(this.options,s);return s!=null&&s.throwOnError||(u=u.catch(ct)),u},nu=function(){re(this,de,su).call(this);const s=Pn(this.options.staleTime,h(this,ie));if(_l.isServer()||h(this,tt).isStale||!Xo(s))return;const c=Gf(h(this,tt).dataUpdatedAt,s)+1;z(this,Gn,Hn.setTimeout(()=>{h(this,tt).isStale||this.updateResult()},c))},ru=function(){return(typeof this.options.refetchInterval=="function"?this.options.refetchInterval(h(this,ie)):this.options.refetchInterval)??!1},lu=function(s){re(this,de,ou).call(this),z(this,En,s),!(_l.isServer()||Ct(this.options.enabled,h(this,ie))===!1||!Xo(h(this,En))||h(this,En)===0)&&z(this,Yn,Hn.setInterval(()=>{(this.options.refetchIntervalInBackground||hu.isFocused())&&re(this,de,kl).call(this)},h(this,En)))},iu=function(){re(this,de,nu).call(this),re(this,de,lu).call(this,re(this,de,ru).call(this))},su=function(){h(this,Gn)&&(Hn.clearTimeout(h(this,Gn)),z(this,Gn,void 0))},ou=function(){h(this,Yn)&&(Hn.clearInterval(h(this,Yn)),z(this,Yn,void 0))},uu=function(){const s=h(this,at).getQueryCache().build(h(this,at),this.options);if(s===h(this,ie))return;const u=h(this,ie);z(this,ie,s),z(this,Rl,s.state),this.hasListeners()&&(u==null||u.removeObserver(this),s.addObserver(this))},rd=function(s){Be.batch(()=>{s.listeners&&this.listeners.forEach(u=>{u(h(this,tt))}),h(this,at).getQueryCache().notify({query:h(this,ie),type:"observerResultsUpdated"})})},Bf);function Mp(o,s){return Ct(s.enabled,o)!==!1&&o.state.data===void 0&&!(o.state.status==="error"&&s.retryOnMount===!1)}function jf(o,s){return Mp(o,s)||o.state.data!==void 0&&au(o,s,s.refetchOnMount)}function au(o,s,u){if(Ct(s.enabled,o)!==!1&&Pn(s.staleTime,o)!=="static"){const c=typeof u=="function"?u(o):u;return c==="always"||c!==!1&&vu(o,s)}return!1}function Tf(o,s,u,c){return(o!==s||Ct(c.enabled,o)===!1)&&(!u.suspense||o.state.status!=="error")&&vu(o,u)}function vu(o,s){return Ct(s.enabled,o)!==!1&&o.isStaleByTime(Pn(s.staleTime,o))}function Fp(o,s){return!Zo(o.getCurrentResult(),s)}function Of(o){return{onFetch:(s,u)=>{var V,F,W,G,ne;const c=s.options,y=(W=(F=(V=s.fetchOptions)==null?void 0:V.meta)==null?void 0:F.fetchMore)==null?void 0:W.direction,S=((G=s.state.data)==null?void 0:G.pages)||[],R=((ne=s.state.data)==null?void 0:ne.pageParams)||[];let N={pages:[],pageParams:[]},O=0;const A=async()=>{let B=!1;const Q=ee=>{Np(ee,()=>s.signal,()=>B=!0)},le=Xf(s.options,s.fetchOptions),he=async(ee,L,ce)=>{if(B)return Promise.reject();if(L==null&&ee.pages.length)return Promise.resolve(ee);const Ce=(()=>{const Ve={client:s.client,queryKey:s.queryKey,pageParam:L,direction:ce?"backward":"forward",meta:s.options.meta};return Q(Ve),Ve})(),Z=await le(Ce),{maxPages:ve}=s.options,we=ce?_p:Cp;return{pages:we(ee.pages,Z,ve),pageParams:we(ee.pageParams,L,ve)}};if(y&&S.length){const ee=y==="backward",L=ee?Lp:zf,ce={pages:S,pageParams:R},fe=L(c,ce);N=await he(ce,fe,ee)}else{const ee=o??S.length;do{const L=O===0?R[0]??c.initialPageParam:zf(c,N);if(O>0&&L==null)break;N=await he(N,L),O++}while(O{var B,Q;return(Q=(B=s.options).persister)==null?void 0:Q.call(B,A,{client:s.client,queryKey:s.queryKey,meta:s.options.meta,signal:s.signal},u)}:s.fetchFn=A}}}function zf(o,{pages:s,pageParams:u}){const c=s.length-1;return s.length>0?o.getNextPageParam(s[c],s,u[c],u):void 0}function Lp(o,{pages:s,pageParams:u}){var c;return s.length>0?(c=o.getPreviousPageParam)==null?void 0:c.call(o,s[0],s,u[0],u):void 0}var Tl,Ut,Xe,Xn,At,gn,Vf,Ip=(Vf=class extends ed{constructor(s){super();q(this,At);q(this,Tl);q(this,Ut);q(this,Xe);q(this,Xn);z(this,Tl,s.client),this.mutationId=s.mutationId,z(this,Xe,s.mutationCache),z(this,Ut,[]),this.state=s.state||Dp(),this.setOptions(s.options),this.scheduleGc()}setOptions(s){this.options=s,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(s){h(this,Ut).includes(s)||(h(this,Ut).push(s),this.clearGcTimeout(),h(this,Xe).notify({type:"observerAdded",mutation:this,observer:s}))}removeObserver(s){z(this,Ut,h(this,Ut).filter(u=>u!==s)),this.scheduleGc(),h(this,Xe).notify({type:"observerRemoved",mutation:this,observer:s})}optionalRemove(){h(this,Ut).length||(this.state.status==="pending"?this.scheduleGc():h(this,Xe).remove(this))}continue(){var s;return((s=h(this,Xn))==null?void 0:s.continue())??this.execute(this.state.variables)}async execute(s){var R,N,O,A,V,F,W,G,ne,B,Q,le,he,ee,L,ce,fe,Ce;const u=()=>{re(this,At,gn).call(this,{type:"continue"})},c={client:h(this,Tl),meta:this.options.meta,mutationKey:this.options.mutationKey};z(this,Xn,bf({fn:()=>this.options.mutationFn?this.options.mutationFn(s,c):Promise.reject(new Error("No mutationFn found")),onFail:(Z,ve)=>{re(this,At,gn).call(this,{type:"failed",failureCount:Z,error:ve})},onPause:()=>{re(this,At,gn).call(this,{type:"pause"})},onContinue:u,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>h(this,Xe).canRun(this)}));const y=this.state.status==="pending",S=!h(this,Xn).canStart();try{if(y)u();else{re(this,At,gn).call(this,{type:"pending",variables:s,isPaused:S}),h(this,Xe).config.onMutate&&await h(this,Xe).config.onMutate(s,this,c);const ve=await((N=(R=this.options).onMutate)==null?void 0:N.call(R,s,c));ve!==this.state.context&&re(this,At,gn).call(this,{type:"pending",context:ve,variables:s,isPaused:S})}const Z=await h(this,Xn).start();return await((A=(O=h(this,Xe).config).onSuccess)==null?void 0:A.call(O,Z,s,this.state.context,this,c)),await((F=(V=this.options).onSuccess)==null?void 0:F.call(V,Z,s,this.state.context,c)),await((G=(W=h(this,Xe).config).onSettled)==null?void 0:G.call(W,Z,null,this.state.variables,this.state.context,this,c)),await((B=(ne=this.options).onSettled)==null?void 0:B.call(ne,Z,null,s,this.state.context,c)),re(this,At,gn).call(this,{type:"success",data:Z}),Z}catch(Z){try{await((le=(Q=h(this,Xe).config).onError)==null?void 0:le.call(Q,Z,s,this.state.context,this,c))}catch(ve){Promise.reject(ve)}try{await((ee=(he=this.options).onError)==null?void 0:ee.call(he,Z,s,this.state.context,c))}catch(ve){Promise.reject(ve)}try{await((ce=(L=h(this,Xe).config).onSettled)==null?void 0:ce.call(L,void 0,Z,this.state.variables,this.state.context,this,c))}catch(ve){Promise.reject(ve)}try{await((Ce=(fe=this.options).onSettled)==null?void 0:Ce.call(fe,void 0,Z,s,this.state.context,c))}catch(ve){Promise.reject(ve)}throw re(this,At,gn).call(this,{type:"error",error:Z}),Z}finally{h(this,Xe).runNext(this)}}},Tl=new WeakMap,Ut=new WeakMap,Xe=new WeakMap,Xn=new WeakMap,At=new WeakSet,gn=function(s){const u=c=>{switch(s.type){case"failed":return{...c,failureCount:s.failureCount,failureReason:s.error};case"pause":return{...c,isPaused:!0};case"continue":return{...c,isPaused:!1};case"pending":return{...c,context:s.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:s.isPaused,status:"pending",variables:s.variables,submittedAt:Date.now()};case"success":return{...c,data:s.data,failureCount:0,failureReason:null,error:null,status:"success",isPaused:!1};case"error":return{...c,data:void 0,error:s.error,failureCount:c.failureCount+1,failureReason:s.error,isPaused:!1,status:"error"}}};this.state=u(this.state),Be.batch(()=>{h(this,Ut).forEach(c=>{c.onMutationUpdate(s)}),h(this,Xe).notify({mutation:this,type:"updated",action:s})})},Vf);function Dp(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:"idle",variables:void 0,submittedAt:0}}var Zt,zt,Ol,Wf,Up=(Wf=class extends zl{constructor(s={}){super();q(this,Zt);q(this,zt);q(this,Ol);this.config=s,z(this,Zt,new Set),z(this,zt,new Map),z(this,Ol,0)}build(s,u,c){const y=new Ip({client:s,mutationCache:this,mutationId:++Vi(this,Ol)._,options:s.defaultMutationOptions(u),state:c});return this.add(y),y}add(s){h(this,Zt).add(s);const u=$i(s);if(typeof u=="string"){const c=h(this,zt).get(u);c?c.push(s):h(this,zt).set(u,[s])}this.notify({type:"added",mutation:s})}remove(s){if(h(this,Zt).delete(s)){const u=$i(s);if(typeof u=="string"){const c=h(this,zt).get(u);if(c)if(c.length>1){const y=c.indexOf(s);y!==-1&&c.splice(y,1)}else c[0]===s&&h(this,zt).delete(u)}}this.notify({type:"removed",mutation:s})}canRun(s){const u=$i(s);if(typeof u=="string"){const c=h(this,zt).get(u),y=c==null?void 0:c.find(S=>S.state.status==="pending");return!y||y===s}else return!0}runNext(s){var c;const u=$i(s);if(typeof u=="string"){const y=(c=h(this,zt).get(u))==null?void 0:c.find(S=>S!==s&&S.state.isPaused);return(y==null?void 0:y.continue())??Promise.resolve()}else return Promise.resolve()}clear(){Be.batch(()=>{h(this,Zt).forEach(s=>{this.notify({type:"removed",mutation:s})}),h(this,Zt).clear(),h(this,zt).clear()})}getAll(){return Array.from(h(this,Zt))}find(s){const u={exact:!0,...s};return this.getAll().find(c=>Cf(u,c))}findAll(s={}){return this.getAll().filter(u=>Cf(s,u))}notify(s){Be.batch(()=>{this.listeners.forEach(u=>{u(s)})})}resumePausedMutations(){const s=this.getAll().filter(u=>u.state.isPaused);return Be.batch(()=>Promise.all(s.map(u=>u.continue().catch(ct))))}},Zt=new WeakMap,zt=new WeakMap,Ol=new WeakMap,Wf);function $i(o){var s;return(s=o.options.scope)==null?void 0:s.id}var Qt,$f,Ap=($f=class extends zl{constructor(s={}){super();q(this,Qt);this.config=s,z(this,Qt,new Map)}build(s,u,c){const y=u.queryKey,S=u.queryHash??pu(y,u);let R=this.get(S);return R||(R=new Op({client:s,queryKey:y,queryHash:S,options:s.defaultQueryOptions(u),state:c,defaultOptions:s.getQueryDefaults(y)}),this.add(R)),R}add(s){h(this,Qt).has(s.queryHash)||(h(this,Qt).set(s.queryHash,s),this.notify({type:"added",query:s}))}remove(s){const u=h(this,Qt).get(s.queryHash);u&&(s.destroy(),u===s&&h(this,Qt).delete(s.queryHash),this.notify({type:"removed",query:s}))}clear(){Be.batch(()=>{this.getAll().forEach(s=>{this.remove(s)})})}get(s){return h(this,Qt).get(s)}getAll(){return[...h(this,Qt).values()]}find(s){const u={exact:!0,...s};return this.getAll().find(c=>Ef(u,c))}findAll(s={}){const u=this.getAll();return Object.keys(s).length>0?u.filter(c=>Ef(s,c)):u}notify(s){Be.batch(()=>{this.listeners.forEach(u=>{u(s)})})}onFocus(){Be.batch(()=>{this.getAll().forEach(s=>{s.onFocus()})})}onOnline(){Be.batch(()=>{this.getAll().forEach(s=>{s.onOnline()})})}},Qt=new WeakMap,$f),je,Cn,_n,Or,zr,Nn,Mr,Fr,Kf,Qp=(Kf=class{constructor(o={}){q(this,je);q(this,Cn);q(this,_n);q(this,Or);q(this,zr);q(this,Nn);q(this,Mr);q(this,Fr);z(this,je,o.queryCache||new Ap),z(this,Cn,o.mutationCache||new Up),z(this,_n,o.defaultOptions||{}),z(this,Or,new Map),z(this,zr,new Map),z(this,Nn,0)}mount(){Vi(this,Nn)._++,h(this,Nn)===1&&(z(this,Mr,hu.subscribe(async o=>{o&&(await this.resumePausedMutations(),h(this,je).onFocus())})),z(this,Fr,qi.subscribe(async o=>{o&&(await this.resumePausedMutations(),h(this,je).onOnline())})))}unmount(){var o,s;Vi(this,Nn)._--,h(this,Nn)===0&&((o=h(this,Mr))==null||o.call(this),z(this,Mr,void 0),(s=h(this,Fr))==null||s.call(this),z(this,Fr,void 0))}isFetching(o){return h(this,je).findAll({...o,fetchStatus:"fetching"}).length}isMutating(o){return h(this,Cn).findAll({...o,status:"pending"}).length}getQueryData(o){var u;const s=this.defaultQueryOptions({queryKey:o});return(u=h(this,je).get(s.queryHash))==null?void 0:u.state.data}ensureQueryData(o){const s=this.defaultQueryOptions(o),u=h(this,je).build(this,s),c=u.state.data;return c===void 0?this.fetchQuery(o):(o.revalidateIfStale&&u.isStaleByTime(Pn(s.staleTime,u))&&this.prefetchQuery(s),Promise.resolve(c))}getQueriesData(o){return h(this,je).findAll(o).map(({queryKey:s,state:u})=>{const c=u.data;return[s,c]})}setQueryData(o,s,u){const c=this.defaultQueryOptions({queryKey:o}),y=h(this,je).get(c.queryHash),S=y==null?void 0:y.state.data,R=xp(s,S);if(R!==void 0)return h(this,je).build(this,c).setData(R,{...u,manual:!0})}setQueriesData(o,s,u){return Be.batch(()=>h(this,je).findAll(o).map(({queryKey:c})=>[c,this.setQueryData(c,s,u)]))}getQueryState(o){var u;const s=this.defaultQueryOptions({queryKey:o});return(u=h(this,je).get(s.queryHash))==null?void 0:u.state}removeQueries(o){const s=h(this,je);Be.batch(()=>{s.findAll(o).forEach(u=>{s.remove(u)})})}resetQueries(o,s){const u=h(this,je);return Be.batch(()=>(u.findAll(o).forEach(c=>{c.reset()}),this.refetchQueries({type:"active",...o},s)))}cancelQueries(o,s={}){const u={revert:!0,...s},c=Be.batch(()=>h(this,je).findAll(o).map(y=>y.cancel(u)));return Promise.all(c).then(ct).catch(ct)}invalidateQueries(o,s={}){return Be.batch(()=>(h(this,je).findAll(o).forEach(u=>{u.invalidate()}),(o==null?void 0:o.refetchType)==="none"?Promise.resolve():this.refetchQueries({...o,type:(o==null?void 0:o.refetchType)??(o==null?void 0:o.type)??"active"},s)))}refetchQueries(o,s={}){const u={...s,cancelRefetch:s.cancelRefetch??!0},c=Be.batch(()=>h(this,je).findAll(o).filter(y=>!y.isDisabled()&&!y.isStatic()).map(y=>{let S=y.fetch(void 0,u);return u.throwOnError||(S=S.catch(ct)),y.state.fetchStatus==="paused"?Promise.resolve():S}));return Promise.all(c).then(ct)}fetchQuery(o){const s=this.defaultQueryOptions(o);s.retry===void 0&&(s.retry=!1);const u=h(this,je).build(this,s);return u.isStaleByTime(Pn(s.staleTime,u))?u.fetch(s):Promise.resolve(u.state.data)}prefetchQuery(o){return this.fetchQuery(o).then(ct).catch(ct)}fetchInfiniteQuery(o){return o.behavior=Of(o.pages),this.fetchQuery(o)}prefetchInfiniteQuery(o){return this.fetchInfiniteQuery(o).then(ct).catch(ct)}ensureInfiniteQueryData(o){return o.behavior=Of(o.pages),this.ensureQueryData(o)}resumePausedMutations(){return qi.isOnline()?h(this,Cn).resumePausedMutations():Promise.resolve()}getQueryCache(){return h(this,je)}getMutationCache(){return h(this,Cn)}getDefaultOptions(){return h(this,_n)}setDefaultOptions(o){z(this,_n,o)}setQueryDefaults(o,s){h(this,Or).set(El(o),{queryKey:o,defaultOptions:s})}getQueryDefaults(o){const s=[...h(this,Or).values()],u={};return s.forEach(c=>{Cl(o,c.queryKey)&&Object.assign(u,c.defaultOptions)}),u}setMutationDefaults(o,s){h(this,zr).set(El(o),{mutationKey:o,defaultOptions:s})}getMutationDefaults(o){const s=[...h(this,zr).values()],u={};return s.forEach(c=>{Cl(o,c.mutationKey)&&Object.assign(u,c.defaultOptions)}),u}defaultQueryOptions(o){if(o._defaulted)return o;const s={...h(this,_n).queries,...this.getQueryDefaults(o.queryKey),...o,_defaulted:!0};return s.queryHash||(s.queryHash=pu(s.queryKey,s)),s.refetchOnReconnect===void 0&&(s.refetchOnReconnect=s.networkMode!=="always"),s.throwOnError===void 0&&(s.throwOnError=!!s.suspense),!s.networkMode&&s.persister&&(s.networkMode="offlineFirst"),s.queryFn===mu&&(s.enabled=!1),s}defaultMutationOptions(o){return o!=null&&o._defaulted?o:{...h(this,_n).mutations,...(o==null?void 0:o.mutationKey)&&this.getMutationDefaults(o.mutationKey),...o,_defaulted:!0}}clear(){h(this,je).clear(),h(this,Cn).clear()}},je=new WeakMap,Cn=new WeakMap,_n=new WeakMap,Or=new WeakMap,zr=new WeakMap,Nn=new WeakMap,Mr=new WeakMap,Fr=new WeakMap,Kf),ld=ze.createContext(void 0),Hp=o=>{const s=ze.useContext(ld);if(!s)throw new Error("No QueryClient set, use QueryClientProvider to set one");return s},Bp=({client:o,children:s})=>(ze.useEffect(()=>(o.mount(),()=>{o.unmount()}),[o]),x.jsx(ld.Provider,{value:o,children:s})),id=ze.createContext(!1),Vp=()=>ze.useContext(id);id.Provider;function Wp(){let o=!1;return{clearReset:()=>{o=!1},reset:()=>{o=!0},isReset:()=>o}}var $p=ze.createContext(Wp()),Kp=()=>ze.useContext($p),qp=(o,s,u)=>{const c=u!=null&&u.state.error&&typeof o.throwOnError=="function"?Zf(o.throwOnError,[u.state.error,u]):o.throwOnError;(o.suspense||o.experimental_prefetchInRender||c)&&(s.isReset()||(o.retryOnMount=!1))},Gp=o=>{ze.useEffect(()=>{o.clearReset()},[o])},Yp=({result:o,errorResetBoundary:s,throwOnError:u,query:c,suspense:y})=>o.isError&&!s.isReset()&&!o.isFetching&&c&&(y&&o.data===void 0||Zf(u,[o.error,c])),Xp=o=>{if(o.suspense){const u=y=>y==="static"?y:Math.max(y??1e3,1e3),c=o.staleTime;o.staleTime=typeof c=="function"?(...y)=>u(c(...y)):u(c),typeof o.gcTime=="number"&&(o.gcTime=Math.max(o.gcTime,1e3))}},Zp=(o,s)=>o.isLoading&&o.isFetching&&!s,Jp=(o,s)=>(o==null?void 0:o.suspense)&&s.isPending,Mf=(o,s,u)=>s.fetchOptimistic(o).catch(()=>{u.clearReset()});function bp(o,s,u){var W,G,ne,B;const c=Vp(),y=Kp(),S=Hp(),R=S.defaultQueryOptions(o);(G=(W=S.getDefaultOptions().queries)==null?void 0:W._experimental_beforeQuery)==null||G.call(W,R);const N=S.getQueryCache().get(R.queryHash);R._optimisticResults=c?"isRestoring":"optimistic",Xp(R),qp(R,y,N),Gp(y);const O=!S.getQueryCache().get(R.queryHash),[A]=ze.useState(()=>new s(S,R)),V=A.getOptimisticResult(R),F=!c&&o.subscribed!==!1;if(ze.useSyncExternalStore(ze.useCallback(Q=>{const le=F?A.subscribe(Be.batchCalls(Q)):ct;return A.updateResult(),le},[A,F]),()=>A.getCurrentResult(),()=>A.getCurrentResult()),ze.useEffect(()=>{A.setOptions(R)},[R,A]),Jp(R,V))throw Mf(R,A,y);if(Yp({result:V,errorResetBoundary:y,throwOnError:R.throwOnError,query:N,suspense:R.suspense}))throw V.error;if((B=(ne=S.getDefaultOptions().queries)==null?void 0:ne._experimental_afterQuery)==null||B.call(ne,R,V),R.experimental_prefetchInRender&&!_l.isServer()&&Zp(V,c)){const Q=O?Mf(R,A,y):N==null?void 0:N.promise;Q==null||Q.catch(ct).finally(()=>{A.updateResult()})}return R.notifyOnChangeProps?V:A.trackResult(V)}function Gi(o,s){return bp(o,zp)}/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const em=o=>o.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),sd=(...o)=>o.filter((s,u,c)=>!!s&&s.trim()!==""&&c.indexOf(s)===u).join(" ").trim();/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var tm={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const nm=ze.forwardRef(({color:o="currentColor",size:s=24,strokeWidth:u=2,absoluteStrokeWidth:c,className:y="",children:S,iconNode:R,...N},O)=>ze.createElement("svg",{ref:O,...tm,width:s,height:s,stroke:o,strokeWidth:c?Number(u)*24/Number(s):u,className:sd("lucide",y),...N},[...R.map(([A,V])=>ze.createElement(A,V)),...Array.isArray(S)?S:[S]]));/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Zn=(o,s)=>{const u=ze.forwardRef(({className:c,...y},S)=>ze.createElement(nm,{ref:S,iconNode:s,className:sd(`lucide-${em(o)}`,c),...y}));return u.displayName=`${o}`,u};/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rm=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],lm=Zn("Activity",rm);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const im=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Ff=Zn("RefreshCw",im);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const sm=[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]],om=Zn("Trash2",sm);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const um=[["path",{d:"M6 9H4.5a2.5 2.5 0 0 1 0-5H6",key:"17hqa7"}],["path",{d:"M18 9h1.5a2.5 2.5 0 0 0 0-5H18",key:"lmptdp"}],["path",{d:"M4 22h16",key:"57wxv0"}],["path",{d:"M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22",key:"1nw9bq"}],["path",{d:"M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22",key:"1np0yb"}],["path",{d:"M18 2H6v7a6 6 0 0 0 12 0V2Z",key:"u46fv3"}]],cu=Zn("Trophy",um);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const am=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}],["path",{d:"M5 12.859a10 10 0 0 1 5.17-2.69",key:"1dl1wf"}],["path",{d:"M19 12.859a10 10 0 0 0-2.007-1.523",key:"4k23kn"}],["path",{d:"M2 8.82a15 15 0 0 1 4.177-2.643",key:"1grhjp"}],["path",{d:"M22 8.82a15 15 0 0 0-11.288-3.764",key:"z3jwby"}],["path",{d:"m2 2 20 20",key:"1ooewy"}]],cm=Zn("WifiOff",am);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fm=[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]],dm=Zn("Wifi",fm);/** + * @license lucide-react v0.475.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hm=[["path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z",key:"1xq2db"}]],Ki=Zn("Zap",hm),yu="",od=()=>fetch(`${yu}/health`).then(o=>o.json()),pm=()=>fetch(`${yu}/stats`).then(o=>o.json()),mm=(o,s=10)=>fetch(`${yu}/leaderboard?task_id=${o}&limit=${s}`).then(u=>u.json()).then(u=>u.entries||[]);function ud(o){var s,u,c="";if(typeof o=="string"||typeof o=="number")c+=o;else if(typeof o=="object")if(Array.isArray(o)){var y=o.length;for(s=0;s{const{data:o}=Gi({queryKey:["health"],queryFn:od,refetchInterval:1e4}),s=(o==null?void 0:o.status)==="ok";return x.jsxs("header",{className:"flex items-center justify-between pb-2",children:[x.jsx("div",{className:"flex items-center gap-6",children:x.jsxs("div",{className:"flex items-center gap-2",children:[x.jsx("img",{src:"/dashboard/logo.svg",className:"h-[38px] w-auto",alt:"CodeLens."}),x.jsx("div",{className:"h-5 w-px bg-zinc-200 hidden sm:block mx-2"}),x.jsx("p",{className:"text-[10px] font-mono font-bold uppercase tracking-[0.3em] hidden sm:block pt-1 opacity-40 group-hover:opacity-60 transition-opacity",style:{color:"var(--color-heading)"},children:"Evaluation"})]})}),x.jsx("div",{className:Nl("flex items-center gap-2 px-4 py-2 rounded-full text-xs font-semibold tracking-wide uppercase transition-all",s?"bg-emerald-50 text-emerald-600 ring-1 ring-emerald-200":"bg-red-50 text-red-500 ring-1 ring-red-200"),children:s?x.jsxs(x.Fragment,{children:[x.jsx(dm,{className:"w-3.5 h-3.5"}),x.jsx("span",{children:"Connected"})]}):x.jsxs(x.Fragment,{children:[x.jsx(cm,{className:"w-3.5 h-3.5"}),x.jsx("span",{children:"Offline"})]})})]})},Yo=({label:o,value:s,icon:u,iconBg:c})=>x.jsxs("div",{className:"bg-white rounded-3xl p-7 transition-all duration-200 hover:shadow-lg hover:-translate-y-0.5 group",style:{border:"1px solid var(--color-border)"},children:[x.jsxs("div",{className:"flex items-start justify-between mb-5",children:[x.jsx("p",{className:"text-[11px] font-bold uppercase tracking-[0.12em]",style:{color:"var(--color-muted)"},children:o}),x.jsx("div",{className:`p-2.5 rounded-xl transition-transform group-hover:scale-110 ${c}`,children:u})]}),x.jsx("h3",{className:"text-4xl font-extrabold tracking-tight tabular-nums",style:{color:"var(--color-heading)"},children:s})]}),ym=()=>{var u;const{data:o}=Gi({queryKey:["stats"],queryFn:pm,refetchInterval:3e4}),{data:s}=Gi({queryKey:["health"],queryFn:od,refetchInterval:1e4});return x.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:[x.jsx(Yo,{label:"Total Episodes",value:(o==null?void 0:o.total_episodes)??0,icon:x.jsx(cu,{className:"w-5 h-5 text-amber-600"}),iconBg:"bg-amber-50"}),x.jsx(Yo,{label:"Avg. Score",value:((u=o==null?void 0:o.avg_score)==null?void 0:u.toFixed(2))??"0.00",icon:x.jsx(Ki,{className:"w-5 h-5 text-blue-600"}),iconBg:"bg-blue-50"}),x.jsx(Yo,{label:"Active Episodes",value:(s==null?void 0:s.active_episodes)??0,icon:x.jsx(lm,{className:"w-5 h-5 text-emerald-600"}),iconBg:"bg-emerald-50"})]})},gm=({score:o})=>{const s=o>=.8?"text-emerald-700 bg-emerald-50 ring-1 ring-emerald-200":o>=.5?"text-amber-700 bg-amber-50 ring-1 ring-amber-200":"text-red-600 bg-red-50 ring-1 ring-red-200";return x.jsx("span",{className:Nl("inline-flex items-center px-3 py-1 rounded-full text-xs font-bold tabular-nums",s),children:o.toFixed(2)})},wm=({entries:o})=>x.jsxs("table",{className:"w-full text-left border-collapse",children:[x.jsx("thead",{children:x.jsxs("tr",{style:{borderBottom:"1px solid var(--color-border)"},children:[x.jsx("th",{className:"px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em]",style:{color:"var(--color-muted)"},children:"Rank"}),x.jsx("th",{className:"px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em]",style:{color:"var(--color-muted)"},children:"Agent"}),x.jsx("th",{className:"px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em] text-center",style:{color:"var(--color-muted)"},children:"Score"}),x.jsx("th",{className:"px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em] text-right",style:{color:"var(--color-muted)"},children:"Seed"}),x.jsx("th",{className:"px-7 py-4 text-[10px] font-bold uppercase tracking-[0.12em] text-right",style:{color:"var(--color-muted)"},children:"Submitted"})]})}),x.jsx("tbody",{children:o.map((s,u)=>x.jsxs("tr",{className:"group hover:bg-zinc-50/80 transition-colors tabular-nums",style:{borderBottom:"1px solid var(--color-border)"},children:[x.jsx("td",{className:"px-7 py-5",children:u<3?x.jsx("span",{className:` + inline-flex items-center justify-center w-7 h-7 rounded-lg text-xs font-extrabold + ${u===0?"bg-amber-50 text-amber-600":""} + ${u===1?"bg-zinc-100 text-zinc-500":""} + ${u===2?"bg-orange-50 text-orange-500":""} + `,children:s.rank}):x.jsx("span",{className:"text-sm font-semibold pl-2",style:{color:"var(--color-muted)"},children:s.rank})}),x.jsx("td",{className:"px-7 py-5",children:x.jsx("span",{className:"font-semibold group-hover:text-zinc-900 transition-colors",style:{color:"var(--color-heading)"},children:s.agent_name})}),x.jsx("td",{className:"px-7 py-5 text-center",children:x.jsx(gm,{score:s.score})}),x.jsx("td",{className:"px-7 py-5 text-right text-sm font-mono",style:{color:"var(--color-muted)"},children:s.seed}),x.jsx("td",{className:"px-7 py-5 text-right text-xs",style:{color:"var(--color-muted)"},children:new Date(s.submitted_at).toLocaleDateString()})]},u))})]}),Sm=()=>{const[o,s]=ze.useState("bug_detection"),{data:u,isLoading:c,refetch:y,isRefetching:S}=Gi({queryKey:["leaderboard",o],queryFn:()=>mm(o)}),R=[{id:"bug_detection",label:"Bug Detection"},{id:"security_audit",label:"Security Audit"},{id:"architectural_review",label:"Arch. Review"}];return x.jsxs("div",{className:"bg-white rounded-3xl overflow-hidden flex flex-col h-[600px]",style:{border:"1px solid var(--color-border)"},children:[x.jsxs("div",{className:"px-7 py-5 flex items-center justify-between",style:{borderBottom:"1px solid var(--color-border)"},children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("div",{className:"p-2 bg-amber-50 rounded-xl",children:x.jsx(cu,{className:"w-5 h-5 text-amber-600"})}),x.jsx("h2",{className:"text-lg font-extrabold tracking-tight",style:{color:"var(--color-heading)"},children:"Leaderboard"})]}),x.jsx("button",{onClick:()=>y(),disabled:c||S,className:"p-2.5 hover:bg-zinc-100 rounded-xl transition-colors disabled:opacity-40",style:{color:"var(--color-muted)"},children:x.jsx(Ff,{className:Nl("w-4 h-4",(c||S)&&"animate-spin")})})]}),x.jsx("div",{className:"px-7",style:{borderBottom:"1px solid var(--color-border)"},children:x.jsx("div",{className:"flex gap-6 overflow-x-auto",children:R.map(N=>x.jsxs("button",{onClick:()=>s(N.id),className:Nl("py-3.5 text-sm font-semibold transition-all relative whitespace-nowrap",o===N.id?"text-zinc-900":"text-zinc-400 hover:text-zinc-600"),children:[N.label,o===N.id&&x.jsx("div",{className:"absolute bottom-0 left-0 right-0 h-[2px] bg-zinc-900 rounded-full"})]},N.id))})}),x.jsx("div",{className:"flex-1 overflow-auto",children:c?x.jsxs("div",{className:"flex items-center justify-center h-full gap-3",style:{color:"var(--color-muted)"},children:[x.jsx(Ff,{className:"w-5 h-5 animate-spin"}),x.jsx("span",{className:"text-sm font-medium",children:"Loading entries..."})]}):u&&u.length>0?x.jsx(wm,{entries:u}):x.jsxs("div",{className:"flex flex-col items-center justify-center h-full space-y-4",children:[x.jsx("div",{className:"p-5 bg-zinc-50 rounded-2xl",children:x.jsx(cu,{className:"w-10 h-10 text-zinc-200"})}),x.jsx("p",{className:"text-xs font-bold uppercase tracking-[0.15em]",style:{color:"var(--color-muted)"},children:"No rankings yet"})]})})]})},Lf=o=>{let s;const u=new Set,c=(A,V)=>{const F=typeof A=="function"?A(s):A;if(!Object.is(F,s)){const W=s;s=V??(typeof F!="object"||F===null)?F:Object.assign({},s,F),u.forEach(G=>G(s,W))}},y=()=>s,N={setState:c,getState:y,getInitialState:()=>O,subscribe:A=>(u.add(A),()=>u.delete(A))},O=s=o(c,y,N);return N},xm=(o=>o?Lf(o):Lf),km=o=>o;function Em(o,s=km){const u=xl.useSyncExternalStore(o.subscribe,xl.useCallback(()=>s(o.getState()),[o,s]),xl.useCallback(()=>s(o.getInitialState()),[o,s]));return xl.useDebugValue(u),u}const If=o=>{const s=xm(o),u=c=>Em(s,c);return Object.assign(u,s),u},Cm=(o=>o?If(o):If),ad=Cm(o=>({events:[],connected:!1,push:s=>o(u=>({events:[s,...u.events].slice(0,20)})),clear:()=>o({events:[]}),setConnected:s=>o({connected:s})})),_m=({event:o})=>{const s=new Date(o.timestamp).toLocaleTimeString([],{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"});return x.jsxs("div",{className:"rounded-2xl p-4 transition-all duration-200 hover:shadow-sm animate-fade-slide-in",style:{backgroundColor:"#fafafa",border:"1px solid var(--color-border)"},children:[x.jsxs("div",{className:"flex items-center justify-between mb-2",children:[x.jsx("span",{className:"text-[10px] tabular-nums font-bold uppercase tracking-wider",style:{color:"var(--color-muted)"},children:s}),x.jsx("span",{className:"text-[10px] font-mono font-bold bg-indigo-50 text-indigo-600 px-2 py-0.5 rounded-md",children:o.episode_id.slice(0,8)})]}),x.jsxs("div",{className:"flex items-center justify-between",children:[x.jsx("span",{className:"text-sm font-semibold capitalize truncate max-w-[140px]",style:{color:"var(--color-heading)"},children:o.type}),x.jsxs("span",{className:Nl("text-xs font-bold font-mono px-2.5 py-1 rounded-full",o.reward>0?"text-emerald-700 bg-emerald-50":o.reward<0?"text-red-600 bg-red-50":"text-zinc-500 bg-zinc-100"),children:[o.reward>0?"+":"",o.reward.toFixed(2)]})]})]})},Nm=()=>{const{events:o,clear:s,connected:u}=ad();return x.jsxs("div",{className:"bg-white rounded-3xl overflow-hidden flex flex-col h-[600px]",style:{border:"1px solid var(--color-border)"},children:[x.jsxs("div",{className:"px-7 py-5 flex items-center justify-between",style:{borderBottom:"1px solid var(--color-border)"},children:[x.jsxs("div",{className:"flex items-center gap-3",children:[x.jsx("div",{className:`p-2 rounded-xl ${u?"bg-amber-50":"bg-zinc-100"}`,children:x.jsx(Ki,{className:`w-5 h-5 ${u?"text-amber-600":"text-zinc-400"}`})}),x.jsx("h2",{className:"text-lg font-extrabold tracking-tight",style:{color:"var(--color-heading)"},children:"Live Feed"})]}),x.jsx("button",{onClick:s,className:"p-2.5 hover:bg-zinc-100 rounded-xl transition-colors",style:{color:"var(--color-muted)"},title:"Clear Feed",children:x.jsx(om,{className:"w-4 h-4"})})]}),x.jsxs("div",{className:"flex-1 overflow-auto p-5 space-y-3",children:[!u&&x.jsxs("div",{className:"flex flex-col items-center justify-center h-full space-y-4 text-center",children:[x.jsx("div",{className:"p-5 bg-zinc-50 rounded-2xl",children:x.jsx(Ki,{className:"w-10 h-10 text-zinc-200 animate-pulse"})}),x.jsx("p",{className:"text-[11px] uppercase tracking-[0.15em] font-bold",style:{color:"var(--color-muted)"},children:"Connecting to live stream..."})]}),u&&o.length===0&&x.jsxs("div",{className:"flex flex-col items-center justify-center h-full space-y-4 text-center",children:[x.jsx("div",{className:"p-5 bg-zinc-50 rounded-2xl",children:x.jsx(Ki,{className:"w-10 h-10 text-zinc-200"})}),x.jsxs("div",{className:"space-y-1.5",children:[x.jsx("p",{className:"text-[11px] font-bold uppercase tracking-[0.15em]",style:{color:"var(--color-muted)"},children:"Monitoring activity"}),x.jsx("p",{className:"text-[11px] max-w-[180px] leading-relaxed",style:{color:"var(--color-muted)"},children:"Evaluation events will appear here in real-time."})]})]}),o.map((c,y)=>x.jsx(_m,{event:c},y))]})]})};function Pm(){const{push:o,setConnected:s}=ad(),u=ze.useRef(null);ze.useEffect(()=>{let c=null,y=!0;function S(){u.current&&clearTimeout(u.current);const R=window.location.protocol==="https:"?"wss:":"ws:",N=window.location.host,O=`${R}//${N}/ws/events`;c=new WebSocket(O),c.onopen=()=>{y&&(s(!0),console.log("WebSocket connected"))},c.onmessage=A=>{if(y)try{const V=JSON.parse(A.data);o({...V,timestamp:new Date().toISOString()})}catch(V){console.error("Failed to parse WS message",V)}},c.onclose=()=>{y&&(s(!1),console.log("WebSocket closed, reconnecting in 3s..."),u.current=setTimeout(S,3e3))},c.onerror=A=>{console.error("WebSocket error",A),c==null||c.close()}}return S(),()=>{y=!1,u.current&&clearTimeout(u.current),c==null||c.close()}},[o,s])}const Rm=()=>(Pm(),x.jsx("div",{className:"min-h-screen",style:{backgroundColor:"var(--color-bg)"},children:x.jsxs("div",{className:"max-w-7xl mx-auto px-6 py-10 space-y-10",children:[x.jsx(vm,{}),x.jsx(ym,{}),x.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-8",children:[x.jsx("div",{className:"lg:col-span-2",children:x.jsx(Sm,{})}),x.jsx("div",{className:"lg:col-span-1",children:x.jsx(Nm,{})})]})]})})),jm=new Qp({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:1}}});mp.createRoot(document.getElementById("root")).render(x.jsx(xl.StrictMode,{children:x.jsx(Bp,{client:jm,children:x.jsx(Rm,{})})})); diff --git a/static/dashboard/assets/inter-cyrillic-400-normal-HOLc17fK.woff b/static/dashboard/assets/inter-cyrillic-400-normal-HOLc17fK.woff new file mode 100644 index 0000000000000000000000000000000000000000..6bd8b02e94181d541bd90231f5f64301b924f27d Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-400-normal-HOLc17fK.woff differ diff --git a/static/dashboard/assets/inter-cyrillic-400-normal-obahsSVq.woff2 b/static/dashboard/assets/inter-cyrillic-400-normal-obahsSVq.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e7583fca2f891e8f3ad0b714b2225be51ff1abf4 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-400-normal-obahsSVq.woff2 differ diff --git a/static/dashboard/assets/inter-cyrillic-600-normal-4D_pXhcN.woff b/static/dashboard/assets/inter-cyrillic-600-normal-4D_pXhcN.woff new file mode 100644 index 0000000000000000000000000000000000000000..10ec579a79bc135a3338d622168d81083ba62db2 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-600-normal-4D_pXhcN.woff differ diff --git a/static/dashboard/assets/inter-cyrillic-600-normal-CWCymEST.woff2 b/static/dashboard/assets/inter-cyrillic-600-normal-CWCymEST.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e250ef0c51d32532938cb63aaeceff7c97dda4d1 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-600-normal-CWCymEST.woff2 differ diff --git a/static/dashboard/assets/inter-cyrillic-700-normal-CjBOestx.woff2 b/static/dashboard/assets/inter-cyrillic-700-normal-CjBOestx.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..781e4b4d96733a950812b1459fb5a9016206d54d Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-700-normal-CjBOestx.woff2 differ diff --git a/static/dashboard/assets/inter-cyrillic-700-normal-DrXBdSj3.woff b/static/dashboard/assets/inter-cyrillic-700-normal-DrXBdSj3.woff new file mode 100644 index 0000000000000000000000000000000000000000..46451f1621b0a6ef9bff4827fba0533b5a1dd2d9 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-700-normal-DrXBdSj3.woff differ diff --git a/static/dashboard/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 b/static/dashboard/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4ee0d275a35d0c1598a922cba8673d5f821b5bf4 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 differ diff --git a/static/dashboard/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff b/static/dashboard/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff new file mode 100644 index 0000000000000000000000000000000000000000..6b6dc78bec954390ee46707d5d866d2b14029fe7 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff differ diff --git a/static/dashboard/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff b/static/dashboard/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff new file mode 100644 index 0000000000000000000000000000000000000000..7b24dd8d1e75ca09e73144ad83fad10e717b8b3f Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff differ diff --git a/static/dashboard/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 b/static/dashboard/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e00289e0658c5da2be3c84d864962950c02c7ee0 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 differ diff --git a/static/dashboard/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 b/static/dashboard/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1a5c3ce7279c3e233c44c9f355bf611f21a65546 Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 differ diff --git a/static/dashboard/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff b/static/dashboard/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff new file mode 100644 index 0000000000000000000000000000000000000000..6fb27004025e709ae81fc1c632a8e42efc91ec4e Binary files /dev/null and b/static/dashboard/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff differ diff --git a/static/dashboard/assets/inter-greek-400-normal-B4URO6DV.woff2 b/static/dashboard/assets/inter-greek-400-normal-B4URO6DV.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e7103fb5d82ee7b79263e028974a0fbb5c1f1e4c Binary files /dev/null and b/static/dashboard/assets/inter-greek-400-normal-B4URO6DV.woff2 differ diff --git a/static/dashboard/assets/inter-greek-400-normal-q2sYcFCs.woff b/static/dashboard/assets/inter-greek-400-normal-q2sYcFCs.woff new file mode 100644 index 0000000000000000000000000000000000000000..c0c36e2cc9063309398f5838556118fa5d858a09 Binary files /dev/null and b/static/dashboard/assets/inter-greek-400-normal-q2sYcFCs.woff differ diff --git a/static/dashboard/assets/inter-greek-600-normal-BZpKdvQh.woff b/static/dashboard/assets/inter-greek-600-normal-BZpKdvQh.woff new file mode 100644 index 0000000000000000000000000000000000000000..ae72058db9451f3ca9718c67833b6ceb4cdd57ff Binary files /dev/null and b/static/dashboard/assets/inter-greek-600-normal-BZpKdvQh.woff differ diff --git a/static/dashboard/assets/inter-greek-600-normal-plRanbMR.woff2 b/static/dashboard/assets/inter-greek-600-normal-plRanbMR.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..479b5472a2c0dc961f852360ad3406c56e12ac11 Binary files /dev/null and b/static/dashboard/assets/inter-greek-600-normal-plRanbMR.woff2 differ diff --git a/static/dashboard/assets/inter-greek-700-normal-BUv2fZ6O.woff b/static/dashboard/assets/inter-greek-700-normal-BUv2fZ6O.woff new file mode 100644 index 0000000000000000000000000000000000000000..1d428f52912ae45450a097b96d89ae3f0968995b Binary files /dev/null and b/static/dashboard/assets/inter-greek-700-normal-BUv2fZ6O.woff differ diff --git a/static/dashboard/assets/inter-greek-700-normal-C3JjAnD8.woff2 b/static/dashboard/assets/inter-greek-700-normal-C3JjAnD8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3a9fc0b9ba4ec20c1599ce319c590fd8408e76b5 Binary files /dev/null and b/static/dashboard/assets/inter-greek-700-normal-C3JjAnD8.woff2 differ diff --git a/static/dashboard/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 b/static/dashboard/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7cb1d6bf2bef5da09376df54940a4274b9d18a9f Binary files /dev/null and b/static/dashboard/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 differ diff --git a/static/dashboard/assets/inter-greek-ext-400-normal-KugGGMne.woff b/static/dashboard/assets/inter-greek-ext-400-normal-KugGGMne.woff new file mode 100644 index 0000000000000000000000000000000000000000..96f1f6020f0d4f464fc56537fb0b673df836d640 Binary files /dev/null and b/static/dashboard/assets/inter-greek-ext-400-normal-KugGGMne.woff differ diff --git a/static/dashboard/assets/inter-greek-ext-600-normal-B8X0CLgF.woff b/static/dashboard/assets/inter-greek-ext-600-normal-B8X0CLgF.woff new file mode 100644 index 0000000000000000000000000000000000000000..b3d15d13d46cd8b583fa1855f5bf873b8f3b0853 Binary files /dev/null and b/static/dashboard/assets/inter-greek-ext-600-normal-B8X0CLgF.woff differ diff --git a/static/dashboard/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 b/static/dashboard/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..83e7de93d5837a6bb85528302ea288c6549fd7eb Binary files /dev/null and b/static/dashboard/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 differ diff --git a/static/dashboard/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff b/static/dashboard/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff new file mode 100644 index 0000000000000000000000000000000000000000..e36fd56f1c0a074846707fe4e2e63d044295100e Binary files /dev/null and b/static/dashboard/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff differ diff --git a/static/dashboard/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 b/static/dashboard/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..af7bcba9e06b2d9e51804c02a5f0b0fb3772aa2c Binary files /dev/null and b/static/dashboard/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 differ diff --git a/static/dashboard/assets/inter-latin-400-normal-C38fXH4l.woff2 b/static/dashboard/assets/inter-latin-400-normal-C38fXH4l.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f15b025d666269fb07daf0263e54231481e4289c Binary files /dev/null and b/static/dashboard/assets/inter-latin-400-normal-C38fXH4l.woff2 differ diff --git a/static/dashboard/assets/inter-latin-400-normal-CyCys3Eg.woff b/static/dashboard/assets/inter-latin-400-normal-CyCys3Eg.woff new file mode 100644 index 0000000000000000000000000000000000000000..2f21ed484182ce5eeaf53879ea2bd2460ee06324 Binary files /dev/null and b/static/dashboard/assets/inter-latin-400-normal-CyCys3Eg.woff differ diff --git a/static/dashboard/assets/inter-latin-600-normal-CiBQ2DWP.woff b/static/dashboard/assets/inter-latin-600-normal-CiBQ2DWP.woff new file mode 100644 index 0000000000000000000000000000000000000000..323fa679d99c6d019afca278b5b23fa77a1c29bd Binary files /dev/null and b/static/dashboard/assets/inter-latin-600-normal-CiBQ2DWP.woff differ diff --git a/static/dashboard/assets/inter-latin-600-normal-LgqL8muc.woff2 b/static/dashboard/assets/inter-latin-600-normal-LgqL8muc.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d1897949fda5c7fc5f04622df43a3fcba5b89d84 Binary files /dev/null and b/static/dashboard/assets/inter-latin-600-normal-LgqL8muc.woff2 differ diff --git a/static/dashboard/assets/inter-latin-700-normal-BLAVimhd.woff b/static/dashboard/assets/inter-latin-700-normal-BLAVimhd.woff new file mode 100644 index 0000000000000000000000000000000000000000..161b01e8217e38fa23ff535ae9c95c77f295c485 Binary files /dev/null and b/static/dashboard/assets/inter-latin-700-normal-BLAVimhd.woff differ diff --git a/static/dashboard/assets/inter-latin-700-normal-Yt3aPRUw.woff2 b/static/dashboard/assets/inter-latin-700-normal-Yt3aPRUw.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a68fb101cd9224aa7bb6ca80356b5132c40c6f3f Binary files /dev/null and b/static/dashboard/assets/inter-latin-700-normal-Yt3aPRUw.woff2 differ diff --git a/static/dashboard/assets/inter-latin-ext-400-normal-77YHD8bZ.woff b/static/dashboard/assets/inter-latin-ext-400-normal-77YHD8bZ.woff new file mode 100644 index 0000000000000000000000000000000000000000..0238739dd00872087aa6e9dec294167d0b6e74dc Binary files /dev/null and b/static/dashboard/assets/inter-latin-ext-400-normal-77YHD8bZ.woff differ diff --git a/static/dashboard/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 b/static/dashboard/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5243e4b2b0274fc97d305e79363e8040975c8775 Binary files /dev/null and b/static/dashboard/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 differ diff --git a/static/dashboard/assets/inter-latin-ext-600-normal-CIVaiw4L.woff b/static/dashboard/assets/inter-latin-ext-600-normal-CIVaiw4L.woff new file mode 100644 index 0000000000000000000000000000000000000000..74b454b3dbe7520224a42688b905946d9dc0ea22 Binary files /dev/null and b/static/dashboard/assets/inter-latin-ext-600-normal-CIVaiw4L.woff differ diff --git a/static/dashboard/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 b/static/dashboard/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bad65d4b7a4e7ded6d25e998a8441fb256de9a79 Binary files /dev/null and b/static/dashboard/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 differ diff --git a/static/dashboard/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 b/static/dashboard/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..c9507e3f354ce4650d2896157dfe8755cdf5f2e3 Binary files /dev/null and b/static/dashboard/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 differ diff --git a/static/dashboard/assets/inter-latin-ext-700-normal-TidjK2hL.woff b/static/dashboard/assets/inter-latin-ext-700-normal-TidjK2hL.woff new file mode 100644 index 0000000000000000000000000000000000000000..b4517fc3e056b559344ee679d9686a6698fdb5d9 Binary files /dev/null and b/static/dashboard/assets/inter-latin-ext-700-normal-TidjK2hL.woff differ diff --git a/static/dashboard/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff b/static/dashboard/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff new file mode 100644 index 0000000000000000000000000000000000000000..ff3f8f1ebf7a23bce390a4ed095fb2a8c861ab07 Binary files /dev/null and b/static/dashboard/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff differ diff --git a/static/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 b/static/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ba7767f2a55fe4294cd0b8f90ca504ebff8a18db Binary files /dev/null and b/static/dashboard/assets/inter-vietnamese-400-normal-DMkecbls.woff2 differ diff --git a/static/dashboard/assets/inter-vietnamese-600-normal-BuLX-rYi.woff b/static/dashboard/assets/inter-vietnamese-600-normal-BuLX-rYi.woff new file mode 100644 index 0000000000000000000000000000000000000000..264f0f55b94c50c16b01fe5f37378e1b121cbf1a Binary files /dev/null and b/static/dashboard/assets/inter-vietnamese-600-normal-BuLX-rYi.woff differ diff --git a/static/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 b/static/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e7b7814b4a6ec44608bddbc6d89c859d9b03dbb5 Binary files /dev/null and b/static/dashboard/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 differ diff --git a/static/dashboard/assets/inter-vietnamese-700-normal-BZaoP0fm.woff b/static/dashboard/assets/inter-vietnamese-700-normal-BZaoP0fm.woff new file mode 100644 index 0000000000000000000000000000000000000000..26d92ec81fe856beee61ec26f9d131b9881e0b77 Binary files /dev/null and b/static/dashboard/assets/inter-vietnamese-700-normal-BZaoP0fm.woff differ diff --git a/static/dashboard/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 b/static/dashboard/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..38c516eb6ea5102499d959cae5976b740f847ce0 Binary files /dev/null and b/static/dashboard/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 differ diff --git a/static/dashboard/favicon.svg b/static/dashboard/favicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..e5d60508f18d89fef7331ea1fdc821baefafc218 --- /dev/null +++ b/static/dashboard/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/dashboard/index.html b/static/dashboard/index.html new file mode 100644 index 0000000000000000000000000000000000000000..ad23cc85b80b80bdaacdbbc6a6dc082b4b2bdda2 --- /dev/null +++ b/static/dashboard/index.html @@ -0,0 +1,15 @@ + + + + + + CodeLens Dashboard + + + + + + +
+ + diff --git a/static/dashboard/logo.svg b/static/dashboard/logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..5cedda39b400e36a41f9c051d6577539534cae03 --- /dev/null +++ b/static/dashboard/logo.svg @@ -0,0 +1,3 @@ + + Codelens. + diff --git a/tests/conftest.py b/tests/conftest.py index b9684a2685ecaf055ae634150f92d8e412c9cc5b..30526a20874ee8967f695264e5ba9765c29431df 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,9 +4,9 @@ from sqlmodel import SQLModel, Session, create_engine from sqlmodel.pool import StaticPool from app import app -from codereview_env.database import get_session -from codereview_env.env import CodeReviewEnv -from codereview_env.models import TaskId, Action, ActionType, Severity, Category, Verdict +from codelens_env.database import get_session +from codelens_env.env import CodeLensEnv +from codelens_env.models import TaskId, Action, ActionType, Severity, Category, Verdict @pytest.fixture(name="session") def session_fixture(): @@ -32,7 +32,7 @@ def client_fixture(session): @pytest.fixture def env(): - return CodeReviewEnv() + return CodeLensEnv() @pytest.fixture def approve_action(): diff --git a/tests/test_api.py b/tests/test_api.py index af46d9dacf588d0e8659ac342a158388f7afdfda..8610dcfe14f924da224ec45744df7b00b1506e36 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1,7 +1,7 @@ import pytest from fastapi.testclient import TestClient from app import app -from codereview_env.models import TaskId, ActionType, Category, Severity, Verdict +from codelens_env.models import TaskId, ActionType, Category, Severity, Verdict def test_api_health(): client = TestClient(app) diff --git a/tests/test_database.py b/tests/test_database.py index ceb519fdfb59230de30da4cd6f90fce519519ae3..d7d29e7b0a7a9eb8273eb23c8bed69fbb81d80ab 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -1,6 +1,6 @@ from sqlmodel import Session -from codereview_env.database import save_episode, get_episode, submit_leaderboard, get_leaderboard_db, get_stats -from codereview_env.models import EpisodeResult, TaskId, ActionRecord, ActionType +from codelens_env.database import save_episode, get_episode, submit_leaderboard, get_leaderboard_db, get_stats +from codelens_env.models import EpisodeResult, TaskId, ActionRecord, ActionType def make_result(episode_id="test-ep-1", score=0.85): return EpisodeResult( diff --git a/tests/test_env.py b/tests/test_env.py index b01056eb78c39ee45d4b2e883e474394457c4a14..3540cbcaa9eb8dc33bac8b3f8a101b13999a71e1 100644 --- a/tests/test_env.py +++ b/tests/test_env.py @@ -1,6 +1,6 @@ import pytest -from codereview_env.env import CodeReviewEnv -from codereview_env.models import ( +from codelens_env.env import CodeLensEnv +from codelens_env.models import ( TaskId, Action, ActionType, Category, Severity, Verdict ) @@ -10,7 +10,7 @@ from codereview_env.models import ( # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ def test_env_reset(): - env = CodeReviewEnv() + env = CodeLensEnv() res = env.reset(TaskId.BUG_DETECTION, seed=0) assert res.task_id == TaskId.BUG_DETECTION assert res.seed == 0 @@ -20,7 +20,7 @@ def test_env_reset(): def test_env_reset_populates_blast_radius(): """Observation should carry blast-radius metadata from the scenario.""" - env = CodeReviewEnv() + env = CodeLensEnv() res = env.reset(TaskId.SECURITY_AUDIT, seed=0) obs = res.observation # Note: New models have different fields or names, but the env should map them. @@ -32,7 +32,7 @@ def test_env_reset_populates_blast_radius(): # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ def test_env_step_bug_detection(): - env = CodeReviewEnv() + env = CodeLensEnv() env.reset(TaskId.BUG_DETECTION, seed=1) # seed=1 โ†’ bug_003: None dereference in auth.py (per reordering) @@ -63,7 +63,7 @@ def test_env_step_bug_detection(): def test_env_step_reward_is_incremental_not_cumulative(): """Each step reward should be a delta (positive or zero or penalty), not a running total.""" - env = CodeReviewEnv() + env = CodeLensEnv() # seed=1 selects bug_003: None dereference in auth.py at line 16 env.reset(TaskId.BUG_DETECTION, seed=1) @@ -87,7 +87,7 @@ def test_env_step_reward_is_incremental_not_cumulative(): def test_env_step_false_positive_penalty(): """False positives should decrement noise_budget and return negative reward.""" - env = CodeReviewEnv() + env = CodeLensEnv() env.reset(TaskId.BUG_DETECTION, seed=0) fp_action = Action( @@ -104,7 +104,7 @@ def test_env_step_false_positive_penalty(): def test_env_noise_budget_exhaustion(): - env = CodeReviewEnv() + env = CodeLensEnv() env.reset(TaskId.BUG_DETECTION, seed=0) fp_action = Action( @@ -127,7 +127,7 @@ def test_env_noise_budget_exhaustion(): def test_env_max_steps(): - env = CodeReviewEnv() + env = CodeLensEnv() env.reset(TaskId.BUG_DETECTION, seed=0) action = Action(action_type=ActionType.ASK_QUESTION, body="what's this?") @@ -145,7 +145,7 @@ def test_env_max_steps(): # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ def test_security_task_runs_to_completion(): - env = CodeReviewEnv() + env = CodeLensEnv() # seed=1 selects sec_002: Hardcoded secret (if 0-indexed and order is preserved) # Actually get_scenario(TaskId.SECURITY_AUDIT, 1) selects the second item. env.reset(TaskId.SECURITY_AUDIT, seed=1) @@ -172,7 +172,7 @@ def test_security_task_runs_to_completion(): def test_arch_task_runs_to_completion(): - env = CodeReviewEnv() + env = CodeLensEnv() env.reset(TaskId.ARCHITECTURAL_REVIEW, seed=0) # arch_001 is UserManager god class @@ -220,7 +220,7 @@ def test_env_step_raises_when_done(env, approve_action): def test_env_history_recorded(env): """All steps should appear in final result history.""" env.reset(TaskId.BUG_DETECTION, seed=0) - from codereview_env.models import Action, ActionType + from codelens_env.models import Action, ActionType for _ in range(3): env.step(Action(action_type=ActionType.ASK_QUESTION, body="question")) env.step(Action(action_type=ActionType.APPROVE, body="LGTM", verdict=Verdict.LGTM)) @@ -242,7 +242,7 @@ def test_env_get_final_result_score_clamped(env, approve_action): def test_env_full_episode_completes(task_id, seed, env): """Full episodes must always reach a terminal state.""" env.reset(task_id, seed=seed) - from codereview_env.models import Action, ActionType, Verdict + from codelens_env.models import Action, ActionType, Verdict # Just skip to terminal action = Action(action_type=ActionType.APPROVE, body="LGTM", verdict=Verdict.LGTM) result = env.step(action) diff --git a/tests/test_graders.py b/tests/test_graders.py index 060ccee23b2e6c23839d31cddbf622080f34486e..5811d8208a1a98deb9a393b2ddafcb2b31d04985 100644 --- a/tests/test_graders.py +++ b/tests/test_graders.py @@ -1,7 +1,7 @@ -from codereview_env.models import Scenario, ActionRecord, Category, Severity, TaskId, GroundTruthIssue, ActionType, Verdict -from codereview_env.graders.bug_grader import grade_bug_detection -from codereview_env.graders.security_grader import grade_security_audit -from codereview_env.graders.arch_grader import grade_architectural_review +from codelens_env.models import Scenario, ActionRecord, Category, Severity, TaskId, GroundTruthIssue, ActionType, Verdict +from codelens_env.graders.bug_grader import grade_bug_detection +from codelens_env.graders.security_grader import grade_security_audit +from codelens_env.graders.arch_grader import grade_architectural_review def test_bug_grader_perfect(): scenario = Scenario( @@ -49,9 +49,9 @@ def test_security_grader_severity_mismatch(): ] score = grade_security_audit(scenario, history) # sev_diff = 3, sev_score = max(0, 1 - 3*0.3) = 0.1 - # threshold = max(4, 1*0.6) = 4. kw_score = 1/4 = 0.25 - # total_score = 0.7 * 0.1 + 0.3 * 0.25 = 0.07 + 0.075 = 0.145 - assert score == 0.145 + # kw_score = 1/1 = 1.0 + # total_score = 0.7 * 0.1 + 0.3 * 1.0 = 0.07 + 0.3 = 0.37 + assert score == 0.37 def test_arch_grader_verdict(): scenario = Scenario( diff --git a/tests/test_scenarios.py b/tests/test_scenarios.py index 5ff4eec72bbae9a02e8bd609c8925d27a16fd64c..8ae402575597405cd176059c558de915e9dacc56 100644 --- a/tests/test_scenarios.py +++ b/tests/test_scenarios.py @@ -1,6 +1,6 @@ import pytest -from codereview_env.scenarios import get_scenario, all_scenarios -from codereview_env.models import TaskId, Severity +from codelens_env.scenarios import get_scenario, all_scenarios +from codelens_env.models import TaskId, Severity # โ”€โ”€ All 30 scenarios loadable โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€