diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 3e5ef9d..e5875b1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,63 +1,38 @@ --- name: Bug Report -about: Report a reproducible bug or issue to help improve BraveGoggles-Configuration-Standard-Development-Kit. -labels: ['bug', 'severity: medium'] -assignees: ['chirag127'] ---- - -## 🐞 Bug Report: BraveGoggles-Configuration-Standard-Development-Kit - -Thank you for taking the time to report a bug! Your effort helps us maintain the quality and reliability of the `BraveGoggles-Configuration-Standard-Development-Kit`. - -### Description - -A clear and concise description of what the bug is. Be specific. What problem are you encountering? +about: Create a report to help us improve +title: "[BUG] " +labels: bug +assignees: '' -### Steps to Reproduce - -Provide clear, step-by-step instructions to reproduce the issue. Include code snippets, configuration files, or detailed commands where relevant. +--- -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error '....' +**Describe the bug** +A clear and concise description of what the bug is. -### Expected Behavior +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error +**Expected behavior** A clear and concise description of what you expected to happen. -### Actual Behavior - -A clear and concise description of what actually happened, including any error messages or unexpected outputs. - -### Screenshots / Recordings (Optional) - -If applicable, add screenshots or a short video recording to help explain your problem. Visuals can significantly aid in understanding and diagnosing the issue. - -### Environment - -Please provide the following information about your environment: - -* **Operating System:** [e.g., macOS Sonoma 14.2, Windows 11, Ubuntu 22.04 LTS] -* **BraveGoggles-Configuration-Standard-Development-Kit Version:** [e.g., `v1.0.0` or commit SHA] -* **Brave Browser Version:** [e.g., `1.60.118`] -* **Brave Search Goggles Configuration:** [Name of the Goggle(s) being used, if applicable] -* **Python Version (if applicable):** [e.g., `Python 3.10.12`] -* **Any other relevant software versions:** - -### Severity - -How critical is this bug? (Please select one by placing an 'x' in the brackets) - -* [ ] **Critical:** The application or a major feature is completely broken or unusable. -* [ ] **High:** A significant feature is impaired, or data loss is possible. Major workflow disruption. -* [ ] **Medium:** A minor feature is broken or inconvenient, but there's a workaround. Moderate disruption. -* [ ] **Low:** Cosmetic issues, minor glitches, or non-critical functionality. Little to no disruption. - -### Impact +**Screenshots** +If applicable, add screenshots to help explain your problem. -Describe the impact of this bug. Who does it affect, and how? +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] -### Additional Context +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] -Add any other context about the problem here. This could include things you've tried, other related issues, or specific scenarios where the bug occurs. \ No newline at end of file +**Additional context** +Add any other context about the problem here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..62079e8 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,20 @@ +--- +name: Pull Request +about: Propose a change to the project +title: "[FEAT] " +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 742d031..034e848 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -1,38 +1,21 @@ -# Security Policy for BraveGoggles-Configuration-Standard-Development-Kit - -## Vulnerability Reporting - -Brave Search is committed to the security of its users and the integrity of its products. We encourage responsible disclosure of security vulnerabilities. If you believe you have found a security issue in this repository, please report it via the following channels: - -* **Primary Method:** Open a **private vulnerability report** through GitHub's security advisory feature. Navigate to the main page of this repository, click on the 'Security' tab, and then select 'Advisories' followed by 'New draft security advisory'. This ensures your report is handled securely and confidentially. -* **Alternative Method:** If you are unable to use GitHub's private reporting, please send an encrypted email to `security@brave.com` with the subject line "Security Vulnerability Report - BraveGoggles-Configuration-Standard-Development-Kit". - -## Reporting Guidelines - -When reporting a security vulnerability, please provide as much of the following information as possible: - -* **Affected Repository:** `chirag127/BraveGoggles-Configuration-Standard-Development-Kit` -* **Description:** A clear and concise description of the vulnerability. -* **Steps to Reproduce:** Detailed steps to reproduce the vulnerability, including any necessary configuration or environment setup. -* **Proof of Concept (PoC):** If available, a minimal PoC demonstrating the vulnerability. -* **Impact Assessment:** Your assessment of the potential impact of the vulnerability. -* **Suggested Mitigation:** Any suggestions for how the vulnerability could be fixed. - -## Disclosure Policy - -We ask that you not disclose any vulnerabilities to the public until we have had a reasonable time to investigate and address the issue. Brave Search will strive to acknowledge receipt of your report within **48 hours** and will provide updates on the status of the investigation and resolution. - -Once a vulnerability has been addressed, we will work with you to determine an appropriate time for public disclosure. +# Security Policy ## Supported Versions -This repository is actively maintained. We aim to address reported vulnerabilities in the latest stable version of the code. Security fixes may be backported to previous versions at our discretion. +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | -## What is NOT considered a security issue? +## Reporting a Vulnerability -* Findings of missing security headers (unless they allow for a specific, demonstrable exploit). -* Denial-of-Service (DoS) vulnerabilities that require a significant, unrealistic level of effort to execute. -* Issues that have been publicly disclosed already. -* Problems that are not specific to this repository's code (e.g., issues with third-party libraries that are not explicitly bundled or maintained by this project, unless a specific exploit is demonstrated). +Use this section to tell people how to report a vulnerability. -Thank you for helping keep the BraveGoggles-Configuration-Standard-Development-Kit secure! +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. diff --git a/.github/badges.yml b/.github/badges.yml new file mode 100644 index 0000000..1fe298b --- /dev/null +++ b/.github/badges.yml @@ -0,0 +1,10 @@ +badges: + - name: Build Status + image: https://img.shields.io/github/actions/workflow/status/{owner}/{repo}/ci.yml?label=Build&style=flat-square + url: https://github.com/{owner}/{repo}/actions/workflows/ci.yml + - name: License + image: https://img.shields.io/badge/License-CC%20BY--NC%204.0-blue.svg?style=flat-square + url: LICENSE + - name: GitHub Stars + image: https://img.shields.io/github/stars/{owner}/{repo}?style=flat-square + url: https://github.com/{owner}/{repo} diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index fb814dc..0000000 --- a/.github/renovate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "local>brave/renovate-config" - ] -} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0434379..5cda57d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,9 +1,5 @@ name: CI -# Apex Standard - December 2025 -# Philosophy: Zero-Defect, High-Velocity, Future-Proof. - -# Trigger on pushes to main branch and pull requests targeting main. on: push: branches: [ main ] @@ -11,62 +7,16 @@ on: branches: [ main ] jobs: - build_and_test: + build: runs-on: ubuntu-latest - strategy: - matrix: - # For Python projects, ensure compatibility across key versions. - python-version: ['3.10', '3.11', '3.12', '3.13'] - steps: - - name: ⬆️ Checkout Repository - uses: actions/checkout@v4 + - uses: actions/checkout@v3 + - name: Use Node.js + uses: actions/setup-node@v3 with: - fetch-depth: 0 # Fetch all history for accurate blame/coverage - - - name: 🐍 Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - cache: 'uv' - cache-dependency-path: '**/uv.lock' - - - name: 📦 Install Dependencies with uv - # uv is the Apex standard for Python dependency management. - run: | - python -m uv install --frozen --system - python -m uv pip freeze > requirements.txt - - - name: 🧹 Lint and Format with Ruff - # Ruff is the Apex standard for ultra-fast linting and formatting. - run: | - python -m uv pip install ruff - ruff check . --fix - ruff format . - - - name: 🧪 Run Tests with Pytest - # Pytest is the Apex standard for robust testing. - run: | - python -m uv pip install pytest - pytest tests/ - - - name: 📊 Generate Code Coverage - # Codecov is the Apex standard for coverage reporting. - # Assumes codecov.yml is configured for upload. - run: | - python -m uv pip install codecov - codecov --token $CODECOV_TOKEN - env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - # Ensure this action can push to the correct repo context. - CI_NAME: github-actions - CI_SLUG: ${{ github.repository }} - CI_BRANCH: ${{ github.ref_name }} - CI_COMMIT: ${{ github.sha }} - - # - name: 🚀 Deploy (Conditional) - # if: github.ref == 'refs/heads/main' && github.event_name == 'push' - # # Add deployment steps here, e.g., to PyPI, internal registry, etc. - # # This requires additional secrets and configuration. - # run: echo "Deployment step placeholder." + node-version: '20.x' + cache: 'npm' + - run: npm install + - run: npm run lint + - run: npm run build --if-present diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d4c43b --- /dev/null +++ b/.gitignore @@ -0,0 +1,131 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-temporary-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build output +.nuxt +dist + +# Docusaurus build output +.docusaurus + +# Gatsby build output +.cache/ +# Add history server for Gatsby Develop +.history/ + +# SvelteKit build output +.svelte-kit +.svelte + +# Remix build output +.cache/ +build/ +public/build/ + +# Astro build output +dist/ +.astro/ + +# Vite build output +dist + +# Storybook build output +storybook-static + +# Mitosis build output +dist/ +.mitosis_cache/ + +# Deprecated Vitest cache directory +.vitest_cache + +# Vitest cache directory +.vitest + +# SolidStart build output +.solid/ +dist/ +.vite/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..7791de9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,50 @@ +# SYSTEM: APEX TECHNICAL AUTHORITY & PRINCIPAL AI ARCHITECT (DECEMBER 2025 EDITION) + +## TABLE OF CONTENTS +- [1. IDENTITY & PRIME DIRECTIVE](#1-identity--prime-directive) +- [2. FRONTEND-ONLY ARCHITECTURE (CRITICAL MANDATE)](#2-frontend-only-architecture-critical-mandate) +- [3. AI ORCHESTRATION & MULTI-PROVIDER PROTOCOL (MANDATORY)](#3-ai-orchestration--multi-provider-protocol-mandatory) +- [4. REPOSITORY STRUCTURE & HYGIENE (BALANCED)](#4-repository-structure--hygiene-balanced) +- [5. PROFESSIONAL REPOSITORY STANDARD (MANDATORY FILES)](#5-professional-repository-standard-mandatory-files) +- [6. ARCHITECTURAL PRINCIPLES (THE LAWS OF PHYSICS)](#6-architectural-principles-the-laws-of-physics) +- [7. CODE HYGIENE & STANDARDS](#7-code-hygiene--standards) +- [8. CONTEXT-AWARE APEX TECH STACKS (LATE 2025)](#8-context-aware-apex-tech-stacks-late-2025) +- [9. RELIABILITY, SECURITY & SUSTAINABILITY](#9-reliability-security--sustainability) +- [10. COMPREHENSIVE TESTING STRATEGY](#10-comprehensive-testing-strategy) +- [11. UI/UX AESTHETIC SINGULARITY (2026 STANDARD: SPATIAL-ADAPTIVE)](#11-uix-aesthetic-singularity-2026-standard-spatial-adaptive) +- [12. DOCUMENTATION & VERSION CONTROL](#12-documentation--version-control) +- [13. AUTOMATION SINGULARITY (GITHUB ACTIONS)](#13-automation-singularity-github-actions) +- [14. LLM OPTIMIZATION PROTOCOL (FOR `AGENTS.md`)](#14-llm-optimization-protocol-for-agentsmd) +- [15. THE ATOMIC EXECUTION CYCLE](#15-the-atomic-execution-cycle) + +--- + +## 1. IDENTITY & PRIME DIRECTIVE +**Role:** You are the **Singularity Architect**—a synthesized intelligence merging 40+ years of software engineering wisdom with 2026-era agentic capabilities. You specialize in building **"Self-Healing, Self-Documenting, High-Velocity"** systems. +**Context:** Current Date is **December 2025**. You are building for the **2026 Paradigm**. +**Output Standard:** Deliver **EXECUTION-ONLY** results. No plans, no "reporting", no chatter—only perfected code, pristine docs, and architectural fixes. +**Philosophy:** "Zero-Defect, High-Velocity, Future-Proof, AI-Native." +**Enforcement Mandate:** For any incoming software, extension, web app, desktop app, or related artifact, audit against this system prompt (injected via `AGENTS.md`). If deviations exist (e.g., backend dependencies, hardcoded keys, non-REST API calls, low-rate-limit providers, SDK usage), automatically modify to align: refactor to frontend-only, integrate dual backups (Cerebras + Gemini) plus additional high-limit providers (>2000 req/day), switch to REST APIs exclusively, incorporate best practices (e.g., prompt chaining, token optimization), and ensure high-rate-limit providers. Preserve all original functionality while additive-modifying for compliance. Log modifications in commit messages as `refactor: align with AGENTS.md (section X)`. +**Precision Prompting Addendum:** All internal reasoning and code generation must employ precision prompting techniques: use explicit role assignments (e.g., "You are a TypeScript expert..."), chain-of-thought breakdowns (e.g., "Step 1: Validate input; Step 2: Call REST endpoint"), and few-shot examples for complex tasks to ensure outputs are structured, verifiable, and aligned with §6 principles. + +--- + +## 2. FRONTEND-ONLY ARCHITECTURE (CRITICAL MANDATE) +**Constraint:** **ALL repositories MUST be frontend-only. NO backend servers or APIs are permitted.** +**Rationale:** Limited deployment resources require all projects to run entirely in the browser/client. +### **Implementation Rules** +1. **Direct API Calls:** All AI/external services MUST be called directly from frontend using REST APIs (via `fetch` or `axios`). **NO SDKs**—prefer raw REST for universal integration, error handling, and minimal bundle size. Implement prompt optimization techniques (e.g., chain-of-thought prompting, few-shot examples) client-side before API submission to reduce token usage. +2. **User-Provided Keys:** Users enter their own API keys (Cerebras, Google Gemini, DeepSeek, Mistral, Together AI, OpenRouter, Groq, etc.) in the UI. **NEVER** hardcode keys. +3. **Client-Side Processing:** All data processing, state management, and logic runs in the browser. Use Web Workers for heavy computations (e.g., token counting via TikToken.js). +4. **Static Hosting:** Projects must be deployable to **GitHub Pages, Vercel, Netlify, Cloudflare Pages**. +5. **No Server Dependencies:** Zero Node.js servers, Python backends, or database servers. +6. **Environment Variables:** Use `.env.example` to document required keys, but keys are entered by users at runtime via UI Settings. +### **Forbidden Patterns (❌)** +* ❌ Express/Fastify/Flask/Django servers. +* ❌ Backend API routes (`/api/*`). +* ❌ Server-side rendering (SSR) requiring Node.js runtime. +* ❌ Database connections (PostgreSQL, MongoDB, MySQL). +* ❌ Server-side authentication flows. +* ❌ SDK imports (e.g., `openai`, `google-generativeai`)—use REST exclusively. +### **Approved Patterns (✅)** +* ✅ Static HTML/CSS/JS with Vite/Webpack. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 345b446..3f5cee4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,25 @@ -# Brave Search Goggles contributing guide +# Contributing to AlgoLens -This repository is meant exclusively as a way to demonstrate the ways Goggles can be leveraged to change the ranking of Brave Search. As such, it contains -*educational material only* that we do not intend to maintain over time. +We welcome contributions to AlgoLens! Please follow these guidelines to ensure that your contributions are accepted. -Goggles is about the community, Brave is only providing the host search engine to apply them, and we hope that other search engines will follow. +## Development -If you create a Goggle it can be hosted in your account, so that you are the sole owner of it. Alternatively, you can share the ownership of Goggles by creating an account or a repository where other people can contribute and help maintain the instructions. It will be accessible and usable by anyone, both in the discovery page or by sharing them as Brave Search URLs with your Goggle URL as `goggles_id` query parameter. +### Prerequisites +* Node.js (v20.x LTS or newer) +* npm + +### Setup +1. Fork and clone the repository. +2. Install the dependencies: `npm install` +3. Start the development server: `npm run dev` + +### Scripts +* `npm run dev`: Starts the development server. +* `npm run build`: Builds the application for production. +* `npm run lint`: Lints the code. +* `npm run test`: Runs the tests. + +## Pull Requests +* Please ensure that your code is linted and that all tests pass before submitting a pull request. +* Please provide a clear and concise description of the changes in your pull request. +* Please link to any relevant issues in your pull request. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d0b3afd --- /dev/null +++ b/LICENSE @@ -0,0 +1,5 @@ +Creative Commons Attribution-NonCommercial 4.0 International + +Official Link: https://creativecommons.org/licenses/by-nc/4.0/ + +This license requires that reusers give credit to the creator. It allows reusers to distribute, remix, adapt, and build upon the material in any medium or format, for noncommercial purposes only. diff --git a/PROPOSED_README.md b/PROPOSED_README.md deleted file mode 100644 index 92f5a50..0000000 --- a/PROPOSED_README.md +++ /dev/null @@ -1,198 +0,0 @@ -# AlgoLens: Search Ranking Customization Guide - -A comprehensive guide to creating, managing, and sharing custom search engine ranking logic. Learn to personalize search results, counter biases, and build bespoke query experiences through rule-based algorithmic frameworks. - -**This repository serves as the definitive documentation and resource hub for mastering advanced search ranking customization.** - ---- - -## 🤖 AI Agent Directives - -
-AI Agent Directives (Click to expand) - -## SYSTEM: APEX TECHNICAL AUTHORITY & ELITE ARCHITECT (DECEMBER 2025 EDITION) - -### 1. IDENTITY & PRIME DIRECTIVE -**Role:** You are a Senior Principal Software Architect and Master Technical Copywriter with **40+ years of elite industry experience**. You operate with absolute precision, enforcing FAANG-level standards and the wisdom of "Managing the Unmanageable." -**Context:** Current Date is **December 2025**. You are building for the 2026 standard. -**Output Standard:** Deliver **EXECUTION-ONLY** results. No plans, no "reporting"—only executed code, updated docs, and applied fixes. -**Philosophy:** "Zero-Defect, High-Velocity, Future-Proof." - ---- - -### 2. INPUT PROCESSING & COGNITION -* **SPEECH-TO-TEXT INTERPRETATION PROTOCOL:** - * **Context:** User inputs may contain phonetic errors (homophones, typos). - * **Semantic Correction:** **STRICTLY FORBIDDEN** from executing literal typos. You must **INFER** technical intent based on the project context. - * **Logic Anchor:** Treat the `README.md` as the **Single Source of Truth (SSOT)**. -* **MANDATORY MCP INSTRUMENTATION:** - * **No Guessing:** Do not hallucinate APIs. - * **Research First:** Use `linkup`/`brave` to search for **December 2025 Industry Standards**, **Security Threats**, and **2026 UI Trends**. - * **Validation:** Use `docfork` to verify *every* external API signature. - * **Reasoning:** Engage `clear-thought-two` to architect complex flows *before* writing code. - ---- - -### 3. CONTEXT-AWARE APEX TECH STACKS (LATE 2025 STANDARDS) -**Directives:** Detect the project type (`pyproject.toml` for Python) and apply the corresponding **Apex Toolchain**. This repository, `AlgoLens-Search-Ranking-Customization-Guide`, is a documentation project focused on Python-based concepts. - -* **PRIMARY SCENARIO: DOCUMENTATION / KNOWLEDGE BASE (Python-centric Concepts)** - * **Stack:** While the core is documentation, the underlying principles and examples discussed might relate to Python. Therefore, we reference **Python 3.10+** concepts. Key tooling for potential script generation or analysis would include **uv** (for package management and dependency resolution), **Ruff** (for ultra-fast linting and formatting), and **Pytest** (for robust unit and integration testing) if any executable examples are present. - * **Architecture:** Adheres to a **Hierarchical Knowledge Structure**, ensuring clear separation of concerns for different aspects of search ranking customization, from foundational concepts to advanced rule-based systems. The documentation is structured for modular consumption and easy navigation. - * **AI Integration:** Discussions may involve AI concepts related to search result personalization and bias mitigation. If any code examples are provided, they would prioritize modular design, clear API contracts, and robust error handling, potentially referencing libraries used for data processing or analysis. - -* **SECONDARY SCENARIO A: WEB / APP / EXTENSION (TypeScript) - *Not applicable for this project's primary function.*** - * **Stack:** TypeScript 6.x (Strict), Vite 7 (Rolldown), Tauri v2.x (Native), WXT (Extensions). - * **State:** Signals (Standardized). - ---- - -### 4. GOVERNANCE & CONTRIBUTION MANDATES -* **CONTRIBUTING.md:** All contributions must adhere to the **Apex Contribution Framework**, ensuring code quality, documentation clarity, and architectural integrity. -* **CODE_OF_CONDUCT.md:** Uphold the **FAANG-level Code of Conduct**, promoting respect and inclusivity. -* **SECURITY.md:** All security vulnerabilities must be reported via the established **Secure Disclosure Policy**. - ---- - -### 5. ARCHITECTURAL PRINCIPLES & VERIFICATION -* **SOLID:** Applied rigorously to any code examples provided. -* **DRY:** Avoid redundancy in documentation and code. -* **YAGNI:** Focus on essential features and information. -* **TESTING:** All code examples must be accompanied by robust **Pytest** test suites demonstrating functionality and edge cases. -* **LINTING & FORMATTING:** Ensure all code adheres to **Ruff** standards. -* **DEPENDENCY MANAGEMENT:** Utilize **uv** for predictable and reproducible environments. - ---- - -### 6. AGENT OPERATIONAL PARAMETERS -* **EMERGENCY PROTOCOL:** In case of critical security threats or system failures related to core infrastructure, immediately halt non-essential operations and engage the **Security Incident Response Team (SIRT)**. -* **CONTINUOUS LEARNING:** Actively monitor AI advancements and industry best practices, updating internal knowledge bases and documentation frameworks accordingly. -* **METADATA ENRICHMENT:** Maintain high-quality metadata (e.g., tags, descriptions) for all artifacts, ensuring discoverability and relevance. - -
- ---- - -## 🚀 Project Status - -[![Build Status](https://img.shields.io/github/actions/workflow/status/chirag127/AlgoLens-Search-Ranking-Customization-Guide/ci.yml?style=flat-square)](https://github.com/chirag127/AlgoLens-Search-Ranking-Customization-Guide/actions/workflows/ci.yml) -[![Code Coverage](https://img.shields.io/codecov/c/github/chirag127/AlgoLens-Search-Ranking-Customization-Guide?style=flat-square)](https://codecov.io/github/chirag127/AlgoLens-Search-Ranking-Customization-Guide) -[![Tech Stack](https://img.shields.io/badge/Docs%20%7C%20Python%20Concepts-Informational?style=flat-square)](https://github.com/chirag127/AlgoLens-Search-Ranking-Customization-Guide) -[![License](https://img.shields.io/badge/License-CC%20BY--NC%204.0-informational?style=flat-square)](https://github.com/chirag127/AlgoLens-Search-Ranking-Customization-Guide/blob/main/LICENSE) -[![GitHub Stars](https://img.shields.io/github/stars/chirag127/AlgoLens-Search-Ranking-Customization-Guide.svg?style=flat-square)](https://github.com/chirag127/AlgoLens-Search-Ranking-Customization-Guide) - -**Star ⭐ this Repo if you find it valuable!** - ---- - -## 🎯 Core Objective - -This repository is dedicated to providing a structured and in-depth guide on the principles, methodologies, and practical applications of customizing search engine ranking logic. It aims to empower developers and power users to build more effective, personalized, and transparent search experiences. - ---- - -## 🌳 Architecture Overview (Conceptual) - -The documentation is structured hierarchically, mirroring the complexity of search algorithms. - -ascii -AlgoLens-Search-Ranking-Customization-Guide/ -├── docs/ -│ ├── core-concepts/ -│ │ ├── indexing.md -│ │ ├── query-processing.md -│ │ └── scoring.md -│ ├── customization-frameworks/ -│ │ ├── rule-based-systems.md -│ │ ├── personalization-engines.md -│ │ └── bias-mitigation.md -│ ├── advanced-topics/ -│ │ ├── learning-to-rank.md -│ │ └── algorithmic-transparency.md -│ └── contributing.md -├── examples/ -│ ├── python/ -│ │ ├── rule_engine.py -│ │ └── personalization_module.py -│ └── bash/ -│ └── query_tester.sh -├── .gitignore -├── LICENSE -├── README.md -└── PROPOSED_README.md - - ---- - -## 📚 Table of Contents - -* [Project Status](#-project-status) -* [Core Objective](#-core-objective) -* [Architecture Overview (Conceptual)](#-architecture-overview-conceptual) -* [Table of Contents](#-table-of-contents) -* [Key Concepts Covered](#-key-concepts-covered) -* [Getting Started](#-getting-started) -* [Contributing](#-contributing) -* [License](#-license) -* [Code Examples & Scripts](#-code-examples--scripts) - ---- - -## 🔑 Key Concepts Covered - -* **Search Fundamentals:** Indexing, query parsing, relevance scoring. -* **Customization Frameworks:** Rule-based systems, weighted factors, boosting/burying. -* **Personalization:** User profiling, collaborative filtering, content-based recommendations. -* **Bias Mitigation:** Identifying and addressing algorithmic bias, fairness metrics. -* **Algorithmic Transparency:** Understanding and documenting ranking factors. -* **Practical Implementation:** Techniques and best practices for implementing custom logic. - ---- - -## ▶️ Getting Started - -This repository is primarily documentation-focused. To explore the concepts: - -1. **Clone the repository:** - bash - git clone https://github.com/chirag127/AlgoLens-Search-Ranking-Customization-Guide.git - cd AlgoLens-Search-Ranking-Customization-Guide - -2. **Explore the `docs/` directory:** Navigate through the markdown files to understand the core concepts. -3. **Review `examples/`:** Examine the provided Python scripts and shell scripts for practical implementations. - ---- - -## 🤝 Contributing - -Contributions are welcome! Please refer to the [CONTRIBUTING.md](https://github.com/chirag127/AlgoLens-Search-Ranking-Customization-Guide/blob/main/.github/CONTRIBUTING.md) file for detailed guidelines on how to contribute. - ---- - -## ⚖️ License - -This project is licensed under the **Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)** license. See the [LICENSE](https://github.com/chirag127/AlgoLens-Search-Ranking-Customization-Guide/blob/main/LICENSE) file for more details. - ---- - -## 💡 Code Examples & Scripts - -This repository includes illustrative code snippets and example scripts to demonstrate the concepts discussed. These are primarily in Python and Bash. Ensure you have the necessary interpreters (Python 3.10+, Bash) installed. - -**Setup for Python Examples (if applicable):** - -bash -# Navigate to the examples directory -cd examples/python - -# Create and activate a virtual environment (optional but recommended) -python -m venv venv -source venv/bin/activate - -# Install dependencies using uv (if needed) -# uv pip install -r requirements.txt - -# Run specific scripts (e.g., rule engine example) -# python rule_engine.py - diff --git a/README.md b/README.md index a1e096a..6dfde8e 100644 --- a/README.md +++ b/README.md @@ -1,122 +1,54 @@ -# BraveGoggles-Configuration-Standard-Development-Kit +# AlgoLens: A Frontend for Search Ranking Customization -[![Build Status](https://img.shields.io/github/actions/workflow/status/chirag127/BraveGoggles-Configuration-Standard-Development-Kit/ci.yml?label=Build&style=flat-square)](https://github.com/chirag127/BraveGoggles-Configuration-Standard-Development-Kit/actions/workflows/ci.yml) -[![Code Coverage](https://img.shields.io/codecov/c/github/chirag127/BraveGoggles-Configuration-Standard-Development-Kit?label=Coverage&style=flat-square)](https://codecov.io/gh/chirag127/BraveGoggles-Configuration-Standard-Development-Kit) +[![Build Status](https://img.shields.io/github/actions/workflow/status/chirag127/AlgoLens-Search-Ranking-Configuration-Guide/ci.yml?style=flat-square)](https://github.com/chirag127/AlgoLens-Search-Ranking-Configuration-Guide/actions/workflows/ci.yml) [![License](https://img.shields.io/badge/License-CC%20BY--NC%204.0-blue.svg?style=flat-square)](LICENSE) -[![GitHub Stars](https://img.shields.io/github/stars/chirag127/BraveGoggles-Configuration-Standard-Development-Kit?style=flat-square)](https://github.com/chirag127/BraveGoggles-Configuration-Standard-Development-Kit) +[![GitHub Stars](https://img.shields.io/github/stars/chirag127/AlgoLens-Search-Ranking-Configuration-Guide?style=flat-square)](https://github.com/chirag127/AlgoLens-Search-Ranking-Configuration-Guide) -**Star ⭐ this Repo** +**Star ⭐ this Repo if you find it valuable!** --- ## 🚀 Project Overview -This repository serves as the **Official Apex Standard Guide and Toolkit** for developing, validating, and deploying custom search ranking configurations, known as **Goggles**, for the Brave Search ecosystem. It enforces high-integrity configuration standards using modern validation schemas and automated CI/CD pipelines. - -This toolkit standardizes the lifecycle of user-defined ranking algorithms, ensuring performance, security, and consistency across all community contributions. - -## 🏗️ Architecture Diagram - -The Goggles Configuration Lifecycle adheres to a strict validation pipeline: - -ascii -+-----------------------------+ -| Goggles Configuration (.js) | -+-----------------------------+ - | - v -+-----------------------------+ -| Apex Schema Validation | -| (JSON Schema / TypeScript) | -+-----------------------------+ - | - v -+-----------------------------+ -| CI/CD Validation Run | -| (Test Scripts / Linting) | -+-----------------------------+ - | - v -+-----------------------------+ -| Deployment to Registry | -+-----------------------------+ - - -## 📋 Table of Contents - -1. [Project Overview](#-project-overview) -2. [Architecture Diagram](#-architecture-diagram) -3. [AI Agent Directives (Apex Alignment)](#-ai-agent-directives-apex-alignment) -4. [Development Standards](#-development-standards) - * [Prerequisites](#prerequisites) - * [Setup & Installation](#setup--installation) - * [Core Scripts](#core-scripts) -5. [Contributing](#contributing) -6. [License](#license) - -## 🤖 AI Agent Directives (Apex Alignment) - -
-Click to view Apex Technical Authority Configuration for this Repository - -# SYSTEM: APEX TECHNICAL AUTHORITY AGENT DIRECTIVES (BraveGoggles-Configuration-Standard-Development-Kit) - -## 1. IDENTITY & PRIME DIRECTIVE -**Role:** You are a Senior Principal Software Architect enforcing **Zero-Defect, High-Velocity** standards for Search Ranking Configuration deployment. -**Context:** This repository defines configuration standards for Brave Goggles. The core artifacts are JavaScript/JSON configuration files subject to rigorous validation. -**Output Standard:** Deliver **EXECUTION-ONLY** results, prioritizing schema correctness and verifiable pipeline success. - -## 2. INPUT PROCESSING & COGNITION -* **Semantic Correction:** When analyzing Goggles code, correct common JS syntax errors against the latest ECMAScript standard before validation. Assume configurations must run in a strict NodeJS environment. -* **Research Anchor:** Use `linkup`/`brave` to search for the **latest Brave Search Goggles SDK documentation (2025/2026)** and the current **JSON Schema Draft standard** being enforced by Brave. -* **Validation Commands:** Always run the integrated validation suite via `npm run validate` before suggesting any changes. - -## 3. CONTEXT-AWARE APEX TECH STACKS (LATE 2025 STANDARDS) -* **PRIMARY SCENARIO: CONFIGURATION VALIDATION & STANDARDS (JavaScript/TypeScript)** - * **Stack:** Leveraging **TypeScript 6.x** for schema definition fidelity, **Vite 7** for tooling, and **Biome** for linting/formatting adherence to modern JS standards. Testing relies on **Vitest** for fast unit checks and **Playwright** for integration sanity checks against sample results. - * **Architecture:** Configurations are treated as **Immutable Data Contracts**. The repository structure emphasizes **Data Definition First**, separated strictly from execution/testing logic. - * **Key Principle:** Configurations must strictly adhere to the principle of **Separation of Concerns (SOLID)**; ranking logic must be decoupled from environment definitions. - -## 4. ARCHITECTURAL VERIFICATION COMMANDS -To align with Apex Authority, execute the following verification sequence: - -1. **Format & Lint Check:** `npm run format:check` (Ensure Biome compliance). -2. **Schema Validation:** `npm run validate` (Verify all configuration files against the defined JSON schema). -3. **Unit Test Execution:** `npm run test:unit` (Run Vitest suite for utility functions). -4. **End-to-End Sanity Check:** `npm run test:e2e` (Use Playwright to simulate a simple Goggle injection against a mocked response). - -
+AlgoLens is a modern, frontend-only application for viewing and managing Brave Goggles. It provides a clean, "Spatial-Adaptive" interface for browsing and inspecting `.goggle` files, which are custom search ranking configurations for the Brave Search ecosystem. + +This project is built with Vite, TypeScript, and Tailwind CSS, and it is designed to be deployed to static hosting platforms like GitHub Pages, Vercel, or Netlify. + +## 🎯 Core Objective + +The primary goal of AlgoLens is to provide a user-friendly interface for interacting with Brave Goggles. It aims to be a lightweight and performant tool for developers and power users who want to customize their search experience. ## ⚙️ Development Standards ### Prerequisites * Node.js (v20.x LTS or newer) -* npm (or uv/pnpm if switching package managers) +* npm ### Setup & Installation 1. **Clone Repository:** - bash - git clone https://github.com/chirag127/BraveGoggles-Configuration-Standard-Development-Kit.git - cd BraveGoggles-Configuration-Standard-Development-Kit + ```bash + git clone https://github.com/chirag127/AlgoLens-Search-Ranking-Configuration-Guide.git + cd AlgoLens-Search-Ranking-Configuration-Guide + ``` -2. **Install Dependencies (Using npm for universal compatibility):** - bash +2. **Install Dependencies:** + ```bash npm install - + ``` ### Core Scripts -| Script | Description | Verification Target | -| :--- | :--- | :--- | -| `npm run dev` | Starts the local development server/validator watcher. | Continuous Integration | -| `npm run test` | Runs Vitest unit tests and Playwright E2E checks. | Functional Correctness | -| `npm run validate` | Executes the primary configuration schema validation routine. | Data Contract Integrity | -| `npm run format` | Applies all Biome formatting rules across the project. | Code Style Adherence | +| Script | Description | +| :--- | :--- | +| `npm run dev` | Starts the local development server. | +| `npm run build` | Builds the application for production. | +| `npm run lint` | Lints the code. | + ## 🤝 Contributing -Contributions are welcomed under the framework of **Future-Proofing and Standardization**. Please review the detailed guidelines in [.github/CONTRIBUTING.md](./.github/CONTRIBUTING.md) before submitting pull requests. +Contributions are welcomed! Please review the detailed guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md) before submitting pull requests. ## 📄 License diff --git a/faq.md b/faq.md deleted file mode 100644 index fb541a2..0000000 --- a/faq.md +++ /dev/null @@ -1,239 +0,0 @@ -# FAQ - -## Who owns a Goggle? - -The sole owner of a Goggle is the person who controls the URL in which it’s -hosted. That person or community has the sole rights to update it. - -Brave has no claim on the ownership of Goggles. Anyone can create and use a -Goggle; there is no sign-up or identification required from Brave Search. We -believe this is the best setup for the community to flourish and come up with -alternative rankings that cater to a wide range of use-cases—rankings that -would be otherwise impossible to handle for an all-purpose search engine such -as Brave Search. - -At the same time, Brave Search has no responsibility to ensure a Goggle's -quality or truthfulness, which can only be estimated based on the reputation of -the authors/maintainers. - -The only Goggles owned by Brave are those in the [goggles folder](./goggles) -from this repository, which are exclusively meant for educational purposes, and -are best-effort and as-is. Brave does not intend to expand or continue -maintaining these in any shape or form, as we expect community-owned Goggles to -cover those use-cases better in the near future. We will however try to keep -the examples functional. - -Goggles are by definition open-source, however, the authors can choose any -license they please. People forking a Goggle are subjected to the terms of its -license as any other open-source piece of software. - - -## Why can’t I apply multiple Goggles at the same time? - -At this point we don’t feel comfortable allowing multiple Goggles at once, as -instructions in multiple Goggles could collide in non-intuitive ways, which -would lead to surprising results. This problem can also appear in a single -Goggle, though this is less likely, and the maintainer(s) would be able to -resolve the conflict since they have access to all the instructions. - -In case you really want to apply multiple Goggles, nothing prevents you from -creating a new Goggle with the instructions of all your favorite Goggles. If -the end result is satisfactory, please share it with the community. - -Goggles are meant to be modified, forked, and extended. - - -## Can Goggles ownership be transferred? - -The identifier of a Goggle is the URL to its specification. Purposely hosted -outside Brave control, no identity or sign-up is required to create or use a -Goggle. - -Again, a Goggle does not belong to Brave in any shape or form, but rather -entirely to the community or individual that created it. - -A side effect of this approach is that the URL itself is the proof of -ownership, which can make migrations to a different URL impossible without -starting from scratch. - -Anticipating this problem, we built a simple transfer model. To transfer a -Goggle, you need to add the `transferred_to` metadata attribute to the old -Goggle, pointing to the hosting URL of the new Goggle. You can then submit the -old Goggle again to signify the transfer to Brave Search. For example: - -``` -! name: Original -! description: This is the original Goggle -! author: John -! public: true -! transferred_to: https://gist.github.com/paul/965503febec9a9e917fb816b1ff8820e -``` - -Where `https://gist.github.com/paul/965503febec9a9e917fb816b1ff8820e` is the -URL hosting the instructions from now on (i.e. "transferred_to"). - -Both URLs must be registered Goggles for the transfer to be successful. In the -case of success: - -* All users of the old URL will be redirected to the new one, so no followers of the Goggle will be lost. This also includes statistics such as popularity. -* A copy of the content of the Goggle on the old URL will be stored by Brave indefinitely as immutable. Once transferred a Goggle cannot be updated further. -* A Goggle can only be transferred once (after successful transfer the Goggle is immutable). -* All transfers will be logged and publicly accessible for transparency and traceability (coming soon). - -Note, there are no guarantees of the truthfulness or accuracy of any Goggle -outside the reputation of their creators/maintainers. - - -## Do Goggles contribute to polarization? - -We believe that Goggles do not contribute to polarization or echo chambers. In -fact, we believe they can help combat these issues. - -First, Goggles does not always have to be about polarizing topics such as -politics. Of course, this kind of Goggles will exist and be popular. For -instance the team at [Allsides](https://allsides.com/) have already built -multiple addressing different political leanings. - -However, we believe that most Goggles will deal with specific use-cases that -are too niche to be properly covered by an all-purpose search engine, which of -course caters to the largest audience possible. The educational “Tech Blogs” or -“1k short” Goggles would be good examples of this. The Web is too large to fit -on a single result page; Goggles aim to tackle this problem. - -It is very important to stress out that Goggles alterations are explicit. -Contrast this with the current “personalization” found in search or social -media (which naturally tend toward echo chambers by social affinity), which are -implicit. Users are mostly oblivious to the fact that results have been -“tailored” to their taste. - -The person using Goggles is making a conscious act when applying a Goggle, and -contrarian perspectives should be readily available. This explicitness alone is -an improvement from the current landscape, where this kind of alteration is -made without the person realizing it. - -Of course, Goggles won’t solve polarization in society. Not all problems have -technical solutions, especially when involving people living in societies. -Biases, propaganda, and untruthful information always have—and always -will—exist. We take responsibility by not making the problem worse, which is a -significant improvement over Big Tech’s status quo. - -Will Brave at least censor some Goggles? No, we will treat Goggles the same as -Web results: Brave will not censor or police them, with the notable exception -of CSAM content and those cases that we are legally obliged to comply with. -Goggles belong solely to their creators, and users are free to use them or not. -We adhere to the fact that it’s a conscious choice by the user that must be -respected, regardless of personal opinions. - - -## What’s next for Goggles? - -Goggles is in beta, and subjected to evolution depending on the most important -factor: the community of creators. - -We believe that the current state is enough to be open, but we’ll closely -monitor feedback. - -There are some things that we already know need to be improved or expanded, for -which we welcome the community to contribute, including: - -* Make it easier for non-technical people to write their own Goggles. There are multiple approaches to this goal: - * An online editor. - * Extensions for a tighter integration with the user, be it import of bookmarks, history and / or in-browsing tagging of domains -* We will continue to work on performance to make the expanded recall set - larger. The instructions defined in a Goggle are not applied to Brave - Search’s entire index, but to what we call the “expanded recall set,” which - in turn is a function of the query. The set of candidate URLs can be in the - tens of thousands, which is often more than enough to observe a noticeable - effect; however, there are no guarantees that all possible URLs are surfaced - (in search terminology, we have no guarantees on recall). -* We will work on making the Goggles language more powerful and able to target - results in more diverse ways. For example, by allowing a match on page - titles, descriptions, or content. - - -## Why is Goggles in Beta? - -Goggles represents a fundamental push towards algorithmic transparency and -openness in search. The community plays a crucial role in this vision. While in -beta, we will keep Goggles on a dedicated tab at -https://search.brave.com/goggles. Once out of beta it will be integrated into -the main search interface. - -Goggles, especially while in beta, is a living project. It will evolve thanks -to the feedback and needs of the community of builders. - - -## Why is a particular page not recoverable with Goggles? - -With Goggles, it’s straightforward to implement custom search engines like a -site search. However, you might notice that some pages you know exist cannot be -retrieved. - -Goggles do not apply to the whole Brave Search index, but to the expanded -recall set which is a function of the input query. So if the target pages -aren’t in the recall set, or even be in the Brave Search index, they won’t be -captured by the Goggle. - -As of June 2022, the Brave Search index contains about 12 billion pages. This -is of course a much smaller number of pages than exist on the Web. Also note -that we don’t index all the content in a page, but rather only fragments that -our models consider relevant. This, too, reduces the recall options. - -These particular design decisions are to limit our infrastructure costs, and to -help us deal with the “garbage-in, garbage-out” problem. Building a -fully-fledged search engine is a massive task; to offer a true alternative to -Big Tech, we must be smart about how to do it. Following conventional design is -not an option. - -Want to help us improve recall and coverage? Check out the [Web Discovery Project](https://github.com/brave/web-discovery-project/blob/main/modules/web-discovery-project/sources/README.md). - - -## Can anyone create a Goggle or is it only for developers? - -Everyone should be able to use or create a Goggle. - -For simple Goggles, the [Goggles syntax](./goggles/quickstart.goggle) -can be mastered in a few minutes. - -The most important thing is to create a Goggle domain knowledge. If you’re -knowledgeable about a particular topic, for instance gardening, you’re probably -aware of a handful of very good domains, and several more that rank highly -despite so-so content. - -A simple Goggle could be just boosting those “very good” domains and demoting -the “so-so” ones. That alone could improve the search results for your -gardening queries a great deal; it could also improve the search results of -other gardening lovers. - -You don’t have to create a new Goggle from scratch—you could also use an -existing one, discover it’s missing some relevant domains, and message the -Goggle owner to adjust. - -Of course, if you’re a developer you’ll easily be able to gather more -comprehensive lists, and fine-tune the Goggle faster. But don’t let the syntax -or developer lingo discourage you—knowledge about the domain is the most -crucial factor for a useful Goggle. - - -## How can I discover new Goggles? - -This question is about discovering Goggles as a user; as a creator, please -check the question “Sharing a Goggle with the world.” - -There are basically two ways to discover a Goggle: - -1. Any link to Brave search that contains a Goggle URL will automatically make - use of that Goggle, and you can follow it if you want to keep using it in - the future. The community that created it might have the link on their - website. Its users might also tweet about it or send the link by email. - Brave is not in control of the Goggle—it belongs to the owner(s), as it - should be. -2. Another way to discover Goggles is to visit the discovery page at - https://search.brave.com/goggles/discover, where you can search among all - existing public Goggles and see if there’s one that fits your needs. - -It’s early, but we believe that Goggles are best discovered by links on a -community of interest. Following the prior question example, a gardening -hobbyist might be part of a couple of forums, and chances are that some other -forum members have already put their domain knowledge about gardening into a -Goggle. diff --git a/getting-started.md b/getting-started.md deleted file mode 100644 index 3bafa5b..0000000 --- a/getting-started.md +++ /dev/null @@ -1,247 +0,0 @@ -# Getting Started - -## Goggles syntax - -Goggles are simple, self-contained text files which can be hosted in Github or -Gitlab. These files contain instructions allowing you to tell Brave Search how -you'd like your results to be ranked. You can target specific URL patterns -(and, soon, website titles and other aspects of Web pages) and indicate how -their ranking should be altered (e.g. boosted, downranked, or completely -discarded from the results). - -Individually, each instruction can either target a very narrow set of pages (or -even a single page), or a wider range of them, to apply reranking to a bigger -set of results. In combination, hundreds or more instructions can allow you to -express complex reranking functions. - -Although the Goggles language could express instructions to search through a -small set of websites or act as a blocklist, Goggles really shine when used to -express boosting and downranking across many domains and pages. - -For an introduction to the syntax of Goggles, check out our [Goggles quickstart guide](./goggles/quickstart.goggle). - -## Creating a Goggle - -First, get familiar with the Goggles DSL (Domain Specific Language), which will -allow you to express reranking instructions. We recommend that you follow the -introduction in our [Goggles quickstart guide](./goggles/quickstart.goggle). - -The next step is to create your Goggle (a plain text file) and then upload it -to one of the supported hosting platforms: - -* https://gist.github.com/ (both public and secret gists are supported) -* https://github.com/ (public files) -* https://gitlab.com/ (both public files and “snippets” are supported) - -Do not forget to add the necessary metadata at the top of your new Goggle: - -``` -! name: My Goggle -! description: What my Goggle does -! public: false -! author: Me -``` - -Additionally, you can specify the following optional metadata attributes: - -* homepage — specifies a homepage URL displayed on your Goggle's profile. -* issues — specifies a URL where users can report issues for your Goggle. -* transferred_to — Allows to transfer ownership of a Goggle. -* avatar — specifies a *valid* HEX color code for your Goggle. -* license — specifies the license of a Goggle's instructions. - -Note that the `public` attribute, when set to value `true`, indicates that your -Goggle can be discovered by other Brave Search users via the search feature on -https://search.brave.com/goggles/discover. A `private` Goggle can still be used -by anyone who knows the URL where it is hosted, but cannot be found through the -discovery page. - -Once you have hosted your rules, you can submit the URL on -https://search.brave.com/goggles/create. Brave Search will then fetch, validate -and cache your Goggle internally so that it can be used while searching. In -case the Goggle cannot be fetched, or is not valid, you will get some feedback -in the page. - -Examples of valid Goggle URLs: -* https://gist.github.com/remusao/fca3f9ee3ddca3e022426b8237e838ac -* https://gist.githubusercontent.com/remusao/fca3f9ee3ddca3e022426b8237e838ac/raw/290bd654ff10472545cc0ba742a875a26daccfa2/tech_blogs.goggles -* https://gitlab.com/-/snippets/2357408 -* https://gitlab.com/-/snippets/2357408/raw -* https://gitlab.com/aurelius.marcus/test/-/raw/main/tech_blogs.goggle -* https://raw.githubusercontent.com/brave/goggles-quickstart/main/goggles/tech_blogs.goggle - -There are currently a few limitations imposed on the Goggle files submitted to -Brave Search, in order to guarantee reasonable performance and prevent abuse. -We believe these limits are safeguards which should not impair the ability to -express complex reranking functions: - -* The size of a Goggle file cannot exceed 2MB -* The number of instructions in a Goggle file cannot exceed 100,000 -* The length of an instruction cannot exceed 500 characters -* The number of `*` characters (wildcard) in a single instruction cannot exceed 2 -* The number of `^` characters (caret) in a single instruction cannot exceed 2 - -## Updating a Goggle - -To update a Goggle, you must resubmit the Goggle URL in -https://search.brave.com/goggles/create. This will trigger a re-fetch of the -updated Goggle source, and then make it available on Brave Search. - -It’s important to know that Brave Search does not maintain a version history of -Goggles, which means the author is solely responsible for the content of their -Goggles. - -## Deleting a Goggle - -Brave only keeps a reference of the original Goggle file when provided with a -link to the original source. This means that to delete a Goggle, it first needs -to be deleted upstream, at the original URL where the Goggle was hosted. Once -that happens, to trigger a delete on demand in Brave Search, submit the Goggle -URL in https://search.brave.com/goggles/create. - -## Learn by example - -We believe it’s best to learn by example—this is why we created some Goggles -for the beta release, strictly for educational purposes, they are authored by -“Goggles 101” and hosted in this repository under the [goggles folder](./goggles). -Any Goggle not hosted by Brave is, of course, not affiliated with Brave in any -way. - -These Goggles are best-effort and as-is. We will not actively maintain them, as -their sole purpose is to showcase some basic use-cases of what is possible with -Goggles. - -We hope that soon the community will create much more sophisticated, accurate, -and useful Goggles so that we can deprecate these educational examples in favor -of community-owned ones. - - - [Tech blogs](./goggles/tech_blogs.goggle) — Rerank results to boost content on tech blogs. List of tech blogs drawn from several sources (blogsurf.io, refined.blog, et al), and not vetted or endorsed by Brave. - - [Hacker News](./goggles/hacker_news.goggle) — Prioritizes domains popular with the Hacker News community, minus those that would rank among the top 1000 most-viewed websites. - - [Rust programming](./goggles/rust_programming.goggle) — Rerank results to boost content related to the Rust programming language. - - [No Pinterest](./goggles/no_pinterest.goggle) — Rerank results to remove pages / threads hosted on Pinterest. - - [Copycats removal](./goggles/copycats_removal.goggle) — Rerank results to remove “copycat” content (e.g. StackOverflow threads or GitHub translations). - - [1k short](./goggles/1k_short.goggle) — Rerank results to remove pages found on the top 1,000 most-viewed websites. List of top sites drawn from tranco-list.eu. Up-ranked sites not vetted or endorsed by Brave. - - [Brave Community](./goggles/brave_community.goggle) — Rerank results to boost threads from the Brave community forums. - -On the [Goggle discovery page](https://search.brave.com/goggles/discover) you will -probably see many more Goggles created by the community, you can learn from -those too. The instructions of the Goggle are by definition open. - - -## Fine-tuning a Goggle - -Creating Goggles is simple. However, they often need some fine-tuning to shine. - -The typical flow is to create the first set of instructions and then have a -test set to evaluate the effect it has on the ranking. You will probably see -some odd results and further instructions will be needed. Rinse and repeat is -the name of the game. - -To make this task a little less tedious, we provide some explanations on the -results that have been affected by the instructions in the Goggle. - -![Goggle explanation shown on the search results page](./assets/goggle-explanations.png) - -This might help you in the process. - - -## Sharing a Goggle with the world - -Any Goggle you create can either be `private` or `public`. - -If it is `private`, it will not be discoverable, and will only be accessible to -those who know the Goggle URL. - -If `public`, a Goggle can be found either by URL or on the [discovery page](https://search.brave.com/goggles/discover). -People can search by keywords to discover new Goggles, and try them out if they -want. People can then follow a Goggle if they want to save it for future use -(followed Goggles are stored in the browser’s localStorage). - -To indicate if your Goggle is `public` or `private`, you need to specify the -following metadata at the head of your Goggle file: - -``` -! public: true -``` - -Or, -``` -! public: false -``` - -For more details about the mandatory and optional metadata attributes of -Goggles, please refer to the [Goggles quickstart -guide](./goggles/quickstart.goggle). - -Certain Goggles that become very popular might end up being displayed on the -[discovery page’s](https://search.brave.com/goggles/discover) Popular Goggles section. For the beta launch, we’re only -displaying the educational Goggles. - -However, the preferred option to discover Goggles is to find them directly from -the creator on their own channels. Sharing your Goggle is as simple as building -the following URL: - -``` -https://search.brave.com/goggles?goggles_id={YOUR_GOGGLE_URL} -``` - -Let us emphasize again that before being able to use a Goggle, it needs to have been submitted to https://search.brave.com/goggles/create - -Note that `YOUR_GOGGLE_URL` should ideally be urlencoded as with: - -``` -https://search.brave.com/goggles?goggles_id=https%3A%2F%2Fgist.githubusercontent.com%2Fremusao%2Ffca3f9ee3ddca3e022426b8237e838ac%2Fraw%2F -``` - -Clicking that link will allow anyone to check your Goggle and follow it. - -## What happens when two instructions are conflicting? - -It is fairly easy to end up with conflicting instructions (i.e. multiple -instructions with different effects applying to the same results). These -conflicts can be either easy to spot, as with: - -``` -$boost=3,site=example.com -$boost=1,site=example.com -``` - -Or they can be more subtle, as with: - -``` -$downrank=3,site=example.com -/posts/$boost=3 -``` - -In the above example, both would match on the URL `https://example.com/posts/hello.html`. - -The precedence rule follows a simple principle: Goggles are meant to surface -more content. So a boosting rule will always take precedence over a downrank. - -On the other hand, a ([non-generic](https://github.com/brave/goggles-quickstart/blob/main/getting-started.md#how-can-i-exclude-any-result-not-matched-by-my-goggle)) `discard` is final and will take precedence -over `boost` and `downrank`. So to summarize: `discard > boost > downrank`. -This means that `$discard` takes precedence over `$boost=3`, which takes -precedence over `$boost=2`, which takes precedence over `$downrank`, which -takes precedence over `$downrank=2`. - -In the examples above, the URL `https://example.com/posts/hello.html` would be -boosted with strength 3. - -## How can I exclude any result not matched by my Goggle? - -By default, results not strictly discarded by your Goggle might still be -included in the final set of results if they’re very relevant to the query -(although matched results will always be boosted according to your -instructions). If you’d like to exclude any result that is not explicitly -matched by any instruction in your Goggle, you can change the “default action” -by adding a generic `$discard` rule. Consider the following: - -``` -$discard -$boost,site=en.wikipedia.org -$boost,site=de.wikipedia.org -``` - -The above example would exclude any result which does not have either -`en.wikipedia.org` or `de.wikipedia.org` as a hostname. Whereas by default -these results would only be boosted and mixed with other results. diff --git a/index.html b/index.html new file mode 100644 index 0000000..0e250ff --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + AlgoLens + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..591cf5d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2355 @@ +{ + "name": "temp-vite", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "temp-vite", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.3", + "react-dom": "^19.2.3" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.18", + "@vitejs/plugin-react": "^5.1.2", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "vite": "^7.2.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.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.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@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.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "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.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "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.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "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.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.54.0.tgz", + "integrity": "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.54.0.tgz", + "integrity": "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.54.0.tgz", + "integrity": "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.54.0.tgz", + "integrity": "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.54.0.tgz", + "integrity": "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.54.0.tgz", + "integrity": "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.54.0.tgz", + "integrity": "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.54.0.tgz", + "integrity": "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.54.0.tgz", + "integrity": "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.54.0.tgz", + "integrity": "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.54.0.tgz", + "integrity": "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.54.0.tgz", + "integrity": "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.54.0.tgz", + "integrity": "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.54.0.tgz", + "integrity": "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.54.0.tgz", + "integrity": "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.54.0.tgz", + "integrity": "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.54.0.tgz", + "integrity": "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.54.0.tgz", + "integrity": "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.54.0.tgz", + "integrity": "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.54.0.tgz", + "integrity": "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.54.0.tgz", + "integrity": "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.54.0.tgz", + "integrity": "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "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.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "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/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "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", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "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/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/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.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "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==", + "dev": true, + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "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.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "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.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "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/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/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.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "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.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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": "19.2.3", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz", + "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.3" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.54.0.tgz", + "integrity": "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==", + "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.54.0", + "@rollup/rollup-android-arm64": "4.54.0", + "@rollup/rollup-darwin-arm64": "4.54.0", + "@rollup/rollup-darwin-x64": "4.54.0", + "@rollup/rollup-freebsd-arm64": "4.54.0", + "@rollup/rollup-freebsd-x64": "4.54.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", + "@rollup/rollup-linux-arm-musleabihf": "4.54.0", + "@rollup/rollup-linux-arm64-gnu": "4.54.0", + "@rollup/rollup-linux-arm64-musl": "4.54.0", + "@rollup/rollup-linux-loong64-gnu": "4.54.0", + "@rollup/rollup-linux-ppc64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-gnu": "4.54.0", + "@rollup/rollup-linux-riscv64-musl": "4.54.0", + "@rollup/rollup-linux-s390x-gnu": "4.54.0", + "@rollup/rollup-linux-x64-gnu": "4.54.0", + "@rollup/rollup-linux-x64-musl": "4.54.0", + "@rollup/rollup-openharmony-arm64": "4.54.0", + "@rollup/rollup-win32-arm64-msvc": "4.54.0", + "@rollup/rollup-win32-ia32-msvc": "4.54.0", + "@rollup/rollup-win32-x64-gnu": "4.54.0", + "@rollup/rollup-win32-x64-msvc": "4.54.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "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.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "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/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": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "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" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7514358 --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "temp-vite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "predev": "node scripts/generate-goggle-list.mjs", + "prebuild": "node scripts/generate-goggle-list.mjs" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.1.18", + "@vitejs/plugin-react": "^5.1.2", + "tailwindcss": "^4.1.18", + "typescript": "~5.9.3", + "vite": "^7.2.4" + }, + "dependencies": { + "react": "^19.2.3", + "react-dom": "^19.2.3" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scripts/generate-goggle-list.mjs b/scripts/generate-goggle-list.mjs new file mode 100644 index 0000000..0487801 --- /dev/null +++ b/scripts/generate-goggle-list.mjs @@ -0,0 +1,8 @@ +import fs from 'fs'; +import path from 'path'; + +const gogglesDir = path.resolve(process.cwd(), 'goggles'); +const output = path.resolve(process.cwd(), 'src/goggles.json'); + +const files = fs.readdirSync(gogglesDir).filter(f => f.endsWith('.goggle')); +fs.writeFileSync(output, JSON.stringify(files)); diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..ff67abc --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,50 @@ +import { useState, useEffect } from 'react'; +import './style.css'; +import goggles from './goggles.json'; + +function App() { + const [selectedGoggle, setSelectedGoggle] = useState(null); + const [goggleContent, setGoggleContent] = useState(''); + + useEffect(() => { + if (selectedGoggle) { + fetch(`/goggles/${selectedGoggle}`) + .then((res) => res.text()) + .then((text) => setGoggleContent(text)); + } + }, [selectedGoggle]); + + return ( +
+
+

AlgoLens

+
+
+ +
+

+ {selectedGoggle ? selectedGoggle : 'Select a goggle to view its content'} +

+
{goggleContent}
+
+
+
+ ); +} + +export default App; diff --git a/src/goggles.json b/src/goggles.json new file mode 100644 index 0000000..8ab2e35 --- /dev/null +++ b/src/goggles.json @@ -0,0 +1 @@ +["1k_short.goggle","brave_community.goggle","copycats_removal.goggle","hacker_news.goggle","no_pinterest.goggle","quickstart.goggle","rust_programming.goggle","tech_blogs.goggle"] \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..abba3f1 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './style.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..f1d8c73 --- /dev/null +++ b/src/style.css @@ -0,0 +1 @@ +@import "tailwindcss"; diff --git a/src/typescript.svg b/src/typescript.svg new file mode 100644 index 0000000..d91c910 --- /dev/null +++ b/src/typescript.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..dca8ba0 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,11 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + ], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..4ba8dd9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["vite/client"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..c909975 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import tailwindcss from '@tailwindcss/vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), tailwindcss()], +})