diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a5b183d7..7804baae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,7 +69,11 @@ jobs: run: pip install -r requirements.txt - name: Install test dependencies - run: pip install pytest-cov + run: pip install pytest-cov ruff + + - name: Ruff baseline + continue-on-error: true + run: ruff check app - name: Wait for PostgreSQL run: | @@ -137,6 +141,124 @@ jobs: name: backend-coverage path: backend-service/coverage.xml + # ────────────────────────────────────────────── + # AI service — focused lint, import, and STT tests + # ────────────────────────────────────────────── + ai: + name: AI Lint, Import & STT Tests + runs-on: ubuntu-latest + + defaults: + run: + working-directory: ai-service + + env: + PYTHONPATH: . + APP_ENV: testing + DEBUG: "False" + DATABASE_URL: sqlite+aiosqlite:///./ci-ai.db + SECRET_KEY: ci-secret-key-not-for-production + GEMINI_API_KEY: "" + GROQ_API_KEY: "" + OPENAI_API_KEY: "" + + steps: + - uses: actions/checkout@v6 + + - name: Set up Python 3.11 + uses: actions/setup-python@v6 + with: + python-version: "3.11" + cache: pip + cache-dependency-path: ai-service/requirements.txt + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -c constraints-ai.txt -r requirements.txt ruff + + - name: Ruff focused STT correctness checks + run: ruff check --select E9,F63,F7,F82 api/routes/stt.py api/services/stt tests/stt + + - name: Check app import + run: python -c "from api.main import app; print(app.title)" + + - name: Run focused STT tests + run: | + pytest \ + tests/stt \ + tests/test_dependency_constraints.py \ + tests/test_lexi_session_management.py \ + tests/trace_cag/test_edges_routing.py \ + tests/trace_cag/test_pipeline_integration.py \ + --tb=short -q + + # ────────────────────────────────────────────── + # MCP server — import and startup protocol smoke + # ────────────────────────────────────────────── + mcp: + name: MCP Pytest & Startup Smoke + runs-on: ubuntu-latest + + defaults: + run: + working-directory: mcp-server + + steps: + - uses: actions/checkout@v6 + + - name: Set up Python 3.11 + uses: actions/setup-python@v6 + with: + python-version: "3.11" + cache: pip + cache-dependency-path: mcp-server/requirements.txt + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Check server import + run: python -c "from server import server; print(type(server).__name__)" + + - name: Run MCP resource, security, and startup tests + run: | + pytest \ + tests/test_resources.py \ + tests/test_security_configuration.py \ + tests/test_integration.py::test_mcp_server_startup \ + tests/test_integration.py::test_list_resources \ + --tb=short -q + + # ────────────────────────────────────────────── + # Admin — reproducible install, build check, Vitest + # ────────────────────────────────────────────── + admin: + name: Admin Build & Tests + runs-on: ubuntu-latest + + defaults: + run: + working-directory: admin-service + + steps: + - uses: actions/checkout@v6 + + - name: Set up Node.js 24 + uses: actions/setup-node@v6 + with: + node-version: "24" + cache: npm + cache-dependency-path: admin-service/package-lock.json + + - name: Install dependencies + run: npm ci + + - name: Build and type check baseline + run: npm run build:check + + - name: Run Vitest + run: npm test + # ────────────────────────────────────────────── # Flutter — analyze + test # ────────────────────────────────────────────── @@ -190,8 +312,8 @@ jobs: name: flutter-analyze-output path: flutter-app/analyze-output.txt - - name: Run unit tests - run: flutter test --no-pub -r compact test/core test/features + - name: Run full test suite + run: flutter test --no-pub -r compact - name: Check formatting (non-blocking) run: dart format --output=none --set-exit-if-changed lib/ diff --git a/.github/workflows/mirror-to-gitlab.yml b/.github/workflows/mirror-to-gitlab.yml new file mode 100644 index 00000000..e1ee2766 --- /dev/null +++ b/.github/workflows/mirror-to-gitlab.yml @@ -0,0 +1,24 @@ +name: Mirror to GitLab + +on: + push: + branches: ["**"] + delete: + branches: ["**"] + +jobs: + mirror: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Push mirror to GitLab + env: + GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }} + GITLAB_USERNAME: ${{ secrets.GITLAB_USERNAME }} + GITLAB_REPO: ${{ secrets.GITLAB_REPO }} + run: | + git remote add gitlab "https://${GITLAB_USERNAME}:${GITLAB_TOKEN}@${GITLAB_REPO}" + git push --mirror gitlab diff --git a/.gitignore b/.gitignore index 0b2543a1..f0fffa02 100644 --- a/.gitignore +++ b/.gitignore @@ -129,9 +129,13 @@ system-testing/ # deployment artifacts dist/ build/ +*.tsbuildinfo .deploy/ backups/ +# Runtime-generated knowledge graph sync metadata +**/data/*_synced_files.json + # gateway runtime security logs gateway/nginx/logs/*.log default.conf @@ -149,6 +153,7 @@ scripts .claude/worktrees/ # Local tool caches +.claude/ .claire/ .crawl4ai/ ai-service/.crawl4ai/ diff --git a/.gitleaks.toml b/.gitleaks.toml index b37cd2fa..f23b4621 100644 --- a/.gitleaks.toml +++ b/.gitleaks.toml @@ -24,6 +24,14 @@ paths = [ '''(^|/)lexilingo_app/lib/firebase_options\.dart$''', ] +# Fake API keys used as test fixtures — not real credentials. +[[allowlists]] +description = "Test fixture placeholder API keys" +targetRules = ["generic-api-key", "google-gemini-api-key", "gcp-api-key"] +paths = [ + '''(^|/)ai-service/tests/test_admin_routes\.py$''', +] + # These examples intentionally use non-secret placeholders. [[allowlists]] description = "Documentation and local gateway placeholders" diff --git a/AGENTS.md b/AGENTS.md index 2d70070b..1feb5fc0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -7,6 +7,7 @@ | Code Reviewer | `.claude/agents/code-reviewer.md` | After any non-trivial change | | Test Writer | `.claude/agents/test-writer.md` | New feature or bug fix | | Security Reviewer | `.claude/agents/security-reviewer.md` | Auth, API, DB schema changes | +| Kaiser | `.claude/agents/kaiser.md` | Technical debt audits, pre-sprint cleanup, when a service feels "heavy" | ## Ownership Map @@ -18,6 +19,7 @@ | `ai-service/` | main Claude | AI pipeline, STT | | Tests | test-writer | Never let main agent skip tests | | Security surface | security-reviewer | Routes, auth middleware, env vars | +| Technical debt | kaiser | Debt register, architecture violations, dead code, complexity hotspots | ## Coordination Protocol @@ -26,6 +28,7 @@ 3. **Spawn test-writer** after every feature implementation. 4. **Spawn security-reviewer** when touching: auth routes, JWT handling, DB migrations, env/config files. 5. **Spawn code-reviewer** before any PR — use `/code-review` skill. +6. **Spawn kaiser** for quarterly debt audits, before major refactors, or when a module starts accumulating complexity. ## Task Decomposition (Large Tasks) diff --git a/admin-service/package-lock.json b/admin-service/package-lock.json index 16a5fb50..2e8464cf 100644 --- a/admin-service/package-lock.json +++ b/admin-service/package-lock.json @@ -10,32 +10,33 @@ "dependencies": { "@gsap/react": "^2.1.2", "@hookform/resolvers": "^5.2.2", - "@tanstack/react-query": "^5.100.9", + "@tanstack/react-query": "^5.101.0", "@vercel/analytics": "^2.0.1", - "antd": "^6.3.7", - "axios": "^1.16.0", - "dayjs": "^1.11.20", + "antd": "^6.4.4", + "axios": "^1.18.0", + "dayjs": "^1.11.21", "dotenv": "^17.4.2", "gsap": "^3.15.0", - "lucide-react": "^1.14.0", - "react": "^19.2.5", - "react-dom": "^19.2.6", - "react-hook-form": "^7.75.0", - "react-router-dom": "^7.15.0", + "lucide-react": "^1.18.0", + "react": "^19.2.7", + "react-dom": "^19.2.7", + "react-hook-form": "^7.79.0", + "react-router-dom": "^7.17.0", "recharts": "^3.8.1", "three": "^0.184.0", - "vercel": "^54.5.0", + "vercel": "^54.14.0", "zod": "^4.4.3", - "zustand": "^5.0.13" + "zustand": "^5.0.14" }, "devDependencies": { - "@types/node": "^25.6.2", - "@types/react": "^19.2.14", + "@types/node": "^25.9.3", + "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", "@types/three": "^0.184.1", "@vitejs/plugin-react": "^6.0.1", "typescript": "^6.0.3", - "vite": "^8.0.11" + "vite": "^8.0.16", + "vitest": "^4.1.8" } }, "node_modules/@ant-design/colors": { @@ -91,14 +92,14 @@ } }, "node_modules/@ant-design/icons": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.1.1.tgz", - "integrity": "sha512-AMT4N2y++TZETNHiM77fs4a0uPVCJGuL5MTonk13Pvv7UN7sID1cNEZOc1qNqx6zLKAOilTEFAdAoAFKa0U//Q==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.2.5.tgz", + "integrity": "sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw==", "license": "MIT", "dependencies": { - "@ant-design/colors": "^8.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@rc-component/util": "^1.3.0", + "@ant-design/colors": "^8.0.1", + "@ant-design/icons-svg": "^4.4.2", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "engines": { @@ -132,9 +133,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -202,32 +203,35 @@ } }, "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", + "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { - "@emnapi/wasi-threads": "1.2.1", + "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", + "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", + "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -724,6 +728,13 @@ "node": ">=18.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/@mapbox/node-pre-gyp": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", @@ -745,14 +756,248 @@ "node": ">=18" } }, + "node_modules/@napi-rs/keyring": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring/-/keyring-1.2.0.tgz", + "integrity": "sha512-d0d4Oyxm+v980PEq1ZH2PmS6cvpMIRc17eYpiU47KgW+lzxklMu6+HOEOPmxrpnF/XQZ0+Q78I2mgMhbIIo/dg==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/keyring-darwin-arm64": "1.2.0", + "@napi-rs/keyring-darwin-x64": "1.2.0", + "@napi-rs/keyring-freebsd-x64": "1.2.0", + "@napi-rs/keyring-linux-arm-gnueabihf": "1.2.0", + "@napi-rs/keyring-linux-arm64-gnu": "1.2.0", + "@napi-rs/keyring-linux-arm64-musl": "1.2.0", + "@napi-rs/keyring-linux-riscv64-gnu": "1.2.0", + "@napi-rs/keyring-linux-x64-gnu": "1.2.0", + "@napi-rs/keyring-linux-x64-musl": "1.2.0", + "@napi-rs/keyring-win32-arm64-msvc": "1.2.0", + "@napi-rs/keyring-win32-ia32-msvc": "1.2.0", + "@napi-rs/keyring-win32-x64-msvc": "1.2.0" + } + }, + "node_modules/@napi-rs/keyring-darwin-arm64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-arm64/-/keyring-darwin-arm64-1.2.0.tgz", + "integrity": "sha512-CA83rDeyONDADO25JLZsh3eHY8yTEtm/RS6ecPsY+1v+dSawzT9GywBMu2r6uOp1IEhQs/xAfxgybGAFr17lSA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-darwin-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-darwin-x64/-/keyring-darwin-x64-1.2.0.tgz", + "integrity": "sha512-dBHjtKRCj4ByfnfqIKIJLo3wueQNJhLRyuxtX/rR4K/XtcS7VLlRD01XXizjpre54vpmObj63w+ZpHG+mGM8uA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-freebsd-x64": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-freebsd-x64/-/keyring-freebsd-x64-1.2.0.tgz", + "integrity": "sha512-DPZFr11pNJSnaoh0dzSUNF+T6ORhy3CkzUT3uGixbA71cAOPJ24iG8e8QrLOkuC/StWrAku3gBnth2XMWOcR3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-arm-gnueabihf": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm-gnueabihf/-/keyring-linux-arm-gnueabihf-1.2.0.tgz", + "integrity": "sha512-8xv6DyEMlvRdqJzp4F39RLUmmTQsLcGYYv/3eIfZNZN1O5257tHxTrFYqAsny659rJJK2EKeSa7PhrSibQqRWQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-arm64-gnu": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-gnu/-/keyring-linux-arm64-gnu-1.2.0.tgz", + "integrity": "sha512-Pu2V6Py+PBt7inryEecirl+t+ti8bhZphjP+W68iVaXHUxLdWmkgL9KI1VkbRHbx5k8K5Tew9OP218YfmVguIA==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-arm64-musl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-arm64-musl/-/keyring-linux-arm64-musl-1.2.0.tgz", + "integrity": "sha512-8TDymrpC4P1a9iDEaegT7RnrkmrJN5eNZh3Im3UEV5PPYGtrb82CRxsuFohthCWQW81O483u1bu+25+XA4nKUw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-riscv64-gnu": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-riscv64-gnu/-/keyring-linux-riscv64-gnu-1.2.0.tgz", + "integrity": "sha512-awsB5XI1MYL7fwfjMDGmKOWvNgJEO7mM7iVEMS0fO39f0kVJnOSjlu7RHcXAF0LOx+0VfF3oxbWqJmZbvRCRHw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-x64-gnu": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-gnu/-/keyring-linux-x64-gnu-1.2.0.tgz", + "integrity": "sha512-8E+7z4tbxSJXxIBqA+vfB1CGajpCDRyTyqXkBig5NtASrv4YXcntSo96Iah2QDR5zD3dSTsmbqJudcj9rKKuHQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-linux-x64-musl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-linux-x64-musl/-/keyring-linux-x64-musl-1.2.0.tgz", + "integrity": "sha512-8RZ8yVEnmWr/3BxKgBSzmgntI7lNEsY7xouNfOsQkuVAiCNmxzJwETspzK3PQ2FHtDxgz5vHQDEBVGMyM4hUHA==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-win32-arm64-msvc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-arm64-msvc/-/keyring-win32-arm64-msvc-1.2.0.tgz", + "integrity": "sha512-AoqaDZpQ6KPE19VBLpxyORcp+yWmHI9Xs9Oo0PJ4mfHma4nFSLVdhAubJCxdlNptHe5va7ghGCHj3L9Akiv4cQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-win32-ia32-msvc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-ia32-msvc/-/keyring-win32-ia32-msvc-1.2.0.tgz", + "integrity": "sha512-EYL+EEI6bCsYi3LfwcQdnX3P/R76ENKNn+3PmpGheBsUFLuh0gQuP7aMVHM4rTw6UVe+L3vCLZSptq/oeacz0A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/keyring-win32-x64-msvc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@napi-rs/keyring-win32-x64-msvc/-/keyring-win32-x64-msvc-1.2.0.tgz", + "integrity": "sha512-xFlx/TsmqmCwNU9v+AVnEJgoEAlBYgzFF5Ihz1rMpPAt4qQWWkMd4sCyM1gMJ1A/GnRqRegDiQpwaxGUHFtFbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", - "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", + "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", "license": "MIT", "optional": true, "dependencies": { - "@tybys/wasm-util": "^0.10.1" + "@tybys/wasm-util": "^0.10.2" }, "funding": { "type": "github", @@ -1152,9 +1397,9 @@ } }, "node_modules/@rc-component/async-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz", - "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-6.0.0.tgz", + "integrity": "sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -1164,14 +1409,14 @@ } }, "node_modules/@rc-component/cascader": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.14.0.tgz", - "integrity": "sha512-Ip9356xwZUR2nbW5PRVGif4B/bDve4pLa/N+PGbvBaTnjbvmN4PFMBGQSmlDlzKP1ovxaYMvwF/dI9lXNLT4iQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.16.1.tgz", + "integrity": "sha512-wxLopwM+EBed0zNNGdnGE4coYoqcO+XD42fHgn+pDvO+XzhNFbdgSlSNXdKocIYqccvqgWvoxDPNb0OVRdi59A==", "license": "MIT", "dependencies": { - "@rc-component/select": "~1.6.0", - "@rc-component/tree": "~1.2.0", - "@rc-component/util": "^1.4.0", + "@rc-component/select": "~1.7.1", + "@rc-component/tree": "~1.3.2", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1225,22 +1470,22 @@ } }, "node_modules/@rc-component/context": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.1.tgz", - "integrity": "sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.2.tgz", + "integrity": "sha512-uiGpAlblCNlziHPwj4S4Iy/oemeuz/hR03mbiEjTCXwsqOIN3BOzsRMyDwpyO5Fm0vIEEJRUf9ZtbRLbhksuTA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0" + "@rc-component/util": "^1.11.0" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@rc-component/dialog": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.8.4.tgz", - "integrity": "sha512-Ay6PM7phkTkquplG8fWfUGFZ2GTLx9diTl4f0d8Eqxd7W1u1KjE9AQooFQHOHnhZf0Ya3z51+5EKCWHmt/dNEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.9.0.tgz", + "integrity": "sha512-zbAAogkg4kkKum79sLE6M+vq1jSAW25zdkafrahgcTP9t9S//SD634Znd1A4c8F2Gc12ZKnehGLsVaaOvZzD2A==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.3", @@ -1285,13 +1530,13 @@ } }, "node_modules/@rc-component/form": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.8.1.tgz", - "integrity": "sha512-8O7TB55Fi2mWIGvSnwZjk8jFqVNYyKDAswglwGShcbndxqzKz4cHwNtNaLjZlAeRge9wcB0LL8IWsC/Bl18raQ==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.8.5.tgz", + "integrity": "sha512-d24EYtvUOBhxEtSd/EqIu9DaMuqrWF2IRIvAFCTM6NQ/GJIYNr8DvEpUSUlv2uPxEJ0ZPwYQ+wwlGIAaiHvdrw==", "license": "MIT", "dependencies": { - "@rc-component/async-validator": "^5.1.0", - "@rc-component/util": "^1.6.2", + "@rc-component/async-validator": "^6.0.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "engines": { @@ -1319,12 +1564,13 @@ } }, "node_modules/@rc-component/input": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.1.2.tgz", - "integrity": "sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.3.1.tgz", + "integrity": "sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.4.0", + "@rc-component/resize-observer": "^1.1.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1348,14 +1594,13 @@ } }, "node_modules/@rc-component/mentions": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.6.0.tgz", - "integrity": "sha512-KIkQNP6habNuTsLhUv0UGEOwG67tlmE7KNIJoQZZNggEZl5lQJTytFDb69sl5CK3TDdISCTjKP3nGEBKgT61CQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.9.0.tgz", + "integrity": "sha512-WUwfFKDSOF5S9UPsNsXcLYtzjTxBGsftTXWRbZuxX6BYrsySISTnujfJNgaaQ6qVzaCDJ35QUkZKvsYxip1C5g==", "license": "MIT", "dependencies": { - "@rc-component/input": "~1.1.0", - "@rc-component/menu": "~1.2.0", - "@rc-component/textarea": "~1.1.0", + "@rc-component/input": "~1.3.0", + "@rc-component/menu": "~1.3.0", "@rc-component/trigger": "^3.0.0", "@rc-component/util": "^1.3.0", "clsx": "^2.1.1" @@ -1366,15 +1611,15 @@ } }, "node_modules/@rc-component/menu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.2.0.tgz", - "integrity": "sha512-VWwDuhvYHSnTGj4n6bV3ISrLACcPAzdPOq3d0BzkeiM5cve8BEYfvkEhNoM0PLzv51jpcejeyrLXeMVIJ+QJlg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.3.1.tgz", + "integrity": "sha512-pSZl9nBPgKgxN0aaW7NilIBEwWsc+43S+ulGdWAg9afak96dNOGWsGx0DLLBB1VQsAJvo6bQMTDzXoPlEHsBEw==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.4", "@rc-component/overflow": "^1.0.0", "@rc-component/trigger": "^3.0.0", - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1395,12 +1640,12 @@ } }, "node_modules/@rc-component/motion": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.2.tgz", - "integrity": "sha512-itfd+GztzJYAb04Z4RkEub1TbJAfZc2Iuy8p44U44xD1F5+fNYFKI3897ijlbIyfvXkTmMm+KGcjkQQGMHywEQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.3.tgz", + "integrity": "sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.2.0", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1425,21 +1670,21 @@ } }, "node_modules/@rc-component/notification": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-1.2.0.tgz", - "integrity": "sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-2.0.7.tgz", + "integrity": "sha512-nqZzpf6BPdaj+3ILx7si79LLmqPKyUmQoXa+/9gg0SkH0v1DbD66oJgRMSBEVnd/zUT3D4gwxWIHUKebYf2ZXQ==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.4", - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "engines": { "node": ">=8.x" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@rc-component/overflow": { @@ -1459,12 +1704,12 @@ } }, "node_modules/@rc-component/pagination": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz", - "integrity": "sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.3.0.tgz", + "integrity": "sha512-12ahTY+HPITg1L2bjWKXUqBJe/oOnpA2QsChdCjthqLVf/e19StiCsv8OLKpWoHbc+8PFEkNjRqRqrLoRBHjFw==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1473,9 +1718,9 @@ } }, "node_modules/@rc-component/picker": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.9.1.tgz", - "integrity": "sha512-9FBYYsvH3HMLICaPDA/1Th5FLaDkFa7qAtangIdlhKb3ZALaR745e9PsOhheJb6asS4QXc12ffiAcjdkZ4C5/g==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.10.0.tgz", + "integrity": "sha512-vVOXP2RVWozwpERGUFAehVH1Jz6o/uRrAb9qSZm1LC+iJs8rvEwFo1bzz2jlOYV+uWwu0dIuG86tnDui14Ea0w==", "license": "MIT", "dependencies": { "@rc-component/overflow": "^1.0.0", @@ -1542,9 +1787,9 @@ } }, "node_modules/@rc-component/qrcode": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz", - "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-2.0.0.tgz", + "integrity": "sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7" @@ -1604,15 +1849,15 @@ } }, "node_modules/@rc-component/select": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.6.15.tgz", - "integrity": "sha512-SyVCWnqxCQZZcQvQJ/CxSjx2bGma6ds/HtnpkIfZVnt6RoEgbqUmHgD6vrzNarNXwbLXerwVzWwq8F3d1sst7g==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.7.1.tgz", + "integrity": "sha512-GZ1cMJk2xQh0VHyOQjjG8drYL4iu24NcbkXioUcReQOCUr+ub/3fmRonZe6cRPEZhWMbJdeHsqnEltogDaZ5Tg==", "license": "MIT", "dependencies": { "@rc-component/overflow": "^1.0.0", "@rc-component/trigger": "^3.0.0", - "@rc-component/util": "^1.3.0", - "@rc-component/virtual-list": "^1.0.1", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.2.0", "clsx": "^2.1.1" }, "engines": { @@ -1672,14 +1917,14 @@ } }, "node_modules/@rc-component/table": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.9.1.tgz", - "integrity": "sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.10.2.tgz", + "integrity": "sha512-b3PjqB9Gp25p5t/zq+9QrbXbodkptT8/zvLmwgd2FNPUUtaYyDnQqfxeD5a7ao8E8lpinLHsi2u2vdfPhyNvAw==", "license": "MIT", "dependencies": { "@rc-component/context": "^2.0.1", "@rc-component/resize-observer": "^1.0.0", - "@rc-component/util": "^1.1.0", + "@rc-component/util": "^1.11.1", "@rc-component/virtual-list": "^1.0.1", "clsx": "^2.1.1" }, @@ -1692,16 +1937,16 @@ } }, "node_modules/@rc-component/tabs": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.7.0.tgz", - "integrity": "sha512-J48cs2iBi7Ho3nptBxxIqizEliUC+ExE23faspUQKGQ550vaBlv3aGF8Epv/UB1vFWeoJDTW/dNzgIU0Qj5i/w==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.9.1.tgz", + "integrity": "sha512-6mY08Fce6aNOHuGsxbzT+f2ekgL9mg1cGGHkittMlVGymjGg+kGupu5v90sRxcUd/paRU9jclLLXtF/PkK1FUA==", "license": "MIT", "dependencies": { "@rc-component/dropdown": "~1.0.0", - "@rc-component/menu": "~1.2.0", + "@rc-component/menu": "~1.3.0", "@rc-component/motion": "^1.1.3", "@rc-component/resize-observer": "^1.0.0", - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "engines": { @@ -1712,22 +1957,6 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/textarea": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/textarea/-/textarea-1.1.2.tgz", - "integrity": "sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==", - "license": "MIT", - "dependencies": { - "@rc-component/input": "~1.1.0", - "@rc-component/resize-observer": "^1.0.0", - "@rc-component/util": "^1.3.0", - "clsx": "^2.1.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/@rc-component/tooltip": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz", @@ -1744,9 +1973,9 @@ } }, "node_modules/@rc-component/tour": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.3.0.tgz", - "integrity": "sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.4.0.tgz", + "integrity": "sha512-aui4r4TqmTzwaBgcQxHYep8kM8PTjZFufjokObpy35KfFeZ0k9ArquWFZqegQlH24P14t+F0qO0mGTgzlav1yg==", "license": "MIT", "dependencies": { "@rc-component/portal": "^2.2.0", @@ -1763,14 +1992,14 @@ } }, "node_modules/@rc-component/tree": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.2.4.tgz", - "integrity": "sha512-5Gli43+m4R7NhpYYz3Z61I6LOw9yI6CNChxgVtvrO6xB1qML7iE6QMLVMB3+FTjo2yF6uFdAHtqWPECz/zbX5w==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.3.2.tgz", + "integrity": "sha512-bJFj46wEkpBPnWyTm18XmgAgNQ/4YvprxMOPPY2a6rmhGJYxLuNKEFiL5Qej4Qctu9wHJm8WW+v2SYskafE0kA==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.0.0", - "@rc-component/util": "^1.8.1", - "@rc-component/virtual-list": "^1.0.1", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.2.0", "clsx": "^2.1.1" }, "engines": { @@ -1782,13 +2011,13 @@ } }, "node_modules/@rc-component/tree-select": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.8.0.tgz", - "integrity": "sha512-iYsPq3nuLYvGqdvFAW+l+I9ASRIOVbMXyA8FGZg2lGym/GwkaWeJGzI4eJ7c9IOEhRj0oyfIN4S92Fl3J05mjQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.10.0.tgz", + "integrity": "sha512-E1U4pn2LAbXEhLJdzIzid7WYbIuFbkTIctuFoeC6weppf8UbPR3+YYB6/ay0c0ksand4gXMRQpa1Z60Auo7VJA==", "license": "MIT", "dependencies": { - "@rc-component/select": "~1.6.0", - "@rc-component/tree": "~1.2.0", + "@rc-component/select": "~1.7.0", + "@rc-component/tree": "~1.3.0", "@rc-component/util": "^1.4.0", "clsx": "^2.1.1" }, @@ -1798,9 +2027,9 @@ } }, "node_modules/@rc-component/trigger": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.0.tgz", - "integrity": "sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.1.tgz", + "integrity": "sha512-LNsYvz60mrLJ/kRvKcHE7boUvcQfVMCfRqZ71x3Fo9AOiZ1KKIEqkzMA8DNvz2V3Bcvir/vwQNn7JF1NPODQ7Q==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.4", @@ -1818,12 +2047,12 @@ } }, "node_modules/@rc-component/upload": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.0.tgz", - "integrity": "sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.1.tgz", + "integrity": "sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1832,9 +2061,9 @@ } }, "node_modules/@rc-component/util": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.10.1.tgz", - "integrity": "sha512-q++9S6rUa5Idb/xIBNz6jtvumw5+O5YV5V0g4iK9mn9jWs4oGJheE3ZN1kAnE723AXyaD8v95yeOASmdk8Jnng==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.11.1.tgz", + "integrity": "sha512-awVlI3ub2vqfqkYxOBc/uQ0efm3jw0wcrhtO/YWLyZfxiKXczKwNbVuhlnyxytDt7H9pbbVQiqr+O6MLATtRYg==", "license": "MIT", "dependencies": { "is-mobile": "^5.0.0", @@ -1852,9 +2081,9 @@ "license": "MIT" }, "node_modules/@rc-component/virtual-list": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.0.2.tgz", - "integrity": "sha512-uvTol/mH74FYsn5loDGJxo+7kjkO4i+y4j87Re1pxJBs0FaeuMuLRzQRGaXwnMcV1CxpZLi2Z56Rerj2M00fjQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.2.0.tgz", + "integrity": "sha512-iavRm1Jo4GDbASQwdGa7jFyk93RvSOo9xHyBT4QL1pgFJj/Fdf1G+3RErH7/7BmAMvx2AkF62mjGYxDbXsK9TQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", @@ -1866,8 +2095,8 @@ "node": ">=8.x" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@reduxjs/toolkit": { @@ -2035,13 +2264,16 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-ugCOyj7a4d9h3q9B+wXmf6g3a68UsjGh6dob5DHevHGMwDUbhsYNbSPxJsENcIttJZ9jv7qGM2UesLw5jqIhdg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", + "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2052,13 +2284,16 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-kKWRhbsotpXkGbcd5dllUWg5gEXcDAa8u5YnP9AV5DYNbvJHGzzuwv7dpmhc8NqKMJldl0a+x76IHbspEpEmdA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", + "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2178,9 +2413,9 @@ "license": "MIT" }, "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", @@ -2218,9 +2453,9 @@ "license": "MIT" }, "node_modules/@tanstack/query-core": { - "version": "5.100.9", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.9.tgz", - "integrity": "sha512-SJSFw1S8+kQ0+knv/XGfrbocWoAlT7vDKsSImtLx3ZPQmEcR46hkDjLSvynSy25N8Ms4tIEini1FuBd5k7IscQ==", + "version": "5.101.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.0.tgz", + "integrity": "sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow==", "license": "MIT", "funding": { "type": "github", @@ -2228,12 +2463,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.100.9", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.9.tgz", - "integrity": "sha512-Oa44XkaI3kCNN6ME0KByU3xT3SEUNOMfZpHxL6+wFoTm+OeUFYHKdeYVe0aOXlRDm/f15sgLwEt2HDorIdW8+A==", + "version": "5.101.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.0.tgz", + "integrity": "sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.100.9" + "@tanstack/query-core": "5.101.0" }, "funding": { "type": "github", @@ -2290,15 +2525,26 @@ "license": "MIT" }, "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", @@ -2362,10 +2608,17 @@ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "license": "MIT" }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "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==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, "node_modules/@types/json-schema": { @@ -2375,19 +2628,19 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz", - "integrity": "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==", + "version": "25.9.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.3.tgz", + "integrity": "sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.19.0" + "undici-types": ">=7.24.0 <7.24.7" } }, "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2481,13 +2734,13 @@ } }, "node_modules/@vercel/backends": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@vercel/backends/-/backends-0.8.0.tgz", - "integrity": "sha512-oDLW8FV/POMhQ5M8UWCRzXQBwy/BtmK8dO7NBFAeNNT1CEN/ZIVopctYF1ICkmHd504rGagDMJ+/YZvbTlYbSA==", + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/@vercel/backends/-/backends-0.8.14.tgz", + "integrity": "sha512-jgepdZh7E4ameCUSt/b28ImFd9Bz1VX71lKwD/ThtZ7nGIwi5SJ9hwyURvH60c4rNW6nKxMD/iSOlcgQOfrK3A==", "license": "Apache-2.0", "dependencies": { - "@vercel/build-utils": "13.26.2", - "@vercel/nft": "1.5.0", + "@vercel/build-utils": "13.30.0", + "@vercel/nft": "1.10.0", "execa": "3.2.0", "fs-extra": "11.1.0", "get-port": "5.1.1", @@ -2526,9 +2779,9 @@ } }, "node_modules/@vercel/build-utils": { - "version": "13.26.2", - "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.26.2.tgz", - "integrity": "sha512-dEgbr6NnbDkvXpKpYoV0V4kN3VWc82A41a5V9bYGqOMYyw76rEhf59VKgSdu9D0SOXgowSln2gL5O7ATJ3xFog==", + "version": "13.30.0", + "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.30.0.tgz", + "integrity": "sha512-fLIa8cpELsSoWbcxshaqegwlTCfKnbgsDmA6uIb+oA797xvSmYkPu5a781aRYCRdghgyOZF7NCSVgtZjHjunnQ==", "license": "Apache-2.0", "dependencies": { "@vercel/python-analysis": "0.11.1", @@ -2537,21 +2790,51 @@ } }, "node_modules/@vercel/cervel": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@vercel/cervel/-/cervel-0.1.8.tgz", - "integrity": "sha512-ux75xbBtZ2Z4AJ2GIn4+VLTlohqo7i7R0kLimUVzSzvABwVmKDuqqbkwSYiMQ6PXzX5W6RFol+6PjkmDW6UfCw==", + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/@vercel/cervel/-/cervel-0.1.22.tgz", + "integrity": "sha512-YbL2AosH3FaBLJZu4GYdVMkFv+5cbWwwSrRBTGN52odynQUudTUQfbc7rCzPyNQLdk2QC4w2IDYRD+nqgojhVg==", "license": "Apache-2.0", "dependencies": { - "@vercel/backends": "0.8.0" + "@vercel/backends": "0.8.14" }, "bin": { "cervel": "bin/cervel.mjs" } }, + "node_modules/@vercel/cli-auth": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@vercel/cli-auth/-/cli-auth-0.3.0.tgz", + "integrity": "sha512-9nsdxUpV/L+9CBVGeRw/Qby2azhi2lk01jp0aTH+Hxx2U61+mAmbi5qChHnrbEmQdx2Ih7dp4LxO3nj1Q7f/5Q==", + "dependencies": { + "@napi-rs/keyring": "1.2.0", + "@vercel/cli-config": "0.2.0", + "async-listen": "3.0.0", + "open": "8.4.0", + "zod": "4.1.11" + } + }, + "node_modules/@vercel/cli-auth/node_modules/async-listen": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", + "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@vercel/cli-auth/node_modules/zod": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.11.tgz", + "integrity": "sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/@vercel/cli-config": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.1.2.tgz", - "integrity": "sha512-XQOcuCM+8tKjh3sfgGRKRuNh78u2D8uGpDJIFcCtFi2tUqbGvqmJo790XX7+Bwakk08y0FCrs2JlEjvvwRhpAg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@vercel/cli-config/-/cli-config-0.2.0.tgz", + "integrity": "sha512-fJRRRB7734BDuXZ89yBEaA2ncYhH7bWX30mk04W80J6VAfQc+4iB8lyzAdaGpFV3/vNlkt9VZt+/uoQoWX6UsQ==", "license": "Apache-2.0", "dependencies": { "xdg-app-paths": "5", @@ -2577,31 +2860,31 @@ } }, "node_modules/@vercel/elysia": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/@vercel/elysia/-/elysia-0.1.81.tgz", - "integrity": "sha512-Z1lKN5awF98e4wCXiEjr0jS2BdIVW3KmPiQJPr3v/qWGUc0I5V3+gE3FD6p4CCzPYtaWcvEy9UxZ8FDIB0u0zw==", + "version": "0.1.93", + "resolved": "https://registry.npmjs.org/@vercel/elysia/-/elysia-0.1.93.tgz", + "integrity": "sha512-36yzZJVU9o7/CcH1TbqeGTRwBePDaCEzv1CYfS183HdLXzsD+pOjOkTqZOBJu7h9aHpJFCCau55Ed0xOQC2jhA==", "license": "Apache-2.0", "dependencies": { - "@vercel/node": "5.8.5", - "@vercel/static-config": "3.3.0" + "@vercel/node": "5.8.17", + "@vercel/static-config": "3.4.0" } }, "node_modules/@vercel/error-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.1.0.tgz", - "integrity": "sha512-DiJcXBOB9N6QM4d7hYPM9Ck/AUjzBl58XNQPxS74o7CuvIanjzrGgygP/70VsyEASeIJMazk1LrhwcNTR/eZGQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.2.0.tgz", + "integrity": "sha512-WFWiRxfPzoYWYifaj4thSKvAaZZwUOqD4k5GINRIgZgCiS2E3iAJbWbIsIZmkQdTecWFHcWGA6q48CjisgpOBA==", "license": "Apache-2.0" }, "node_modules/@vercel/express": { - "version": "0.1.91", - "resolved": "https://registry.npmjs.org/@vercel/express/-/express-0.1.91.tgz", - "integrity": "sha512-+lj3y8M+1AZu52A00+VBhb2Y1vJYnyRqFEryU8ttWjFO+x88hEhZyhfvvO6S7W0H7RCdsS839NWoaqZ817Ivdg==", + "version": "0.1.105", + "resolved": "https://registry.npmjs.org/@vercel/express/-/express-0.1.105.tgz", + "integrity": "sha512-F+QRQxWWKdeztW4MKPkzXl/Ajc8j1qOffCp1tt8+YPaNiqZtxpn7FjIYRXHbfR1aepfaEkDRDD7o2qxmmaUU5w==", "license": "Apache-2.0", "dependencies": { - "@vercel/cervel": "0.1.8", - "@vercel/nft": "1.5.0", - "@vercel/node": "5.8.5", - "@vercel/static-config": "3.3.0", + "@vercel/cervel": "0.1.22", + "@vercel/nft": "1.10.0", + "@vercel/node": "5.8.17", + "@vercel/static-config": "3.4.0", "fs-extra": "11.1.0", "path-to-regexp": "8.3.0", "ts-morph": "12.0.0", @@ -2618,13 +2901,13 @@ } }, "node_modules/@vercel/fastify": { - "version": "0.1.84", - "resolved": "https://registry.npmjs.org/@vercel/fastify/-/fastify-0.1.84.tgz", - "integrity": "sha512-4Iq6MEp9UyzQFKys2NQkzCXibq/XKMKNzW7ArMjIEKzIBN6URAJ0WTMGnhvEz0Go1aNcXCjSQ1kAxp09tJ1MXw==", + "version": "0.1.96", + "resolved": "https://registry.npmjs.org/@vercel/fastify/-/fastify-0.1.96.tgz", + "integrity": "sha512-4Uq6GVmi0ksQxIHp4FDUhgoz47uacxZm42XT04SK5gzX5v5UmZXWZPprZjkwwk/2gmP/rF2qKqJ0nu6OsI+yDw==", "license": "Apache-2.0", "dependencies": { - "@vercel/node": "5.8.5", - "@vercel/static-config": "3.3.0" + "@vercel/node": "5.8.17", + "@vercel/static-config": "3.4.0" } }, "node_modules/@vercel/fun": { @@ -2737,43 +3020,43 @@ } }, "node_modules/@vercel/gatsby-plugin-vercel-builder": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.2.8.tgz", - "integrity": "sha512-XSyOMFwB/aSBX4RPU5baeaXgvltidojCaaoW4IAizPjWBBO5vfSvGHqsOmF39d7rNcLX0WMa4K/H5MoGOhkzUA==", + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/@vercel/gatsby-plugin-vercel-builder/-/gatsby-plugin-vercel-builder-2.2.19.tgz", + "integrity": "sha512-dA1ZWZHruRjFbLToqjcPHUyh5J7/Cl3qGFDge87ghAInuy/aXfalApzFbw61OIopGx0SSsIYi/8kbpJ+SbQ6ZQ==", "license": "Apache-2.0", "dependencies": { "@sinclair/typebox": "0.25.24", - "@vercel/build-utils": "13.26.2", + "@vercel/build-utils": "13.30.0", "esbuild": "0.27.0", "etag": "1.8.1", "fs-extra": "11.1.0" } }, "node_modules/@vercel/go": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.8.0.tgz", - "integrity": "sha512-ftQqQMn3sGdL8mdIqfcS3YZg6dazM/h4s0jkY37oVV1rPdh7Aq/GL0oMjv1L+PoIk5uJEAyBan7C8Yisp4LH+g==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@vercel/go/-/go-3.9.0.tgz", + "integrity": "sha512-vGbEwckvtr9UXKDz3qEHUE7VHJGG/9VQLuScgHytksfZyX8dzvNPgEuBKBbhPaMwua8pUCZKQqNxFM3Dul+bLA==", "license": "Apache-2.0" }, "node_modules/@vercel/h3": { - "version": "0.1.90", - "resolved": "https://registry.npmjs.org/@vercel/h3/-/h3-0.1.90.tgz", - "integrity": "sha512-jbf4CxOcAtPXxCJN0rUgUzrenwbOXQ99Oo59q/iZOwasQcV8rusPr+UD0WCBTZumj183oEgyYtFidnAXKQ23Fw==", + "version": "0.1.102", + "resolved": "https://registry.npmjs.org/@vercel/h3/-/h3-0.1.102.tgz", + "integrity": "sha512-UnHFLBemE2UfvQ+w2z2zxGcvyiShQ8eMdk3ag2sV71wbyatnXwmio8HOy//B2ZIEQNEid5gW2HjWOXLtrR+E2Q==", "license": "Apache-2.0", "dependencies": { - "@vercel/node": "5.8.5", - "@vercel/static-config": "3.3.0" + "@vercel/node": "5.8.17", + "@vercel/static-config": "3.4.0" } }, "node_modules/@vercel/hono": { - "version": "0.2.84", - "resolved": "https://registry.npmjs.org/@vercel/hono/-/hono-0.2.84.tgz", - "integrity": "sha512-qLE30Gj3b2nQdvZuNr3s9ZbA009grDRctjO/pm6iEbFBZs0ri4Qy6ooPjFp/cbn4bvUpnWqDs+1ds3oNNKUq/g==", + "version": "0.2.96", + "resolved": "https://registry.npmjs.org/@vercel/hono/-/hono-0.2.96.tgz", + "integrity": "sha512-h4G0GSo5omhXS1iqimIcekcW7THEAnUGd6eioDNnSqwS3L0CGEvvTPUekJDyJcybsqnKslH1XTZA40f4b9MPHg==", "license": "Apache-2.0", "dependencies": { - "@vercel/nft": "1.5.0", - "@vercel/node": "5.8.5", - "@vercel/static-config": "3.3.0", + "@vercel/nft": "1.10.0", + "@vercel/node": "5.8.17", + "@vercel/static-config": "3.4.0", "fs-extra": "11.1.0", "path-to-regexp": "8.3.0", "ts-morph": "12.0.0", @@ -2790,48 +3073,48 @@ } }, "node_modules/@vercel/hydrogen": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@vercel/hydrogen/-/hydrogen-1.3.7.tgz", - "integrity": "sha512-nh8hZ76Ipf9FRmMmQGd4SjkE0zxdjt+TUpZcuCIUG7yaHEh9STQV655I8rxKCB3hEWaKB3HALGgxZ0htIjQtZQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vercel/hydrogen/-/hydrogen-1.4.0.tgz", + "integrity": "sha512-gf3ELmAjcia7WNGNHAB/rFWFU0l5fJ7mTMgGC5hvcCjSIE4kp8WWuGYiTQgQ8W6GF/1FJAxa2J3BhY/yxjY8tA==", "license": "Apache-2.0", "dependencies": { - "@vercel/static-config": "3.3.0", + "@vercel/static-config": "3.4.0", "ts-morph": "12.0.0" } }, "node_modules/@vercel/koa": { - "version": "0.1.64", - "resolved": "https://registry.npmjs.org/@vercel/koa/-/koa-0.1.64.tgz", - "integrity": "sha512-F+T3Cr5kUrk2v1WcPQLNIcUk1eP3S8eBXGIN5j+dYx6I8eoFurKPzu4Z7gGIVQ1CCddHjl8MNR1SWxlEn4r5iw==", + "version": "0.1.76", + "resolved": "https://registry.npmjs.org/@vercel/koa/-/koa-0.1.76.tgz", + "integrity": "sha512-6MuBn5RM2nHKfHKeBqbs3aaFJlBFDhOZgpC1ubLQG2B/EvnAfljB7FPIKCl1SwANAHisX7vQACinMedCbFdi+Q==", "license": "Apache-2.0", "dependencies": { - "@vercel/node": "5.8.5", - "@vercel/static-config": "3.3.0" + "@vercel/node": "5.8.17", + "@vercel/static-config": "3.4.0" } }, "node_modules/@vercel/nestjs": { - "version": "0.2.85", - "resolved": "https://registry.npmjs.org/@vercel/nestjs/-/nestjs-0.2.85.tgz", - "integrity": "sha512-fUEVgxzXJ9lWrEK8EUpcfqyf2GwLIcRB882QtpntDECucmzPz906QKdcKJFEQA+3qcve3fYHgzQWbKOQzGJ4jw==", + "version": "0.2.97", + "resolved": "https://registry.npmjs.org/@vercel/nestjs/-/nestjs-0.2.97.tgz", + "integrity": "sha512-KM9uBmC+a10EPJgtm0B/vfGsTaUEzxKkihTyaQ4PhSUQHJOABTv6TBpGKtwIM5P1vMLKUg9R0A2SUvkKdaALvA==", "license": "Apache-2.0", "dependencies": { - "@vercel/node": "5.8.5", - "@vercel/static-config": "3.3.0" + "@vercel/node": "5.8.17", + "@vercel/static-config": "3.4.0" } }, "node_modules/@vercel/next": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.17.4.tgz", - "integrity": "sha512-XsvV4pwphvrSgRTlpkSOiraST9ZrzEXRpEKABaR3cLnVf/2OvY4ZHb7uGDWX1ogNKadEZKSVgk5nKBueornANw==", + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@vercel/next/-/next-4.19.0.tgz", + "integrity": "sha512-9B7juRNydQ9MU7xT8OE254ymhVrNdcOKlXrZ4anem8YEa34KvXjLczQhZEPdvTz9JaCXpYiEEGmd/D3t2oJ+Uw==", "license": "Apache-2.0", "dependencies": { - "@vercel/nft": "1.5.0" + "@vercel/nft": "1.10.0" } }, "node_modules/@vercel/nft": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.5.0.tgz", - "integrity": "sha512-IWTDeIoWhQ7ZtRO/JRKH+jhmeQvZYhtGPmzw/QGDY+wDCQqfm25P9yIdoAFagu4fWsK4IwZXDFIjrmp5rRm/sA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.10.0.tgz", + "integrity": "sha512-iLOW4fcsgkipfOh2Bw3wB38YDfxTlxr7+j4uFeui2OswkNT28jIitS/aMce7tS0mef1YPQ8zLIDYr3a0aahNrA==", "license": "MIT", "dependencies": { "@mapbox/node-pre-gyp": "^2.0.0", @@ -2855,19 +3138,19 @@ } }, "node_modules/@vercel/node": { - "version": "5.8.5", - "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.8.5.tgz", - "integrity": "sha512-NoqElZnk/K5bVsZE2Z1Pi5m0QRbS5m6cYN1YBA5mHIF/JpnztA8miTH4bj7cGMpNGkjfayjVfQ/VpHH5HAJ35Q==", + "version": "5.8.17", + "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.8.17.tgz", + "integrity": "sha512-n2DVzblqS43LTs4BV1iLfx8tjjrTegcSsyDgRzn70h6tQePYWjl+h0bU3X1stpITZtaYJSZYwVevuX1BJNZHHg==", "license": "Apache-2.0", "dependencies": { "@edge-runtime/node-utils": "2.3.0", "@edge-runtime/primitives": "4.1.0", "@edge-runtime/vm": "3.2.0", "@types/node": "20.11.0", - "@vercel/build-utils": "13.26.2", - "@vercel/error-utils": "2.1.0", - "@vercel/nft": "1.5.0", - "@vercel/static-config": "3.3.0", + "@vercel/build-utils": "13.30.0", + "@vercel/error-utils": "2.2.0", + "@vercel/nft": "1.10.0", + "@vercel/static-config": "3.4.0", "async-listen": "3.0.0", "cjs-module-lexer": "1.2.3", "edge-runtime": "2.5.9", @@ -2975,15 +3258,15 @@ } }, "node_modules/@vercel/prepare-flags-definitions": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@vercel/prepare-flags-definitions/-/prepare-flags-definitions-0.2.1.tgz", - "integrity": "sha512-ouXTsqn7I9xZ1KKezgvn/w3tZeQHL/tc52j9GHiOYi6kT8xgdbT8s2x8C9BQr44iceX0hfhtZwk9q7NuI2Tqbw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@vercel/prepare-flags-definitions/-/prepare-flags-definitions-0.3.0.tgz", + "integrity": "sha512-/0nuDFwYje0nqZnVKSd2VfJy2wOPQwbkas1qO1JQgtb0sLl+EeSCW4O9hrvq55pN50PNlAZ/APSeWHIAT9ZGHg==", "license": "MIT" }, "node_modules/@vercel/python": { - "version": "6.43.2", - "resolved": "https://registry.npmjs.org/@vercel/python/-/python-6.43.2.tgz", - "integrity": "sha512-pFE20KP7FOCwCjHvB7iECu/Q9BFw70pHaU/kb+XyHvS7mCCeZIdFdZaMHolcBKVxz/Ju6QhtZe5e84vcbBw5OA==", + "version": "6.45.1", + "resolved": "https://registry.npmjs.org/@vercel/python/-/python-6.45.1.tgz", + "integrity": "sha512-2ay12lt3Cu6xS6qiaKNNwALRKxI1AE3rtHDfFOP+BU4qJ2U5k7JmPxlDuU+CXKY+chQClQM2orgThJWeMoeQkw==", "license": "Apache-2.0", "dependencies": { "@vercel/python-analysis": "0.11.1" @@ -3028,13 +3311,13 @@ } }, "node_modules/@vercel/redwood": { - "version": "2.4.13", - "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.4.13.tgz", - "integrity": "sha512-pXWzVctZea/J7WMQstjsYUDiMc6oJF72p8J5YZnLSCJWg7m+/dLzYGfaUSEo6Q0JpiO/NOcDmG3WENpn7kHwzg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@vercel/redwood/-/redwood-2.5.0.tgz", + "integrity": "sha512-LO24CbieV57rGAqrq5n5z/B+fMYeUqbE/Ge3qMeKRuS3Q9awgcBgB6WYLCe8crHM7XJd5AZjbuyoS/6k3r0X0w==", "license": "Apache-2.0", "dependencies": { - "@vercel/nft": "1.5.0", - "@vercel/static-config": "3.3.0", + "@vercel/nft": "1.10.0", + "@vercel/static-config": "3.4.0", "semver": "6.3.1", "ts-morph": "12.0.0" } @@ -3049,14 +3332,14 @@ } }, "node_modules/@vercel/remix-builder": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-5.8.2.tgz", - "integrity": "sha512-iiL8ppHkt+tIyLUEKQQQQmqVsoyZSPGc0zqIQ9lRUQLSMzxsgh57LPBjDA8AJrdLHXyxQQwNdHEtuMFZaKOG2w==", + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/@vercel/remix-builder/-/remix-builder-5.9.1.tgz", + "integrity": "sha512-s0SpfV640nmQ1BsKCPMYugGrH/V+319onTo2ZILSmsy6NTBlmeN0zJU9nPcP8dBEotGqtp68NfOlOUUdrVBzkw==", "license": "Apache-2.0", "dependencies": { - "@vercel/error-utils": "2.1.0", - "@vercel/nft": "1.5.0", - "@vercel/static-config": "3.3.0", + "@vercel/error-utils": "2.2.0", + "@vercel/nft": "1.10.0", + "@vercel/static-config": "3.4.0", "path-to-regexp": "6.1.0", "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", "ts-morph": "12.0.0" @@ -3135,26 +3418,43 @@ "license": "ISC" }, "node_modules/@vercel/sandbox": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@vercel/sandbox/-/sandbox-1.9.0.tgz", - "integrity": "sha512-zgr1ad0tkT1xZn/8Vxo60wOUOLqMAVGo4WqJQ8/UDcUtWynNJsBjI2tiMdWZrAo9EKH1MIqEzJNkcclF0UT1EQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vercel/sandbox/-/sandbox-2.1.1.tgz", + "integrity": "sha512-gKhW+YlvU15Qxya7jQKByB+sqA1dWat5zx/rvxT52E3Ryg9MAIXgqD5wd1d+CoJDbdHL26gIOcksTZY5sFpplA==", "license": "Apache-2.0", "dependencies": { "@vercel/oidc": "3.2.0", + "@workflow/serde": "4.1.0-beta.2", "async-retry": "1.3.3", + "jose": "6.2.3", "jsonlines": "0.1.1", "ms": "2.1.3", "picocolors": "^1.1.1", "tar-stream": "3.1.7", - "undici": "^7.16.0", + "undici": "^7.27.1", "xdg-app-paths": "5.1.0", "zod": "3.24.4" } }, + "node_modules/@vercel/sandbox/node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@vercel/sandbox/node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/@vercel/sandbox/node_modules/undici": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", + "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -3170,21 +3470,21 @@ } }, "node_modules/@vercel/static-build": { - "version": "2.9.31", - "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.9.31.tgz", - "integrity": "sha512-alC4tglwsksalNt/Pd0C5oCupK660nUhh0k9en39yQBa+7vRZx4//IDAkAxFB5AmDzsPLIHZVmLwM57bQaL9Rw==", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@vercel/static-build/-/static-build-2.10.3.tgz", + "integrity": "sha512-+IipWidX6mL1Zck8Khw4wSXHPSgDfkapvcuWA9wSCmhnk2GL2Iuu+6vab+g8UPahv+QDUYm8Tphhadg6dICZnA==", "license": "Apache-2.0", "dependencies": { "@vercel/gatsby-plugin-vercel-analytics": "1.0.11", - "@vercel/gatsby-plugin-vercel-builder": "2.2.8", - "@vercel/static-config": "3.3.0", + "@vercel/gatsby-plugin-vercel-builder": "2.2.19", + "@vercel/static-config": "3.4.0", "ts-morph": "12.0.0" } }, "node_modules/@vercel/static-config": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.3.0.tgz", - "integrity": "sha512-GpS3tPwUeDJCkrKbMNtS2XLRFgfxTlN7YNUL+Bo23+fGolrDw6Oq79R3yvxTYgqRaJMGSEqC7iMw6mj6I5loxg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.4.0.tgz", + "integrity": "sha512-wCq90CMUB//ggnFh77NQO1xaLFsS4LigQIqKrH6ohnr9Br/KI1FhlErx62WfCOuueWaW+LVsbLOqNXIUjK8t6A==", "license": "Apache-2.0", "dependencies": { "ajv": "8.6.3", @@ -3218,6 +3518,135 @@ } } }, + "node_modules/@vitest/expect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", + "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", + "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.8", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", + "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", + "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.8", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", + "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "@vitest/utils": "4.1.8", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", + "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", + "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.8", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@workflow/serde": { + "version": "4.1.0-beta.2", + "resolved": "https://registry.npmjs.org/@workflow/serde/-/serde-4.1.0-beta.2.tgz", + "integrity": "sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==", + "license": "Apache-2.0" + }, "node_modules/abbrev": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", @@ -3228,9 +3657,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3274,55 +3703,54 @@ } }, "node_modules/antd": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/antd/-/antd-6.3.7.tgz", - "integrity": "sha512-WTHi4bHVNKpYXLHESzU0Tts7rRNQeL84Bph9dfI3Qw7mHbTulExDcYKNHny5CTXcrBBOpraXbU9miBAwUR5vaw==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/antd/-/antd-6.4.4.tgz", + "integrity": "sha512-lgPz4KhfhiYddV/qPYo0ieqWimCVgV2OQF72mbeGNixE753JWNnmEc7UNGy08wBS/zZ7hxrmX0pc5aX7EUaIIg==", "license": "MIT", "dependencies": { "@ant-design/colors": "^8.0.1", "@ant-design/cssinjs": "^2.1.2", "@ant-design/cssinjs-utils": "^2.1.2", "@ant-design/fast-color": "^3.0.1", - "@ant-design/icons": "^6.1.1", + "@ant-design/icons": "^6.2.5", "@ant-design/react-slick": "~2.0.0", - "@babel/runtime": "^7.28.4", - "@rc-component/cascader": "~1.14.0", + "@babel/runtime": "^7.29.2", + "@rc-component/cascader": "~1.16.1", "@rc-component/checkbox": "~2.0.0", "@rc-component/collapse": "~1.2.0", "@rc-component/color-picker": "~3.1.1", - "@rc-component/dialog": "~1.8.4", + "@rc-component/dialog": "~1.9.0", "@rc-component/drawer": "~1.4.2", "@rc-component/dropdown": "~1.0.2", - "@rc-component/form": "~1.8.1", + "@rc-component/form": "~1.8.3", "@rc-component/image": "~1.9.0", - "@rc-component/input": "~1.1.2", + "@rc-component/input": "~1.3.1", "@rc-component/input-number": "~1.6.2", - "@rc-component/mentions": "~1.6.0", - "@rc-component/menu": "~1.2.0", - "@rc-component/motion": "^1.3.2", + "@rc-component/mentions": "~1.9.0", + "@rc-component/menu": "~1.3.1", + "@rc-component/motion": "^1.3.3", "@rc-component/mutate-observer": "^2.0.1", - "@rc-component/notification": "~1.2.0", - "@rc-component/pagination": "~1.2.0", - "@rc-component/picker": "~1.9.1", + "@rc-component/notification": "~2.0.7", + "@rc-component/pagination": "~1.3.0", + "@rc-component/picker": "~1.10.0", "@rc-component/progress": "~1.0.2", - "@rc-component/qrcode": "~1.1.1", + "@rc-component/qrcode": "~2.0.0", "@rc-component/rate": "~1.0.1", "@rc-component/resize-observer": "^1.1.2", "@rc-component/segmented": "~1.3.0", - "@rc-component/select": "~1.6.15", + "@rc-component/select": "~1.7.1", "@rc-component/slider": "~1.0.1", "@rc-component/steps": "~1.2.2", "@rc-component/switch": "~1.0.3", - "@rc-component/table": "~1.9.1", - "@rc-component/tabs": "~1.7.0", - "@rc-component/textarea": "~1.1.2", + "@rc-component/table": "~1.10.2", + "@rc-component/tabs": "~1.9.1", "@rc-component/tooltip": "~1.4.0", - "@rc-component/tour": "~2.3.0", - "@rc-component/tree": "~1.2.4", - "@rc-component/tree-select": "~1.8.0", - "@rc-component/trigger": "^3.9.0", - "@rc-component/upload": "~1.1.0", - "@rc-component/util": "^1.10.1", + "@rc-component/tour": "~2.4.0", + "@rc-component/tree": "~1.3.2", + "@rc-component/tree-select": "~1.10.0", + "@rc-component/trigger": "^3.9.1", + "@rc-component/upload": "~1.1.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1", "dayjs": "^1.11.11", "scroll-into-view-if-needed": "^3.1.0", @@ -3355,6 +3783,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/ast-types": { "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", @@ -3395,16 +3833,42 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", - "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz", + "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, + "node_modules/axios/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/axios/node_modules/proxy-from-env": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", @@ -3414,6 +3878,20 @@ "node": ">=10" } }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3421,9 +3899,9 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.1.tgz", + "integrity": "sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==", "license": "Apache-2.0", "peerDependencies": { "bare-abort-controller": "*" @@ -3453,9 +3931,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3505,6 +3983,16 @@ "node": ">= 0.4" } }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/chokidar": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.0.tgz", @@ -3601,6 +4089,13 @@ "node": ">=8" } }, + "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/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", @@ -3771,9 +4266,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "license": "MIT" }, "node_modules/debug": { @@ -3799,6 +4294,15 @@ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", "license": "MIT" }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/degenerator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", @@ -3898,12 +4402,6 @@ "node": ">= 14" } }, - "node_modules/edge-runtime/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "license": "ISC" - }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -4130,6 +4628,16 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4430,9 +4938,9 @@ } }, "node_modules/glob/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -4639,6 +5147,21 @@ "node": ">=4" } }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4693,6 +5216,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5025,18 +5560,18 @@ } }, "node_modules/lru-cache": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz", - "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==", + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/lucide-react": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.14.0.tgz", - "integrity": "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.18.0.tgz", + "integrity": "sha512-LZDb7H/0YfM+RJncD0hDQRCAu+vSGODqpe35TuVI8EuXaRjkczbsx7p8dY4J87F/MUSj6bpYqeI8nw8qXaAdmA==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -5051,6 +5586,16 @@ "node": ">=12" } }, + "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/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -5303,6 +5848,20 @@ "node": ">=8" } }, + "node_modules/obug": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5327,6 +5886,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/os-paths": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/os-paths/-/os-paths-4.4.0.tgz", @@ -5468,6 +6044,13 @@ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "license": "MIT" }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -5475,9 +6058,9 @@ "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==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "license": "ISC" }, "node_modules/picomatch": { @@ -5493,9 +6076,9 @@ } }, "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "dev": true, "funding": [ { @@ -5513,7 +6096,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5521,6 +6104,13 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss/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/pretty-ms": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", @@ -5631,30 +6221,30 @@ } }, "node_modules/react": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", - "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", + "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", - "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", + "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { - "react": "^19.2.6" + "react": "^19.2.7" } }, "node_modules/react-hook-form": { - "version": "7.75.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.75.0.tgz", - "integrity": "sha512-Ovv94H+0p3sJ7B9B5QxPuCP1u8V/cHuVGyH55cSwodYDtoJwK+fqk3vjfIgSX59I2U/bU4z0nRJ9HMLpNiWEmw==", + "version": "7.79.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.79.0.tgz", + "integrity": "sha512-mhYp/MTmXvzYX6AJcJVko0rktoIhhmRnEouObj4wF5i/tCttgJvnp1+9wRkpITZjDTqpo4IOSJqu0dBlPlV/Lw==", "license": "MIT", "engines": { "node": ">=18.0.0" @@ -5698,9 +6288,9 @@ } }, "node_modules/react-router": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.15.0.tgz", - "integrity": "sha512-HW9vYwuM8f4yx66Izy8xfrzCM+SBJluoZcCbww9A1TySax11S5Vgw6fi3ZjMONw9J4gQwngL7PzkyIpJJpJ7RQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.17.0.tgz", + "integrity": "sha512-FDELK7rTMlCHO5+reyXsPlmfr7N1F91lPHsWYfMEGQm/KQ+F4JFM8jGoeQDmDvdTs93Fw9aSilH+uKRb4/jXvQ==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -5720,12 +6310,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.15.0.tgz", - "integrity": "sha512-VcrVg64Fo8nwBvDscajG8gRTLIuTC6N50nb22l2HOOV4PTOHgoGp8mUjy9wLiHYoYTSYI36tUnXZgasSRFZorQ==", + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.17.0.tgz", + "integrity": "sha512-fyU2yjGups/hE6Xz0I5ZYbVL8Gx29eCjgpHaRaTaVU+OOAdfRX05KsvyRm0GO8YQwOkhpU3MurW1jyMUJn+zSw==", "license": "MIT", "dependencies": { - "react-router": "7.15.0" + "react-router": "7.17.0" }, "engines": { "node": ">=20.0.0" @@ -5921,12 +6511,13 @@ "license": "MIT" }, "node_modules/sandbox": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/sandbox/-/sandbox-2.5.6.tgz", - "integrity": "sha512-tnFr7nyiuEhsAGb+xy60SDbij0790X+FgDljh3J/2HaRM6yQgNJkQKHbDH8ld7mR+PozXGgEfJ2Dc/5OyFnwsg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/sandbox/-/sandbox-3.1.2.tgz", + "integrity": "sha512-g93rma0Z9Aa6EoTktzYnGZmQvMzm7j73BekJIMwmkdWR5uryZ+6hBCADtd3JKGAB27k+ubnG7HHsZqtscAMzIQ==", "license": "Apache-2.0", "dependencies": { - "@vercel/sandbox": "1.9.0", + "@vercel/sandbox": "2.1.1", + "async-retry": "1.3.3", "debug": "^4.4.1", "zod": "^4.1.1" }, @@ -5951,9 +6542,9 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5995,6 +6586,13 @@ "node": ">=8" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", @@ -6092,6 +6690,13 @@ "node": ">=20.16.0" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, "node_modules/stat-mode": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.3.0.tgz", @@ -6107,6 +6712,13 @@ "node": ">= 0.6" } }, + "node_modules/std-env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", + "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -6146,9 +6758,9 @@ } }, "node_modules/streamx": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", - "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.0.tgz", + "integrity": "sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==", "license": "MIT", "dependencies": { "events-universal": "^1.0.0", @@ -6205,20 +6817,6 @@ "streamx": "^2.15.0" } }, - "node_modules/tar-stream/node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", @@ -6237,20 +6835,6 @@ "b4a": "^1.6.4" } }, - "node_modules/text-decoder/node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, "node_modules/three": { "version": "0.184.0", "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", @@ -6299,6 +6883,13 @@ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -6306,9 +6897,9 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { @@ -6322,6 +6913,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6886,9 +7487,9 @@ } }, "node_modules/undici-types": { - "version": "7.19.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", - "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", "dev": true, "license": "MIT" }, @@ -6929,42 +7530,43 @@ } }, "node_modules/vercel": { - "version": "54.5.0", - "resolved": "https://registry.npmjs.org/vercel/-/vercel-54.5.0.tgz", - "integrity": "sha512-9NANKCdLqfpUQu7fGWelmPFJvnNK73PBH/4oGL4OMAfjLjrS8vDShFXm5lKQJ+01sgziLVjWek8rldOrpe7Dqg==", + "version": "54.14.2", + "resolved": "https://registry.npmjs.org/vercel/-/vercel-54.14.2.tgz", + "integrity": "sha512-XMUBq4mEYniGGIHTAIY7Egop120x6d2NLZ9wezk3032VfKRMsB3q2UYFiZduWETG/TwFSddlNJ6UI8jBskleog==", "license": "Apache-2.0", "dependencies": { - "@vercel/backends": "0.8.0", + "@vercel/backends": "0.8.14", "@vercel/blob": "2.4.0", - "@vercel/build-utils": "13.26.2", - "@vercel/cli-config": "0.1.2", + "@vercel/build-utils": "13.30.0", + "@vercel/cli-auth": "0.3.0", + "@vercel/cli-config": "0.2.0", "@vercel/detect-agent": "1.2.3", - "@vercel/elysia": "0.1.81", - "@vercel/express": "0.1.91", - "@vercel/fastify": "0.1.84", + "@vercel/elysia": "0.1.93", + "@vercel/express": "0.1.105", + "@vercel/fastify": "0.1.96", "@vercel/fun": "1.3.0", - "@vercel/go": "3.8.0", - "@vercel/h3": "0.1.90", - "@vercel/hono": "0.2.84", - "@vercel/hydrogen": "1.3.7", - "@vercel/koa": "0.1.64", - "@vercel/nestjs": "0.2.85", - "@vercel/next": "4.17.4", - "@vercel/node": "5.8.5", - "@vercel/prepare-flags-definitions": "0.2.1", - "@vercel/python": "6.43.2", - "@vercel/redwood": "2.4.13", - "@vercel/remix-builder": "5.8.2", + "@vercel/go": "3.9.0", + "@vercel/h3": "0.1.102", + "@vercel/hono": "0.2.96", + "@vercel/hydrogen": "1.4.0", + "@vercel/koa": "0.1.76", + "@vercel/nestjs": "0.2.97", + "@vercel/next": "4.19.0", + "@vercel/node": "5.8.17", + "@vercel/prepare-flags-definitions": "0.3.0", + "@vercel/python": "6.45.1", + "@vercel/redwood": "2.5.0", + "@vercel/remix-builder": "5.9.1", "@vercel/ruby": "2.4.0", "@vercel/rust": "1.3.0", - "@vercel/static-build": "2.9.31", + "@vercel/static-build": "2.10.3", "chokidar": "4.0.0", "esbuild": "0.27.0", "form-data": "^4.0.0", "jose": "5.9.6", "luxon": "^3.4.0", "proxy-agent": "6.4.0", - "sandbox": "2.5.6", + "sandbox": "3.1.2", "smol-toml": "1.5.2", "zod": "4.1.11" }, @@ -7008,17 +7610,17 @@ } }, "node_modules/vite": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.11.tgz", - "integrity": "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow==", + "version": "8.0.16", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", + "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", - "postcss": "^8.5.14", - "rolldown": "1.0.0-rc.18", - "tinyglobby": "^0.2.16" + "postcss": "^8.5.15", + "rolldown": "1.0.3", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" @@ -7085,10 +7687,44 @@ } } }, + "node_modules/vite/node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/vite/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/vite/node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/vite/node_modules/@oxc-project/types": { - "version": "0.128.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", - "integrity": "sha512-huv1Y/LzBJkBVHt3OlC7u0zHBW9qXf1FdD7sGmc1rXc2P1mTwHssYv7jyGx5KAACSCH+9B3Bhn6Z9luHRvf7pQ==", + "version": "0.133.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", + "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", "dev": true, "license": "MIT", "funding": { @@ -7096,9 +7732,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.18.tgz", - "integrity": "sha512-lIDyUAfD7U3+BWKzdxMbJcsYHuqXqmGz40aeRqvuAm3y5TkJSYTBW2RDrn65DJFPQqVjUAUqq5uz8urzQ8aBdQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", + "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", "cpu": [ "arm64" ], @@ -7113,9 +7749,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.18.tgz", - "integrity": "sha512-apJq2ktnGp27nSInMR5Vcj8kY6xJzDAvfdIFlpDcAK/w4cDO58qVoi1YQsES/SKiFNge/6e4CUzgjfHduYqWpQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", + "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", "cpu": [ "arm64" ], @@ -7130,9 +7766,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.18.tgz", - "integrity": "sha512-5Ofot8xbs+pxRHJqm9/9N/4sTQOvdrwEsmPE9pdLEEoAbdZtG6F2LMDfO1sp6ZAtXJuJV/21ew2srq3W8NXB5g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", + "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", "cpu": [ "x64" ], @@ -7147,9 +7783,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.18.tgz", - "integrity": "sha512-7h8eeOTT1eyqJyx64BFCnWZpNm486hGWt2sqeLLgDxA0xI1oGZ9H7gK1S85uNGmBhkdPwa/6reTxfFFKvIsebw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", + "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", "cpu": [ "x64" ], @@ -7164,9 +7800,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.18.tgz", - "integrity": "sha512-eRcm/HVt9U/JFu5RKAEKwGQYtDCKWLiaH6wOnsSEp6NMBb/3Os8LgHZlNyzMpFVNmiiMFlfb2zEnebfzJrHFmg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", + "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", "cpu": [ "arm" ], @@ -7181,13 +7817,16 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-SOrT/cT4ukTmgnrEz/Hg3m7LBnuCLW9psDeMKrimRWY4I8DmnO7Lco8W2vtqPmMkbVu8iJ+g4GFLVLLOVjJ9DQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", + "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -7198,13 +7837,16 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.18.tgz", - "integrity": "sha512-QWjdxN1HJCpBTAcZ5N5F7wju3gVPzRzSpmGzx7na0c/1qpN9CFil+xt+l9lV/1M6/gqHSNXCiqPfwhVJPeLnug==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", + "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -7215,13 +7857,16 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.18.tgz", - "integrity": "sha512-uCo8ElcCIAMyYAZyuIZ81oFkhTSIllNvUCHCAlbhlN4ji3uC28h7IIdlXyIvGO7HsuqnV9p3rD/bpH7XhIyhRw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", + "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -7232,13 +7877,16 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.18.tgz", - "integrity": "sha512-XNOQZtuE6yUIvx4rwGemwh8kpL1xvU41FXy/s9K7T/3JVcqGzo3NfKM2HrbrGgfPYGFW42f07Wk++aOC6B9NWA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", + "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -7249,9 +7897,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.18.tgz", - "integrity": "sha512-tSn/kzrfa7tNOXr7sEacDBN4YsIqTyLqh45IO0nHDwtpKIDNDJr+VFojt+4klSpChxB29JLyduSsE0MKEwa65A==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", + "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", "cpu": [ "arm64" ], @@ -7266,9 +7914,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.18.tgz", - "integrity": "sha512-+J9YGmc+czgqlhYmwun3S3O0FIZhsH8ep2456xwjAdIOmuJxM7xz4P4PtrxU+Bz17a/5bqPA8o3HAAoX0teUdg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", + "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", "cpu": [ "wasm32" ], @@ -7285,9 +7933,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.18.tgz", - "integrity": "sha512-zsu47DgU0FQzSwi6sU9dZoEdUv7pc1AptSEz/Z8HBg54sV0Pbs3N0+CrIbTsgiu6EyoaNN9CHboqbLaz9lhOyQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", + "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", "cpu": [ "arm64" ], @@ -7302,9 +7950,9 @@ } }, "node_modules/vite/node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.18.tgz", - "integrity": "sha512-7H+3yqGgmnlDTRRhw/xpYY9J1kf4GC681nVc4GqKhExZTDrVVrV2tsOR9kso0fvgBdcTCcQShx4SLLoHgaLwhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", + "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", "cpu": [ "x64" ], @@ -7319,21 +7967,21 @@ } }, "node_modules/vite/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz", - "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, "node_modules/vite/node_modules/rolldown": { - "version": "1.0.0-rc.18", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz", - "integrity": "sha512-phmyKBpuBdRYDf4hgyynGAYn/rDDe+iZXKVJ7WX5b1zQzpLkP5oJRPGsfJuHdzPMlyyEO/4sPW6yfSx2gf7lVg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", + "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.128.0", - "@rolldown/pluginutils": "1.0.0-rc.18" + "@oxc-project/types": "=0.133.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { "rolldown": "bin/cli.mjs" @@ -7342,21 +7990,128 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.18", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.18", - "@rolldown/binding-darwin-x64": "1.0.0-rc.18", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.18", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.18", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.18", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.18", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.18", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.18", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.18", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.18", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.18" + "@rolldown/binding-android-arm64": "1.0.3", + "@rolldown/binding-darwin-arm64": "1.0.3", + "@rolldown/binding-darwin-x64": "1.0.3", + "@rolldown/binding-freebsd-x64": "1.0.3", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", + "@rolldown/binding-linux-arm64-gnu": "1.0.3", + "@rolldown/binding-linux-arm64-musl": "1.0.3", + "@rolldown/binding-linux-ppc64-gnu": "1.0.3", + "@rolldown/binding-linux-s390x-gnu": "1.0.3", + "@rolldown/binding-linux-x64-gnu": "1.0.3", + "@rolldown/binding-linux-x64-musl": "1.0.3", + "@rolldown/binding-openharmony-arm64": "1.0.3", + "@rolldown/binding-wasm32-wasi": "1.0.3", + "@rolldown/binding-win32-arm64-msvc": "1.0.3", + "@rolldown/binding-win32-x64-msvc": "1.0.3" + } + }, + "node_modules/vitest": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", + "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.8", + "@vitest/mocker": "4.1.8", + "@vitest/pretty-format": "4.1.8", + "@vitest/runner": "4.1.8", + "@vitest/snapshot": "4.1.8", + "@vitest/spy": "4.1.8", + "@vitest/utils": "4.1.8", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.8", + "@vitest/browser-preview": "4.1.8", + "@vitest/browser-webdriverio": "4.1.8", + "@vitest/coverage-istanbul": "4.1.8", + "@vitest/coverage-v8": "4.1.8", + "@vitest/ui": "4.1.8", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vitest/node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, "node_modules/web-vitals": { @@ -7396,6 +8151,23 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7471,9 +8243,9 @@ } }, "node_modules/zustand": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.13.tgz", - "integrity": "sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==", + "version": "5.0.14", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.14.tgz", + "integrity": "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==", "license": "MIT", "engines": { "node": ">=12.20.0" diff --git a/admin-service/package.json b/admin-service/package.json index 4c4cec5e..cb2fe54e 100644 --- a/admin-service/package.json +++ b/admin-service/package.json @@ -8,6 +8,7 @@ "dev": "vite", "build": "vite build", "build:check": "tsc -b && vite build", + "test": "vitest run", "preview": "vite preview" }, "dependencies": { @@ -15,29 +16,30 @@ "@hookform/resolvers": "^5.2.2", "@tanstack/react-query": "^5.101.0", "@vercel/analytics": "^2.0.1", - "antd": "^6.3.7", - "axios": "^1.17.0", + "antd": "^6.4.4", + "axios": "^1.18.0", "dayjs": "^1.11.21", "dotenv": "^17.4.2", "gsap": "^3.15.0", - "lucide-react": "^1.17.0", + "lucide-react": "^1.21.0", "react": "^19.2.7", "react-dom": "^19.2.7", - "react-hook-form": "^7.78.0", - "react-router-dom": "^7.17.0", + "react-hook-form": "^7.80.0", + "react-router-dom": "^7.18.0", "recharts": "^3.8.1", "three": "^0.184.0", - "vercel": "^54.6.1", + "vercel": "^54.14.5", "zod": "^4.4.3", "zustand": "^5.0.14" }, "devDependencies": { - "@types/node": "^25.9.2", + "@types/node": "^25.9.4", "@types/react": "^19.2.17", "@types/react-dom": "^19.2.3", "@types/three": "^0.184.1", "@vitejs/plugin-react": "^6.0.1", "typescript": "^6.0.3", - "vite": "^8.0.16" + "vite": "^8.0.16", + "vitest": "^4.1.8" } } diff --git a/admin-service/pnpm-lock.yaml b/admin-service/pnpm-lock.yaml index 93b7a586..a848f678 100644 --- a/admin-service/pnpm-lock.yaml +++ b/admin-service/pnpm-lock.yaml @@ -10,25 +10,25 @@ importers: dependencies: '@gsap/react': specifier: ^2.1.2 - version: 2.1.2(gsap@3.15.0)(react@19.2.6) + version: 2.1.2(gsap@3.15.0)(react@19.2.7) '@hookform/resolvers': specifier: ^5.2.2 - version: 5.4.0(react-hook-form@7.78.0(react@19.2.6)) + version: 5.4.0(react-hook-form@7.80.0(react@19.2.7)) '@tanstack/react-query': specifier: ^5.101.0 - version: 5.101.0(react@19.2.6) + version: 5.101.0(react@19.2.7) '@vercel/analytics': specifier: ^2.0.1 - version: 2.0.1(react@19.2.6) + version: 2.0.1(react@19.2.7) antd: - specifier: ^6.3.7 - version: 6.4.3(luxon@3.7.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^6.4.4 + version: 6.4.4(luxon@3.7.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) axios: - specifier: ^1.17.0 - version: 1.17.0 + specifier: ^1.18.0 + version: 1.18.0 dayjs: - specifier: ^1.11.20 - version: 1.11.20 + specifier: ^1.11.21 + version: 1.11.21 dotenv: specifier: ^17.4.2 version: 17.4.2 @@ -36,57 +36,60 @@ importers: specifier: ^3.15.0 version: 3.15.0 lucide-react: - specifier: ^1.17.0 - version: 1.17.0(react@19.2.6) + specifier: ^1.21.0 + version: 1.21.0(react@19.2.7) react: - specifier: ^19.2.5 - version: 19.2.6 + specifier: ^19.2.7 + version: 19.2.7 react-dom: - specifier: ^19.2.6 - version: 19.2.6(react@19.2.6) + specifier: ^19.2.7 + version: 19.2.7(react@19.2.7) react-hook-form: - specifier: ^7.78.0 - version: 7.78.0(react@19.2.6) + specifier: ^7.80.0 + version: 7.80.0(react@19.2.7) react-router-dom: - specifier: ^7.16.0 - version: 7.16.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + specifier: ^7.18.0 + version: 7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) recharts: specifier: ^3.8.1 - version: 3.8.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react-is@18.3.1)(react@19.2.6)(redux@5.0.1) + version: 3.8.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@18.3.1)(react@19.2.7)(redux@5.0.1) three: specifier: ^0.184.0 version: 0.184.0 vercel: - specifier: ^54.6.1 - version: 54.6.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + specifier: ^54.14.5 + version: 54.14.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) zod: specifier: ^4.4.3 version: 4.4.3 zustand: specifier: ^5.0.14 - version: 5.0.14(@types/react@19.2.15)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) + version: 5.0.14(@types/react@19.2.17)(immer@11.1.8)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) devDependencies: '@types/node': - specifier: ^25.6.2 - version: 25.9.1 + specifier: ^25.9.4 + version: 25.9.4 '@types/react': - specifier: ^19.2.14 - version: 19.2.15 + specifier: ^19.2.17 + version: 19.2.17 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.15) + version: 19.2.3(@types/react@19.2.17) '@types/three': specifier: ^0.184.1 version: 0.184.1 '@vitejs/plugin-react': specifier: ^6.0.1 - version: 6.0.2(vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.0)(tsx@4.21.0)) + version: 6.0.2(vite@8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0)) typescript: specifier: ^6.0.3 version: 6.0.3 vite: specifier: ^8.0.16 - version: 8.0.16(@types/node@25.9.1)(esbuild@0.27.0)(tsx@4.21.0) + version: 8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0) + vitest: + specifier: ^4.1.8 + version: 4.1.9(@edge-runtime/vm@3.2.0)(@types/node@25.9.4)(vite@8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0)) packages: @@ -112,8 +115,8 @@ packages: '@ant-design/icons-svg@4.4.2': resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} - '@ant-design/icons@6.2.3': - resolution: {integrity: sha512-Pl3aoAtxQeKryYnt6VvDJtOxMOtA8wrRSACe/pTjOAIG3fdHrWm6Ivb4ku9tsFjYroSXBKirvuxG4QkwBXD9gg==} + '@ant-design/icons@6.2.5': + resolution: {integrity: sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw==} engines: {node: '>=8'} peerDependencies: react: '>=16.0.0' @@ -125,8 +128,8 @@ packages: react: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} '@bytecodealliance/preview2-shim@0.17.6': @@ -353,17 +356,107 @@ packages: resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@mapbox/node-pre-gyp@2.0.3': resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} engines: {node: '>=18'} hasBin: true + '@napi-rs/keyring-darwin-arm64@1.2.0': + resolution: {integrity: sha512-CA83rDeyONDADO25JLZsh3eHY8yTEtm/RS6ecPsY+1v+dSawzT9GywBMu2r6uOp1IEhQs/xAfxgybGAFr17lSA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/keyring-darwin-x64@1.2.0': + resolution: {integrity: sha512-dBHjtKRCj4ByfnfqIKIJLo3wueQNJhLRyuxtX/rR4K/XtcS7VLlRD01XXizjpre54vpmObj63w+ZpHG+mGM8uA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/keyring-freebsd-x64@1.2.0': + resolution: {integrity: sha512-DPZFr11pNJSnaoh0dzSUNF+T6ORhy3CkzUT3uGixbA71cAOPJ24iG8e8QrLOkuC/StWrAku3gBnth2XMWOcR3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/keyring-linux-arm-gnueabihf@1.2.0': + resolution: {integrity: sha512-8xv6DyEMlvRdqJzp4F39RLUmmTQsLcGYYv/3eIfZNZN1O5257tHxTrFYqAsny659rJJK2EKeSa7PhrSibQqRWQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/keyring-linux-arm64-gnu@1.2.0': + resolution: {integrity: sha512-Pu2V6Py+PBt7inryEecirl+t+ti8bhZphjP+W68iVaXHUxLdWmkgL9KI1VkbRHbx5k8K5Tew9OP218YfmVguIA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@napi-rs/keyring-linux-arm64-musl@1.2.0': + resolution: {integrity: sha512-8TDymrpC4P1a9iDEaegT7RnrkmrJN5eNZh3Im3UEV5PPYGtrb82CRxsuFohthCWQW81O483u1bu+25+XA4nKUw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/keyring-linux-riscv64-gnu@1.2.0': + resolution: {integrity: sha512-awsB5XI1MYL7fwfjMDGmKOWvNgJEO7mM7iVEMS0fO39f0kVJnOSjlu7RHcXAF0LOx+0VfF3oxbWqJmZbvRCRHw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@napi-rs/keyring-linux-x64-gnu@1.2.0': + resolution: {integrity: sha512-8E+7z4tbxSJXxIBqA+vfB1CGajpCDRyTyqXkBig5NtASrv4YXcntSo96Iah2QDR5zD3dSTsmbqJudcj9rKKuHQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/keyring-linux-x64-musl@1.2.0': + resolution: {integrity: sha512-8RZ8yVEnmWr/3BxKgBSzmgntI7lNEsY7xouNfOsQkuVAiCNmxzJwETspzK3PQ2FHtDxgz5vHQDEBVGMyM4hUHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@napi-rs/keyring-win32-arm64-msvc@1.2.0': + resolution: {integrity: sha512-AoqaDZpQ6KPE19VBLpxyORcp+yWmHI9Xs9Oo0PJ4mfHma4nFSLVdhAubJCxdlNptHe5va7ghGCHj3L9Akiv4cQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/keyring-win32-ia32-msvc@1.2.0': + resolution: {integrity: sha512-EYL+EEI6bCsYi3LfwcQdnX3P/R76ENKNn+3PmpGheBsUFLuh0gQuP7aMVHM4rTw6UVe+L3vCLZSptq/oeacz0A==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/keyring-win32-x64-msvc@1.2.0': + resolution: {integrity: sha512-xFlx/TsmqmCwNU9v+AVnEJgoEAlBYgzFF5Ihz1rMpPAt4qQWWkMd4sCyM1gMJ1A/GnRqRegDiQpwaxGUHFtFbA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/keyring@1.2.0': + resolution: {integrity: sha512-d0d4Oyxm+v980PEq1ZH2PmS6cvpMIRc17eYpiU47KgW+lzxklMu6+HOEOPmxrpnF/XQZ0+Q78I2mgMhbIIo/dg==} + engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@1.1.4': resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@napi-rs/wasm-runtime@1.1.5': + resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -509,12 +602,12 @@ packages: cpu: [x64] os: [win32] - '@rc-component/async-validator@5.1.0': - resolution: {integrity: sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==} + '@rc-component/async-validator@6.0.0': + resolution: {integrity: sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==} engines: {node: '>=14.x'} - '@rc-component/cascader@1.15.0': - resolution: {integrity: sha512-ZzpMtwFCRo3fbXHuDnncARJMZQjdqA2w7aDuPofNQt+aDx39st1hgfIpEwTBLhe2Hqsvs/zOr8RTtgxTkCPySw==} + '@rc-component/cascader@1.16.1': + resolution: {integrity: sha512-wxLopwM+EBed0zNNGdnGE4coYoqcO+XD42fHgn+pDvO+XzhNFbdgSlSNXdKocIYqccvqgWvoxDPNb0OVRdi59A==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' @@ -537,11 +630,11 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/context@2.0.1': - resolution: {integrity: sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==} + '@rc-component/context@2.0.2': + resolution: {integrity: sha512-uiGpAlblCNlziHPwj4S4Iy/oemeuz/hR03mbiEjTCXwsqOIN3BOzsRMyDwpyO5Fm0vIEEJRUf9ZtbRLbhksuTA==} peerDependencies: - react: '>=16.9.0' - react-dom: '>=16.9.0' + react: '>=18.0.0' + react-dom: '>=18.0.0' '@rc-component/dialog@1.9.0': resolution: {integrity: sha512-zbAAogkg4kkKum79sLE6M+vq1jSAW25zdkafrahgcTP9t9S//SD634Znd1A4c8F2Gc12ZKnehGLsVaaOvZzD2A==} @@ -561,8 +654,8 @@ packages: react: '>=16.11.0' react-dom: '>=16.11.0' - '@rc-component/form@1.8.1': - resolution: {integrity: sha512-8O7TB55Fi2mWIGvSnwZjk8jFqVNYyKDAswglwGShcbndxqzKz4cHwNtNaLjZlAeRge9wcB0LL8IWsC/Bl18raQ==} + '@rc-component/form@1.8.3': + resolution: {integrity: sha512-jNkat3uxZ246ELudKwnjQhnDI8+rSxgLxjztvQU3Mrb0G+LwDyOrPu9RNfekOjqU5GQ5QJepi225x+9LhCizJw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -580,8 +673,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/input@1.3.0': - resolution: {integrity: sha512-IUUNOdAuWuEvDEFFgfmwQl818tiDbvXwLgon4HL1q2hJeYkqrRrYwYhJN0zfPHGTDxs3gvyVC/C02D4hWFoIcA==} + '@rc-component/input@1.3.1': + resolution: {integrity: sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==} peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' @@ -592,18 +685,18 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/menu@1.3.0': - resolution: {integrity: sha512-u3NfiwpiEgT177qa5Yxm5QsI8i/93EBGpWj8HYZQDnh2pCZ2xtQCe/+w3pSR2NlwKOZDTCKzEhEyD09mGphssA==} + '@rc-component/menu@1.3.1': + resolution: {integrity: sha512-pSZl9nBPgKgxN0aaW7NilIBEwWsc+43S+ulGdWAg9afak96dNOGWsGx0DLLBB1VQsAJvo6bQMTDzXoPlEHsBEw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/mini-decimal@1.1.3': - resolution: {integrity: sha512-bk/FJ09fLf+NLODMAFll6CfYrHPBioTedhW6lxDBuuWucJEqFUd4l/D/5JgIi3dina6sYahB8iuPAZTNz2pMxw==} + '@rc-component/mini-decimal@1.1.4': + resolution: {integrity: sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==} engines: {node: '>=8.x'} - '@rc-component/motion@1.3.2': - resolution: {integrity: sha512-itfd+GztzJYAb04Z4RkEub1TbJAfZc2Iuy8p44U44xD1F5+fNYFKI3897ijlbIyfvXkTmMm+KGcjkQQGMHywEQ==} + '@rc-component/motion@1.3.3': + resolution: {integrity: sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -628,8 +721,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/pagination@1.2.0': - resolution: {integrity: sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==} + '@rc-component/pagination@1.3.0': + resolution: {integrity: sha512-12ahTY+HPITg1L2bjWKXUqBJe/oOnpA2QsChdCjthqLVf/e19StiCsv8OLKpWoHbc+8PFEkNjRqRqrLoRBHjFw==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -654,8 +747,8 @@ packages: moment: optional: true - '@rc-component/portal@2.2.0': - resolution: {integrity: sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==} + '@rc-component/portal@2.2.1': + resolution: {integrity: sha512-ck+r1kW/JSv0wxPji3KN2ss9K6Z0qqwusw/mf/0JobXhZ8hC2ejZwCJObW/SvDi0uhA0VzmCnx0CaCci95tcmA==} engines: {node: '>=12.x'} peerDependencies: react: '>=18.0.0' @@ -667,8 +760,8 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/qrcode@1.1.1': - resolution: {integrity: sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==} + '@rc-component/qrcode@2.0.0': + resolution: {integrity: sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -693,8 +786,8 @@ packages: react: '>=16.0.0' react-dom: '>=16.0.0' - '@rc-component/select@1.6.15': - resolution: {integrity: sha512-SyVCWnqxCQZZcQvQJ/CxSjx2bGma6ds/HtnpkIfZVnt6RoEgbqUmHgD6vrzNarNXwbLXerwVzWwq8F3d1sst7g==} + '@rc-component/select@1.7.1': + resolution: {integrity: sha512-GZ1cMJk2xQh0VHyOQjjG8drYL4iu24NcbkXioUcReQOCUr+ub/3fmRonZe6cRPEZhWMbJdeHsqnEltogDaZ5Tg==} engines: {node: '>=8.x'} peerDependencies: react: '*' @@ -720,15 +813,15 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/table@1.10.0': - resolution: {integrity: sha512-SjtpcCf+rL7dDc62GKT3rXTdERjVuJvRiqjpU7g0Jc/ewCifXynHc7Nm3Em1XsD+WhGrgQtxNDScI/0+Lpfr0w==} + '@rc-component/table@1.10.2': + resolution: {integrity: sha512-b3PjqB9Gp25p5t/zq+9QrbXbodkptT8/zvLmwgd2FNPUUtaYyDnQqfxeD5a7ao8E8lpinLHsi2u2vdfPhyNvAw==} engines: {node: '>=8.x'} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' - '@rc-component/tabs@1.9.0': - resolution: {integrity: sha512-tn1slmbbaTyt8mgwyWJcT8jo/qNiYUs6u1H7OgGQt9faYO06BJIkU5cTmMqORzIrNmSEeeUY6pD5i+JlqSHYhg==} + '@rc-component/tabs@1.9.1': + resolution: {integrity: sha512-6mY08Fce6aNOHuGsxbzT+f2ekgL9mg1cGGHkittMlVGymjGg+kGupu5v90sRxcUd/paRU9jclLLXtF/PkK1FUA==} engines: {node: '>=8.x'} peerDependencies: react: '>=16.9.0' @@ -747,28 +840,28 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' - '@rc-component/tree-select@1.9.0': - resolution: {integrity: sha512-GXcFe15a+trUl1/J3OHWQhsVWFpwFpGFK2cqYWZ1sK22Zs3KZTvMwDpzr75PIo1s6QVioVxpE/pRwRopkeDQ6w==} + '@rc-component/tree-select@1.10.0': + resolution: {integrity: sha512-E1U4pn2LAbXEhLJdzIzid7WYbIuFbkTIctuFoeC6weppf8UbPR3+YYB6/ay0c0ksand4gXMRQpa1Z60Auo7VJA==} peerDependencies: react: '*' react-dom: '*' - '@rc-component/tree@1.3.1': - resolution: {integrity: sha512-zlL0PW0bTFlveTtLcA01VD/yMWKK73EywItFMgIZUY5sb6tMOAw7zV6qGzqldufqrV93ZWQB4H3NBNoTMCueJA==} + '@rc-component/tree@1.3.2': + resolution: {integrity: sha512-bJFj46wEkpBPnWyTm18XmgAgNQ/4YvprxMOPPY2a6rmhGJYxLuNKEFiL5Qej4Qctu9wHJm8WW+v2SYskafE0kA==} engines: {node: '>=10.x'} peerDependencies: react: '*' react-dom: '*' - '@rc-component/trigger@3.9.0': - resolution: {integrity: sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==} + '@rc-component/trigger@3.9.1': + resolution: {integrity: sha512-LNsYvz60mrLJ/kRvKcHE7boUvcQfVMCfRqZ71x3Fo9AOiZ1KKIEqkzMA8DNvz2V3Bcvir/vwQNn7JF1NPODQ7Q==} engines: {node: '>=8.x'} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' - '@rc-component/upload@1.1.0': - resolution: {integrity: sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==} + '@rc-component/upload@1.1.1': + resolution: {integrity: sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==} peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' @@ -1025,6 +1118,9 @@ packages: '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -1052,6 +1148,9 @@ packages: '@types/d3-timer@3.0.2': resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} @@ -1061,16 +1160,16 @@ packages: '@types/node@20.11.0': resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} - '@types/node@25.9.1': - resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + '@types/node@25.9.4': + resolution: {integrity: sha512-dszCsrKb5U7ZsVZBWiHFklTloVl0mSEnWH/iZXfZUlI4rzCUnsvGmgqfuVRHL54ugE7/wRuxEIXRa2iMZ+BG6g==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.15': - resolution: {integrity: sha512-eRwcGNHve+E8qtEQSSRl6urh+rFop4v8gm6O8rGv25CodbvFdLjA1vVQ1KkiFE0w0UPOnb8tDiFKL5lp0rtY5Q==} + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} '@types/stats.js@0.17.4': resolution: {integrity: sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==} @@ -1113,38 +1212,41 @@ packages: vue-router: optional: true - '@vercel/backends@0.8.3': - resolution: {integrity: sha512-a0NivGZn4BA6155m7BXqBBlHcqoB4HIxiYDcs9ZRFySr45CYAJg1icUmlNKgWMX5gL7jA1JToXIRyjs78mkPtg==} + '@vercel/backends@0.8.14': + resolution: {integrity: sha512-jgepdZh7E4ameCUSt/b28ImFd9Bz1VX71lKwD/ThtZ7nGIwi5SJ9hwyURvH60c4rNW6nKxMD/iSOlcgQOfrK3A==} '@vercel/blob@2.4.0': resolution: {integrity: sha512-ncQ8CRb6XoEAYJwjOTRGpACRT6h/AeY+/33gLyeVxG5BIes27OPm1jmqreF+JHjcTmGhClTP+kBpmyLfbV0xew==} engines: {node: '>=20.0.0'} - '@vercel/build-utils@13.26.4': - resolution: {integrity: sha512-0g3ZxtZUJZbt4y0Vu4pkHtu1UN58FbVF9cqGT8T6jHp0EHdLGFj5TVCiME8ALeK4tjPImSmxnKZvvB5yb2hqEw==} + '@vercel/build-utils@13.30.0': + resolution: {integrity: sha512-fLIa8cpELsSoWbcxshaqegwlTCfKnbgsDmA6uIb+oA797xvSmYkPu5a781aRYCRdghgyOZF7NCSVgtZjHjunnQ==} - '@vercel/cervel@0.1.11': - resolution: {integrity: sha512-xgdahaAIny+mxLU4OUHqTtueV3JZrDDoC8Av871TdGiJGTEO9D1HQEwDvtmcKpQtxvbgSKFI0zc1rdesT2SdOQ==} + '@vercel/cervel@0.1.22': + resolution: {integrity: sha512-YbL2AosH3FaBLJZu4GYdVMkFv+5cbWwwSrRBTGN52odynQUudTUQfbc7rCzPyNQLdk2QC4w2IDYRD+nqgojhVg==} hasBin: true - '@vercel/cli-config@0.1.2': - resolution: {integrity: sha512-XQOcuCM+8tKjh3sfgGRKRuNh78u2D8uGpDJIFcCtFi2tUqbGvqmJo790XX7+Bwakk08y0FCrs2JlEjvvwRhpAg==} + '@vercel/cli-auth@0.3.0': + resolution: {integrity: sha512-9nsdxUpV/L+9CBVGeRw/Qby2azhi2lk01jp0aTH+Hxx2U61+mAmbi5qChHnrbEmQdx2Ih7dp4LxO3nj1Q7f/5Q==} + + '@vercel/cli-config@0.2.0': + resolution: {integrity: sha512-fJRRRB7734BDuXZ89yBEaA2ncYhH7bWX30mk04W80J6VAfQc+4iB8lyzAdaGpFV3/vNlkt9VZt+/uoQoWX6UsQ==} '@vercel/detect-agent@1.2.3': resolution: {integrity: sha512-VYNCgUc0nOmC4WJmWw9GkrKdfr8Zl4/rxhC5SvgacBgxiW9W/9NRttUoHHXV8xdII3MaRgkZZVX8Ikzc/Jmjag==} engines: {node: '>=14'} - '@vercel/elysia@0.1.84': - resolution: {integrity: sha512-lXJHbMKbpx+hfTLw1kH0EyPsTSrBiQyvL2Xz7r262DwdzVewdQzVqpGVHcT5x4muOhnHmDbQ8MlmE2j5K9Nt1Q==} + '@vercel/elysia@0.1.93': + resolution: {integrity: sha512-36yzZJVU9o7/CcH1TbqeGTRwBePDaCEzv1CYfS183HdLXzsD+pOjOkTqZOBJu7h9aHpJFCCau55Ed0xOQC2jhA==} - '@vercel/error-utils@2.1.0': - resolution: {integrity: sha512-DiJcXBOB9N6QM4d7hYPM9Ck/AUjzBl58XNQPxS74o7CuvIanjzrGgygP/70VsyEASeIJMazk1LrhwcNTR/eZGQ==} + '@vercel/error-utils@2.2.0': + resolution: {integrity: sha512-WFWiRxfPzoYWYifaj4thSKvAaZZwUOqD4k5GINRIgZgCiS2E3iAJbWbIsIZmkQdTecWFHcWGA6q48CjisgpOBA==} - '@vercel/express@0.1.94': - resolution: {integrity: sha512-J2sjhwK9BKVfoJ28UB/R1Q6ugJ47mtvVALs+paWQoIdlK6FLip3jKstqnZU1L6VxguVmERWQk49U5mux3CgeVw==} + '@vercel/express@0.1.105': + resolution: {integrity: sha512-F+QRQxWWKdeztW4MKPkzXl/Ajc8j1qOffCp1tt8+YPaNiqZtxpn7FjIYRXHbfR1aepfaEkDRDD7o2qxmmaUU5w==} - '@vercel/fastify@0.1.87': - resolution: {integrity: sha512-JdUKon4nTozwQweVycsAVTtn3qhD6sPJKFsPpetHZEh2FdlEkOUSTMRlmuO7pPjSQ41MckplVkBNNQSSXuaXmA==} + '@vercel/fastify@0.1.96': + resolution: {integrity: sha512-4Uq6GVmi0ksQxIHp4FDUhgoz47uacxZm42XT04SK5gzX5v5UmZXWZPprZjkwwk/2gmP/rF2qKqJ0nu6OsI+yDw==} '@vercel/fun@1.3.0': resolution: {integrity: sha512-8erw9uPe0dFg45THkNxmjtvMX143SkZebmjgSVbcM3XCkXu3RIiBaJMcMNG8aaS+rnTuw8+d4De9HVT0M/r3wg==} @@ -1153,56 +1255,56 @@ packages: '@vercel/gatsby-plugin-vercel-analytics@1.0.11': resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} - '@vercel/gatsby-plugin-vercel-builder@2.2.10': - resolution: {integrity: sha512-KIkEQRLK7/gDSBTFEZble4dWkGQNTniBe2pJaNl6eUlyB2RW4cl/x2+1Qms+q12VP2EwzHLJjj7hhC48kwPdQA==} + '@vercel/gatsby-plugin-vercel-builder@2.2.19': + resolution: {integrity: sha512-dA1ZWZHruRjFbLToqjcPHUyh5J7/Cl3qGFDge87ghAInuy/aXfalApzFbw61OIopGx0SSsIYi/8kbpJ+SbQ6ZQ==} - '@vercel/go@3.8.0': - resolution: {integrity: sha512-ftQqQMn3sGdL8mdIqfcS3YZg6dazM/h4s0jkY37oVV1rPdh7Aq/GL0oMjv1L+PoIk5uJEAyBan7C8Yisp4LH+g==} + '@vercel/go@3.9.1': + resolution: {integrity: sha512-EZTyb+C6RqDi4zkicrXLaDjdAnk0eRdgOA4fAI4wziB62HRz/He9dmDxVuoRPneXn4dlb/3Cl9BoXjyjwe4JqA==} - '@vercel/h3@0.1.93': - resolution: {integrity: sha512-ZvheBxNHJOHyC1/vAoni8N4VcXTDLGfIf5REFE/ZFwWOP4YepmFgjOPk0udMY5YXk5ryUNBTC6tdvrFLB+nSDQ==} + '@vercel/h3@0.1.102': + resolution: {integrity: sha512-UnHFLBemE2UfvQ+w2z2zxGcvyiShQ8eMdk3ag2sV71wbyatnXwmio8HOy//B2ZIEQNEid5gW2HjWOXLtrR+E2Q==} - '@vercel/hono@0.2.87': - resolution: {integrity: sha512-UH11b/RwIcXaCJpm6y8v9jXuv2ju4/bJdAHW9Vx/dvtUJDFWDSQbwKf36QIZoJ8UJRJfxo+PzT1TANXuOi8jfw==} + '@vercel/hono@0.2.96': + resolution: {integrity: sha512-h4G0GSo5omhXS1iqimIcekcW7THEAnUGd6eioDNnSqwS3L0CGEvvTPUekJDyJcybsqnKslH1XTZA40f4b9MPHg==} - '@vercel/hydrogen@1.3.8': - resolution: {integrity: sha512-ANCJg+FyZQpP2tntc9GUXQDGtOpQ/soykJGB1WBeCqn96QJFfSzRHHz1MHCh163MrKjO5Hx5cnCYUgRYRXVSjA==} + '@vercel/hydrogen@1.4.0': + resolution: {integrity: sha512-gf3ELmAjcia7WNGNHAB/rFWFU0l5fJ7mTMgGC5hvcCjSIE4kp8WWuGYiTQgQ8W6GF/1FJAxa2J3BhY/yxjY8tA==} - '@vercel/koa@0.1.67': - resolution: {integrity: sha512-pxNRTkJ71kgihABVQXG5E4L3qXySfoCtZ/f1yJzCfNV1r+IAlf2QL8tQWTTXeY7s/rcrOLF19HQYMW4TVzyE3A==} + '@vercel/koa@0.1.76': + resolution: {integrity: sha512-6MuBn5RM2nHKfHKeBqbs3aaFJlBFDhOZgpC1ubLQG2B/EvnAfljB7FPIKCl1SwANAHisX7vQACinMedCbFdi+Q==} - '@vercel/nestjs@0.2.88': - resolution: {integrity: sha512-bqJf/NieVsDHlwFDZ5D/UJHXetd1GckXSGLcoveC23ZeKaBJskPlC0oiWZ5wikzbeHHz7jdi0mqjwrvpmI6YBw==} + '@vercel/nestjs@0.2.97': + resolution: {integrity: sha512-KM9uBmC+a10EPJgtm0B/vfGsTaUEzxKkihTyaQ4PhSUQHJOABTv6TBpGKtwIM5P1vMLKUg9R0A2SUvkKdaALvA==} - '@vercel/next@4.17.5': - resolution: {integrity: sha512-zmj3X+H8bTs0V+8RbsuV8ZbHI0J3nBX+ZV4gcrpGbFNOzqydcwb3H2UJXnEP/rwED3zOevHD65GYPkv9JR/wOQ==} + '@vercel/next@4.19.1': + resolution: {integrity: sha512-4no1YiY7xjcNhaFpdPNFwgMg1YvQC+7DATM3MCVntLtjTEkUFgYGpFtaPiqfEhTX3QgFg2HZNOT612z+vDATkw==} '@vercel/nft@1.10.0': resolution: {integrity: sha512-iLOW4fcsgkipfOh2Bw3wB38YDfxTlxr7+j4uFeui2OswkNT28jIitS/aMce7tS0mef1YPQ8zLIDYr3a0aahNrA==} engines: {node: '>=20'} hasBin: true - '@vercel/node@5.8.8': - resolution: {integrity: sha512-+uRT9evnGWUE6klrJJED4fCvlSxNShbIc/UY4FeUzt2sdcy5a5b1IoYlo94RJd7tAY9Jg2lR2cVfGfsnWH81ZA==} + '@vercel/node@5.8.17': + resolution: {integrity: sha512-n2DVzblqS43LTs4BV1iLfx8tjjrTegcSsyDgRzn70h6tQePYWjl+h0bU3X1stpITZtaYJSZYwVevuX1BJNZHHg==} '@vercel/oidc@3.2.0': resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==} engines: {node: '>= 20'} - '@vercel/prepare-flags-definitions@0.2.1': - resolution: {integrity: sha512-ouXTsqn7I9xZ1KKezgvn/w3tZeQHL/tc52j9GHiOYi6kT8xgdbT8s2x8C9BQr44iceX0hfhtZwk9q7NuI2Tqbw==} + '@vercel/prepare-flags-definitions@0.3.0': + resolution: {integrity: sha512-/0nuDFwYje0nqZnVKSd2VfJy2wOPQwbkas1qO1JQgtb0sLl+EeSCW4O9hrvq55pN50PNlAZ/APSeWHIAT9ZGHg==} '@vercel/python-analysis@0.11.1': resolution: {integrity: sha512-EPPLuXJQhIDUx08H9nG76AR2HSgBquwe3OAX5s2w20M923iaWeGGVkhX/4yZ89CJfXEZgE1Aj/mX7lVHOVIcYA==} - '@vercel/python@6.44.0': - resolution: {integrity: sha512-78+todx9665oQSZahIsK8o6gN76oKyPeuw5g61ZI88sAjHgjXL0qE5ou+rEBjwTfRa5+hXxBeeWi7YUpCQ8xJA==} + '@vercel/python@6.47.0': + resolution: {integrity: sha512-ijTrgj2qD8d4Zx/Y62WV1wDuFCqPu0qbpJofH4TMhHJjpM2FzUdJpW0QhpriA0djmrI3UYtSnOyCLQ9ZZ9rKqw==} - '@vercel/redwood@2.4.15': - resolution: {integrity: sha512-f7bK2VFCr6UpUxQ0bUUev9rfHFVh3OeZjr5eISoVjEQ/x+cXCICfBb20wFb9AllcyhXo8a2Lkh9b65wdOgVA3Q==} + '@vercel/redwood@2.5.0': + resolution: {integrity: sha512-LO24CbieV57rGAqrq5n5z/B+fMYeUqbE/Ge3qMeKRuS3Q9awgcBgB6WYLCe8crHM7XJd5AZjbuyoS/6k3r0X0w==} - '@vercel/remix-builder@5.8.4': - resolution: {integrity: sha512-OcoNTzHS3cPcyYo+feOowwpbDewUzwfwFE5CTOKQLUdKt4unZ6Sf/ObOelokgLsxY0JEEp5Gr7zV936UQVy8Dg==} + '@vercel/remix-builder@5.9.1': + resolution: {integrity: sha512-s0SpfV640nmQ1BsKCPMYugGrH/V+319onTo2ZILSmsy6NTBlmeN0zJU9nPcP8dBEotGqtp68NfOlOUUdrVBzkw==} '@vercel/ruby@2.4.0': resolution: {integrity: sha512-YI7Amyf09hHZWOqDHgJO92XcKh6Pye8rrmJFhlP6euG3o6QjoZzJj7Z2WzjSrDRGMewzEK4uz2+CbNpNS7gLog==} @@ -1210,11 +1312,11 @@ packages: '@vercel/rust@1.3.0': resolution: {integrity: sha512-z1X0z1NM+ISunm/scgRpuENNwcKlh7DjXn0QvKE0n10DcaYqxkBQVK8iRA9X05xSK9AzPlnB9DHdGKiXZO5buw==} - '@vercel/sandbox@1.9.0': - resolution: {integrity: sha512-zgr1ad0tkT1xZn/8Vxo60wOUOLqMAVGo4WqJQ8/UDcUtWynNJsBjI2tiMdWZrAo9EKH1MIqEzJNkcclF0UT1EQ==} + '@vercel/sandbox@2.1.1': + resolution: {integrity: sha512-gKhW+YlvU15Qxya7jQKByB+sqA1dWat5zx/rvxT52E3Ryg9MAIXgqD5wd1d+CoJDbdHL26gIOcksTZY5sFpplA==} - '@vercel/static-build@2.9.33': - resolution: {integrity: sha512-PTcDWlCo/aMJo3uoQ9wuJTsNqKFqMfWc1sBhJD91eicqa4vXisJHlZ7bDs6s0GHHMkX++wICiYTxOYKyYnXqrQ==} + '@vercel/static-build@2.10.3': + resolution: {integrity: sha512-+IipWidX6mL1Zck8Khw4wSXHPSgDfkapvcuWA9wSCmhnk2GL2Iuu+6vab+g8UPahv+QDUYm8Tphhadg6dICZnA==} '@vercel/static-config@3.4.0': resolution: {integrity: sha512-wCq90CMUB//ggnFh77NQO1xaLFsS4LigQIqKrH6ohnr9Br/KI1FhlErx62WfCOuueWaW+LVsbLOqNXIUjK8t6A==} @@ -1232,6 +1334,38 @@ packages: babel-plugin-react-compiler: optional: true + '@vitest/expect@4.1.9': + resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} + + '@vitest/mocker@4.1.9': + resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.9': + resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + + '@vitest/runner@4.1.9': + resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} + + '@vitest/snapshot@4.1.9': + resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} + + '@vitest/spy@4.1.9': + resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} + + '@vitest/utils@4.1.9': + resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + + '@workflow/serde@4.1.0-beta.2': + resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -1241,8 +1375,8 @@ packages: peerDependencies: acorn: ^8 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true @@ -1257,8 +1391,8 @@ packages: ajv@8.6.3: resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} - antd@6.4.3: - resolution: {integrity: sha512-6H2avkxCGfxcF67r3J2mwm9Ck50el1pks/73vfM1wDsPL/tPtj5vHuauMgJFnrqmq7CH3g8aoZ0VBQbt+jpAsw==} + antd@6.4.4: + resolution: {integrity: sha512-lgPz4KhfhiYddV/qPYo0ieqWimCVgV2OQF72mbeGNixE753JWNnmEc7UNGy08wBS/zZ7hxrmX0pc5aX7EUaIIg==} peerDependencies: react: '>=18.0.0' react-dom: '>=18.0.0' @@ -1272,6 +1406,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -1296,8 +1434,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.17.0: - resolution: {integrity: sha512-J8SwNxprqqpbfenehxWYXE7CW+wM1BB4w3+N+g+/Wx40xM4rsLrfPmHHxSWIxJLYDgSY/HqlFPIYb2/S3rxafw==} + axios@1.18.0: + resolution: {integrity: sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==} b4a@1.8.1: resolution: {integrity: sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==} @@ -1314,8 +1452,8 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - bare-events@2.8.3: - resolution: {integrity: sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw==} + bare-events@2.9.1: + resolution: {integrity: sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==} peerDependencies: bare-abort-controller: '*' peerDependenciesMeta: @@ -1351,6 +1489,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chokidar@4.0.0: resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} engines: {node: '>= 14.16.0'} @@ -1391,6 +1533,9 @@ packages: resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} engines: {node: '>=8'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-es@2.0.1: resolution: {integrity: sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA==} @@ -1453,8 +1598,8 @@ packages: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - dayjs@1.11.20: - resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -1477,6 +1622,10 @@ packages: decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -1526,6 +1675,9 @@ packages: es-module-lexer@1.5.0: resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} engines: {node: '>= 0.4'} @@ -1559,6 +1711,9 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -1584,6 +1739,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1628,8 +1787,8 @@ packages: debug: optional: true - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + form-data@4.0.6: + resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} fs-extra@11.1.0: @@ -1758,6 +1917,11 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1780,12 +1944,19 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} jose@5.9.6: resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} + jose@6.2.3: + resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -1891,8 +2062,8 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lucide-react@1.17.0: - resolution: {integrity: sha512-9FA9evdox/JQL5PT57fdA1x/yg8T7knJ98+zjTL3UfKza6pflQUUh3XtaQIHKvnsJw1lmsEyHVlt5jchYxOQ5w==} + lucide-react@1.21.0: + resolution: {integrity: sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -1900,6 +2071,9 @@ packages: resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} engines: {node: '>=12'} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -2021,6 +2195,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + obug@2.1.3: + resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} + engines: {node: '>=12.20.0'} + once@1.3.3: resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} @@ -2031,6 +2209,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + open@8.4.0: + resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} + engines: {node: '>=12'} + os-paths@4.4.0: resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} engines: {node: '>= 6.0'} @@ -2079,6 +2261,9 @@ packages: path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -2132,13 +2317,13 @@ packages: resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} engines: {node: '>= 0.8'} - react-dom@19.2.6: - resolution: {integrity: sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==} + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: - react: ^19.2.6 + react: ^19.2.7 - react-hook-form@7.78.0: - resolution: {integrity: sha512-EEZqc+N23moyzTlz61Pj+JvcXo76ICkpfOZo8JZw+sM4+wLQGh6nI2Ms+PdMOYNluFu0ghlM7B8mCzhRYtJCnA==} + react-hook-form@7.80.0: + resolution: {integrity: sha512-4P+fk6oXsxY+6xSj7Euhc2sumQD8zQqCuVHoJwoyp9EchP+IUW9OESB7uHFJOKsIBQ4MQqYE84INJFqUCYNoOg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -2158,15 +2343,15 @@ packages: redux: optional: true - react-router-dom@7.16.0: - resolution: {integrity: sha512-kMUAbimWB5FVbF4Bce4bJsiKJWLIUHq/mEG8+CFDnCSgltptBiG5nguducmsJeGKytlCvQud9Qhzpn49iduTlA==} + react-router-dom@7.18.0: + resolution: {integrity: sha512-Fi0yY6kgtKae/Th2xibdWK0KSdYZ4B53Gyf6wRtomOKWgpNm7H7+DyfDhncdz9FKbpS+1jmDhg3F4WoGJ+yFOA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.16.0: - resolution: {integrity: sha512-wArC8lVyJb3+jM9OpDyW6hLCizACWkvQR/sSGqSs+o5uEXEtGlqdZ4v8hENR3Jad6i+LRkK93q/+bQAcvl6V1A==} + react-router@7.18.0: + resolution: {integrity: sha512-pTTGt8J+ji1NOmYnjzT+bAJy/1zD+Jp4ziO6cL7T3ZLvXKtusO7BpFqlRXitqpcPVqllsIXFHRMt+2/k3Xn6HQ==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -2175,8 +2360,8 @@ packages: react-dom: optional: true - react@19.2.6: - resolution: {integrity: sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==} + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} readdirp@4.1.2: @@ -2241,8 +2426,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sandbox@2.5.6: - resolution: {integrity: sha512-tnFr7nyiuEhsAGb+xy60SDbij0790X+FgDljh3J/2HaRM6yQgNJkQKHbDH8ld7mR+PozXGgEfJ2Dc/5OyFnwsg==} + sandbox@3.1.2: + resolution: {integrity: sha512-g93rma0Z9Aa6EoTktzYnGZmQvMzm7j73BekJIMwmkdWR5uryZ+6hBCADtd3JKGAB27k+ubnG7HHsZqtscAMzIQ==} hasBin: true scheduler@0.27.0: @@ -2260,8 +2445,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.8.1: - resolution: {integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true @@ -2279,6 +2464,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -2315,6 +2503,9 @@ packages: engines: {node: '>=20.16.0'} hasBin: true + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stat-mode@0.3.0: resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} @@ -2322,14 +2513,18 @@ packages: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + stream-to-array@2.3.0: resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} stream-to-promise@2.2.0: resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + deprecated: Deprecated. Use node:stream/promises and node:stream/consumers instead. - streamx@2.26.0: - resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -2344,8 +2539,8 @@ packages: tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - tar@7.5.15: - resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} + tar@7.5.16: + resolution: {integrity: sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==} engines: {node: '>=18'} tar@7.5.7: @@ -2374,13 +2569,24 @@ packages: tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} + engines: {node: '>=18'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyrainbow@3.1.0: + resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + engines: {node: '>=14.0.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2433,12 +2639,12 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - undici@6.26.0: - resolution: {integrity: sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==} + undici@6.27.0: + resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} engines: {node: '>=18.17'} - undici@7.26.0: - resolution: {integrity: sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==} + undici@7.28.0: + resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==} engines: {node: '>=20.18.1'} universalify@2.0.1: @@ -2457,8 +2663,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - vercel@54.6.1: - resolution: {integrity: sha512-hZOuNcI5o4Y40ENpyf1bCHpfsxlIzEK3TjMB32i/SHuB4odDgFWlIrITP0RSqvLH41F33Gunl/zSgw0BLK+6ew==} + vercel@54.14.5: + resolution: {integrity: sha512-ZPzKwBAmlqizS4uXYEPIL4uZH3ghJNdeuTLOBHuzczoZ2T6GoaFPQJ98OwADCB5+fJGUmTd0HyeshGWiPxorrQ==} engines: {node: '>= 18'} hasBin: true @@ -2508,6 +2714,47 @@ packages: yaml: optional: true + vitest@4.1.9: + resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.1.9 + '@vitest/browser-preview': 4.1.9 + '@vitest/browser-webdriverio': 4.1.9 + '@vitest/coverage-istanbul': 4.1.9 + '@vitest/coverage-v8': 4.1.9 + '@vitest/ui': 4.1.9 + happy-dom: '*' + jsdom: '*' + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + web-vitals@0.2.4: resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} @@ -2522,6 +2769,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -2591,49 +2843,49 @@ snapshots: dependencies: '@ant-design/fast-color': 3.0.1 - '@ant-design/cssinjs-utils@2.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@ant-design/cssinjs-utils@2.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@ant-design/cssinjs': 2.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@babel/runtime': 7.29.2 - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + '@ant-design/cssinjs': 2.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@babel/runtime': 7.29.7 + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@ant-design/cssinjs@2.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@ant-design/cssinjs@2.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 csstype: 3.2.3 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) stylis: 4.4.0 '@ant-design/fast-color@3.0.1': {} '@ant-design/icons-svg@4.4.2': {} - '@ant-design/icons@6.2.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@ant-design/icons@6.2.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@ant-design/colors': 8.0.1 '@ant-design/icons-svg': 4.4.2 - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@ant-design/react-slick@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@ant-design/react-slick@2.0.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 clsx: 2.1.1 json2mq: 0.2.0 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) throttle-debounce: 5.0.2 - '@babel/runtime@7.29.2': {} + '@babel/runtime@7.29.7': {} '@bytecodealliance/preview2-shim@0.17.6': {} @@ -2751,15 +3003,15 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@gsap/react@2.1.2(gsap@3.15.0)(react@19.2.6)': + '@gsap/react@2.1.2(gsap@3.15.0)(react@19.2.7)': dependencies: gsap: 3.15.0 - react: 19.2.6 + react: 19.2.7 - '@hookform/resolvers@5.4.0(react-hook-form@7.78.0(react@19.2.6))': + '@hookform/resolvers@5.4.0(react-hook-form@7.80.0(react@19.2.7))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.78.0(react@19.2.6) + react-hook-form: 7.80.0(react@19.2.7) '@isaacs/balanced-match@4.0.1': {} @@ -2771,6 +3023,8 @@ snapshots: dependencies: minipass: 7.1.3 + '@jridgewell/sourcemap-codec@1.5.5': {} + '@mapbox/node-pre-gyp@2.0.3': dependencies: consola: 3.4.2 @@ -2778,12 +3032,63 @@ snapshots: https-proxy-agent: 7.0.6 node-fetch: 2.7.0 nopt: 8.1.0 - semver: 7.8.1 - tar: 7.5.15 + semver: 7.8.5 + tar: 7.5.16 transitivePeerDependencies: - encoding - supports-color + '@napi-rs/keyring-darwin-arm64@1.2.0': + optional: true + + '@napi-rs/keyring-darwin-x64@1.2.0': + optional: true + + '@napi-rs/keyring-freebsd-x64@1.2.0': + optional: true + + '@napi-rs/keyring-linux-arm-gnueabihf@1.2.0': + optional: true + + '@napi-rs/keyring-linux-arm64-gnu@1.2.0': + optional: true + + '@napi-rs/keyring-linux-arm64-musl@1.2.0': + optional: true + + '@napi-rs/keyring-linux-riscv64-gnu@1.2.0': + optional: true + + '@napi-rs/keyring-linux-x64-gnu@1.2.0': + optional: true + + '@napi-rs/keyring-linux-x64-musl@1.2.0': + optional: true + + '@napi-rs/keyring-win32-arm64-msvc@1.2.0': + optional: true + + '@napi-rs/keyring-win32-ia32-msvc@1.2.0': + optional: true + + '@napi-rs/keyring-win32-x64-msvc@1.2.0': + optional: true + + '@napi-rs/keyring@1.2.0': + optionalDependencies: + '@napi-rs/keyring-darwin-arm64': 1.2.0 + '@napi-rs/keyring-darwin-x64': 1.2.0 + '@napi-rs/keyring-freebsd-x64': 1.2.0 + '@napi-rs/keyring-linux-arm-gnueabihf': 1.2.0 + '@napi-rs/keyring-linux-arm64-gnu': 1.2.0 + '@napi-rs/keyring-linux-arm64-musl': 1.2.0 + '@napi-rs/keyring-linux-riscv64-gnu': 1.2.0 + '@napi-rs/keyring-linux-x64-gnu': 1.2.0 + '@napi-rs/keyring-linux-x64-musl': 1.2.0 + '@napi-rs/keyring-win32-arm64-msvc': 1.2.0 + '@napi-rs/keyring-win32-ia32-msvc': 1.2.0 + '@napi-rs/keyring-win32-x64-msvc': 1.2.0 + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: '@emnapi/core': 1.10.0 @@ -2791,6 +3096,13 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true + '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2857,7 +3169,7 @@ snapshots: '@oxc-transform/binding-wasm32-wasi@0.111.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -2872,345 +3184,345 @@ snapshots: '@oxc-transform/binding-win32-x64-msvc@0.111.0': optional: true - '@rc-component/async-validator@5.1.0': + '@rc-component/async-validator@6.0.0': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 - '@rc-component/cascader@1.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/cascader@1.16.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/select': 1.6.15(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/tree': 1.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/select': 1.7.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/tree': 1.3.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/checkbox@2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/checkbox@2.0.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/collapse@1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/collapse@1.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@babel/runtime': 7.29.7 + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/color-picker@3.1.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/color-picker@3.1.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: '@ant-design/fast-color': 3.0.1 - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/context@2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/context@2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/dialog@1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/dialog@1.9.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/portal': 2.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/portal': 2.2.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/drawer@1.4.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/drawer@1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/portal': 2.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/portal': 2.2.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/dropdown@1.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/dropdown@1.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/form@1.8.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/form@1.8.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/async-validator': 5.1.0 - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/async-validator': 6.0.0 + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/image@1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/image@1.9.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/portal': 2.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/portal': 2.2.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/input-number@1.6.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/input-number@1.6.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/mini-decimal': 1.1.3 - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/mini-decimal': 1.1.4 + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/input@1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/input@1.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/mentions@1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/mentions@1.9.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/input': 1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/menu': 1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/input': 1.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/menu': 1.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/menu@1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/menu@1.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/overflow': 1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/overflow': 1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/mini-decimal@1.1.3': + '@rc-component/mini-decimal@1.1.4': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 - '@rc-component/motion@1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/motion@1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/mutate-observer@2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/mutate-observer@2.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/notification@2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/notification@2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/overflow@1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/overflow@1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@babel/runtime': 7.29.7 + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/pagination@1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/pagination@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/picker@1.10.0(dayjs@1.11.20)(luxon@3.7.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/picker@1.10.0(dayjs@1.11.21)(luxon@3.7.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/overflow': 1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/overflow': 1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - dayjs: 1.11.20 + dayjs: 1.11.21 luxon: 3.7.2 - '@rc-component/portal@2.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/portal@2.2.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/progress@1.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/progress@1.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/qrcode@1.1.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/qrcode@2.0.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + '@babel/runtime': 7.29.7 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/rate@1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/rate@1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/resize-observer@1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/resize-observer@1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/segmented@1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/segmented@1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@babel/runtime': 7.29.7 + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/select@1.6.15(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/select@1.7.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/overflow': 1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/virtual-list': 1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/overflow': 1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/virtual-list': 1.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/slider@1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/slider@1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/steps@1.2.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/steps@1.2.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/switch@1.0.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/switch@1.0.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/table@1.10.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/table@1.10.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/context': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/virtual-list': 1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/context': 2.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/virtual-list': 1.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/tabs@1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/tabs@1.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/dropdown': 1.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/menu': 1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/dropdown': 1.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/menu': 1.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/tooltip@1.4.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/tooltip@1.4.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/tour@2.4.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/tour@2.4.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/portal': 2.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/portal': 2.2.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/tree-select@1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/tree-select@1.10.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/select': 1.6.15(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/tree': 1.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/select': 1.7.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/tree': 1.3.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/tree@1.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/tree@1.3.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/virtual-list': 1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/virtual-list': 1.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/trigger@3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/trigger@3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/portal': 2.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/portal': 2.2.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/upload@1.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/upload@1.1.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@rc-component/util@1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/util@1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: is-mobile: 5.0.0 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-is: 18.3.1 - '@rc-component/virtual-list@1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)': + '@rc-component/virtual-list@1.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@babel/runtime': 7.29.7 + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1))(react@19.2.6)': + '@reduxjs/toolkit@2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1))(react@19.2.7)': dependencies: '@standard-schema/spec': 1.1.0 '@standard-schema/utils': 0.3.0 @@ -3219,8 +3531,8 @@ snapshots: redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.1 optionalDependencies: - react: 19.2.6 - react-redux: 9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1) + react: 19.2.7 + react-redux: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) '@renovatebot/pep440@4.2.1': {} @@ -3292,7 +3604,7 @@ snapshots: '@rolldown/binding-wasm32-wasi@1.0.0-rc.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3335,10 +3647,10 @@ snapshots: '@tanstack/query-core@5.101.0': {} - '@tanstack/react-query@5.101.0(react@19.2.6)': + '@tanstack/react-query@5.101.0(react@19.2.7)': dependencies: '@tanstack/query-core': 5.101.0 - react: 19.2.6 + react: 19.2.7 '@tootallnate/once@2.0.0': {} @@ -3358,6 +3670,11 @@ snapshots: tslib: 2.8.1 optional: true + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/d3-array@3.2.2': {} '@types/d3-color@3.1.3': {} @@ -3382,6 +3699,8 @@ snapshots: '@types/d3-timer@3.0.2': {} + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.9': {} '@types/json-schema@7.0.15': {} @@ -3390,15 +3709,15 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@25.9.1': + '@types/node@25.9.4': dependencies: undici-types: 7.24.6 - '@types/react-dom@19.2.3(@types/react@19.2.15)': + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.17 - '@types/react@19.2.15': + '@types/react@19.2.17': dependencies: csstype: 3.2.3 @@ -3417,13 +3736,13 @@ snapshots: '@types/webxr@0.5.24': {} - '@vercel/analytics@2.0.1(react@19.2.6)': + '@vercel/analytics@2.0.1(react@19.2.7)': optionalDependencies: - react: 19.2.6 + react: 19.2.7 - '@vercel/backends@0.8.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@vercel/backends@0.8.14(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@vercel/build-utils': 13.26.4 + '@vercel/build-utils': 13.30.0 '@vercel/nft': 1.10.0 execa: 3.2.0 fs-extra: 11.1.0 @@ -3448,17 +3767,17 @@ snapshots: is-buffer: 2.0.5 is-node-process: 1.2.0 throttleit: 2.1.0 - undici: 6.26.0 + undici: 6.27.0 - '@vercel/build-utils@13.26.4': + '@vercel/build-utils@13.30.0': dependencies: '@vercel/python-analysis': 0.11.1 cjs-module-lexer: 1.2.3 es-module-lexer: 1.5.0 - '@vercel/cervel@0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@vercel/cervel@0.1.22(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@vercel/backends': 0.8.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@vercel/backends': 0.8.14(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3466,29 +3785,37 @@ snapshots: - rollup - supports-color - '@vercel/cli-config@0.1.2': + '@vercel/cli-auth@0.3.0': + dependencies: + '@napi-rs/keyring': 1.2.0 + '@vercel/cli-config': 0.2.0 + async-listen: 3.0.0 + open: 8.4.0 + zod: 4.1.11 + + '@vercel/cli-config@0.2.0': dependencies: xdg-app-paths: 5.5.1 zod: 4.1.11 '@vercel/detect-agent@1.2.3': {} - '@vercel/elysia@0.1.84': + '@vercel/elysia@0.1.93': dependencies: - '@vercel/node': 5.8.8 + '@vercel/node': 5.8.17 '@vercel/static-config': 3.4.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/error-utils@2.1.0': {} + '@vercel/error-utils@2.2.0': {} - '@vercel/express@0.1.94(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@vercel/express@0.1.105(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@vercel/cervel': 0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@vercel/cervel': 0.1.22(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@vercel/nft': 1.10.0 - '@vercel/node': 5.8.8 + '@vercel/node': 5.8.17 '@vercel/static-config': 3.4.0 fs-extra: 11.1.0 path-to-regexp: 8.3.0 @@ -3501,9 +3828,9 @@ snapshots: - rollup - supports-color - '@vercel/fastify@0.1.87': + '@vercel/fastify@0.1.96': dependencies: - '@vercel/node': 5.8.8 + '@vercel/node': 5.8.17 '@vercel/static-config': 3.4.0 transitivePeerDependencies: - encoding @@ -3538,29 +3865,29 @@ snapshots: dependencies: web-vitals: 0.2.4 - '@vercel/gatsby-plugin-vercel-builder@2.2.10': + '@vercel/gatsby-plugin-vercel-builder@2.2.19': dependencies: '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 13.26.4 + '@vercel/build-utils': 13.30.0 esbuild: 0.27.0 etag: 1.8.1 fs-extra: 11.1.0 - '@vercel/go@3.8.0': {} + '@vercel/go@3.9.1': {} - '@vercel/h3@0.1.93': + '@vercel/h3@0.1.102': dependencies: - '@vercel/node': 5.8.8 + '@vercel/node': 5.8.17 '@vercel/static-config': 3.4.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/hono@0.2.87': + '@vercel/hono@0.2.96': dependencies: '@vercel/nft': 1.10.0 - '@vercel/node': 5.8.8 + '@vercel/node': 5.8.17 '@vercel/static-config': 3.4.0 fs-extra: 11.1.0 path-to-regexp: 8.3.0 @@ -3571,30 +3898,30 @@ snapshots: - rollup - supports-color - '@vercel/hydrogen@1.3.8': + '@vercel/hydrogen@1.4.0': dependencies: '@vercel/static-config': 3.4.0 ts-morph: 12.0.0 - '@vercel/koa@0.1.67': + '@vercel/koa@0.1.76': dependencies: - '@vercel/node': 5.8.8 + '@vercel/node': 5.8.17 '@vercel/static-config': 3.4.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/nestjs@0.2.88': + '@vercel/nestjs@0.2.97': dependencies: - '@vercel/node': 5.8.8 + '@vercel/node': 5.8.17 '@vercel/static-config': 3.4.0 transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/next@4.17.5': + '@vercel/next@4.19.1': dependencies: '@vercel/nft': 1.10.0 transitivePeerDependencies: @@ -3606,8 +3933,8 @@ snapshots: dependencies: '@mapbox/node-pre-gyp': 2.0.3 '@rollup/pluginutils': 5.4.0 - acorn: 8.16.0 - acorn-import-attributes: 1.9.5(acorn@8.16.0) + acorn: 8.17.0 + acorn-import-attributes: 1.9.5(acorn@8.17.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -3621,14 +3948,14 @@ snapshots: - rollup - supports-color - '@vercel/node@5.8.8': + '@vercel/node@5.8.17': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 '@edge-runtime/vm': 3.2.0 '@types/node': 20.11.0 - '@vercel/build-utils': 13.26.4 - '@vercel/error-utils': 2.1.0 + '@vercel/build-utils': 13.30.0 + '@vercel/error-utils': 2.2.0 '@vercel/nft': 1.10.0 '@vercel/static-config': 3.4.0 async-listen: 3.0.0 @@ -3652,7 +3979,7 @@ snapshots: '@vercel/oidc@3.2.0': {} - '@vercel/prepare-flags-definitions@0.2.1': {} + '@vercel/prepare-flags-definitions@0.3.0': {} '@vercel/python-analysis@0.11.1': dependencies: @@ -3664,11 +3991,11 @@ snapshots: smol-toml: 1.5.2 zod: 3.22.4 - '@vercel/python@6.44.0': + '@vercel/python@6.47.0': dependencies: '@vercel/python-analysis': 0.11.1 - '@vercel/redwood@2.4.15': + '@vercel/redwood@2.5.0': dependencies: '@vercel/nft': 1.10.0 '@vercel/static-config': 3.4.0 @@ -3679,9 +4006,9 @@ snapshots: - rollup - supports-color - '@vercel/remix-builder@5.8.4': + '@vercel/remix-builder@5.9.1': dependencies: - '@vercel/error-utils': 2.1.0 + '@vercel/error-utils': 2.2.0 '@vercel/nft': 1.10.0 '@vercel/static-config': 3.4.0 path-to-regexp: 6.1.0 @@ -3699,25 +4026,27 @@ snapshots: execa: 5.1.1 smol-toml: 1.5.2 - '@vercel/sandbox@1.9.0': + '@vercel/sandbox@2.1.1': dependencies: '@vercel/oidc': 3.2.0 + '@workflow/serde': 4.1.0-beta.2 async-retry: 1.3.3 + jose: 6.2.3 jsonlines: 0.1.1 ms: 2.1.3 picocolors: 1.1.1 tar-stream: 3.1.7 - undici: 7.26.0 + undici: 7.28.0 xdg-app-paths: 5.1.0 zod: 3.24.4 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - '@vercel/static-build@2.9.33': + '@vercel/static-build@2.10.3': dependencies: '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 - '@vercel/gatsby-plugin-vercel-builder': 2.2.10 + '@vercel/gatsby-plugin-vercel-builder': 2.2.19 '@vercel/static-config': 3.4.0 ts-morph: 12.0.0 @@ -3727,18 +4056,61 @@ snapshots: json-schema-to-ts: 1.6.4 ts-morph: 12.0.0 - '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.0)(tsx@4.21.0))': + '@vitejs/plugin-react@6.0.2(vite@8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.0.16(@types/node@25.9.1)(esbuild@0.27.0)(tsx@4.21.0) + vite: 8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0) + + '@vitest/expect@4.1.9': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + chai: 6.2.2 + tinyrainbow: 3.1.0 + + '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0))': + dependencies: + '@vitest/spy': 4.1.9 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0) + + '@vitest/pretty-format@4.1.9': + dependencies: + tinyrainbow: 3.1.0 + + '@vitest/runner@4.1.9': + dependencies: + '@vitest/utils': 4.1.9 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + '@vitest/utils': 4.1.9 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.9': {} + + '@vitest/utils@4.1.9': + dependencies: + '@vitest/pretty-format': 4.1.9 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.0 + + '@workflow/serde@4.1.0-beta.2': {} abbrev@3.0.1: {} - acorn-import-attributes@1.9.5(acorn@8.16.0): + acorn-import-attributes@1.9.5(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} + acorn@8.17.0: {} agent-base@6.0.2: dependencies: @@ -3755,55 +4127,55 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - antd@6.4.3(luxon@3.7.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + antd@6.4.4(luxon@3.7.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: '@ant-design/colors': 8.0.1 - '@ant-design/cssinjs': 2.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@ant-design/cssinjs-utils': 2.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@ant-design/cssinjs': 2.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@ant-design/cssinjs-utils': 2.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@ant-design/fast-color': 3.0.1 - '@ant-design/icons': 6.2.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@ant-design/react-slick': 2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@babel/runtime': 7.29.2 - '@rc-component/cascader': 1.15.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/checkbox': 2.0.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/collapse': 1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/color-picker': 3.1.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/dialog': 1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/drawer': 1.4.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/dropdown': 1.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/form': 1.8.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/image': 1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/input': 1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/input-number': 1.6.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/mentions': 1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/menu': 1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/motion': 1.3.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/mutate-observer': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/notification': 2.0.7(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/pagination': 1.2.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/picker': 1.10.0(dayjs@1.11.20)(luxon@3.7.2)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/progress': 1.0.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/qrcode': 1.1.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/rate': 1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/resize-observer': 1.1.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/segmented': 1.3.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/select': 1.6.15(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/slider': 1.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/steps': 1.2.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/switch': 1.0.3(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/table': 1.10.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/tabs': 1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/tooltip': 1.4.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/tour': 2.4.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/tree': 1.3.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/tree-select': 1.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/trigger': 3.9.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/upload': 1.1.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@rc-component/util': 1.11.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + '@ant-design/icons': 6.2.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@ant-design/react-slick': 2.0.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@babel/runtime': 7.29.7 + '@rc-component/cascader': 1.16.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/checkbox': 2.0.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/collapse': 1.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/color-picker': 3.1.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/dialog': 1.9.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/drawer': 1.4.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/dropdown': 1.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/form': 1.8.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/image': 1.9.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/input': 1.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/input-number': 1.6.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/mentions': 1.9.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/menu': 1.3.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/motion': 1.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/mutate-observer': 2.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/notification': 2.0.7(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/pagination': 1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/picker': 1.10.0(dayjs@1.11.21)(luxon@3.7.2)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/progress': 1.0.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/qrcode': 2.0.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/rate': 1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/resize-observer': 1.1.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/segmented': 1.3.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/select': 1.7.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/slider': 1.0.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/steps': 1.2.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/switch': 1.0.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/table': 1.10.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/tabs': 1.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/tooltip': 1.4.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/tour': 2.4.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/tree': 1.3.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/tree-select': 1.10.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/trigger': 3.9.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/upload': 1.1.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@rc-component/util': 1.11.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: 2.1.1 - dayjs: 1.11.20 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + dayjs: 1.11.21 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) scroll-into-view-if-needed: 3.1.0 throttle-debounce: 5.0.2 transitivePeerDependencies: @@ -3817,6 +4189,8 @@ snapshots: argparse@2.0.1: {} + assertion-error@2.0.1: {} + ast-types@0.13.4: dependencies: tslib: 2.8.1 @@ -3835,10 +4209,10 @@ snapshots: asynckit@0.4.0: {} - axios@1.17.0: + axios@1.18.0: dependencies: follow-redirects: 1.16.0 - form-data: 4.0.5 + form-data: 4.0.6 https-proxy-agent: 5.0.1 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -3851,7 +4225,7 @@ snapshots: balanced-match@4.0.4: {} - bare-events@2.8.3: {} + bare-events@2.9.1: {} basic-ftp@5.3.1: {} @@ -3881,6 +4255,8 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 + chai@6.2.2: {} + chokidar@4.0.0: dependencies: readdirp: 4.1.2 @@ -3907,6 +4283,8 @@ snapshots: convert-hrtime@3.0.0: {} + convert-source-map@2.0.0: {} + cookie-es@2.0.1: {} cookie@1.1.1: {} @@ -3959,7 +4337,7 @@ snapshots: data-uri-to-buffer@6.0.2: {} - dayjs@1.11.20: {} + dayjs@1.11.21: {} debug@4.3.4: dependencies: @@ -3971,6 +4349,8 @@ snapshots: decimal.js-light@2.5.1: {} + define-lazy-prop@2.0.0: {} + degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -4019,6 +4399,8 @@ snapshots: es-module-lexer@1.5.0: {} + es-module-lexer@2.1.0: {} + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -4075,6 +4457,10 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + esutils@2.0.3: {} etag@1.8.1: {} @@ -4085,7 +4471,7 @@ snapshots: events-universal@1.0.1: dependencies: - bare-events: 2.8.3 + bare-events: 2.9.1 transitivePeerDependencies: - bare-abort-controller @@ -4114,6 +4500,8 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + expect-type@1.3.0: {} + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -4148,7 +4536,7 @@ snapshots: follow-redirects@1.16.0: {} - form-data@4.0.5: + form-data@4.0.6: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -4288,6 +4676,8 @@ snapshots: is-buffer@2.0.5: {} + is-docker@2.2.1: {} + is-extglob@2.1.1: {} is-glob@4.0.3: @@ -4302,10 +4692,16 @@ snapshots: is-stream@2.0.1: {} + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + isexe@2.0.0: {} jose@5.9.6: {} + jose@6.2.3: {} + js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -4386,12 +4782,16 @@ snapshots: lru-cache@7.18.3: {} - lucide-react@1.17.0(react@19.2.6): + lucide-react@1.21.0(react@19.2.7): dependencies: - react: 19.2.6 + react: 19.2.7 luxon@3.7.2: {} + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + math-intrinsics@1.1.0: {} merge-stream@2.0.0: {} @@ -4473,6 +4873,8 @@ snapshots: dependencies: path-key: 3.1.1 + obug@2.1.3: {} + once@1.3.3: dependencies: wrappy: 1.0.2 @@ -4485,6 +4887,12 @@ snapshots: dependencies: mimic-fn: 2.1.0 + open@8.4.0: + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + os-paths@4.4.0: {} oxc-transform@0.111.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): @@ -4552,6 +4960,8 @@ snapshots: path-to-regexp@8.3.0: {} + pathe@2.0.3: {} + pend@1.2.0: {} picocolors@1.0.0: {} @@ -4607,59 +5017,59 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-dom@19.2.6(react@19.2.6): + react-dom@19.2.7(react@19.2.7): dependencies: - react: 19.2.6 + react: 19.2.7 scheduler: 0.27.0 - react-hook-form@7.78.0(react@19.2.6): + react-hook-form@7.80.0(react@19.2.7): dependencies: - react: 19.2.6 + react: 19.2.7 react-is@18.3.1: {} - react-redux@9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1): + react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1): dependencies: '@types/use-sync-external-store': 0.0.6 - react: 19.2.6 - use-sync-external-store: 1.6.0(react@19.2.6) + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.17 redux: 5.0.1 - react-router-dom@7.16.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + react-router-dom@7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) - react-router: 7.16.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + react-router: 7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) - react-router@7.16.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): + react-router@7.18.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: cookie: 1.1.1 - react: 19.2.6 + react: 19.2.7 set-cookie-parser: 2.7.2 optionalDependencies: - react-dom: 19.2.6(react@19.2.6) + react-dom: 19.2.7(react@19.2.7) - react@19.2.6: {} + react@19.2.7: {} readdirp@4.1.2: {} - recharts@3.8.1(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react-is@18.3.1)(react@19.2.6)(redux@5.0.1): + recharts@3.8.1(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react-is@18.3.1)(react@19.2.7)(redux@5.0.1): dependencies: - '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1))(react@19.2.6) + '@reduxjs/toolkit': 2.12.0(react-redux@9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1))(react@19.2.7) clsx: 2.1.1 decimal.js-light: 2.5.1 es-toolkit: 1.46.1 eventemitter3: 5.0.4 immer: 10.2.0 - react: 19.2.6 - react-dom: 19.2.6(react@19.2.6) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-is: 18.3.1 - react-redux: 9.3.0(@types/react@19.2.15)(react@19.2.6)(redux@5.0.1) + react-redux: 9.3.0(@types/react@19.2.17)(react@19.2.7)(redux@5.0.1) reselect: 5.1.1 tiny-invariant: 1.3.3 - use-sync-external-store: 1.6.0(react@19.2.6) + use-sync-external-store: 1.6.0(react@19.2.7) victory-vendor: 37.3.6 transitivePeerDependencies: - '@types/react' @@ -4734,9 +5144,10 @@ snapshots: safer-buffer@2.1.2: {} - sandbox@2.5.6: + sandbox@3.1.2: dependencies: - '@vercel/sandbox': 1.9.0 + '@vercel/sandbox': 2.1.1 + async-retry: 1.3.3 debug: 4.4.3 zod: 4.4.3 transitivePeerDependencies: @@ -4756,7 +5167,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.8.1: {} + semver@7.8.5: {} set-cookie-parser@2.7.2: {} @@ -4768,6 +5179,8 @@ snapshots: shebang-regex@3.0.0: {} + siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.0.2: {} @@ -4798,10 +5211,14 @@ snapshots: dependencies: cookie-es: 2.0.1 + stackback@0.0.2: {} + stat-mode@0.3.0: {} statuses@1.5.0: {} + std-env@4.1.0: {} + stream-to-array@2.3.0: dependencies: any-promise: 1.3.0 @@ -4812,7 +5229,7 @@ snapshots: end-of-stream: 1.1.0 stream-to-array: 2.3.0 - streamx@2.26.0: + streamx@2.28.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -4831,12 +5248,12 @@ snapshots: dependencies: b4a: 1.8.1 fast-fifo: 1.3.2 - streamx: 2.26.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - tar@7.5.15: + tar@7.5.16: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -4870,13 +5287,19 @@ snapshots: tiny-invariant@1.3.3: {} + tinybench@2.9.0: {} + tinyexec@0.3.2: {} + tinyexec@1.2.4: {} + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyrainbow@3.1.0: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -4917,9 +5340,9 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - undici@6.26.0: {} + undici@6.27.0: {} - undici@7.26.0: {} + undici@7.28.0: {} universalify@2.0.1: {} @@ -4929,43 +5352,44 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@19.2.6): + use-sync-external-store@1.6.0(react@19.2.7): dependencies: - react: 19.2.6 + react: 19.2.7 - vercel@54.6.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): + vercel@54.14.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): dependencies: - '@vercel/backends': 0.8.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@vercel/backends': 0.8.14(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@vercel/blob': 2.4.0 - '@vercel/build-utils': 13.26.4 - '@vercel/cli-config': 0.1.2 + '@vercel/build-utils': 13.30.0 + '@vercel/cli-auth': 0.3.0 + '@vercel/cli-config': 0.2.0 '@vercel/detect-agent': 1.2.3 - '@vercel/elysia': 0.1.84 - '@vercel/express': 0.1.94(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - '@vercel/fastify': 0.1.87 + '@vercel/elysia': 0.1.93 + '@vercel/express': 0.1.105(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@vercel/fastify': 0.1.96 '@vercel/fun': 1.3.0 - '@vercel/go': 3.8.0 - '@vercel/h3': 0.1.93 - '@vercel/hono': 0.2.87 - '@vercel/hydrogen': 1.3.8 - '@vercel/koa': 0.1.67 - '@vercel/nestjs': 0.2.88 - '@vercel/next': 4.17.5 - '@vercel/node': 5.8.8 - '@vercel/prepare-flags-definitions': 0.2.1 - '@vercel/python': 6.44.0 - '@vercel/redwood': 2.4.15 - '@vercel/remix-builder': 5.8.4 + '@vercel/go': 3.9.1 + '@vercel/h3': 0.1.102 + '@vercel/hono': 0.2.96 + '@vercel/hydrogen': 1.4.0 + '@vercel/koa': 0.1.76 + '@vercel/nestjs': 0.2.97 + '@vercel/next': 4.19.1 + '@vercel/node': 5.8.17 + '@vercel/prepare-flags-definitions': 0.3.0 + '@vercel/python': 6.47.0 + '@vercel/redwood': 2.5.0 + '@vercel/remix-builder': 5.9.1 '@vercel/ruby': 2.4.0 '@vercel/rust': 1.3.0 - '@vercel/static-build': 2.9.33 + '@vercel/static-build': 2.10.3 chokidar: 4.0.0 esbuild: 0.27.0 - form-data: 4.0.5 + form-data: 4.0.6 jose: 5.9.6 luxon: 3.7.2 proxy-agent: 6.4.0 - sandbox: 2.5.6 + sandbox: 3.1.2 smol-toml: 1.5.2 zod: 4.1.11 transitivePeerDependencies: @@ -4994,7 +5418,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite@8.0.16(@types/node@25.9.1)(esbuild@0.27.0)(tsx@4.21.0): + vite@8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -5002,11 +5426,39 @@ snapshots: rolldown: 1.0.3 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 25.9.4 esbuild: 0.27.0 fsevents: 2.3.3 tsx: 4.21.0 + vitest@4.1.9(@edge-runtime/vm@3.2.0)(@types/node@25.9.4)(vite@8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0)): + dependencies: + '@vitest/expect': 4.1.9 + '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0)) + '@vitest/pretty-format': 4.1.9 + '@vitest/runner': 4.1.9 + '@vitest/snapshot': 4.1.9 + '@vitest/spy': 4.1.9 + '@vitest/utils': 4.1.9 + es-module-lexer: 2.1.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.3 + pathe: 2.0.3 + picomatch: 4.0.4 + std-env: 4.1.0 + tinybench: 2.9.0 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.0 + vite: 8.0.16(@types/node@25.9.4)(esbuild@0.27.0)(tsx@4.21.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@edge-runtime/vm': 3.2.0 + '@types/node': 25.9.4 + transitivePeerDependencies: + - msw + web-vitals@0.2.4: {} webidl-conversions@3.0.1: {} @@ -5020,6 +5472,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + wrappy@1.0.2: {} xdg-app-paths@5.1.0: @@ -5061,9 +5518,9 @@ snapshots: zod@4.4.3: {} - zustand@5.0.14(@types/react@19.2.15)(immer@11.1.8)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)): + zustand@5.0.14(@types/react@19.2.17)(immer@11.1.8)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): optionalDependencies: - '@types/react': 19.2.15 + '@types/react': 19.2.17 immer: 11.1.8 - react: 19.2.6 - use-sync-external-store: 1.6.0(react@19.2.6) + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) diff --git a/admin-service/src/App.tsx b/admin-service/src/App.tsx index 037237d3..e08256e0 100644 --- a/admin-service/src/App.tsx +++ b/admin-service/src/App.tsx @@ -10,7 +10,7 @@ import { LayoutDashboard, Users, BookOpen, Layers, FileText, PenTool, BarChart3, Languages, Trophy, ShoppingBag, Megaphone, ScrollText, Activity, Settings, - Shield, Database, Bot, ArrowRight, ArrowLeft, MessageSquare + Shield, Database, Bot, ArrowRight, ArrowLeft, MessageSquare, Swords, Bell } from "lucide-react"; // Lazy-loaded components @@ -37,6 +37,8 @@ const ContentAnalyticsPage = lazy(() => import("./pages/ContentAnalyticsPage").t const SystemSettingsPage = lazy(() => import("./pages/SystemSettingsPage").then(m => ({ default: m.SystemSettingsPage }))); const AdminManagementPage = lazy(() => import("./pages/AdminManagementPage").then(m => ({ default: m.AdminManagementPage }))); const AiChatSettingsPage = lazy(() => import("./pages/AiChatSettingsPage").then(m => ({ default: m.AiChatSettingsPage }))); +const RankingAgentPage = lazy(() => import("./pages/RankingAgentPage").then(m => ({ default: m.RankingAgentPage }))); +const NotificationCampaignPage = lazy(() => import("./pages/NotificationCampaignPage").then(m => ({ default: m.NotificationCampaignPage }))); const NoAccessPage = lazy(() => import("./pages/NoAccessPage").then(m => ({ default: m.NoAccessPage }))); const NotFoundPage = lazy(() => import("./pages/NotFoundPage").then(m => ({ default: m.NotFoundPage }))); @@ -62,6 +64,8 @@ const AppRoutes = () => { { to: "/admin/vocabulary", label: t.nav.vocabulary, icon: }, { to: "/admin/achievements", label: t.nav.achievements, icon: }, { to: "/admin/shop", label: t.nav.shop, icon: }, + { to: "/admin/ranking-agent", label: t.nav.rankingAgent, icon: }, + { to: "/admin/notification-campaign", label: t.nav.notificationCampaign, icon: }, { to: "/admin/ads", label: t.nav.bannerAds, icon: }, { to: "/admin/logs", label: t.nav.logs, icon: }, { to: "/admin/monitoring", label: t.nav.monitoring, icon: }, @@ -104,6 +108,8 @@ const AppRoutes = () => { } /> } /> } /> + } /> + } /> } /> } /> } /> diff --git a/admin-service/src/components/content-agent/ContentAgentDrawer.test.tsx b/admin-service/src/components/content-agent/ContentAgentDrawer.test.tsx new file mode 100644 index 00000000..e675d5da --- /dev/null +++ b/admin-service/src/components/content-agent/ContentAgentDrawer.test.tsx @@ -0,0 +1,153 @@ +import { describe, expect, it, vi } from "vitest"; + +import type { ContentAgentJob } from "../../lib/contentAgentApi"; +import { + applyContentAgentPreview, + canApplyContentAgentJob, + isContentAgentJobActive, + summarizeContentAgentPreview, +} from "./ContentAgentDrawer"; + +const job = (overrides: Partial = {}): ContentAgentJob => ({ + id: "job-1", + status: "preview_ready", + config: {}, + progress: { percentage: 100 }, + source_manifest: [], + warnings: [], + blocking_errors: [], + created_entity_ids: {}, + created_at: "2026-06-15T00:00:00Z", + updated_at: "2026-06-15T00:01:00Z", + ...overrides, +}); + +describe("ContentAgentDrawer state", () => { + it("polls only non-terminal pipeline stages", () => { + expect(isContentAgentJobActive("resolving_sources")).toBe(true); + expect(isContentAgentJobActive("loading_snapshots")).toBe(true); + expect(isContentAgentJobActive("normalizing_upload")).toBe(true); + expect(isContentAgentJobActive("generating")).toBe(true); + expect(isContentAgentJobActive("applying")).toBe(true); + expect(isContentAgentJobActive("preview_ready")).toBe(false); + expect(isContentAgentJobActive("completed")).toBe(false); + expect(isContentAgentJobActive("failed")).toBe(false); + }); + + it("disables apply when validation has blocking errors", () => { + expect(canApplyContentAgentJob(job())).toBe(true); + expect( + canApplyContentAgentJob( + job({ blocking_errors: ["Lesson 2 has an invalid exercise"] }), + ), + ).toBe(false); + expect(canApplyContentAgentJob(job({ status: "generating" }))).toBe(false); + }); + + it("summarizes preview vocabulary and speaking/listening exercises", () => { + expect( + summarizeContentAgentPreview({ + schema_version: 2, + prompt_version: "cefr-course-v2", + generation_key: "key", + source_manifest: [], + courses: [ + { + title: "A1 Foundations", + description: "", + language: "en", + level: "A1", + tags: [], + units: [ + { + title: "Daily life", + order_index: 1, + lessons: [ + { + title: "Morning", + order_index: 1, + vocabulary: [{ word: "wake", part_of_speech: "verb" }], + exercises: [ + { + id: "e1", + type: "speaking", + ui_type: "speaking_repeat", + question: "Repeat.", + correct_answer: "I wake up.", + }, + { + id: "e2", + type: "listening", + ui_type: "dictation", + question: "Type what you hear.", + correct_answer: "I wake up.", + }, + ], + }, + ], + }, + ], + }, + ], + quality: { + blocking_errors: [], + warnings: [], + metrics: { duplicate_reuse_count: 3 }, + }, + }), + ).toEqual({ + courses: 1, + units: 1, + lessons: 1, + vocabulary: 1, + speaking: 1, + listening: 1, + duplicateReuse: 3, + }); + }); + + it("reports a successful apply and lets the page refresh courses", async () => { + const apply = vi.fn().mockResolvedValue( + job({ + status: "completed", + created_entity_ids: { course_ids: ["course-1"] }, + }), + ); + const onApplied = vi.fn(); + + const result = await applyContentAgentPreview("job-1", apply, onApplied); + + expect(apply).toHaveBeenCalledWith("job-1"); + expect(onApplied).toHaveBeenCalledWith(result); + expect(result.created_entity_ids.course_ids).toEqual(["course-1"]); + }); + + it("blocking errors from job and preview both prevent apply", () => { + expect( + canApplyContentAgentJob( + job({ blocking_errors: ["Missing required field: definition"] }), + ), + ).toBe(false); + + expect( + canApplyContentAgentJob( + job({ blocking_errors: ["Invalid POS enum: VERB", "Missing license"] }), + ), + ).toBe(false); + }); + + it("canApply is true only when status is preview_ready and no blocking errors", () => { + expect(canApplyContentAgentJob(job({ status: "preview_ready", blocking_errors: [] }))).toBe(true); + expect(canApplyContentAgentJob(job({ status: "completed", blocking_errors: [] }))).toBe(false); + expect(canApplyContentAgentJob(job({ status: "failed", blocking_errors: [] }))).toBe(false); + expect(canApplyContentAgentJob(job({ status: "preview_ready", blocking_errors: ["err"] }))).toBe(false); + }); + + it("validation report shows error count through blocking_errors array", () => { + const jobWithErrors = job({ + blocking_errors: ["Error 1", "Error 2", "Error 3"], + }); + expect(jobWithErrors.blocking_errors).toHaveLength(3); + expect(canApplyContentAgentJob(jobWithErrors)).toBe(false); + }); +}); diff --git a/admin-service/src/components/content-agent/ContentAgentDrawer.tsx b/admin-service/src/components/content-agent/ContentAgentDrawer.tsx new file mode 100644 index 00000000..4746e8d0 --- /dev/null +++ b/admin-service/src/components/content-agent/ContentAgentDrawer.tsx @@ -0,0 +1,743 @@ +import React, { useCallback, useEffect, useMemo, useState } from "react"; +import { + AlertTriangle, + Ban, + CheckCircle2, + ChevronRight, + Database, + FileCheck2, + RefreshCw, + RotateCcw, + ShieldCheck, + Sparkles, + X, +} from "lucide-react"; + +import { + CONTENT_AGENT_ACTIVE_STATUSES, + applyContentAgentJob, + cancelContentAgentJob, + getContentAgentJob, + getContentAgentPreview, + retryContentAgentJob, + type ContentAgentJob, + type ContentAgentJobStatus, + type ContentAgentPreview, +} from "../../lib/contentAgentApi"; +import { useI18n } from "../../lib/i18n"; +import { StatusPill } from "../StatusPill"; + +const POLL_INTERVAL_MS = 2_500; +const activeStatuses = new Set(CONTENT_AGENT_ACTIVE_STATUSES); + +export const isContentAgentJobActive = (status: ContentAgentJobStatus) => + activeStatuses.has(status); + +export const canApplyContentAgentJob = (job: ContentAgentJob) => + job.status === "preview_ready" && job.blocking_errors.length === 0; + +export type ContentAgentPreviewSummary = { + courses: number; + units: number; + lessons: number; + vocabulary: number; + speaking: number; + listening: number; + duplicateReuse: number; +}; + +export const summarizeContentAgentPreview = ( + preview: ContentAgentPreview, +): ContentAgentPreviewSummary => { + const summary: ContentAgentPreviewSummary = { + courses: preview.courses.length, + units: 0, + lessons: 0, + vocabulary: 0, + speaking: 0, + listening: 0, + duplicateReuse: 0, + }; + + preview.courses.forEach((course) => { + summary.units += course.units.length; + course.units.forEach((unit) => { + summary.lessons += unit.lessons.length; + unit.lessons.forEach((lesson) => { + summary.vocabulary += lesson.vocabulary.length; + lesson.exercises.forEach((exercise) => { + if ( + exercise.ui_type === "speaking_repeat" || + exercise.ui_type === "pronunciation_practice" + ) { + summary.speaking += 1; + } + if ( + exercise.ui_type === "dictation" || + exercise.ui_type === "listen_and_choose" + ) { + summary.listening += 1; + } + }); + }); + }); + }); + + const duplicateReuse = + preview.quality.metrics.duplicate_reuse_count ?? + preview.quality.metrics.deduplicated_records ?? + preview.quality.metrics.duplicate_reuse; + summary.duplicateReuse = + typeof duplicateReuse === "number" ? duplicateReuse : 0; + + return summary; +}; + +export const applyContentAgentPreview = async ( + jobId: string, + apply: (id: string) => Promise, + onApplied: (job: ContentAgentJob) => void, +) => { + const result = await apply(jobId); + onApplied(result); + return result; +}; + +type ContentAgentDrawerProps = { + jobId: string; + initialJob?: ContentAgentJob | null; + onClose: () => void; + onApplied: (job: ContentAgentJob) => void; +}; + +export function ContentAgentDrawer({ + jobId, + initialJob = null, + onClose, + onApplied, +}: ContentAgentDrawerProps) { + const { t } = useI18n(); + const [job, setJob] = useState( + initialJob?.id === jobId ? initialJob : null, + ); + const [preview, setPreview] = useState(null); + const [loading, setLoading] = useState(!initialJob); + const [busyAction, setBusyAction] = useState< + "apply" | "retry" | "cancel" | null + >(null); + const [error, setError] = useState(null); + + const refreshJob = useCallback(async () => { + const nextJob = await getContentAgentJob(jobId); + setJob(nextJob); + return nextJob; + }, [jobId]); + + useEffect(() => { + let disposed = false; + setPreview(null); + setError(null); + + if (initialJob?.id === jobId) { + setJob(initialJob); + setLoading(false); + return () => { + disposed = true; + }; + } + + setLoading(true); + void refreshJob() + .catch((requestError) => { + if (!disposed) { + setError( + requestError instanceof Error + ? requestError.message + : t.contentAgent.loadJobFailed, + ); + } + }) + .finally(() => { + if (!disposed) setLoading(false); + }); + + return () => { + disposed = true; + }; + }, [initialJob, jobId, refreshJob, t.contentAgent.loadJobFailed]); + + useEffect(() => { + if (!job || !isContentAgentJobActive(job.status)) return; + + let disposed = false; + const interval = window.setInterval(() => { + void refreshJob().catch((requestError) => { + if (!disposed) { + setError( + requestError instanceof Error + ? requestError.message + : t.contentAgent.loadJobFailed, + ); + } + }); + }, POLL_INTERVAL_MS); + + return () => { + disposed = true; + window.clearInterval(interval); + }; + }, [job, refreshJob, t.contentAgent.loadJobFailed]); + + useEffect(() => { + if ( + !job || + (job.status !== "preview_ready" && job.status !== "completed") || + preview + ) { + return; + } + + let disposed = false; + void getContentAgentPreview(job.id) + .then((nextPreview) => { + if (!disposed) setPreview(nextPreview); + }) + .catch((requestError) => { + if (!disposed) { + setError( + requestError instanceof Error + ? requestError.message + : t.contentAgent.loadPreviewFailed, + ); + } + }); + + return () => { + disposed = true; + }; + }, [job, preview, t.contentAgent.loadPreviewFailed]); + + const summary = useMemo( + () => (preview ? summarizeContentAgentPreview(preview) : null), + [preview], + ); + + const handleApply = async () => { + if (!job || !canApplyContentAgentJob(job)) return; + setBusyAction("apply"); + setError(null); + try { + const result = await applyContentAgentPreview( + job.id, + applyContentAgentJob, + onApplied, + ); + setJob(result); + } catch (requestError) { + setError( + requestError instanceof Error + ? requestError.message + : t.contentAgent.applyFailed, + ); + } finally { + setBusyAction(null); + } + }; + + const handleRetry = async () => { + if (!job) return; + setBusyAction("retry"); + setError(null); + try { + const result = await retryContentAgentJob(job.id); + setJob(result); + setPreview(null); + } catch (requestError) { + setError( + requestError instanceof Error + ? requestError.message + : t.contentAgent.retryFailed, + ); + } finally { + setBusyAction(null); + } + }; + + const handleCancel = async () => { + if (!job) return; + setBusyAction("cancel"); + setError(null); + try { + setJob(await cancelContentAgentJob(job.id)); + } catch (requestError) { + setError( + requestError instanceof Error + ? requestError.message + : t.contentAgent.cancelFailed, + ); + } finally { + setBusyAction(null); + } + }; + + const percentage = Math.max( + 0, + Math.min( + 100, + Number(job?.progress.percentage ?? job?.progress.percent ?? 0), + ), + ); + const warnings = [ + ...(job?.warnings ?? []), + ...(preview?.quality.warnings ?? []), + ]; + const blockingErrors = [ + ...(job?.blocking_errors ?? []), + ...(preview?.quality.blocking_errors ?? []), + ]; + const courseIds = + job?.created_entity_ids.course_ids ?? + job?.created_entity_ids.courses ?? + []; + + return ( +
+ + +
+ + +
+ {loading && !job ? ( +
+ + {t.contentAgent.loadingJob} +
+ ) : job ? ( + <> +
+
+
+ {t.contentAgent.currentStage} + {formatStage(job.status)} +
+ +
+
+ +
+
+ {job.progress.message || t.contentAgent.processing} + {percentage}% +
+
+ +
+ + + +
+ + {job.error_message && ( + } + items={[job.error_message]} + title={t.contentAgent.jobError} + tone="danger" + /> + )} + {blockingErrors.length > 0 && ( + } + items={blockingErrors} + title={t.contentAgent.blockingErrors} + tone="danger" + /> + )} + {warnings.length > 0 && ( + } + items={warnings} + title={t.contentAgent.warnings} + tone="warning" + /> + )} + + {job.source_manifest.length > 0 && ( +
+
+ +

{t.contentAgent.provenance}

+
+
+ {job.source_manifest.map((source, index) => ( +
+
+ {source.source_name} + + {typeof source.policy_version === "string" && source.policy_version + ? `${t.contentAgent.snapshotVersion} ${source.policy_version} · ` + : ""} + {Array.isArray(source.content_usage) + ? source.content_usage.join(", ") + : source.content_usage || + source.license_mode || + t.common.unknown} + +
+ {typeof source.record_count === "number" && ( + {source.record_count} {t.contentAgent.snapshotRecords} + )} +
+ ))} +
+
+ )} + + {summary && preview && ( + <> +
+
+ +

{t.contentAgent.previewSummary}

+
+
+ + + + + + +
+

+ {summary.duplicateReuse} {t.contentAgent.duplicatesReused} +

+
+ +
+
+ +

{t.contentAgent.courseTree}

+
+
+ {preview.courses.map((course, courseIndex) => ( +
+ + + {course.title} + + {course.level} · {course.units.length}{" "} + {t.contentAgent.unitsCount.toLowerCase()} + + + +
+ {course.units.map((unit) => ( +
+ {unit.title} +
    + {unit.lessons.map((lesson) => ( +
  • + {lesson.title} + + {lesson.vocabulary.length}{" "} + {t.contentAgent.words} ·{" "} + {lesson.exercises.length}{" "} + {t.contentAgent.exercises} + +
  • + ))} +
+
+ ))} +
+
+ ))} +
+
+ + + + )} + + {job.status === "completed" && ( +
+
+ )} + + {error &&
{error}
} + + ) : ( +
+ {error || t.contentAgent.loadJobFailed} +
+ )} +
+ + {job && ( +
+ {(job.status === "failed" || job.status === "cancelled") && ( + + )} + {isContentAgentJobActive(job.status) && + job.status !== "applying" && ( + + )} + {job.status === "preview_ready" && ( + <> + {blockingErrors.length > 0 && ( + + {t.contentAgent.validationBlocking} + + )} + + + )} +
+ )} + + + ); +} + +function formatStage(status: string) { + return status + .split("_") + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join(" "); +} + +function statusTone(status: ContentAgentJobStatus) { + if (status === "completed" || status === "preview_ready") return "success"; + if (status === "failed" || status === "cancelled") return "danger"; + if (status === "queued") return "neutral"; + return "info"; +} + +function counter( + job: ContentAgentJob, + name: "processed" | "rejected" | "deduplicated", +) { + const longName = `${name}_records`; + const counters = job.progress.counters ?? {}; + const value = + job.progress[longName] ?? + job.progress[name] ?? + counters[longName] ?? + counters[name] ?? + (name === "processed" ? counters.input_records : undefined); + return typeof value === "number" ? value : 0; +} + +function Counter({ label, value }: { label: string; value: number }) { + return ( +
+ {value.toLocaleString()} + {label} +
+ ); +} + +function PreviewMetric({ label, value }: { label: string; value: number }) { + return ( +
+ {label} + {value.toLocaleString()} +
+ ); +} + +function MessageList({ + icon, + items, + title, + tone, +}: { + icon: React.ReactNode; + items: string[]; + title: string; + tone: "danger" | "warning"; +}) { + return ( +
+
+ {icon} + {title} +
+
    + {items.map((item, index) => ( +
  • {item}
  • + ))} +
+
+ ); +} + +function SampleExercises({ preview }: { preview: ContentAgentPreview }) { + const { t } = useI18n(); + const exercises = preview.courses + .flatMap((course) => course.units) + .flatMap((unit) => unit.lessons) + .flatMap((lesson) => lesson.exercises) + .slice(0, 3); + + if (exercises.length === 0) return null; + + return ( +
+
+ +

{t.contentAgent.sampleExercises}

+
+
+ {exercises.map((exercise) => ( +
+ {formatStage(exercise.ui_type)} + {exercise.question} +

{exercise.correct_answer}

+
+ ))} +
+
+ ); +} diff --git a/admin-service/src/components/content-agent/ContentAgentModal.test.tsx b/admin-service/src/components/content-agent/ContentAgentModal.test.tsx new file mode 100644 index 00000000..4c40b8c9 --- /dev/null +++ b/admin-service/src/components/content-agent/ContentAgentModal.test.tsx @@ -0,0 +1,204 @@ +import { describe, expect, it, vi, beforeEach } from "vitest"; + +import type { SourceSnapshot } from "../../lib/contentAgentApi"; +import { + createDefaultContentAgentForm, + validateContentAgentForm, + validateContentAgentUpload, +} from "./ContentAgentModal"; + +vi.mock("../../lib/contentAgentApi", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + getSourceCatalog: vi.fn().mockResolvedValue([]), + }; +}); + +const sourceSnapshot = ( + overrides: Partial = {}, +): SourceSnapshot => ({ + source_id: "oewn", + source_name: "Open English WordNet", + source_version: "2025", + snapshot_id: `oewn:2025:${"a".repeat(64)}`, + official_url: "https://en-word.net/", + license_id: "CC-BY-4.0", + license_url: "https://creativecommons.org/licenses/by/4.0/", + attribution_text: "Open English WordNet contributors", + retrieved_at: "2026-06-01T00:00:00Z", + raw_checksum: "a".repeat(64), + normalized_sha256: "b".repeat(64), + normalized_bytes: 2048, + record_checksum_root: "c".repeat(64), + adapter_version: 1, + record_count: 150000, + status: "active", + enabled: true, + ...overrides, +}); + +describe("ContentAgentModal configuration", () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("defaults to every CEFR level, no source, and ten-item lessons", () => { + const form = createDefaultContentAgentForm(); + + expect(form.levels).toEqual(["A1", "A2", "B1", "B2", "C1", "C2"]); + expect(form.sources).toEqual([]); + expect(form.vocabularyPerLesson).toBe(10); + expect(form.exerciseCount).toBe(10); + expect(form.previewOnly).toBe(true); + expect(form.uploadAttestation).toBe(false); + }); + + it("requires vocabulary counts to stay inside the approved 8-12 range", () => { + expect( + validateContentAgentForm({ + ...createDefaultContentAgentForm(), + sources: ["oewn"], + vocabularyPerLesson: 7, + acknowledgedDraft: true, + }), + ).toContain("8"); + expect( + validateContentAgentForm({ + ...createDefaultContentAgentForm(), + sources: ["oewn"], + vocabularyPerLesson: 13, + acknowledgedDraft: true, + }), + ).toContain("12"); + }); + + it("matches the backend limit of at most ten units per course", () => { + expect( + validateContentAgentForm({ + ...createDefaultContentAgentForm(), + sources: ["oewn"], + unitsPerCourse: 11, + acknowledgedDraft: true, + }), + ).toContain("10"); + }); + + it("requires CEFR/source selection and the draft acknowledgement", () => { + expect( + validateContentAgentForm({ + ...createDefaultContentAgentForm(), + levels: [], + sources: [], + }), + ).toBeTruthy(); + expect( + validateContentAgentForm({ + ...createDefaultContentAgentForm(), + sources: ["oewn"], + }), + ).toContain("draft"); + }); + + it("accepts UTF-8 CSV/JSON files up to five megabytes", () => { + expect( + validateContentAgentUpload( + new File(["[]"], "records.json", { type: "application/json" }), + ), + ).toBeNull(); + expect( + validateContentAgentUpload( + new File(["word"], "records.txt", { type: "text/plain" }), + ), + ).toContain("CSV or JSON"); + expect( + validateContentAgentUpload( + new File([new Uint8Array(5 * 1024 * 1024 + 1)], "records.csv", { + type: "text/csv", + }), + ), + ).toContain("5 MB"); + }); + + it("requires upload attestation when a file is provided", () => { + const form = { ...createDefaultContentAgentForm(), sources: ["oewn"], acknowledgedDraft: true, uploadAttestation: false }; + const result = validateContentAgentForm(form, true); + expect(result).toBeTruthy(); + expect(result).toContain("confirm"); + }); + + it("passes validation when upload attestation is checked", () => { + const form = { + ...createDefaultContentAgentForm(), + sources: ["oewn"], + acknowledgedDraft: true, + uploadAttestation: true, + }; + expect(validateContentAgentForm(form, true)).toBeNull(); + }); +}); + +describe("ContentAgentModal source catalog logic", () => { + it("getSourceCatalog mock returns empty list by default", async () => { + const { getSourceCatalog } = await import("../../lib/contentAgentApi"); + const result = await getSourceCatalog(); + expect(Array.isArray(result)).toBe(true); + expect(result).toHaveLength(0); + }); + + it("getSourceCatalog resolves approved snapshots", async () => { + const { getSourceCatalog } = await import("../../lib/contentAgentApi"); + vi.mocked(getSourceCatalog).mockResolvedValueOnce([ + sourceSnapshot(), + ]); + + const result = await getSourceCatalog(); + expect(result).toHaveLength(1); + expect(result[0].source_id).toBe("oewn"); + expect(result[0].status).toBe("active"); + expect(result[0].enabled).toBe(true); + }); + + it("only approved+enabled snapshots are selectable", () => { + const snapshots = [ + sourceSnapshot(), + sourceSnapshot({ source_id: "tatoeba", enabled: false }), + sourceSnapshot({ source_id: "cmudict", enabled: false }), + ]; + + const selectable = snapshots.filter((s) => s.status === "active" && s.enabled); + expect(selectable).toHaveLength(1); + expect(selectable[0].source_id).toBe("oewn"); + }); + + it("core lexical sources are preselected when available and approved", () => { + const coreSourceIds = ["oewn", "cmudict", "cefr_j", "wikidata"]; + const approvedSnapshots = [ + sourceSnapshot(), + sourceSnapshot({ source_id: "tatoeba" }), + sourceSnapshot({ source_id: "cefr_j", enabled: false }), + ]; + + const preselected = approvedSnapshots + .filter((s) => s.status === "active" && s.enabled && coreSourceIds.includes(s.source_id)) + .map((s) => s.source_id); + + expect(preselected).toEqual(["oewn"]); + expect(preselected).not.toContain("tatoeba"); + expect(preselected).not.toContain("cefr_j"); + }); + + it("inactive snapshot is disabled (not approved+enabled)", () => { + const snapshot = sourceSnapshot({ + source_id: "cmudict", + enabled: false, + source_name: "CMUdict", + source_version: "1.0", + license_id: "BSD", + record_count: 0, + }); + + const selectable = snapshot.status === "active" && snapshot.enabled; + expect(selectable).toBe(false); + }); +}); diff --git a/admin-service/src/components/content-agent/ContentAgentModal.tsx b/admin-service/src/components/content-agent/ContentAgentModal.tsx new file mode 100644 index 00000000..87108cd6 --- /dev/null +++ b/admin-service/src/components/content-agent/ContentAgentModal.tsx @@ -0,0 +1,676 @@ +import React, { useEffect, useState } from "react"; +import { ShieldCheck, Sparkles, Upload, X } from "lucide-react"; + +import { + CEFR_LEVELS, + createContentAgentJob, + getSourceCatalog, + uploadContentAgentFile, + type CefrLevel, + type ContentAgentJob, + type ContentAgentJobCreate, + type ContentAgentSource, + type SourceSnapshot, +} from "../../lib/contentAgentApi"; +import { useI18n } from "../../lib/i18n"; + +const MAX_UPLOAD_BYTES = 5 * 1024 * 1024; + +const CORE_LEXICAL_SOURCES: readonly string[] = ["oewn", "cmudict", "cefr_j", "wikidata"]; + +export type ContentAgentFormState = { + levels: CefrLevel[]; + sources: string[]; + courseTitle: string; + topicFocus: string; + unitsPerCourse: number; + lessonsPerUnit: number; + vocabularyPerLesson: number; + exerciseCount: number; + speakingExerciseCount: number; + listeningExerciseCount: number; + confidenceThreshold: number; + previewOnly: true; + acknowledgedDraft: boolean; + revision: boolean; + uploadAttestation: boolean; +}; + +export const createDefaultContentAgentForm = (): ContentAgentFormState => ({ + levels: [...CEFR_LEVELS], + sources: [], + courseTitle: "", + topicFocus: "", + unitsPerCourse: 3, + lessonsPerUnit: 4, + vocabularyPerLesson: 10, + exerciseCount: 10, + speakingExerciseCount: 2, + listeningExerciseCount: 2, + confidenceThreshold: 0.75, + previewOnly: true, + acknowledgedDraft: false, + revision: false, + uploadAttestation: false, +}); + +export const validateContentAgentUpload = (file: File): string | null => { + const extension = file.name.toLowerCase().split(".").pop(); + if (extension !== "csv" && extension !== "json") { + return "Upload must be a CSV or JSON file."; + } + if (file.size > MAX_UPLOAD_BYTES) { + return "Upload must be 5 MB or smaller."; + } + if (file.size === 0) { + return "Upload cannot be empty."; + } + return null; +}; + +export const validateContentAgentForm = ( + form: ContentAgentFormState, + hasUpload = false, +): string | null => { + if (form.levels.length === 0) return "Select at least one CEFR level."; + if (form.sources.length === 0 && !hasUpload) { + return "Select at least one approved source or upload a file."; + } + if (hasUpload && !form.uploadAttestation) { + return "You must confirm rights before uploading"; + } + if ( + form.vocabularyPerLesson < 8 || + form.vocabularyPerLesson > 12 + ) { + return "Vocabulary per lesson must be between 8 and 12."; + } + if (form.unitsPerCourse < 1 || form.unitsPerCourse > 10) { + return "Units per course must be between 1 and 10."; + } + if (form.lessonsPerUnit < 1 || form.lessonsPerUnit > 20) { + return "Lessons per unit must be between 1 and 20."; + } + if ( + form.exerciseCount < 4 || + form.speakingExerciseCount < 0 || + form.listeningExerciseCount < 0 || + form.speakingExerciseCount + form.listeningExerciseCount > + form.exerciseCount + ) { + return "Exercise mix must fit inside the total exercise count."; + } + if ( + form.confidenceThreshold < 0.5 || + form.confidenceThreshold > 0.99 + ) { + return "Confidence threshold must be between 0.50 and 0.99."; + } + if (!form.acknowledgedDraft) { + return "Acknowledge that generated courses remain drafts."; + } + return null; +}; + +type ContentAgentModalProps = { + onClose: () => void; + onJobCreated: (job: ContentAgentJob) => void; +}; + +export function ContentAgentModal({ + onClose, + onJobCreated, +}: ContentAgentModalProps) { + const { t } = useI18n(); + const [form, setForm] = useState( + createDefaultContentAgentForm, + ); + const [upload, setUpload] = useState(null); + const [uploadError, setUploadError] = useState(null); + const [error, setError] = useState(null); + const [submitting, setSubmitting] = useState(false); + + const [catalog, setCatalog] = useState([]); + const [catalogLoading, setCatalogLoading] = useState(true); + const [catalogError, setCatalogError] = useState(null); + + useEffect(() => { + let disposed = false; + setCatalogLoading(true); + setCatalogError(null); + + getSourceCatalog() + .then((snapshots) => { + if (disposed) return; + setCatalog(snapshots); + const preselected = snapshots + .filter( + (s) => + s.status === "active" && + s.enabled && + CORE_LEXICAL_SOURCES.includes(s.source_id), + ) + .map((s) => s.source_id); + setForm((current) => ({ ...current, sources: preselected })); + }) + .catch((err) => { + if (!disposed) { + setCatalogError( + err instanceof Error ? err.message : t.contentAgent.sourceError, + ); + } + }) + .finally(() => { + if (!disposed) setCatalogLoading(false); + }); + + return () => { + disposed = true; + }; + }, [t.contentAgent.sourceError]); + + useEffect(() => { + const onKeyDown = (event: KeyboardEvent) => { + if (event.key === "Escape" && !submitting) onClose(); + }; + window.addEventListener("keydown", onKeyDown); + return () => window.removeEventListener("keydown", onKeyDown); + }, [onClose, submitting]); + + const toggleLevel = (level: CefrLevel) => { + setForm((current) => ({ + ...current, + levels: current.levels.includes(level) + ? current.levels.filter((item) => item !== level) + : [...current.levels, level], + })); + }; + + const toggleSource = (sourceId: string) => { + setForm((current) => ({ + ...current, + sources: current.sources.includes(sourceId) + ? current.sources.filter((item) => item !== sourceId) + : [...current.sources, sourceId], + })); + }; + + const handleUpload = (file: File | null) => { + setUpload(file); + const nextError = file ? validateContentAgentUpload(file) : null; + setUploadError(nextError); + }; + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + const validationError = validateContentAgentForm(form, Boolean(upload)); + const fileError = upload ? validateContentAgentUpload(upload) : null; + if (validationError || fileError) { + setError(validationError); + setUploadError(fileError); + return; + } + + setSubmitting(true); + setError(null); + try { + const uploaded = upload + ? await uploadContentAgentFile(upload, form.uploadAttestation) + : null; + const sources: ContentAgentSource[] = form.sources as ContentAgentSource[]; + if (uploaded && !sources.includes("admin_upload")) { + sources.push("admin_upload"); + } + + const payload: ContentAgentJobCreate = { + levels: form.levels, + sources, + ...(uploaded ? { upload_id: uploaded.id } : {}), + ...(form.courseTitle.trim() + ? { title_focus: form.courseTitle.trim() } + : {}), + topic_focus: form.topicFocus + .split(",") + .map((topic) => topic.trim()) + .filter(Boolean), + units_per_course: form.unitsPerCourse, + lessons_per_unit: form.lessonsPerUnit, + words_per_lesson: form.vocabularyPerLesson, + exercises_per_lesson: form.exerciseCount, + exercise_mix: { + speaking: form.speakingExerciseCount, + listening: form.listeningExerciseCount, + }, + confidence_threshold: form.confidenceThreshold, + revision: form.revision, + apply_on_success: false, + }; + + const job = await createContentAgentJob(payload); + onJobCreated(job); + } catch (requestError) { + setError( + requestError instanceof Error + ? requestError.message + : t.contentAgent.createFailed, + ); + } finally { + setSubmitting(false); + } + }; + + const formatLastSync = (lastSyncAt: string | null): string => { + if (!lastSyncAt) return t.common.never; + try { + return new Date(lastSyncAt).toLocaleDateString(); + } catch { + return lastSyncAt; + } + }; + + return ( +
!submitting && onClose()} + > +
event.stopPropagation()} + role="dialog" + > +
+
+ +
+

+ {t.contentAgent.configureTitle} +

+

{t.contentAgent.configureDescription}

+
+
+ +
+ +
+
+
+
+

{t.contentAgent.cefrLevels}

+

{t.contentAgent.cefrHelp}

+
+ + {form.levels.length}/6 + +
+
+ {CEFR_LEVELS.map((level) => ( + + ))} +
+
+ +
+
+
+

{t.contentAgent.sourceCatalog}

+

{t.contentAgent.sourcesHelp}

+
+
+
+ {catalogLoading && ( +
+
+ )} + {!catalogLoading && catalogError && ( +
{catalogError}
+ )} + {!catalogLoading && !catalogError && catalog.length === 0 && ( +
+ {t.contentAgent.sourceEmpty} +
+ )} + {!catalogLoading && + !catalogError && + catalog.map((snapshot) => { + const selectable = + snapshot.status === "active" && snapshot.enabled; + const checked = form.sources.includes(snapshot.source_id); + return ( + + ); + })} +
+
+ +
+
+
+

{t.contentAgent.uploadTitle}

+

{t.contentAgent.uploadHelp}

+
+
+ + {uploadError &&
{uploadError}
} + {upload && ( + + )} +
+ +
+
+
+

{t.contentAgent.curriculum}

+

{t.contentAgent.curriculumHelp}

+
+
+
+ + + + setForm((current) => ({ + ...current, + unitsPerCourse: value, + })) + } + value={form.unitsPerCourse} + /> + + setForm((current) => ({ + ...current, + lessonsPerUnit: value, + })) + } + value={form.lessonsPerUnit} + /> + + setForm((current) => ({ + ...current, + vocabularyPerLesson: value, + })) + } + value={form.vocabularyPerLesson} + /> + + setForm((current) => ({ + ...current, + exerciseCount: value, + })) + } + value={form.exerciseCount} + /> + + setForm((current) => ({ + ...current, + speakingExerciseCount: value, + })) + } + value={form.speakingExerciseCount} + disabled + /> + + setForm((current) => ({ + ...current, + listeningExerciseCount: value, + })) + } + value={form.listeningExerciseCount} + disabled + /> + +
+
+ +
+
+ {t.contentAgent.previewOnly} + {t.contentAgent.previewLocked} +
+ +
+ + + + + + {error &&
{error}
} + +
+ + +
+
+
+
+ ); +} + +type NumberFieldProps = { + label: string; + min: number; + max: number; + value: number; + onChange: (value: number) => void; + disabled?: boolean; +}; + +function NumberField({ + label, + min, + max, + value, + onChange, + disabled = false, +}: NumberFieldProps) { + return ( + + ); +} diff --git a/admin-service/src/components/dashboard/CompletionFunnelChart.tsx b/admin-service/src/components/dashboard/CompletionFunnelChart.tsx index c9fe6de1..b548d132 100644 --- a/admin-service/src/components/dashboard/CompletionFunnelChart.tsx +++ b/admin-service/src/components/dashboard/CompletionFunnelChart.tsx @@ -47,9 +47,9 @@ export const CompletionFunnelChart: React.FC = ({ data, loading }) => { tick={{ fontSize: 12 }} width={90} /> - [ - `${value.toLocaleString()} (${props.payload.percentage.toFixed(1)}%)`, + [ + `${Number(value ?? 0).toLocaleString()} (${Number(item.payload?.percentage ?? 0).toFixed(1)}%)`, "" ]} /> diff --git a/admin-service/src/components/dashboard/CoursePopularityChart.tsx b/admin-service/src/components/dashboard/CoursePopularityChart.tsx index b753cf6a..5fd49adf 100644 --- a/admin-service/src/components/dashboard/CoursePopularityChart.tsx +++ b/admin-service/src/components/dashboard/CoursePopularityChart.tsx @@ -45,7 +45,7 @@ export const CoursePopularityChart: React.FC = ({ data, loading }) => { cx="50%" cy="50%" labelLine={false} - label={({ name, percent }) => `${name}: ${(percent * 100).toFixed(0)}%`} + label={({ name, percent }) => `${name}: ${((percent ?? 0) * 100).toFixed(0)}%`} outerRadius={80} fill="#8884d8" dataKey="value" @@ -54,7 +54,7 @@ export const CoursePopularityChart: React.FC = ({ data, loading }) => { ))} - [value.toLocaleString() + " đăng ký", ""]} /> + [Number(value ?? 0).toLocaleString() + " đăng ký", ""]} /> diff --git a/admin-service/src/components/dashboard/EngagementChart.tsx b/admin-service/src/components/dashboard/EngagementChart.tsx index 03e11562..f77b65fb 100644 --- a/admin-service/src/components/dashboard/EngagementChart.tsx +++ b/admin-service/src/components/dashboard/EngagementChart.tsx @@ -37,7 +37,7 @@ export const EngagementChart: React.FC = ({ data, loading }) => { - [value.toLocaleString(), ""]} /> + [Number(value ?? 0).toLocaleString(), ""]} /> diff --git a/admin-service/src/components/dashboard/UserGrowthChart.tsx b/admin-service/src/components/dashboard/UserGrowthChart.tsx index 92154dd0..f745e852 100644 --- a/admin-service/src/components/dashboard/UserGrowthChart.tsx +++ b/admin-service/src/components/dashboard/UserGrowthChart.tsx @@ -48,7 +48,7 @@ export const UserGrowthChart: React.FC = ({ data, loading }) => { const date = new Date(value); return date.toLocaleDateString("vi-VN"); }} - formatter={(value: number) => [value.toLocaleString(), ""]} + formatter={(value) => [Number(value ?? 0).toLocaleString(), ""]} /> void; + onJobUpdated: (job: NotificationCampaignJob) => void; +}; + +export function NotificationCampaignDrawer({ job: initialJob, onClose, onJobUpdated }: Props) { + const [job, setJob] = useState(initialJob); + const [applying, setApplying] = useState(false); + const [actionError, setActionError] = useState(null); + const [previewExpanded, setPreviewExpanded] = useState(true); + const pollRef = useRef | null>(null); + + const updateJob = useCallback( + (updated: NotificationCampaignJob) => { + setJob(updated); + onJobUpdated(updated); + }, + [onJobUpdated] + ); + + useEffect(() => { + if (!isNotificationCampaignJobActive(job.status)) return; + pollRef.current = setInterval(async () => { + try { + const updated = await getNotificationCampaignJob(job.id); + updateJob(updated); + if (!isNotificationCampaignJobActive(updated.status)) { + clearInterval(pollRef.current!); + } + } catch { + // ignore transient + } + }, POLL_MS); + return () => clearInterval(pollRef.current!); + }, [job.id, job.status, updateJob]); + + async function handleApply() { + setActionError(null); + setApplying(true); + try { + const updated = await applyNotificationCampaignJob(job.id); + updateJob(updated); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Apply failed."); + } finally { + setApplying(false); + } + } + + async function handleCancel() { + setActionError(null); + try { + updateJob(await cancelNotificationCampaignJob(job.id)); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Cancel failed."); + } + } + + async function handleRetry() { + setActionError(null); + try { + updateJob(await retryNotificationCampaignJob(job.id)); + } catch (err) { + setActionError(err instanceof Error ? err.message : "Retry failed."); + } + } + + const statusColor: Record = { + queued: "text-gray-500 bg-gray-100", + segmenting: "text-blue-600 bg-blue-50", + generating: "text-purple-600 bg-purple-50", + validating: "text-indigo-600 bg-indigo-50", + sending: "text-orange-600 bg-orange-50", + preview_ready: "text-amber-600 bg-amber-50", + completed: "text-green-600 bg-green-50", + failed: "text-red-600 bg-red-50", + cancelled: "text-gray-500 bg-gray-100", + }; + + const content = (job.config as Record>)?.content ?? {}; + + return ( +
+
+
+ +
+
+ + {JOB_TYPE_LABELS[job.job_type]} + + +
+ {job.id.slice(0, 8)}… +
+
+
+ + {STATUS_LABELS[job.status] ?? job.status} + + +
+
+ + {isNotificationCampaignJobActive(job.status) && ( +
+
+ {job.progress.stage} + {job.progress.percent ?? 0}% +
+
+
+
+
+ )} + +
+ {(job.status === "segmenting" || job.status === "generating" || job.status === "validating") && ( +
+ +

{job.status}…

+
+ )} + + {job.blocking_errors.length > 0 && ( +
+

+ Blocking errors +

+ {job.blocking_errors.map((e, i) => ( +

{e}

+ ))} +
+ )} + + {job.warnings.length > 0 && ( +
+

+ Warnings +

+ {job.warnings.map((w, i) => ( +

{w}

+ ))} +
+ )} + + {job.artifact && job.status === "preview_ready" && ( +
+ + {previewExpanded && ( +
+ +
+ )} +
+ )} + + {job.status === "completed" && ( +
+ +

Campaign sent successfully

+ +
+ )} + + {job.status === "failed" && ( +
+

Job failed

+ {job.error_message && ( +

{job.error_message}

+ )} +
+ )} + + {actionError && ( +

{actionError}

+ )} +
+ +
+
+ {isNotificationCampaignJobActive(job.status) && job.status !== "sending" && ( + + )} + {job.status === "failed" && ( + + )} +
+ {canApplyNotificationCampaignJob(job) && ( + + )} +
+
+ ); +} + +function PreviewSummary({ job }: { job: NotificationCampaignJob }) { + const art = job.artifact!; + const contentPreview = art.content_preview as Record | undefined; + const aiCopy = art.ai_copy as Record | undefined; + const sampleUsers = (art.sample_users as Array>) ?? []; + + return ( +
+
+ + 0 ? "text-green-600" : "text-red-500"} + /> +
+ + {contentPreview && ( +
+ {!!aiCopy && ( +

+ AI-generated copy +

+ )} +

+ {String(contentPreview.title ?? "")} +

+

{String(contentPreview.body ?? "")}

+
+ )} + + {sampleUsers.length > 0 && ( +
+

+ Sample users ({sampleUsers.length}) +

+
+ {sampleUsers.map((u, i) => ( +
+ {String(u.username ?? "")} + + {String(u.cefr_level ?? "")} · {u.has_fcm ? "FCM ✓" : "no FCM"} + +
+ ))} +
+
+ )} + + {!!art.scheduled_for && ( +

+ Scheduled: {new Date(String(art.scheduled_for)).toLocaleString()} +

+ )} +
+ ); +} + +function Stat({ + label, + value, + color = "text-gray-900", +}: { + label: string; + value: string; + color?: string; +}) { + return ( +
+

{label}

+

{value}

+
+ ); +} + +function DeliveryStats({ stats }: { stats: Record }) { + if (!Object.keys(stats).length) return null; + return ( +
+ + + +
+ ); +} diff --git a/admin-service/src/components/notification-campaign/NotificationCampaignModal.tsx b/admin-service/src/components/notification-campaign/NotificationCampaignModal.tsx new file mode 100644 index 00000000..f281b28b --- /dev/null +++ b/admin-service/src/components/notification-campaign/NotificationCampaignModal.tsx @@ -0,0 +1,337 @@ +import React, { useState } from "react"; +import { Bell, Calendar, MessageSquare, Radio, Sparkles, X } from "lucide-react"; + +import { + createNotificationCampaignJob, + type NotificationCampaignJob, + type NotificationCampaignJobType, +} from "../../lib/notificationCampaignApi"; + +const LEAGUES = [ + "bronze", "silver", "gold", "platinum", "sapphire", "ruby", "amethyst", "master", +] as const; +const CEFR_LEVELS = ["A1", "A2", "B1", "B2", "C1", "C2"] as const; + +type Props = { + onClose: () => void; + onJobCreated: (job: NotificationCampaignJob) => void; +}; + +type Tab = NotificationCampaignJobType; + +const TAB_INFO: Record = { + targeted_push: { + label: "Targeted Push", + icon: , + description: "Send an FCM push notification to a filtered user segment.", + }, + in_app_broadcast: { + label: "In-App Broadcast", + icon: , + description: "Create persisted in-app notifications visible in the notification feed.", + }, + scheduled_push: { + label: "Scheduled Push", + icon: , + description: "Schedule a push notification to be sent at a specific date and time.", + }, +}; + +export function NotificationCampaignModal({ onClose, onJobCreated }: Props) { + const [activeTab, setActiveTab] = useState("targeted_push"); + const [submitting, setSubmitting] = useState(false); + const [error, setError] = useState(null); + + // Content + const [title, setTitle] = useState(""); + const [body, setBody] = useState(""); + const [notifType, setNotifType] = useState("campaign"); + const [deepLink, setDeepLink] = useState(""); + const [useAiCopy, setUseAiCopy] = useState(false); + + // Audience + const [audienceType, setAudienceType] = useState<"all" | "segment">("all"); + const [selectedLeagues, setSelectedLeagues] = useState([]); + const [selectedCefr, setSelectedCefr] = useState([]); + const [minStreak, setMinStreak] = useState(""); + const [inactiveDays, setInactiveDays] = useState(""); + + // Scheduled push + const [sendAt, setSendAt] = useState(""); + + function toggleLeague(l: string) { + setSelectedLeagues((prev) => + prev.includes(l) ? prev.filter((x) => x !== l) : [...prev, l] + ); + } + + function toggleCefr(l: string) { + setSelectedCefr((prev) => + prev.includes(l) ? prev.filter((x) => x !== l) : [...prev, l] + ); + } + + async function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + if (!title.trim() || !body.trim()) { + setError("Title and body are required."); + return; + } + + const audienceFilters: Record = { has_fcm_token: true }; + if (audienceType === "segment") { + if (selectedLeagues.length) audienceFilters.leagues = selectedLeagues; + if (selectedCefr.length) audienceFilters.cefr_levels = selectedCefr; + if (minStreak) audienceFilters.min_streak = parseInt(minStreak, 10); + if (inactiveDays) audienceFilters.inactive_days = parseInt(inactiveDays, 10); + } + + const config: Record = { + audience: { type: audienceType, filters: audienceFilters }, + content: { + title: title.trim(), + body: body.trim(), + notification_type: notifType, + deep_link: deepLink.trim() || null, + use_ai_copy: useAiCopy, + }, + }; + + if (activeTab === "scheduled_push" && sendAt) { + config.send_at = new Date(sendAt).toISOString(); + } + + setSubmitting(true); + setError(null); + try { + const job = await createNotificationCampaignJob({ + job_type: activeTab, + config, + }); + onJobCreated(job); + } catch (err: unknown) { + setError(err instanceof Error ? err.message : "Failed to create job"); + } finally { + setSubmitting(false); + } + } + + return ( +
+
+
+
+ +

Tạo Notification Campaign

+
+ +
+ +
+ {(Object.keys(TAB_INFO) as Tab[]).map((tab) => ( + + ))} +
+ +
+

{TAB_INFO[activeTab].description}

+ +
+

Nội dung thông báo

+ +
+ + setTitle(e.target.value)} + maxLength={100} + placeholder="Ví dụ: Weekend Boost đã bắt đầu!" + /> +

{title.length}/100

+
+ +
+ +