From 607b9bb9e752bf8702d4e522d2496ba6bce41baa Mon Sep 17 00:00:00 2001 From: sp mac bookpro 2605 Date: Sun, 24 May 2026 16:19:15 +0800 Subject: [PATCH] chore: migrate from my-content-site (Next.js) to Vite-based aura-web - Remove legacy my-content-site Next.js scaffold - Add new Vite project structure (src/, public/, index.html, vite.config.ts) - Add Docker support (Dockerfile, docker-compose.yml, nginx.conf) - Add .env.example, .gitignore and updated README --- .env.example | 6 + .gitignore | 7 + Dockerfile | 15 + README.md | 45 + docker-compose.yml | 16 + index.html | 12 + my-content-site/.gitignore | 41 - my-content-site/AGENTS.md | 5 - my-content-site/CLAUDE.md | 1 - my-content-site/README.md | 36 - my-content-site/app/favicon.ico | Bin 25931 -> 0 bytes my-content-site/app/globals.css | 26 - my-content-site/app/layout.tsx | 33 - my-content-site/app/page.tsx | 65 - my-content-site/eslint.config.mjs | 18 - my-content-site/next.config.ts | 7 - my-content-site/package-lock.json | 6693 ------------------------- my-content-site/package.json | 26 - my-content-site/postcss.config.mjs | 7 - my-content-site/public/file.svg | 1 - my-content-site/public/globe.svg | 1 - my-content-site/public/next.svg | 1 - my-content-site/public/vercel.svg | 1 - my-content-site/public/window.svg | 1 - my-content-site/tsconfig.json | 34 - nginx.conf | 33 + package-lock.json | 4029 +++++++++++++++ package.json | 28 + public/avatars/avatar-01.png | Bin 0 -> 7637 bytes public/avatars/avatar-02.png | Bin 0 -> 7614 bytes public/avatars/avatar-03.png | Bin 0 -> 7232 bytes public/avatars/avatar-04.png | Bin 0 -> 6506 bytes public/avatars/avatar-05.png | Bin 0 -> 11776 bytes public/avatars/avatar-06.png | Bin 0 -> 7424 bytes public/avatars/avatar-07.png | Bin 0 -> 9172 bytes public/avatars/avatar-08.png | Bin 0 -> 7039 bytes public/avatars/avatar-09.png | Bin 0 -> 7479 bytes public/avatars/avatar-10.png | Bin 0 -> 8595 bytes public/avatars/avatar-11.png | Bin 0 -> 8132 bytes public/avatars/avatar-12.png | Bin 0 -> 9115 bytes public/default_bot_icon.jpg | Bin 0 -> 6549 bytes src/App.tsx | 110 + src/api.ts | 735 +++ src/components/ChatPreview.tsx | 197 + src/components/CommandPalette.tsx | 244 + src/components/McpPanel.tsx | 385 ++ src/components/McpResourcesDrawer.tsx | 305 ++ src/components/SessionSidebar.tsx | 393 ++ src/components/Sidebar.tsx | 170 + src/components/SkillEditor.tsx | 190 + src/main.tsx | 132 + src/pages/AgentEditor.tsx | 986 ++++ src/pages/AgentList.tsx | 285 ++ src/pages/ChatPage.tsx | 1206 +++++ src/pages/LLMProvidersPage.tsx | 420 ++ src/pages/LoginPage.tsx | 319 ++ src/pages/MarketplacePage.tsx | 272 + src/pages/PromptLibraryPage.tsx | 494 ++ src/pages/SharedSessionPage.tsx | 129 + src/pages/StatsPage.tsx | 255 + src/pages/TeamsPage.tsx | 395 ++ src/pages/WorkflowsPage.tsx | 775 +++ src/skillTemplates.ts | 75 + src/store/auth.ts | 37 + src/styles.css | 780 +++ tsconfig.json | 18 + vite.config.ts | 27 + 67 files changed, 13525 insertions(+), 6997 deletions(-) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 index.html delete mode 100644 my-content-site/.gitignore delete mode 100644 my-content-site/AGENTS.md delete mode 100644 my-content-site/CLAUDE.md delete mode 100644 my-content-site/README.md delete mode 100644 my-content-site/app/favicon.ico delete mode 100644 my-content-site/app/globals.css delete mode 100644 my-content-site/app/layout.tsx delete mode 100644 my-content-site/app/page.tsx delete mode 100644 my-content-site/eslint.config.mjs delete mode 100644 my-content-site/next.config.ts delete mode 100644 my-content-site/package-lock.json delete mode 100644 my-content-site/package.json delete mode 100644 my-content-site/postcss.config.mjs delete mode 100644 my-content-site/public/file.svg delete mode 100644 my-content-site/public/globe.svg delete mode 100644 my-content-site/public/next.svg delete mode 100644 my-content-site/public/vercel.svg delete mode 100644 my-content-site/public/window.svg delete mode 100644 my-content-site/tsconfig.json create mode 100644 nginx.conf create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/avatars/avatar-01.png create mode 100644 public/avatars/avatar-02.png create mode 100644 public/avatars/avatar-03.png create mode 100644 public/avatars/avatar-04.png create mode 100644 public/avatars/avatar-05.png create mode 100644 public/avatars/avatar-06.png create mode 100644 public/avatars/avatar-07.png create mode 100644 public/avatars/avatar-08.png create mode 100644 public/avatars/avatar-09.png create mode 100644 public/avatars/avatar-10.png create mode 100644 public/avatars/avatar-11.png create mode 100644 public/avatars/avatar-12.png create mode 100644 public/default_bot_icon.jpg create mode 100644 src/App.tsx create mode 100644 src/api.ts create mode 100644 src/components/ChatPreview.tsx create mode 100644 src/components/CommandPalette.tsx create mode 100644 src/components/McpPanel.tsx create mode 100644 src/components/McpResourcesDrawer.tsx create mode 100644 src/components/SessionSidebar.tsx create mode 100644 src/components/Sidebar.tsx create mode 100644 src/components/SkillEditor.tsx create mode 100644 src/main.tsx create mode 100644 src/pages/AgentEditor.tsx create mode 100644 src/pages/AgentList.tsx create mode 100644 src/pages/ChatPage.tsx create mode 100644 src/pages/LLMProvidersPage.tsx create mode 100644 src/pages/LoginPage.tsx create mode 100644 src/pages/MarketplacePage.tsx create mode 100644 src/pages/PromptLibraryPage.tsx create mode 100644 src/pages/SharedSessionPage.tsx create mode 100644 src/pages/StatsPage.tsx create mode 100644 src/pages/TeamsPage.tsx create mode 100644 src/pages/WorkflowsPage.tsx create mode 100644 src/skillTemplates.ts create mode 100644 src/store/auth.ts create mode 100644 src/styles.css create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..d134642 --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +# 前端容器对外暴露的端口 +HTTP_PORT=8080 +# 构建期注入:编译后的前端调用的后端地址 +# - 本机直连后端:http://host.docker.internal:4001 +# - 与 aura-server 同 docker 网络时:http://server:4001 +VITE_API_TARGET=http://host.docker.internal:4001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb18b22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +.DS_Store +*.log +.env +.env.local +tsconfig.tsbuildinfo diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..a4f5001 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +# 前端构建:Vite 静态产物 → nginx 提供 +FROM node:20-alpine AS builder +WORKDIR /src +COPY package.json package-lock.json* ./ +RUN npm ci || npm install +COPY . ./ +# 后端在 docker 网络中通过服务名 server 访问(compose 里) +ARG VITE_API_TARGET=http://server:4001 +ENV VITE_API_TARGET=$VITE_API_TARGET +RUN npm run build + +FROM nginx:alpine +COPY --from=builder /src/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 diff --git a/README.md b/README.md index e69de29..dcde59b 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,45 @@ +# aura-web + +Aura Agent Platform 前端项目(React + Vite + TypeScript)。 + +> 由 `rh-agent-platform/web/` 拆分独立而来。后端代码现位于平级项目 `aura-server`。 + +## 本地开发 + +```bash +npm install +npm run dev # http://localhost:5173 +``` + +默认 `/api` 代理到 `http://localhost:4001`(即 aura-server 的 Go 服务)。 +如需切换: + +```bash +VITE_API_TARGET=http://localhost:4000 npm run dev +``` + +## 构建 + +```bash +npm run build # 产物输出至 dist/ +npm run preview # 本地预览 +``` + +## Docker + +```bash +cp .env.example .env +docker compose up -d --build +# 浏览器访问 http://localhost:8080 +``` + +## 目录结构 + +``` +src/ +├── components/ 公共组件 +├── pages/ 路由页面 +├── store/ Zustand 状态 +├── api.ts REST/SSE 客户端 +└── main.tsx 入口 +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..10fe49f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +version: "3.9" + +# 独立的前端编排:构建 Vite 产物并由 nginx 提供 +# 后端地址通过构建参数 VITE_API_TARGET 注入(默认指向同机 4001) +services: + web: + build: + context: . + dockerfile: Dockerfile + args: + VITE_API_TARGET: ${VITE_API_TARGET:-http://host.docker.internal:4001} + image: agent-studio-web:v0.9 + container_name: agent-web + restart: unless-stopped + ports: + - "${HTTP_PORT:-8080}:80" diff --git a/index.html b/index.html new file mode 100644 index 0000000..86a3c58 --- /dev/null +++ b/index.html @@ -0,0 +1,12 @@ + + + + + + AI 智能体管理平台 + + +
+ + + diff --git a/my-content-site/.gitignore b/my-content-site/.gitignore deleted file mode 100644 index 5ef6a52..0000000 --- a/my-content-site/.gitignore +++ /dev/null @@ -1,41 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/versions - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# env files (can opt-in for committing if needed) -.env* - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/my-content-site/AGENTS.md b/my-content-site/AGENTS.md deleted file mode 100644 index 8bd0e39..0000000 --- a/my-content-site/AGENTS.md +++ /dev/null @@ -1,5 +0,0 @@ - -# This is NOT the Next.js you know - -This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. - diff --git a/my-content-site/CLAUDE.md b/my-content-site/CLAUDE.md deleted file mode 100644 index 43c994c..0000000 --- a/my-content-site/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -@AGENTS.md diff --git a/my-content-site/README.md b/my-content-site/README.md deleted file mode 100644 index e215bc4..0000000 --- a/my-content-site/README.md +++ /dev/null @@ -1,36 +0,0 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/my-content-site/app/favicon.ico b/my-content-site/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/my-content-site/app/globals.css b/my-content-site/app/globals.css deleted file mode 100644 index a2dc41e..0000000 --- a/my-content-site/app/globals.css +++ /dev/null @@ -1,26 +0,0 @@ -@import "tailwindcss"; - -:root { - --background: #ffffff; - --foreground: #171717; -} - -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); -} - -@media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } -} - -body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; -} diff --git a/my-content-site/app/layout.tsx b/my-content-site/app/layout.tsx deleted file mode 100644 index 976eb90..0000000 --- a/my-content-site/app/layout.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; - -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - {children} - - ); -} diff --git a/my-content-site/app/page.tsx b/my-content-site/app/page.tsx deleted file mode 100644 index 3f36f7c..0000000 --- a/my-content-site/app/page.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import Image from "next/image"; - -export default function Home() { - return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
- -
-
- ); -} diff --git a/my-content-site/eslint.config.mjs b/my-content-site/eslint.config.mjs deleted file mode 100644 index 05e726d..0000000 --- a/my-content-site/eslint.config.mjs +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig, globalIgnores } from "eslint/config"; -import nextVitals from "eslint-config-next/core-web-vitals"; -import nextTs from "eslint-config-next/typescript"; - -const eslintConfig = defineConfig([ - ...nextVitals, - ...nextTs, - // Override default ignores of eslint-config-next. - globalIgnores([ - // Default ignores of eslint-config-next: - ".next/**", - "out/**", - "build/**", - "next-env.d.ts", - ]), -]); - -export default eslintConfig; diff --git a/my-content-site/next.config.ts b/my-content-site/next.config.ts deleted file mode 100644 index e9ffa30..0000000 --- a/my-content-site/next.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = { - /* config options here */ -}; - -export default nextConfig; diff --git a/my-content-site/package-lock.json b/my-content-site/package-lock.json deleted file mode 100644 index 48fece1..0000000 --- a/my-content-site/package-lock.json +++ /dev/null @@ -1,6693 +0,0 @@ -{ - "name": "my-content-site", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "my-content-site", - "version": "0.1.0", - "dependencies": { - "next": "16.2.6", - "react": "19.2.4", - "react-dom": "19.2.4" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "16.2.6", - "tailwindcss": "^4", - "typescript": "^5" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", - "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@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/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "license": "MIT", - "optional": 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==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", - "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", - "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", - "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.17.0", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@img/colour": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", - "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@next/env": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", - "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", - "license": "MIT" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", - "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-glob": "3.3.1" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", - "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", - "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", - "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", - "cpu": [ - "arm64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", - "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", - "cpu": [ - "arm64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", - "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", - "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", - "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", - "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@swc/helpers": { - "version": "0.5.15", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", - "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", - "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.21.0", - "jiti": "^2.6.1", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.3.0" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", - "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.3.0", - "@tailwindcss/oxide-darwin-arm64": "4.3.0", - "@tailwindcss/oxide-darwin-x64": "4.3.0", - "@tailwindcss/oxide-freebsd-x64": "4.3.0", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", - "@tailwindcss/oxide-linux-x64-musl": "4.3.0", - "@tailwindcss/oxide-wasm32-wasi": "4.3.0", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", - "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", - "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", - "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", - "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", - "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", - "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", - "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", - "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", - "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", - "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.10.0", - "@emnapi/runtime": "^1.10.0", - "@emnapi/wasi-threads": "^1.2.1", - "@napi-rs/wasm-runtime": "^1.1.4", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", - "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", - "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.3.0.tgz", - "integrity": "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.3.0", - "@tailwindcss/oxide": "4.3.0", - "postcss": "^8.5.10", - "tailwindcss": "4.3.0" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", - "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", - "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", - "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/type-utils": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "ignore": "^7.0.5", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.59.3", - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", - "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", - "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.3", - "@typescript-eslint/types": "^8.59.3", - "debug": "^4.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", - "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", - "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", - "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3", - "debug": "^4.4.3", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", - "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", - "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.59.3", - "@typescript-eslint/tsconfig-utils": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", - "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", - "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.59.3", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "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==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", - "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", - "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.29", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.29.tgz", - "integrity": "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", - "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "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/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.356", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.356.tgz", - "integrity": "sha512-9NgFd7m5t5MCJ5rUSjJITUXAH9mEGlrlofnMf4YEr+pz6JlP7cWmTAH+JFmbPnaSW8koVTkuW7pacORWAnA5Yw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.21.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", - "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", - "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.1.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.3.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.5", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.2", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.14.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.5", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-config-next": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz", - "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@next/eslint-plugin-next": "16.2.6", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.32.0", - "eslint-plugin-jsx-a11y": "^6.10.0", - "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^7.0.0", - "globals": "16.4.0", - "typescript-eslint": "^8.46.0" - }, - "peerDependencies": { - "eslint": ">=9.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-config-next/node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.16.1", - "resolve": "^2.0.0-next.6" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "hasown": "^2.0.2", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "safe-regex-test": "^1.0.3", - "string.prototype.includes": "^2.0.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", - "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.3", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.2.1", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.9", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.1", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.12", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", - "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "hermes-parser": "^0.25.1", - "zod": "^3.25.0 || ^4.0.0", - "zod-validation-error": "^3.5.0 || ^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", - "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.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", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", - "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/generator-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", - "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", - "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hermes-estree": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", - "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", - "dev": true, - "license": "MIT" - }, - "node_modules/hermes-parser": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", - "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hermes-estree": "0.25.1" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", - "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.4", - "generator-function": "^2.0.0", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", - "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "get-proto": "^1.0.0", - "has-symbols": "^1.1.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.23", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", - "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/language-tags": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", - "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "language-subtag-registry": "^0.3.20" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/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", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/next": { - "version": "16.2.6", - "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", - "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", - "license": "MIT", - "dependencies": { - "@next/env": "16.2.6", - "@swc/helpers": "0.5.15", - "baseline-browser-mapping": "^2.9.19", - "caniuse-lite": "^1.0.30001579", - "postcss": "8.4.31", - "styled-jsx": "5.1.6" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=20.9.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "16.2.6", - "@next/swc-darwin-x64": "16.2.6", - "@next/swc-linux-arm64-gnu": "16.2.6", - "@next/swc-linux-arm64-musl": "16.2.6", - "@next/swc-linux-x64-gnu": "16.2.6", - "@next/swc-linux-x64-musl": "16.2.6", - "@next/swc-win32-arm64-msvc": "16.2.6", - "@next/swc-win32-x64-msvc": "16.2.6", - "sharp": "^0.34.5" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.51.1", - "babel-plugin-react-compiler": "*", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@playwright/test": { - "optional": true - }, - "babel-plugin-react-compiler": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/next/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/node-exports-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", - "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/node-releases": { - "version": "2.0.44", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", - "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.4" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "2.0.0-next.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.6.tgz", - "integrity": "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/sharp/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", - "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", - "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", - "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.3", - "@typescript-eslint/parser": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/utils": "8.59.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", - "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-validation-error": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", - "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - } - } -} diff --git a/my-content-site/package.json b/my-content-site/package.json deleted file mode 100644 index 09393a3..0000000 --- a/my-content-site/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "my-content-site", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "eslint" - }, - "dependencies": { - "next": "16.2.6", - "react": "19.2.4", - "react-dom": "19.2.4" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4", - "@types/node": "^20", - "@types/react": "^19", - "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "16.2.6", - "tailwindcss": "^4", - "typescript": "^5" - } -} diff --git a/my-content-site/postcss.config.mjs b/my-content-site/postcss.config.mjs deleted file mode 100644 index 61e3684..0000000 --- a/my-content-site/postcss.config.mjs +++ /dev/null @@ -1,7 +0,0 @@ -const config = { - plugins: { - "@tailwindcss/postcss": {}, - }, -}; - -export default config; diff --git a/my-content-site/public/file.svg b/my-content-site/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/my-content-site/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/my-content-site/public/globe.svg b/my-content-site/public/globe.svg deleted file mode 100644 index 567f17b..0000000 --- a/my-content-site/public/globe.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/my-content-site/public/next.svg b/my-content-site/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/my-content-site/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/my-content-site/public/vercel.svg b/my-content-site/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/my-content-site/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/my-content-site/public/window.svg b/my-content-site/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/my-content-site/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/my-content-site/tsconfig.json b/my-content-site/tsconfig.json deleted file mode 100644 index 3a13f90..0000000 --- a/my-content-site/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./*"] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts", - "**/*.mts" - ], - "exclude": ["node_modules"] -} diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..26f76e9 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,33 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + # 反代 API + SSE 兼容 + location /api/ { + proxy_pass http://server:4001; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 600s; + chunked_transfer_encoding on; + # SSE 不要被压缩 + proxy_set_header Accept-Encoding "identity"; + } + + # SPA history fallback + location / { + try_files $uri $uri/ /index.html; + } + + # 静态资源缓存 + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { + expires 7d; + add_header Cache-Control "public, max-age=604800"; + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2a22f68 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4029 @@ +{ + "name": "agent-platform-web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "agent-platform-web", + "version": "0.1.0", + "dependencies": { + "antd": "^5.21.0", + "axios": "^1.7.7", + "dayjs": "^1.11.13", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^9.0.1", + "react-router-dom": "^6.26.2", + "zustand": "^4.5.5" + }, + "devDependencies": { + "@types/react": "^18.3.10", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "typescript": "^5.6.2", + "vite": "^5.4.8" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.2.1.tgz", + "integrity": "sha512-lCHDcEzieu4GA3n8ELeZ5VQ8pKQAWcGGLRTQ50aQM2iqPpq2evTxER84jfdPvsPAtEcZ7m44NI45edFMo8oOYQ==", + "dependencies": { + "@ant-design/fast-color": "^2.0.6" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.24.0.tgz", + "integrity": "sha512-K4cYrJBsgvL+IoozUXYjbT6LHHNt+19a9zkvpBPxLjFHas1UpPM2A5MlhROb0BT8N8WoavM5VsP9MeSeNK/3mg==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.3.4" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/cssinjs-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-1.1.3.tgz", + "integrity": "sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==", + "dependencies": { + "@ant-design/cssinjs": "^1.21.0", + "@babel/runtime": "^7.23.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@ant-design/fast-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-2.0.6.tgz", + "integrity": "sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.6.1.tgz", + "integrity": "sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.24.8", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.1.2.tgz", + "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "dependencies": { + "@babel/runtime": "^7.24.4" + }, + "engines": { + "node": ">=14.x" + } + }, + "node_modules/@rc-component/color-picker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-2.0.1.tgz", + "integrity": "sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==", + "dependencies": { + "@ant-design/fast-color": "^2.0.6", + "@babel/runtime": "^7.23.6", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.3.tgz", + "integrity": "sha512-bk/FJ09fLf+NLODMAFll6CfYrHPBioTedhW6lxDBuuWucJEqFUd4l/D/5JgIi3dina6sYahB8iuPAZTNz2pMxw==", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "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==", + "dependencies": { + "@babel/runtime": "^7.24.7" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.15.1.tgz", + "integrity": "sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.3.1.tgz", + "integrity": "sha512-ORENF39PeXTzM+gQEshuk460Z8N4+6DkjpxlpE7Q3gYy1iBpLrx0FOJz3h62ryrJZ/3zCAUIkT1Pb/8hHWpb3A==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.44.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==" + }, + "node_modules/@types/react": { + "version": "18.3.29", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.29.tgz", + "integrity": "sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/antd": { + "version": "5.29.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.29.3.tgz", + "integrity": "sha512-3DdbGCa9tWAJGcCJ6rzR8EJFsv2CtyEbkVabZE14pfgUHfCicWCj0/QzQVLDYg8CPfQk9BH7fHCoTXHTy7MP/A==", + "dependencies": { + "@ant-design/colors": "^7.2.1", + "@ant-design/cssinjs": "^1.23.0", + "@ant-design/cssinjs-utils": "^1.1.3", + "@ant-design/fast-color": "^2.0.6", + "@ant-design/icons": "^5.6.1", + "@ant-design/react-slick": "~1.1.2", + "@babel/runtime": "^7.26.0", + "@rc-component/color-picker": "~2.0.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/qrcode": "~1.1.0", + "@rc-component/tour": "~1.15.1", + "@rc-component/trigger": "^2.3.0", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.11", + "rc-cascader": "~3.34.0", + "rc-checkbox": "~3.5.0", + "rc-collapse": "~3.9.0", + "rc-dialog": "~9.6.0", + "rc-drawer": "~7.3.0", + "rc-dropdown": "~4.2.1", + "rc-field-form": "~2.7.1", + "rc-image": "~7.12.0", + "rc-input": "~1.8.0", + "rc-input-number": "~9.5.0", + "rc-mentions": "~2.20.0", + "rc-menu": "~9.16.1", + "rc-motion": "^2.9.5", + "rc-notification": "~5.6.4", + "rc-pagination": "~5.1.0", + "rc-picker": "~4.11.3", + "rc-progress": "~4.0.0", + "rc-rate": "~2.13.1", + "rc-resize-observer": "^1.4.3", + "rc-segmented": "~2.7.0", + "rc-select": "~14.16.8", + "rc-slider": "~11.1.9", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.54.0", + "rc-tabs": "~15.7.0", + "rc-textarea": "~1.10.2", + "rc-tooltip": "~6.4.0", + "rc-tree": "~5.13.1", + "rc-tree-select": "~5.27.0", + "rc-upload": "~4.11.0", + "rc-util": "^5.44.4", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "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/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==" + }, + "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 + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.361", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.361.tgz", + "integrity": "sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + }, + "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 + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/rc-cascader": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.34.0.tgz", + "integrity": "sha512-KpXypcvju9ptjW9FaN2NFcA2QH9E9LHKq169Y0eWtH4e/wHQ5Wh5qZakAgvb8EKZ736WZ3B0zLLOBsrsja5Dag==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "^2.3.1", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.5.0.tgz", + "integrity": "sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.9.0.tgz", + "integrity": "sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.6.0.tgz", + "integrity": "sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.3.0.tgz", + "integrity": "sha512-DX6CIgiBWNpJIMGFO8BAISFkxiuKitoizooj4BDyee8/SnBn0zwO2FHrNDpqqepj0E/TFTDpmEBCyFuTgC7MOg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.1.tgz", + "integrity": "sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.44.1" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-2.7.1.tgz", + "integrity": "sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/async-validator": "^5.0.3", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.12.0.tgz", + "integrity": "sha512-cZ3HTyyckPnNnUb9/DRqduqzLfrQRyi+CdHjdqgsyDpI3Ln5UX1kXnAhPBSJj9pVRzwRFgqkN7p9b6HBDjmu/Q==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.6.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.8.0.tgz", + "integrity": "sha512-KXvaTbX+7ha8a/k+eg6SYRVERK0NddX8QX7a7AnRvUa/rEH0CNMlpcBzBkhI0wp2C8C4HlMoYl8TImSN+fuHKA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.5.0.tgz", + "integrity": "sha512-bKaEvB5tHebUURAEXw35LDcnRZLq3x1k7GxfAqBMzmpHkDGzjAtnUL8y4y5N15rIFIg5IJgwr211jInl3cipag==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.8.0", + "rc-util": "^5.40.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.20.0.tgz", + "integrity": "sha512-w8HCMZEh3f0nR8ZEd466ATqmXFCMGMN5UFCzEUL0bM/nGw/wOS2GgRzKBcm19K++jDyuWCOJOdgcKGXU3fXfbQ==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.8.0", + "rc-menu": "~9.16.0", + "rc-textarea": "~1.10.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.16.1", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.16.1.tgz", + "integrity": "sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.5.tgz", + "integrity": "sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.44.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.6.4.tgz", + "integrity": "sha512-KcS4O6B4qzM3KH7lkwOB7ooLPZ4b6J+VMmQgT51VZCeEcmghdeR4IrMcFq0LG+RPdnbe/ArT086tGM8Snimgiw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.5.0.tgz", + "integrity": "sha512-Lm/v9h0LymeUYJf0x39OveU52InkdRXqnn2aYXfWmo8WdOonIKB2kfau+GF0fWq6jPgtdO9yMqveGcK6aIhJmg==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-5.1.0.tgz", + "integrity": "sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.11.3.tgz", + "integrity": "sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==", + "dependencies": { + "@babel/runtime": "^7.24.7", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.43.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-4.0.0.tgz", + "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.13.1.tgz", + "integrity": "sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.3.tgz", + "integrity": "sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.44.1", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.7.1.tgz", + "integrity": "sha512-izj1Nw/Dw2Vb7EVr+D/E9lUTkBe+kKC+SAFSU9zqr7WV2W5Ktaa9Gc7cB2jTqgk8GROJayltaec+DBlYKc6d+g==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.16.8", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.16.8.tgz", + "integrity": "sha512-NOV5BZa1wZrsdkKaiK7LHRuo5ZjZYMDxPP6/1+09+FB4KoNi8jcG1ZqLE3AVCxEsYMBe65OBx71wFoHRTP3LRg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.1.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-11.1.9.tgz", + "integrity": "sha512-h8IknhzSh3FEM9u8ivkskh+Ef4Yo4JRIY2nj7MrH6GQmrwV6mcpJf5/4KgH5JaVI1H3E52yCdpOlVyGZIeph5A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.54.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.54.0.tgz", + "integrity": "sha512-/wDTkki6wBTjwylwAGjpLKYklKo9YgjZwAU77+7ME5mBoS32Q4nAwoqhA2lSge6fobLW3Tap6uc5xfwaL2p0Sw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.44.3", + "rc-virtual-list": "^3.14.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-15.7.0.tgz", + "integrity": "sha512-ZepiE+6fmozYdWf/9gVp7k56PKHB1YYoDsKeQA1CBlJ/POIhjkcYiv0AGP0w2Jhzftd3AVvZP/K+V+Lpi2ankA==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.16.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.10.2.tgz", + "integrity": "sha512-HfaeXiaSlpiSp0I/pvWpecFEHpVysZ9tpDLNkxQbMvMz6gsr7aVZ7FpWP9kt4t7DB+jJXesYS0us1uPZnlRnwQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.8.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.4.0.tgz", + "integrity": "sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1", + "rc-util": "^5.44.3" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.13.1", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.13.1.tgz", + "integrity": "sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.27.0.tgz", + "integrity": "sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "classnames": "2.x", + "rc-select": "~14.16.2", + "rc-tree": "~5.13.0", + "rc-util": "^5.43.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.11.0.tgz", + "integrity": "sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.44.4", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.44.4.tgz", + "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-virtual-list": { + "version": "3.19.2", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.19.2.tgz", + "integrity": "sha512-Ys6NcjwGkuwkeaWBDqfI3xWuZ7rDiQXlH1o2zLfFzATfEgXcqpk8CkgMfbJD81McqjcJVez25a3kPxCR807evA==", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/react-markdown": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz", + "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3b2a8b4 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "agent-platform-web", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "antd": "^5.21.0", + "axios": "^1.7.7", + "dayjs": "^1.11.13", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^9.0.1", + "react-router-dom": "^6.26.2", + "zustand": "^4.5.5" + }, + "devDependencies": { + "@types/react": "^18.3.10", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "typescript": "^5.6.2", + "vite": "^5.4.8" + } +} diff --git a/public/avatars/avatar-01.png b/public/avatars/avatar-01.png new file mode 100644 index 0000000000000000000000000000000000000000..811b3abf9313f54eea62c8bf9649c3eb08fb6b20 GIT binary patch literal 7637 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 literal 0 HcmV?d00001 diff --git a/public/avatars/avatar-03.png b/public/avatars/avatar-03.png new file mode 100644 index 0000000000000000000000000000000000000000..6030539e4a78a9eb136490d3b904aa0f4872244d GIT binary patch literal 7232 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

3a-3=vt=RkT@KY>6l(EhNiD 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 DEryca literal 0 HcmV?d00001 diff --git a/public/avatars/avatar-05.png b/public/avatars/avatar-05.png new file mode 100644 index 0000000000000000000000000000000000000000..cfed182c1ac4995352c4fb537ccffbe0905b2e56 GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/public/avatars/avatar-06.png b/public/avatars/avatar-06.png new file mode 100644 index 0000000000000000000000000000000000000000..a53ea55cfc4070c1257b7f0a9194e7cb3868f092 GIT binary patch literal 7424 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 literal 0 HcmV?d00001 diff --git a/public/avatars/avatar-07.png b/public/avatars/avatar-07.png new file mode 100644 index 0000000000000000000000000000000000000000..7350004b8cb30f1ca561aa278902b726d6367389 GIT binary patch literal 9172 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�XlsA2YCT8sX2(DFk60i}R0Tso@fJoO=<`m1Ox(6Yip?)0ly)~ zC;1uRyH(NlBM1bRBB)ysjBLHRu{aM$7gr27!553+cEJ+tK@e>N6V-p8hj1Ssa4952 z5`};xWDpKe1n~KDI7-6op>U`aFky>;AraC@q!bb(jgXd-h9iOVc=dP@>WHvM%1BEh zVGuxC`s7j)i9$Lek-(&#w9K&}67$c3|8F^IzyLcaL<-P=bO4}GaOg1*9Ew8xoeeSw zI24XTq5!K9(okthNn5xh+)?`EfMbwI2vP#<#bdH?rL0T$W= zvVaVr7*GiTIFUjEW}oOs920p00;q&T5pXF0QW62jNJ9VKHKgP*`AC>F0&wjlA}4ME zE;<6Skp$dy1O%i3m;PuxRtT&(p4jX78ysNiBrM0_g8)H>9tR$>wNAVR0+H^xm{<@j zF6+tKd$@_)I(XP&#C_bbK!Sll@=88fTl{+tb|vgFBW|RpnN>%8d|*{)^5Nu3Wq@$J#vH@h8OobuV7R&Q}7Emk|CN ze*SX$gr9#9a!e1wh2V<$-?H-$M*bUJ|Bn7!?4R=Hf1XQNXAgo0-q{2DC#3+tf7jG8 z?|+toq=NpHRDb4VRdE;x7s7u|p#LNRWcEoS{ohP<^~C?Pb)I+(7MS`S9S27VpmhJ) zI$%jw?BJ_>?H7`%rk&K`48H^-%Ntl|%jsga)I|1~k?CH@oC zab^9*$lur5zuW<&&;JK|06Rt}HTusK{v*IXw!g{yowk2P_|HAE<`_F;f-T{svHW4+ ze^Ms$$6@)c_+LT()|ub_0nHO=qY{6bF);Yk&N1#l561z`+UK0$a}ekpleU_&iBH;U zI%R?2<~VOlwpZ7n`fhI5(}uL|VGCEw>cP*ZKa%<-UZ?!vM~WR|PKO z3%gC-`;FcH`i5`#a$%(Rr&7W1uzIH)P)|W{4r9={c;OJLcE(G$?IGN)|HX2D8VQ=| z0XUV~kx7X&)ly9aEkKb)e0)0pg=Mwq(&rhDrM@LSm+|MMG|?+^JI@-oU-OI@R!&5H zV;ojX)#eZ?d)oDu($Dd;IQyrWmouu*4u2Fj*4$`V8LplPcUSBnlZ-w^I+$4gI_*M2 zO8A3`TBjN)gtgq|v-Q;qyI8W$Am~F@=VdT?-hD@x&rcVhXE){RddU&KZhnXn+vuuk zV(2B@(KcbUz^gKKY@6E*3QAl@OcJ2>U)Zhb-bX%CQx28V6ouA4Am>c~F7iw2!2Muc z9`GgfYMVzyAiF5-*$y&Z_wTg|Wj9jK4i+1tJDDgu{1+~#IAYR!**X~_$kF6_OwCte zkrtn)cV$MLaxPk!R<$+SV*oBL> zoiwC_X~M4|*@-ftT~AlJJ|qlD@AnWW(`d*n7hUCb+J8E+mhjO}H8n*cc+lr`vVGbz z%eo?c^B)2HN;1bSs(O#1ST8Hd-Jl@~ABDC~5%^;6F0E@pw=K+@EWP~B-dTIdE6(v4 zg4bmz5T+!avEP}`HC>)zYL?+_#Itffrnw$(_F_Vv2i0biwxPqI9xBBTK}SO6RDWJ2 zA93iZ^G%3gs zcc##2ucsr*7kwE_noQ$bW|Zh{>bNdgIdgg{u{vvdb(Gg80K;;$0b9*e1x31Dt0q{> zRCzPE20m4$JE)#^)1$Uw%Ke&%$R!%RC*kv?iT9JwdGd(lP8L@^r^TpNKIp?FVPAq$ zT-JrY@iy^7AHHNu5rMZ2(4&NiG7V21!25S!7Y8pW_*UO&AiJy)R&^h8Dz)n#s32^d z>%fWQu`ya$a0Fa-VQQ1nMmp=u?Yq%j$@f2I*t8~vn)X4N_$)z5!xg5jZX=J=vTlrv z``V8;FXXtSFy;~yBF}#fi1@{o)q0U7^2_j%-?Q_Ew-xoob5t? zw_XTJcR4DLmNc0P0^4JGlB?vEO4*UReFh(r7@z7uL5!|zewVgClk2Vy1z%%7{ zMZFz=?BU}6@zo(0*ZhDQ?xW}F9$f`bbIDHiesN)yP${HY@&3&|PkQ#2w1uHb8|^2c zRH|e}<0aL~^8kPXEEo(?}d;+X;Ez0AdyyIGh z#)kMxT5@-majmXJs3VW)5@2EDZjQjZ(W>*ONCo97A+g+h(g_^bXYYq8$>uv{;`8kH z`)?r>K2f0gA3x6n0o?ht>+6g1M(bvJC?2wjJ&>%ta-|Mr5#sB+D=>npRCD)hlo!k7 zVI=Rn_{$$sJl#&V`ROWYajyaTJ@J-u_Xx7bJ=^X*5wcrHgvWKekxa!f`uLJ$U^11eRnRQ_^(n>fzm z^FNxibaNrx^Z{2^&aI2sm)?mB@kLVrnWRp!d@BFJ@~PNl^N&{MG>Km~-4>(utQVPw z_Fm9?fX_*ARI?*jA585wxzPQjpawwrIA9x!n#YWV6r{+C7^%Sm11@ z!_W9F2QwhV8E6_;Voa|V%72>DRW!~xbn5-<>jnHap>dDCB~UkPe;C+FcTfk*#^)A# z7A21^V&v{KPspg382D>fHBrU?Qkn>S5tsHOEv~^d$)we}%=uANzbdR=UmHX^ILz4c zVee;0&H607Rnx_yA@E{P_QCq_;d4RIhJ|l_$FF@$?4_DXPbe4L72aqfzfLh=et_&L5b{mFo5^(5SIMAGWWh^@1~{E6@q2 zy6qnw#au9@Po-hA1m$DBC^Y3cd$(F2v_yDdk2d2o`EEl4zs*tDG!0xVsv#o%^M6+6 z`rOuvs+mX{?Y^hup7OKrycGDAV~#Gu{l}*uTtu#VL-Ucpn|}Y7C)nk4NgfZy&xU}I7GV$Fn`Sl|mMU9LEyqE8<0nXQ@_8gue` z6zbXo%gI75O;m(*)R~qinld7UVNEwH|M4y#tHZ#Zy{kSG&OLPjM;K_$Hplu@A(sZN zKv~3vSMGfQ)`SzW|Jv>;jAZi7{FMj2718ImYc*dz zh>7;nmgdNoz9OEo84Ok9pdm|;FJhhA@@orScxi1>7#(7#MKVtpWf?G@wS1wJp|GKC zEc_dJDyd`mNO{7!7U87#%MU9r-qK>U=yKWHNB*|9wqa2t2KrOHoo}1CkUG{xrQk|JTXIj_gb1z5 zlfi;7xY@;&^jyXjPy%q&|m*s?z)RhR;(neG2&k zArOrIB|3B%&1unrPy;brT&}u#v}3DVa!yp*Du~B#D|@D0F6ARxl%WipoEiT9^XJp* z+$Dl;tkn{ZtT-xj>?Q+BWArQZwB z3=oj}qEyK5{q643wnrVkl{03kz~<+jXD}w@40pv^r*e437E1;BTf1h!3|IF)K`Bxx}2%E3sY-R`-&Q@ z6d_D~Ha0=!w$_FlKXf<7zOq-RYv&$>GIg4>`*@dwbracEb}e}$MdaZvx_(=*8G~9wqE4Rd0C#3 zF`b2`Xh1|tO3GP1YHj?`By&v3D9IuV#Cg?3nB%=H;o6jXlbs)R%wz(rfA+C$V6_Vm zqd1*YSE-#MT6O5+tsEk~vbszS++aWhO2(>$D~x0PM5ds`ao9gEO3P$>HOjWmra8!Y zK#&ko-^0{0Z&CQ1H#4L(XV#>8p)UItF15WQy`mCNj6$cGIFV}q)aYSxaR7%c_}-!R^W2B8HCEzu-vNY zLmsYj>Y(b*0`*h#XB;!MTS?{G$+G?i+gioPSZuS@Gw4j{(N*Fy1jnpPDuAw zPH8Z6`snDjRn}H~)i!^z^17^MNn*_HU)(EIFvoh`&o}0~-J5TK;#vF8fraW!nRr>< zCPr#%SuYp7xdYZEks~o+js;niT^i8&d9cOv5$x*m>7hU z%q@9Z1%y-j7Y#3keL0S3DpK?Q!KbF@b~BzozwtmL^9*_0tcKk))m!ijku5Q^3=cU* z`De?C12od%C@Yfq0|TMNocD91WhI1!tZj}+y{IV<8`98D|OS1_Ymm!#B@d~k)Fz=*AN^-{5Lwf2Qr@>eE zx~oUmj7jvqp_YXqucBhM=Wfk2Gn!BOFJpfI$@%gINKZxExrK#BAc%lj80^d6U~yK~Z#ZX}!NZNNA9*j4-tww4t^MXg2ki?P7rA zOY-f3RJIM3f-@z7M~7>tHwJ$+^lrBH49_2&8ch&ol;-GspcRVkGBq^?`u^a2RhgHI z?^rw<6||2%oHiE4-nh1AU1Fum`V7Y+k+$#jszT%QVcra{I&%sA)22q9oWoTxO^uH@ zwJ|z+`c?LN4o}*>)TLZn7)yI2EiuC26clkQ-ET6IVsY2@-At2D3QIiXVi>kee_gPB zjo#}G_zt?)F;hTXBheWfiH=&Q@vG%O$k2d_Tn_pomTSm0_3qx=o{6r6O4;fcELN)8 z`5=zgGux@en-kErPdOe;#mcP|A!U34+gHfWOOVr9k(@79XbUyyjY&_ zD;h;SOi78#eGQeE{INMb@d1N?;~f{5W)H)w`#gRy3fHMiHLhzExbxo!9?R@5h4RNx zx81$lC{CRlEV9RsaHS(Vl(3fVFsOAOXGc&k0+05C8czHAW^SC0g@PRvsB7MWpUiUh4@8qdSneF=)EhrP(hA z%ObLckv&oI)so#Sr|wsybI-8L4(lf>aULeska5x^t4P~Nyz(X%bjDKM6-`ik%+5}! zaYj}yc`Hz4s%AZ*_80#H@dir1Bx8_pXi^K%PRz+z>~nJIL1YIQ=bcMxsw?wHwp6WLzk#{r8*^E2%SZ%}1+ z*9u|volguWC=g(SCqBL1^8&v6+~mP@qz)fRVv>}+-vwm@@^B;!YLNZ zC>x>=1rIUA?Qk**kK{-5&*@oef*a-u_lq|CV-1Ig((mHM_Uh&pSS3U^O(xqT%Tl#& zgYGaCh2~(3LhG+j4(BL+$-CYsxkK^>d>+`WVA}YcO@KQs{#o8ip+()1%UZf7y2 zucFPnYSsD+?M=k8XR66iQsCS|tDAbGMMOB|#Sl9VoDR@v9MGY@9_M#ki?J+H74BtB zHfaBm!^JkT+)KM3<=*(tu>J^J`nk?JvKzJJJg{)KG*NfqTY>Y}Zv@C>z{QjW&xg;v zt;4NXu>Bwr%AF;N0Pdj0kL%pyTuXdJu7&{yNh{=+Vu!fx(iZGK~)^wAcz5qu`! zo^==URFxx|%kiMp+-+gbntxF?pAP6mVBv_7~c)&z}?4AI<@l}CNcHiet#T5O6&ORPFuwTMa{4D~-|DzHik zGvnBUuE&Q|+ZS&Q^PnUW_!upWTfq2ML*EA_cX{K$S8co!qe|H#Ghmd`#R=~(vg8wf zC~fuKxFx^83`5yuZ&IW*S?tc{x-j+PE)?zXqM7vy*yfqiPKVw`TWiB1#m{U*>q;B* zoW2n55S=}Ved4A3FAsBy9A+cKv3ZJAhxXP7u^s;FvM&PCAdXEH8k~5Fg4pU8k5_(c)@S0y z_Eq1UNBS$NT*=$q77cSzYuFQFdZIWsH$@7;Kr2X|w)_Sa-uv#;|INCP++U$F5*kGOkx-(K`m~o|G0m_zVOis1kn7P(n zTKr<`yds=5%30B(GFOJ;QoA^6iZ%=>mS;rH@qH|IGV%0$3r9kjp28!cviTS*bQ+t* zm$`uMy5{oi{yNf5dV*DL#Ny`b=|6GO7EKi z;dz^F?N0i)uyhllvWFB!JF%kAcf_LXCUuC;!rCwWE}aQJ=!2Ef&xh8b-DRQ;(SmZ% zcgkOjLUVM=>;s`!(s$A4R0YV1eBl4x+k*e*Wx{`4J|boP1QM77jcp#k3fETGS1VCL Ghy5F|rQC=B literal 0 HcmV?d00001 diff --git a/public/avatars/avatar-11.png b/public/avatars/avatar-11.png new file mode 100644 index 0000000000000000000000000000000000000000..60805351e8e88d44b2d85179a57a0f120b48a318 GIT binary patch literal 8132 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 literal 0 HcmV?d00001 diff --git a/public/avatars/avatar-12.png b/public/avatars/avatar-12.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec21d6ce56640477b8bcdf09a3c6f3232254d14 GIT binary patch literal 9115 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 z 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 literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..478385f --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,110 @@ +import { useEffect, useState } from 'react'; +import { Routes, Route, Navigate, useLocation, useNavigate } from 'react-router-dom'; +import { Spin } from 'antd'; +import Sidebar from './components/Sidebar'; +import CommandPalette from './components/CommandPalette'; +import AgentList from './pages/AgentList'; +import AgentEditor from './pages/AgentEditor'; +import ChatPage from './pages/ChatPage'; +import LoginPage from './pages/LoginPage'; +import MarketplacePage from './pages/MarketplacePage'; +import TeamsPage from './pages/TeamsPage'; +import PromptLibraryPage from './pages/PromptLibraryPage'; +import StatsPage from './pages/StatsPage'; +import LLMProvidersPage from './pages/LLMProvidersPage'; +import SharedSessionPage from './pages/SharedSessionPage'; +import WorkflowsPage from './pages/WorkflowsPage'; +import { useAuth } from './store/auth'; +import { AgentAPI } from './api'; + +function HomeRedirect() { + const navigate = useNavigate(); + useEffect(() => { + AgentAPI.list().then(list => { + if (list.length > 0) { + navigate(`/agents/${list[0].id}/chat`, { replace: true }); + } else { + navigate('/agents', { replace: true }); + } + }).catch(() => { + navigate('/agents', { replace: true }); + }); + }, [navigate]); + return

; +} + +export default function App() { + const { user, loading, bootstrap } = useAuth(); + const location = useLocation(); + const [paletteOpen, setPaletteOpen] = useState(false); + + useEffect(() => { + bootstrap(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // 全局快捷键 Ctrl/⌘ + K + useEffect(() => { + if (!user) return; + const handler = (e: KeyboardEvent) => { + if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') { + e.preventDefault(); + setPaletteOpen((v) => !v); + } + }; + window.addEventListener('keydown', handler); + return () => window.removeEventListener('keydown', handler); + }, [user]); + + if (loading) { + return ( +
+ +
+ ); + } + + const mainContent = ( + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + ); + + return ( + <> + {/* 公开分享会话页:跳过 AuthGuard */} + {location.pathname.startsWith('/shared/') ? ( + + } /> + + ) : !user ? ( + + } /> + } /> + + ) : ( +
+ {/* 只有编辑器全屏显示,其他页面均保留侧边栏 */} + {!location.pathname.startsWith('/agents/') || location.pathname.includes('/chat') ? ( + setPaletteOpen(true)} /> + ) : null} +
+ {mainContent} +
+ setPaletteOpen(false)} /> +
+ )} + + ); +} diff --git a/src/api.ts b/src/api.ts new file mode 100644 index 0000000..f7bc1d8 --- /dev/null +++ b/src/api.ts @@ -0,0 +1,735 @@ +import axios from 'axios'; + +export const api = axios.create({ + baseURL: '/api', + timeout: 90000, + withCredentials: true // 关键:跨域请求带 cookie +}); + +// 401 拦截:自动跳登录 +api.interceptors.response.use( + (r) => r, + (err) => { + if (err?.response?.status === 401 && !location.pathname.startsWith('/login')) { + const next = encodeURIComponent(location.pathname + location.search); + location.href = `/login?next=${next}`; + } + return Promise.reject(err); + } +); + +export type KnowledgeStatus = 'pending' | 'indexing' | 'ready' | 'failed'; + +export interface KnowledgeFile { + id: string; + originalName: string; + filename: string; + size: number; + mime: string; + status: KnowledgeStatus; + error?: string; + chunkCount: number; + createdAt: number; +} + +export type SkillType = 'prompt' | 'http' | 'js'; + +export interface SkillBrief { + id: string; + name: string; + filename: string; + description?: string; + type: SkillType; + enabled: number; + createdAt: number; +} + +export interface SkillDetail extends SkillBrief { + content: string; + parameters: string; + handler: string; + config: string; +} + +export interface Agent { + id: string; + name: string; + description: string; + avatar: string; + prompt: string; + model: string; + temperature: number; + owner_id?: string | null; + team_id?: string | null; + visibility?: 'private' | 'team' | 'public'; + fork_count?: number; + forked_from?: string | null; + created_at: number; + updated_at: number; + knowledge?: KnowledgeFile[]; + skills?: SkillBrief[]; + _access?: 'owner' | 'team' | 'view' | 'none'; +} + +export interface RetrievedSnippet { + fileName: string; + chunkIndex: number; + score: number; + preview: string; +} + +export interface ToolCallTrace { + name: string; + args: any; + result: any; +} + +export interface ChatMessage { + id: string; + role: 'user' | 'assistant'; + content: string; + parentId?: string | null; + createdAt: number; + meta?: { + retrieved?: RetrievedSnippet[]; + toolCalls?: ToolCallTrace[]; + aborted?: boolean; + } | null; +} + +export interface BranchInfo { + total: number; + activeIndex: number; + ids: string[]; +} + +export interface ChatHistoryResp { + messages: ChatMessage[]; + branches: Record; +} + +export const AgentAPI = { + list: () => api.get('/agents').then((r) => r.data), + detail: (id: string) => api.get(`/agents/${id}`).then((r) => r.data), + create: (payload: Partial) => api.post('/agents', payload).then((r) => r.data), + update: (id: string, payload: Partial) => api.put(`/agents/${id}`, payload).then((r) => r.data), + remove: (id: string) => api.delete(`/agents/${id}`).then((r) => r.data), + + uploadKnowledge: (id: string, files: File[]) => { + const fd = new FormData(); + files.forEach((f) => fd.append('files', f)); + return api.post(`/agents/${id}/knowledge`, fd).then((r) => r.data); + }, + reindexKnowledge: (agentId: string, fileId: string) => + api.post(`/agents/${agentId}/knowledge/${fileId}/reindex`).then((r) => r.data), + deleteKnowledge: (agentId: string, fileId: string) => + api.delete(`/agents/${agentId}/knowledge/${fileId}`).then((r) => r.data), + + uploadSkills: (id: string, files: File[]) => { + const fd = new FormData(); + files.forEach((f) => fd.append('files', f)); + return api.post(`/agents/${id}/skills`, fd).then((r) => r.data); + }, + createSkill: (id: string, payload: { name: string; content: string }) => + api.post(`/agents/${id}/skills/manual`, payload).then((r) => r.data), + getSkill: (agentId: string, skillId: string) => + api.get(`/agents/${agentId}/skills/${skillId}`).then((r) => r.data), + updateSkill: (agentId: string, skillId: string, payload: { content?: string; enabled?: boolean }) => + api.put(`/agents/${agentId}/skills/${skillId}`, payload).then((r) => r.data), + deleteSkill: (agentId: string, skillId: string) => + api.delete(`/agents/${agentId}/skills/${skillId}`).then((r) => r.data) +}; + +export const ChatAPI = { + history: (agentId: string, sessionId?: string) => + api + .get(`/chat/${agentId}/messages`, { params: sessionId ? { sessionId } : {} }) + .then((r) => r.data), + send: ( + agentId: string, + content: string, + sessionId?: string, + overrides?: ModelOverrides, + attachmentsText?: string, + imageUrls?: string[] + ) => + api + .post<{ user: ChatMessage; assistant: ChatMessage }>(`/chat/${agentId}/messages`, { + content, + sessionId, + overrides, + attachmentsText, + imageUrls + }) + .then((r) => r.data), + clear: (agentId: string, sessionId?: string) => + api + .delete(`/chat/${agentId}/messages`, { params: sessionId ? { sessionId } : {} }) + .then((r) => r.data), + /** 切换分支:把 user 消息下的某条 assistant 兄弟设为激活 */ + switchBranch: (agentId: string, userMsgId: string, branchId: string) => + api + .post(`/chat/${agentId}/messages/${userMsgId}/switch-branch`, { branchId }) + .then((r) => r.data) +}; + +export interface ChatAttachment { + name: string; + size: number; + mime: string; + text: string; + truncated: boolean; +} + +export const ChatAttachmentsAPI = { + upload: (files: File[]) => { + const fd = new FormData(); + files.forEach((f) => fd.append('files', f)); + return api + .post<{ files: ChatAttachment[] }>('/chat/attachments', fd) + .then((r) => r.data); + } +}; + +// ============== MCP ============== + +export interface McpServer { + id: string; + name: string; + transport: 'stdio' | 'sse' | 'http'; + command: string; + args: string[]; + env: Record; + url: string; + enabled: boolean; + createdAt: number; +} + +export interface McpStatus { + id: string; + name: string; + error?: string; + toolCount: number; + resourceCount: number; + promptCount: number; + capabilities: { tools: boolean; resources: boolean; prompts: boolean }; + tools: { name: string; description?: string }[]; + resources: { uri: string; name?: string; description?: string; mimeType?: string }[]; + prompts: { name: string; description?: string; arguments?: any[] }[]; +} + +export const McpAPI = { + list: (agentId: string) => api.get(`/agents/${agentId}/mcp-servers`).then((r) => r.data), + status: (agentId: string) => api.get(`/agents/${agentId}/mcp-status`).then((r) => r.data), + create: (agentId: string, payload: Partial) => + api.post(`/agents/${agentId}/mcp-servers`, payload).then((r) => r.data), + update: (agentId: string, serverId: string, payload: Partial) => + api.put(`/agents/${agentId}/mcp-servers/${serverId}`, payload).then((r) => r.data), + remove: (agentId: string, serverId: string) => + api.delete(`/agents/${agentId}/mcp-servers/${serverId}`).then((r) => r.data), + restart: (agentId: string) => api.post(`/agents/${agentId}/mcp-restart`).then((r) => r.data), + importJSON: (agentId: string, config: any, replace = false) => + api.post(`/agents/${agentId}/mcp-import`, { config, replace }).then((r) => r.data), + readResource: (agentId: string, serverId: string, uri: string) => + api.post(`/agents/${agentId}/mcp-read-resource`, { serverId, uri }).then((r) => r.data), + getPrompt: (agentId: string, serverId: string, name: string, args: Record = {}) => + api.post(`/agents/${agentId}/mcp-get-prompt`, { serverId, name, args }).then((r) => r.data) +}; + +// ============== 会话 ============== + +export interface ChatSession { + id: string; + agentId: string; + title: string; + archived?: boolean; + createdAt: number; + updatedAt: number; + messageCount?: number; + lastPreview?: string; + lastAt?: number; +} + +export interface SearchHit { + id: string; + sessionId: string; + sessionTitle: string; + sessionArchived: boolean; + role: 'user' | 'assistant'; + content: string; + snippet: string; + createdAt: number; +} + +export interface SearchResult { + sessions: { id: string; title: string; archived: boolean; created_at: number; updated_at: number }[]; + messages: SearchHit[]; +} + +export const SessionAPI = { + list: (agentId: string, archived: '0' | '1' | 'all' = '0') => + api.get(`/agents/${agentId}/sessions`, { params: { archived } }).then((r) => r.data), + create: (agentId: string, title?: string) => + api.post(`/agents/${agentId}/sessions`, { title }).then((r) => r.data), + rename: (agentId: string, sessionId: string, title: string) => + api.put(`/agents/${agentId}/sessions/${sessionId}`, { title }).then((r) => r.data), + remove: (agentId: string, sessionId: string) => + api.delete(`/agents/${agentId}/sessions/${sessionId}`).then((r) => r.data), + archive: (agentId: string, sessionId: string, archived: boolean) => + api.post(`/agents/${agentId}/sessions/${sessionId}/archive`, { archived }).then((r) => r.data), + share: (agentId: string, sessionId: string, ttlHours = 0) => + api + .post<{ token: string; expiresAt?: number }>(`/agents/${agentId}/sessions/${sessionId}/share`, { ttlHours }) + .then((r) => r.data), + revokeShare: (agentId: string, sessionId: string) => + api.delete(`/agents/${agentId}/sessions/${sessionId}/share`).then((r) => r.data), + search: (agentId: string, q: string, opts: { includeArchived?: boolean; limit?: number } = {}) => + api + .get(`/agents/${agentId}/sessions/search`, { + params: { + q, + includeArchived: opts.includeArchived ? '1' : '0', + limit: opts.limit ?? 30 + } + }) + .then((r) => r.data), + /** 导出会话为文件并触发浏览器下载 */ + exportSession: (agentId: string, sessionId: string, format: 'md' | 'json' = 'md') => { + const url = `/api/agents/${agentId}/sessions/${sessionId}/export?format=${format}`; + const a = document.createElement('a'); + a.href = url; + a.rel = 'noopener'; + document.body.appendChild(a); + a.click(); + a.remove(); + } +}; + +// 公开会话访问(不需要登录) +export const SharedAPI = { + get: (token: string) => + api.get<{ + agent: { name: string; description: string }; + session: { id: string; title: string; createdAt: number; updatedAt: number }; + messages: { id: string; role: 'user' | 'assistant'; content: string; createdAt: number }[]; + }>(`/shared/${token}`).then((r) => r.data) +}; + +// 图床 +export interface UploadedImage { + url: string; + name: string; + size: number; + mime: string; +} +export const ImageAPI = { + upload: (files: File[]) => { + const fd = new FormData(); + files.forEach((f) => fd.append('file', f)); + return api.post<{ files: UploadedImage[] }>('/uploads/image', fd).then((r) => r.data); + } +}; + +// ============== 全局搜索(v0.7 命令面板) ============== + +export interface GlobalSearchResult { + agents: { id: string; name: string; description: string; model: string }[]; + sessions: { id: string; agentId: string; agentName: string; title: string; updatedAt: number; archived: boolean }[]; + messages: { + id: string; + sessionId: string; + agentId: string; + agentName: string; + sessionTitle: string; + role: 'user' | 'assistant'; + snippet: string; + createdAt: number; + }[]; +} + +export const SearchAPI = { + global: (q: string, limit = 8) => + api.get('/search', { params: { q, limit } }).then((r) => r.data) +}; + +// ============== 鉴权 / 用户 / 团队 / 广场 ============== + +export interface AuthUser { + id: string; + email: string; + name: string; + role: 'admin' | 'user'; +} + +export const AuthAPI = { + me: () => api.get('/auth/me').then((r) => r.data), + login: (email: string, password: string) => + api.post('/auth/login', { email, password }).then((r) => r.data), + register: (payload: { email: string; password: string; name: string; inviteCode?: string }) => + api.post('/auth/register', payload).then((r) => r.data), + logout: () => api.post('/auth/logout').then((r) => r.data), + listInvites: () => api.get('/auth/invites').then((r) => r.data), + createInvite: (payload: { email?: string; teamId?: string; role?: string; ttlHours?: number }) => + api.post('/auth/invites', payload).then((r) => r.data), + deleteInvite: (code: string) => api.delete(`/auth/invites/${code}`).then((r) => r.data) +}; + +export interface Team { + id: string; + name: string; + ownerId: string; + createdAt: number; + myRole?: 'owner' | 'admin' | 'member'; + members?: { id: string; email: string; name: string; role: string; joinedAt: number }[]; + agentCount?: number; +} + +export const TeamAPI = { + list: () => api.get('/teams').then((r) => r.data), + detail: (id: string) => api.get(`/teams/${id}`).then((r) => r.data), + create: (name: string) => api.post('/teams', { name }).then((r) => r.data), + rename: (id: string, name: string) => api.put(`/teams/${id}`, { name }).then((r) => r.data), + remove: (id: string) => api.delete(`/teams/${id}`).then((r) => r.data), + removeMember: (id: string, userId: string) => + api.delete(`/teams/${id}/members/${userId}`).then((r) => r.data) +}; + +export interface MarketplaceAgent extends Agent { + ownerName?: string; + fork_count: number; + skillCount: number; + kbCount: number; +} + +export const MarketplaceAPI = { + list: () => api.get('/agents/_/marketplace').then((r) => r.data), + detail: (id: string) => api.get(`/agents/_/marketplace/${id}`).then((r) => r.data), + fork: (id: string) => api.post(`/agents/_/marketplace/${id}/fork`).then((r) => r.data) +}; + +// ============== Prompt 模板库 (v0.8 P1) ============== + +export interface PromptTemplate { + id: string; + ownerId: string; + ownerName?: string; + title: string; + body: string; + category: string; + variables: string; + visibility: 'private' | 'public'; + useCount: number; + createdAt: number; + updatedAt: number; +} + +export const PromptTemplateAPI = { + list: (opts: { scope?: 'mine' | 'public' | 'all'; q?: string } = {}) => + api + .get('/prompt-templates', { + params: { scope: opts.scope ?? 'all', q: opts.q ?? '' } + }) + .then((r) => r.data), + create: (payload: Partial) => + api.post<{ id: string }>('/prompt-templates', payload).then((r) => r.data), + update: (id: string, payload: Partial) => + api.put(`/prompt-templates/${id}`, payload).then((r) => r.data), + remove: (id: string) => api.delete(`/prompt-templates/${id}`).then((r) => r.data), + use: (id: string) => api.post(`/prompt-templates/${id}/use`).then((r) => r.data) +}; + +// ============== 调用统计 (v0.8 P1) ============== + +export interface StatsOverview { + agentCount: number; + sessionCount: number; + messageCount: number; + daily: { day: string; total: number; user: number; assistant: number }[]; + topAgents: { id: string; name: string; messageCount: number }[]; +} + +export interface AgentStats { + sessionCount: number; + messageCount: number; + avgMessageLen: number; + assistantWithToolCalls: number; + knowledgeFiles: number; + skillCount: number; + daily: { day: string; count: number }[]; +} + +export const StatsAPI = { + overview: () => api.get('/stats/overview').then((r) => r.data), + agent: (id: string) => api.get(`/stats/agents/${id}`).then((r) => r.data) +}; + +// ============== 流式(手写 SSE,不用 EventSource,因为它不能 POST) ============== + +// ============== LLM 提供商 (v0.9) ============== + +export type LLMKind = 'openai' | 'openai-compatible' | 'anthropic' | 'ollama' | 'tencent-tokenplan'; + +export interface LLMProvider { + id: string; + name: string; + kind: LLMKind; + baseUrl: string; + apiKeyMasked: string; + hasApiKey: boolean; + models: string[]; + defaultModel: string; + enabled: boolean; + isDefault: boolean; + createdAt: number; + updatedAt: number; +} + +export const LLMProviderAPI = { + list: () => api.get('/llm-providers').then((r) => r.data), + create: (payload: Partial & { apiKey?: string }) => + api.post<{ id: string }>('/llm-providers', payload).then((r) => r.data), + update: (id: string, payload: Partial & { apiKey?: string }) => + api.put(`/llm-providers/${id}`, payload).then((r) => r.data), + remove: (id: string) => api.delete(`/llm-providers/${id}`).then((r) => r.data), + test: (id: string, model?: string) => + api.post<{ ok: boolean; reply?: string; error?: string; usage?: any; model?: string }>( + `/llm-providers/${id}/test`, + { model } + ).then((r) => r.data), + setDefault: (id: string) => api.post(`/llm-providers/${id}/default`).then((r) => r.data) +}; + + +export interface StreamEvents { + onMeta?: (data: { userMsgId: string; retrieved: RetrievedSnippet[]; toolsAvailable: number; mcpToolsCount: number }) => void; + onDelta?: (text: string) => void; + onToolCall?: (data: { id: string; name: string; args: any }) => void; + onToolResult?: (data: { id: string; name: string; result: any }) => void; + onDone?: (data: { user: ChatMessage; assistant: ChatMessage }) => void; + onAborted?: (data: { assistant: ChatMessage }) => void; + onError?: (msg: string) => void; +} + +export interface ModelOverrides { + model?: string; + temperature?: number; + topP?: number; + maxTokens?: number; +} + +export async function streamChat( + agentId: string, + content: string, + h: StreamEvents, + signal?: AbortSignal, + sessionId?: string, + overrides?: ModelOverrides, + attachmentsText?: string, + imageUrls?: string[] +) { + const resp = await fetch(`/api/chat/${agentId}/messages/stream`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ content, sessionId, overrides, attachmentsText, imageUrls }), + signal, + credentials: 'include' + }); + return await consumeSSE(resp, h, signal); +} + +/** 重新生成(开新分支);行为同 streamChat */ +export async function regenerateMessage( + agentId: string, + assistantMsgId: string, + h: StreamEvents, + signal?: AbortSignal, + overrides?: ModelOverrides, + attachmentsText?: string +) { + const resp = await fetch(`/api/chat/${agentId}/messages/${assistantMsgId}/regenerate`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ overrides, attachmentsText }), + signal, + credentials: 'include' + }); + return await consumeSSE(resp, h, signal); +} + +async function consumeSSE(resp: Response, h: StreamEvents, signal?: AbortSignal) { + if (!resp.ok || !resp.body) { + const txt = await resp.text().catch(() => ''); + h.onError?.(`HTTP ${resp.status}: ${txt}`); + return; + } + const reader = resp.body.getReader(); + const decoder = new TextDecoder('utf-8'); + let buf = ''; + try { + while (true) { + const { value, done } = await reader.read(); + if (done) break; + buf += decoder.decode(value, { stream: true }); + + let idx; + while ((idx = buf.indexOf('\n\n')) !== -1) { + const raw = buf.slice(0, idx); + buf = buf.slice(idx + 2); + if (!raw.trim() || raw.startsWith(':')) continue; + + let event = 'message'; + let dataStr = ''; + for (const line of raw.split('\n')) { + if (line.startsWith('event:')) event = line.slice(6).trim(); + else if (line.startsWith('data:')) dataStr += line.slice(5).trim(); + } + if (!dataStr) continue; + let data: any; + try { + data = JSON.parse(dataStr); + } catch { + continue; + } + switch (event) { + case 'meta': + h.onMeta?.(data); + break; + case 'delta': + h.onDelta?.(data.content || ''); + break; + case 'tool_call': + h.onToolCall?.(data); + break; + case 'tool_result': + h.onToolResult?.(data); + break; + case 'done': + h.onDone?.(data); + break; + case 'aborted': + h.onAborted?.(data); + break; + case 'error': + h.onError?.(data.message || 'stream error'); + break; + } + } + } + } catch (e: any) { + if (signal?.aborted || e?.name === 'AbortError') { + // 静默:本地已 abort + return; + } + h.onError?.(e?.message ?? String(e)); + } +} + +// ============== Workflow (v1.1) ============== + +export type WorkflowNodeType = 'agent' | 'skill' | 'http' | 'transform' | 'branch'; + +export interface WorkflowNode { + id: string; + type: WorkflowNodeType; + name: string; + config: Record; + next?: string; + elseNext?: string; +} + +export interface WorkflowGraph { + entry: string; + nodes: WorkflowNode[]; + variables?: Record; +} + +export interface Workflow { + id: string; + name: string; + description: string; + graph: WorkflowGraph; + scheduleCron: string; + scheduleEnabled: boolean; + enabled: boolean; + lastRunAt: number; + runCount: number; + createdAt: number; + updatedAt: number; +} + +export interface WorkflowRun { + id: string; + workflowId: string; + trigger: 'manual' | 'cron' | 'api'; + status: 'running' | 'success' | 'failed' | 'aborted'; + error: string; + startedAt: number; + finishedAt: number; + durationMs: number; +} + +export interface WorkflowRunStep { + id: string; + nodeId: string; + nodeType: string; + stepIndex: number; + status: 'running' | 'success' | 'failed' | 'skipped'; + input: any; + output: any; + error: string; + startedAt: number; + finishedAt: number; + durationMs: number; +} + +export interface WorkflowRunDetail extends WorkflowRun { + input: any; + output: any; + steps: WorkflowRunStep[]; +} + +export const WorkflowAPI = { + list: () => api.get('/workflows').then((r) => r.data), + get: (id: string) => api.get(`/workflows/${id}`).then((r) => r.data), + create: (payload: Partial) => + api.post<{ id: string }>('/workflows', payload).then((r) => r.data), + update: (id: string, payload: Partial) => + api.put(`/workflows/${id}`, payload).then((r) => r.data), + remove: (id: string) => api.delete(`/workflows/${id}`).then((r) => r.data), + run: (id: string, input?: Record) => + api.post<{ runId: string }>(`/workflows/${id}/run`, { input }).then((r) => r.data), + listRuns: (id: string, limit = 30) => + api.get(`/workflows/${id}/runs`, { params: { limit } }).then((r) => r.data), + getRun: (runId: string) => + api.get(`/workflows/runs/${runId}`).then((r) => r.data) +}; + +// SSE 流式执行 workflow(用 EventSource,cookie 由浏览器自动带) +export function streamWorkflowRun( + workflowId: string, + input: Record | undefined, + handlers: { + onReady?: (data: any) => void; + onStepStart?: (data: any) => void; + onStepFinish?: (data: any) => void; + onRunFinish?: (data: any) => void; + onError?: (msg: string) => void; + } +): () => void { + const qs = input ? `?input=${encodeURIComponent(JSON.stringify(input))}` : ''; + const url = `/api/workflows/${workflowId}/run-stream${qs}`; + const es = new EventSource(url, { withCredentials: true } as any); + es.addEventListener('ready', (e: any) => handlers.onReady?.(JSON.parse(e.data))); + es.addEventListener('step_start', (e: any) => handlers.onStepStart?.(JSON.parse(e.data))); + es.addEventListener('step_finish', (e: any) => handlers.onStepFinish?.(JSON.parse(e.data))); + es.addEventListener('run_finish', (e: any) => { + handlers.onRunFinish?.(JSON.parse(e.data)); + es.close(); + }); + es.addEventListener('error', () => { + if (es.readyState === EventSource.CLOSED) return; + handlers.onError?.('stream error'); + es.close(); + }); + return () => es.close(); +} diff --git a/src/components/ChatPreview.tsx b/src/components/ChatPreview.tsx new file mode 100644 index 0000000..8b4b89f --- /dev/null +++ b/src/components/ChatPreview.tsx @@ -0,0 +1,197 @@ +import { useEffect, useRef, useState } from 'react'; +import { Button, Input, Space, App as AntApp, Empty, Spin } from 'antd'; +import ReactMarkdown from 'react-markdown'; +import { + Agent, + ChatMessage, + streamChat, + RetrievedSnippet, + ToolCallTrace +} from '../api'; + +interface Props { + agent: Agent; + agentId?: string; +} + +interface StreamingState { + active: boolean; + text: string; + retrieved: RetrievedSnippet[]; + toolCalls: ToolCallTrace[]; +} + +export default function ChatPreview({ agent, agentId }: Props) { + const { message: msg } = AntApp.useApp(); + const [messages, setMessages] = useState([]); + const [input, setInput] = useState(''); + const [sending, setSending] = useState(false); + const [streaming, setStreaming] = useState({ + active: false, + text: '', + retrieved: [], + toolCalls: [] + }); + const bodyRef = useRef(null); + const abortRef = useRef(null); + + const scrollBottom = () => { + requestAnimationFrame(() => { + bodyRef.current?.scrollTo({ top: bodyRef.current.scrollHeight, behavior: 'smooth' }); + }); + }; + + useEffect(() => { + return () => abortRef.current?.abort(); + }, []); + + const handleSend = async () => { + const text = input.trim(); + if (!text || !agentId || sending) return; + setInput(''); + setSending(true); + + const tempUser: ChatMessage = { + id: 'tmp-' + Date.now(), + role: 'user', + content: text, + createdAt: Date.now() + }; + setMessages((m) => [...m, tempUser]); + setStreaming({ active: true, text: '', retrieved: [], toolCalls: [] }); + scrollBottom(); + + abortRef.current?.abort(); + const ctrl = new AbortController(); + abortRef.current = ctrl; + + try { + await streamChat( + agentId, + text, + { + onMeta: (m) => setStreaming((s) => ({ ...s, retrieved: m.retrieved || [] })), + onDelta: (chunk) => + setStreaming((s) => { + const next = { ...s, text: s.text + chunk }; + scrollBottom(); + return next; + }), + onToolCall: (data) => + setStreaming((s) => ({ + ...s, + toolCalls: [...s.toolCalls, { name: data.name, args: data.args, result: { pending: true } }] + })), + onToolResult: (data) => + setStreaming((s) => { + const list = [...s.toolCalls]; + for (let i = list.length - 1; i >= 0; i--) { + if (list[i].name === data.name && (list[i].result as any)?.pending) { + list[i] = { ...list[i], result: data.result }; + break; + } + } + return { ...s, toolCalls: list }; + }), + onDone: (data) => { + setMessages((m) => [...m.filter((x) => x.id !== tempUser.id), data.user, data.assistant]); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + scrollBottom(); + }, + onError: (errMsg) => { + msg.error('预览失败:' + errMsg); + setMessages((m) => m.filter((x) => x.id !== tempUser.id)); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + } + }, + ctrl.signal + ); + } catch (e: any) { + if (e?.name !== 'AbortError') { + msg.error('请求失败:' + (e?.message ?? e)); + } + setMessages((m) => m.filter((x) => x.id !== tempUser.id)); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + } finally { + setSending(false); + } + }; + + const isImageUrl = (url: string) => url?.startsWith('http') || url?.startsWith('/'); + + return ( +
+
+
+ {isImageUrl(agent.avatar) ? ( + avatar + ) : ( + (agent?.name?.charAt(0) || '?').toUpperCase() + )} +
+
预览
+
+ +
+ {messages.length === 0 && !streaming.active ? ( + + ) : ( +
+ {messages.map((m) => ( +
+
+ {m.content} +
+
+ ))} + {streaming.active && ( +
+
+ {streaming.text ? ( + {streaming.text + '▍'} + ) : ( + 思考中... + )} +
+
+ )} +
+ )} +
+ +
+
+ setInput(e.target.value)} + placeholder="输入消息测试..." + autoSize={{ minRows: 1, maxRows: 4 }} + onPressEnter={(e) => { + if (!e.shiftKey) { + e.preventDefault(); + handleSend(); + } + }} + disabled={sending || !agentId} + className="rounded-lg" + /> + +
+ {!agentId && ( +
请先保存智能体以启用预览
+ )} +
+
+ ); +} diff --git a/src/components/CommandPalette.tsx b/src/components/CommandPalette.tsx new file mode 100644 index 0000000..2070b81 --- /dev/null +++ b/src/components/CommandPalette.tsx @@ -0,0 +1,244 @@ +import { useEffect, useMemo, useRef, useState } from 'react'; +import { Modal, Input, Spin, Empty, Tag } from 'antd'; +import { useNavigate } from 'react-router-dom'; +import dayjs from 'dayjs'; +import { SearchAPI, GlobalSearchResult } from '../api'; + +interface Props { + open: boolean; + onClose: () => void; +} + +type FlatItem = + | { kind: 'agent'; id: string; title: string; subtitle: string; route: string } + | { kind: 'session'; id: string; agentId: string; title: string; subtitle: string; archived: boolean; route: string } + | { kind: 'message'; id: string; agentId: string; sessionId: string; title: string; snippet: string; role: 'user' | 'assistant'; createdAt: number; route: string }; + +export default function CommandPalette({ open, onClose }: Props) { + const [q, setQ] = useState(''); + const [loading, setLoading] = useState(false); + const [result, setResult] = useState(null); + const [active, setActive] = useState(0); + const navigate = useNavigate(); + const inputRef = useRef(null); + + // 重置 + useEffect(() => { + if (open) { + setQ(''); + setResult(null); + setActive(0); + setTimeout(() => inputRef.current?.focus(), 50); + } + }, [open]); + + // 防抖搜索 + useEffect(() => { + const query = q.trim(); + if (!query) { + setResult(null); + return; + } + const t = setTimeout(async () => { + setLoading(true); + try { + const r = await SearchAPI.global(query, 6); + setResult(r); + setActive(0); + } catch { + setResult({ agents: [], sessions: [], messages: [] }); + } finally { + setLoading(false); + } + }, 200); + return () => clearTimeout(t); + }, [q]); + + const flat = useMemo(() => { + if (!result) return []; + const list: FlatItem[] = []; + for (const a of result.agents) { + list.push({ + kind: 'agent', + id: a.id, + title: a.name, + subtitle: a.description || a.model, + route: `/agents/${a.id}/chat` + }); + } + for (const s of result.sessions) { + list.push({ + kind: 'session', + id: s.id, + agentId: s.agentId, + title: s.title, + subtitle: `${s.agentName} · ${dayjs(s.updatedAt).format('MM-DD HH:mm')}`, + archived: s.archived, + route: `/agents/${s.agentId}/chat?session=${s.id}` + }); + } + for (const m of result.messages) { + list.push({ + kind: 'message', + id: m.id, + agentId: m.agentId, + sessionId: m.sessionId, + title: `${m.agentName} / ${m.sessionTitle}`, + snippet: m.snippet, + role: m.role, + createdAt: m.createdAt, + route: `/agents/${m.agentId}/chat?session=${m.sessionId}&msg=${m.id}` + }); + } + return list; + }, [result]); + + const handlePick = (it: FlatItem) => { + navigate(it.route); + onClose(); + }; + + const onKeyDown: React.KeyboardEventHandler = (e) => { + if (e.key === 'ArrowDown') { + e.preventDefault(); + setActive((i) => Math.min(flat.length - 1, i + 1)); + } else if (e.key === 'ArrowUp') { + e.preventDefault(); + setActive((i) => Math.max(0, i - 1)); + } else if (e.key === 'Enter') { + e.preventDefault(); + const it = flat[active]; + if (it) handlePick(it); + } else if (e.key === 'Escape') { + onClose(); + } + }; + + return ( + +
+ setQ(e.target.value)} + onKeyDown={onKeyDown} + prefix={⌘K} + /> +
+
+ {loading && ( +
+ +
+ )} + {!loading && q.trim() && flat.length === 0 && ( + + )} + {!loading && !q.trim() && ( +
+
💡 快捷键提示:
+
    +
  • Ctrl/⌘ + K 打开命令面板
  • +
  • ↑ ↓ 切换结果,Enter 跳转
  • +
  • 支持搜索:智能体名 / 会话标题 / 消息内容
  • +
+
+ )} + {!loading && flat.length > 0 && ( +
+ {(() => { + const groups: { label: string; items: FlatItem[] }[] = []; + const agents = flat.filter((x) => x.kind === 'agent'); + const sessions = flat.filter((x) => x.kind === 'session'); + const messages = flat.filter((x) => x.kind === 'message'); + if (agents.length) groups.push({ label: '🤖 智能体', items: agents }); + if (sessions.length) groups.push({ label: '💬 会话', items: sessions }); + if (messages.length) groups.push({ label: '📝 消息', items: messages }); + let cursor = 0; + return groups.map((g) => ( +
+
+ {g.label} +
+ {g.items.map((it) => { + const idx = cursor++; + const isActive = idx === active; + return ( +
setActive(idx)} + onClick={() => handlePick(it)} + style={{ + padding: '8px 14px', + cursor: 'pointer', + background: isActive ? '#eef2ff' : 'transparent', + borderLeft: isActive ? '3px solid #6366f1' : '3px solid transparent' + }} + > + {it.kind === 'agent' && ( + <> +
{it.title}
+
{it.subtitle}
+ + )} + {it.kind === 'session' && ( + <> +
+ 💬 {it.title} + {it.archived && 归档} +
+
{it.subtitle}
+ + )} + {it.kind === 'message' && ( + <> +
+ + {it.role === 'user' ? '我' : 'AI'} + + {it.title} · {dayjs(it.createdAt).format('MM-DD HH:mm')} +
+
+ + )} +
+ ); + })} +
+ )); + })()} +
+ )} +
+ + ); +} diff --git a/src/components/McpPanel.tsx b/src/components/McpPanel.tsx new file mode 100644 index 0000000..900a563 --- /dev/null +++ b/src/components/McpPanel.tsx @@ -0,0 +1,385 @@ +import { useEffect, useState } from 'react'; +import { Button, Card, List, Modal, Form, Input, Select, Tag, Space, Popconfirm, App as AntApp, Tooltip, Alert } from 'antd'; +import { McpAPI, McpServer, McpStatus } from '../api'; + +interface Props { + agentId: string; +} + +const PRESETS: { label: string; description: string; config: any }[] = [ + { + label: 'filesystem (官方 NPM)', + description: '本地文件系统操作(读、列目录)。请把最后一个参数改成你要暴露给智能体的目录绝对路径。', + config: { + mcpServers: { + filesystem: { + command: 'npx', + args: ['-y', '@modelcontextprotocol/server-filesystem', '/path/to/your/dir'] + } + } + } + }, + { + label: 'fetch (官方 NPM)', + description: '抓取网页/URL 内容', + config: { + mcpServers: { + fetch: { command: 'npx', args: ['-y', '@modelcontextprotocol/server-fetch'] } + } + } + }, + { + label: 'sequential-thinking (官方 NPM)', + description: '辅助思维链推理', + config: { + mcpServers: { + 'sequential-thinking': { + command: 'npx', + args: ['-y', '@modelcontextprotocol/server-sequential-thinking'] + } + } + } + } +]; + +export default function McpPanel({ agentId }: Props) { + const { message } = AntApp.useApp(); + const [servers, setServers] = useState([]); + const [statusList, setStatusList] = useState([]); + const [statusLoading, setStatusLoading] = useState(false); + const [editing, setEditing] = useState(null); + const [createOpen, setCreateOpen] = useState(false); + const [importOpen, setImportOpen] = useState(false); + const [importJson, setImportJson] = useState(''); + + const refresh = async () => { + const list = await McpAPI.list(agentId); + setServers(list); + }; + + const refreshStatus = async () => { + setStatusLoading(true); + try { + const s = await McpAPI.status(agentId); + setStatusList(s); + } catch (e: any) { + message.error('状态获取失败:' + (e?.message ?? e)); + } finally { + setStatusLoading(false); + } + }; + + useEffect(() => { + refresh(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [agentId]); + + const handleSave = async (values: any) => { + try { + // args 字符串 → 数组 + let args: string[] = []; + if (typeof values.argsText === 'string') { + args = values.argsText + .split(/\r?\n/) + .map((s: string) => s.trim()) + .filter(Boolean); + } + let env: Record = {}; + if (values.envText) { + try { + env = JSON.parse(values.envText); + } catch { + message.error('env 必须是合法 JSON 对象'); + return; + } + } + const payload = { + name: values.name, + transport: values.transport, + command: values.command || '', + args, + env, + url: values.url || '' + }; + if (editing) { + await McpAPI.update(agentId, editing.id, payload); + message.success('已更新'); + } else { + await McpAPI.create(agentId, payload); + message.success('已创建'); + } + setEditing(null); + setCreateOpen(false); + refresh(); + } catch (e: any) { + message.error('保存失败:' + (e?.message ?? e)); + } + }; + + const handleImport = async () => { + let parsed: any; + try { + parsed = JSON.parse(importJson); + } catch { + message.error('JSON 解析失败'); + return; + } + try { + const r = await McpAPI.importJSON(agentId, parsed, false); + message.success(`已导入 ${r.imported} 个 MCP Server`); + setImportOpen(false); + setImportJson(''); + refresh(); + } catch (e: any) { + message.error('导入失败:' + (e?.message ?? e)); + } + }; + + return ( + + 🔌 MCP Servers + {servers.length} 个 + + } + extra={ + + + + + + } + > + + + { + const status = statusList.find((x) => x.id === s.id); + return ( + { + setEditing(s); + setCreateOpen(true); + }} + > + 编辑 + , + { + await McpAPI.remove(agentId, s.id); + message.success('已删除'); + refresh(); + }} + > + + + ]} + > + + {s.transport} + {s.name} + {!s.enabled && 已停用} + {status?.error && ( + + 连接失败 + + )} + {status && !status.error && ( + {status.toolCount} 工具就绪 + )} + + } + description={ + + + {s.transport === 'stdio' + ? `${s.command} ${s.args.join(' ')}` + : s.url} + + {status?.tools && status.tools.length > 0 && ( + + {status.tools.slice(0, 8).map((t) => ( + + + {t.name} + + + ))} + {status.tools.length > 8 && +{status.tools.length - 8}} + + )} + + } + /> + + ); + }} + /> + + { + setCreateOpen(false); + setEditing(null); + }} + footer={null} + destroyOnHidden + > + { + setCreateOpen(false); + setEditing(null); + }} + /> + + + setImportOpen(false)} + onOk={handleImport} + okText="导入" + cancelText="取消" + > + + + {PRESETS.map((p) => ( + + + + ))} + + setImportJson(e.target.value)} + placeholder={`{ + "mcpServers": { + "filesystem": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"] + } + } +}`} + autoSize={{ minRows: 12, maxRows: 20 }} + style={{ fontFamily: 'Consolas, Menlo, monospace', fontSize: 13 }} + /> + + + ); +} + +function McpForm({ + initial, + onSubmit, + onCancel +}: { + initial: McpServer | null; + onSubmit: (values: any) => void; + onCancel: () => void; +}) { + const [form] = Form.useForm(); + const [transport, setTransport] = useState<'stdio' | 'sse' | 'http'>(initial?.transport ?? 'stdio'); + + useEffect(() => { + form.setFieldsValue({ + name: initial?.name ?? '', + transport: initial?.transport ?? 'stdio', + command: initial?.command ?? '', + argsText: (initial?.args ?? []).join('\n'), + envText: initial?.env ? JSON.stringify(initial.env, null, 2) : '', + url: initial?.url ?? '' + }); + setTransport(initial?.transport ?? 'stdio'); + }, [initial, form]); + + return ( +
+ + + + + + + + + + + + + + ) : ( + + + + )} + + + + + +
+ ); +} diff --git a/src/components/McpResourcesDrawer.tsx b/src/components/McpResourcesDrawer.tsx new file mode 100644 index 0000000..09902c7 --- /dev/null +++ b/src/components/McpResourcesDrawer.tsx @@ -0,0 +1,305 @@ +import { useEffect, useState } from 'react'; +import { Drawer, Tabs, Button, List, Space, Tag, App as AntApp, Empty, Modal, Form, Input, Spin } from 'antd'; +import { McpAPI, McpStatus } from '../api'; + +interface Props { + agentId: string; + open: boolean; + onClose: () => void; + /** 当用户选中要"使用"某个 Resource 或 Prompt 时,回调把内容塞回输入框 */ + onUse: (text: string) => void; +} + +export default function McpResourcesDrawer({ agentId, open, onClose, onUse }: Props) { + const { message } = AntApp.useApp(); + const [loading, setLoading] = useState(false); + const [status, setStatus] = useState([]); + const [contentModal, setContentModal] = useState<{ title: string; content: string } | null>(null); + const [promptModal, setPromptModal] = useState<{ server: McpStatus; prompt: any } | null>(null); + const [promptArgs, setPromptArgs] = useState>({}); + + const load = async () => { + setLoading(true); + try { + const s = await McpAPI.status(agentId); + setStatus(s); + } catch (e: any) { + message.error('加载失败:' + (e?.message ?? e)); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + if (open) load(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [open, agentId]); + + const handleReadResource = async (serverId: string, uri: string, name: string) => { + try { + const r = await McpAPI.readResource(agentId, serverId, uri); + // 把 contents 拼成 markdown 文本 + const text = (r.contents ?? []) + .map((c: any) => { + if (c.text) return c.text; + if (c.blob) return `[binary blob: ${c.mimeType}, ${c.blob.length} bytes]`; + return ''; + }) + .filter(Boolean) + .join('\n\n'); + setContentModal({ title: name || uri, content: text || '(空)' }); + } catch (e: any) { + message.error('读取失败:' + (e?.message ?? e)); + } + }; + + const handleGetPrompt = async () => { + if (!promptModal) return; + try { + const r = await McpAPI.getPrompt(agentId, promptModal.server.id, promptModal.prompt.name, promptArgs); + // prompt 的 messages 转成可用文本 + const text = (r.messages ?? []) + .map((m: any) => { + if (typeof m.content === 'string') return m.content; + if (m.content?.text) return m.content.text; + if (Array.isArray(m.content)) return m.content.map((c: any) => c.text || '').filter(Boolean).join('\n'); + return ''; + }) + .filter(Boolean) + .join('\n\n'); + onUse(text); + message.success('已填充到输入框'); + setPromptModal(null); + setPromptArgs({}); + onClose(); + } catch (e: any) { + message.error('获取失败:' + (e?.message ?? e)); + } + }; + + return ( + <> + + 🔄 刷新 + + } + > + {loading ? ( + + ) : status.length === 0 ? ( + + ) : ( + ({ + key: srv.id, + label: ( + + {srv.name} + {srv.error ? ( + 连接失败 + ) : ( + <> + {srv.resourceCount} 资源 + {srv.promptCount} 提示词 + + )} + + ), + children: srv.error ? ( + + ) : ( + + ) : ( + ( + handleReadResource(srv.id, r.uri, r.name || r.uri)} + > + 读取 + , + + ]} + > + + {r.name || r.uri.split('/').pop()} + {r.mimeType && {r.mimeType}} + + } + description={ +
+ {r.uri} + {r.description &&
{r.description}
} +
+ } + /> +
+ )} + /> + ) + }, + { + key: 'pr', + label: `💡 Prompts (${srv.promptCount})`, + children: srv.prompts.length === 0 ? ( + + ) : ( + ( + { + setPromptModal({ server: srv, prompt: p }); + setPromptArgs({}); + }} + > + 使用 + + ]} + > + + {p.description} + {p.arguments && p.arguments.length > 0 && ( +
+ + {p.arguments.map((a: any) => ( + + {a.name} + {a.required ? ' *' : ''} + + ))} + +
+ )} +
+ } + /> + + )} + /> + ) + } + ]} + /> + ) + }))} + /> + )} + + + setContentModal(null)} + footer={[ + , + + ]} + > +
+          {contentModal?.content}
+        
+
+ + { + setPromptModal(null); + setPromptArgs({}); + }} + onOk={handleGetPrompt} + okText="获取并填充" + cancelText="取消" + > +
{promptModal?.prompt.description}
+
+ {(promptModal?.prompt.arguments ?? []).map((arg: any) => ( + + {arg.name} + {arg.required && 必填} + + } + extra={arg.description} + > + setPromptArgs((p) => ({ ...p, [arg.name]: e.target.value }))} + /> + + ))} +
+
+ + ); +} diff --git a/src/components/SessionSidebar.tsx b/src/components/SessionSidebar.tsx new file mode 100644 index 0000000..5dc321d --- /dev/null +++ b/src/components/SessionSidebar.tsx @@ -0,0 +1,393 @@ +import { useEffect, useState } from 'react'; +import { Button, List, Popconfirm, Input, App as AntApp, Tooltip, Empty, Segmented, Tag, Spin, Dropdown, Modal } from 'antd'; +import dayjs from 'dayjs'; +import { ChatSession, SearchHit, SessionAPI } from '../api'; + +interface Props { + agentId: string; + activeSessionId: string | null; + onChange: (sessionId: string, options?: { highlightMessageId?: string }) => void; + refreshTick?: number; + theme?: 'light' | 'dark'; +} + +export default function SessionSidebar({ agentId, activeSessionId, onChange, refreshTick, theme = 'light' }: Props) { + const { message } = AntApp.useApp(); + const [tab, setTab] = useState<'active' | 'archived'>('active'); + const [active, setActive] = useState([]); + const [archived, setArchived] = useState([]); + const [editingId, setEditingId] = useState(null); + const [editingTitle, setEditingTitle] = useState(''); + + // 搜索 + const [searchQ, setSearchQ] = useState(''); + const [searching, setSearching] = useState(false); + const [searchHits, setSearchHits] = useState([]); + const [searchSessionTitles, setSearchSessionTitles] = useState<{ id: string; title: string; archived: boolean }[]>([]); + + const load = async () => { + const [a, ar] = await Promise.all([SessionAPI.list(agentId, '0'), SessionAPI.list(agentId, '1')]); + setActive(a); + setArchived(ar); + // 自动选中 + if (!activeSessionId) { + if (a.length === 0) { + const created = await SessionAPI.create(agentId); + setActive([created]); + onChange(created.id); + } else { + onChange(a[0].id); + } + } + }; + + useEffect(() => { + load(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [agentId, refreshTick]); + + const isDark = theme === 'dark'; + + // Theme-aware colors + const c = { + text: isDark ? '#c8c8d8' : '#1f2330', + textDim: isDark ? '#8b8ba0' : '#9ca3af', + textActive: isDark ? '#e0e0f0' : '#4338ca', + bgActive: isDark ? 'rgba(99,102,241,0.12)' : '#eef2ff', + borderActive: isDark ? 'rgba(99,102,241,0.3)' : '#c7d2fe', + bgHover: isDark ? 'rgba(255,255,255,0.04)' : '#f9fafb', + bgSearch: isDark ? 'rgba(255,255,255,0.04)' : '#f9fafb', + bgTransparent: 'transparent', + inputBg: isDark ? 'rgba(255,255,255,0.08)' : '#fff', + border: isDark ? 'rgba(255,255,255,0.08)' : '#f0f1f5', + dangerText: isDark ? '#f87171' : '#ef4444', + primaryBtn: isDark ? '#6366f1' : undefined, + }; + + const list = tab === 'active' ? active : archived; + + // 防抖搜索 + useEffect(() => { + const q = searchQ.trim(); + if (!q) { + setSearchHits([]); + setSearchSessionTitles([]); + return; + } + const t = setTimeout(async () => { + setSearching(true); + try { + const r = await SessionAPI.search(agentId, q, { includeArchived: true, limit: 30 }); + setSearchHits(r.messages || []); + setSearchSessionTitles(r.sessions || []); + } catch (e: any) { + message.error('搜索失败:' + (e?.message ?? e)); + } finally { + setSearching(false); + } + }, 250); + return () => clearTimeout(t); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [searchQ]); + + const handleNew = async () => { + const created = await SessionAPI.create(agentId); + setActive((l) => [created, ...l]); + setTab('active'); + onChange(created.id); + }; + + const handleDelete = async (id: string) => { + await SessionAPI.remove(agentId, id); + const nextActive = active.filter((s) => s.id !== id); + const nextArchived = archived.filter((s) => s.id !== id); + setActive(nextActive); + setArchived(nextArchived); + if (id === activeSessionId) { + const fallback = nextActive[0] || nextArchived[0]; + if (fallback) onChange(fallback.id); + else { + const c = await SessionAPI.create(agentId); + setActive([c]); + onChange(c.id); + } + } + }; + + const handleArchive = async (s: ChatSession, archive: boolean) => { + await SessionAPI.archive(agentId, s.id, archive); + message.success(archive ? '已归档' : '已恢复'); + load(); + }; + + const handleShare = async (s: ChatSession) => { + try { + const r = await SessionAPI.share(agentId, s.id, 0); + const url = `${location.origin}/shared/${r.token}`; + try { + await navigator.clipboard.writeText(url); + message.success('🔗 公开分享链接已复制到剪贴板'); + } catch { + Modal.info({ + title: '公开分享链接', + content: ( +
+

任何人凭此链接都可只读访问该会话:

+ +
+ ) + }); + } + } catch (e: any) { + message.error('生成链接失败:' + (e?.message ?? e)); + } + }; + + const handleRename = async (id: string) => { + if (!editingTitle.trim()) { + setEditingId(null); + return; + } + await SessionAPI.rename(agentId, id, editingTitle.trim()); + setActive((l) => l.map((s) => (s.id === id ? { ...s, title: editingTitle.trim() } : s))); + setArchived((l) => l.map((s) => (s.id === id ? { ...s, title: editingTitle.trim() } : s))); + setEditingId(null); + message.success('已重命名'); + }; + + // 渲染单个会话 + const renderSession = (s: ChatSession) => { + const isActive = s.id === activeSessionId; + const editing = editingId === s.id; + return ( + (editing ? null : onChange(s.id))} + style={{ + cursor: 'pointer', + padding: '8px 10px', + background: isActive ? c.bgActive : c.bgTransparent, + borderRadius: 6, + border: isActive ? `1px solid ${c.borderActive}` : '1px solid transparent', + marginBottom: 4 + }} + > +
+ {editing ? ( + setEditingTitle(e.target.value)} + onPressEnter={() => handleRename(s.id)} + onBlur={() => handleRename(s.id)} + /> + ) : ( + <> +
+ 💬 {s.title} +
+
+ {s.lastPreview || '无消息'} · {dayjs(s.lastAt || s.updatedAt).format('MM-DD HH:mm')} +
+ + )} +
+ {!editing && ( +
e.stopPropagation()}> + + + + + + + { + SessionAPI.exportSession(agentId, s.id, key as 'md' | 'json'); + message.success('已开始下载'); + } + }} + > + + + + + + + + handleDelete(s.id)} okText="删除" cancelText="取消"> + + +
+ )} +
+ ); + }; + + const inSearchMode = searchQ.trim().length > 0; + + return ( +
+ + + setSearchQ(e.target.value)} + style={{ marginBottom: 8 }} + styles={isDark ? { input: { background: c.inputBg, borderColor: c.border, color: c.text } } : undefined} + /> + + {inSearchMode ? ( +
+ {searching ? ( +
+ +
+ ) : searchHits.length === 0 && searchSessionTitles.length === 0 ? ( + + ) : ( + <> + {searchSessionTitles.length > 0 && ( +
+
+ 📁 会话标题命中 ({searchSessionTitles.length}) +
+ {searchSessionTitles.map((s) => ( +
onChange(s.id)} + style={{ + cursor: 'pointer', + padding: '6px 10px', + borderRadius: 6, + marginBottom: 2, + background: activeSessionId === s.id ? c.bgActive : c.bgSearch, + fontSize: 12, + color: c.text + }} + > + 💬 {s.title} + {s.archived && 归档} +
+ ))} +
+ )} + {searchHits.length > 0 && ( +
+
+ 🔎 消息内容命中 ({searchHits.length}) +
+ {searchHits.map((h) => ( +
+ onChange(h.sessionId, { highlightMessageId: h.id }) + } + style={{ + cursor: 'pointer', + padding: 8, + borderRadius: 6, + marginBottom: 4, + background: c.bgSearch, + borderLeft: `3px solid ${h.role === 'user' ? '#6366f1' : '#10b981'}` + }} + > +
+ {h.role === 'user' ? '我' : 'AI'} · {h.sessionTitle} + {h.sessionArchived && 归档} + {dayjs(h.createdAt).format('MM-DD HH:mm')} +
+
+
+ ))} +
+ )} + + )} +
+ ) : ( + <> + setTab(v as any)} + options={[ + { value: 'active', label: `💬 活跃 (${active.length})` }, + { value: 'archived', label: `📦 归档 (${archived.length})` } + ]} + style={{ marginBottom: 8 }} + /> + {list.length === 0 ? ( + + ) : ( + + )} + + )} + + {/* 顶部全局样式 mark 标签高亮 */} + +
+ ); +} diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..c49e54b --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,170 @@ +import { NavLink, useNavigate } from 'react-router-dom'; +import { Dropdown, Avatar, Tooltip } from 'antd'; +import { + SearchOutlined, + MessageOutlined, + RobotOutlined, + CompassOutlined, + BookOutlined, + ApartmentOutlined, + BarChartOutlined, + ApiOutlined, + TeamOutlined, + SunOutlined, + MoonOutlined, + LogoutOutlined +} from '@ant-design/icons'; +import { useAuth } from '../store/auth'; +import { useTheme } from '../main'; + +interface Props { + onOpenPalette?: () => void; +} + +const NAV_GROUPS: Array<{ + label: string; + items: Array<{ to: string; icon: React.ReactNode; label: string; end?: boolean }>; +}> = [ + { + label: '工作台', + items: [ + { to: '/', icon: , label: '聊天', end: true }, + { to: '/agents', icon: , label: '我的智能体' }, + { to: '/marketplace', icon: , label: '智能体广场' } + ] + }, + { + label: '资源', + items: [ + { to: '/prompts', icon: , label: 'Prompt 模板库' }, + { to: '/workflows', icon: , label: '工作流' } + ] + }, + { + label: '管理', + items: [ + { to: '/stats', icon: , label: '调用统计' }, + { to: '/llm-providers', icon: , label: 'LLM 提供商' }, + { to: '/teams', icon: , label: '团队' } + ] + } +]; + +export default function Sidebar({ onOpenPalette }: Props) { + const { user, logout } = useAuth(); + const navigate = useNavigate(); + const { mode, toggle } = useTheme(); + + const isMac = + typeof navigator !== 'undefined' && /mac|iphone|ipad|ipod/i.test(navigator.platform || ''); + const cmdKey = isMac ? '⌘' : 'Ctrl'; + + return ( + + ); +} diff --git a/src/components/SkillEditor.tsx b/src/components/SkillEditor.tsx new file mode 100644 index 0000000..444412c --- /dev/null +++ b/src/components/SkillEditor.tsx @@ -0,0 +1,190 @@ +import { useEffect, useMemo, useState } from 'react'; +import { Modal, Input, Select, Tabs, Alert, Space, Button, App as AntApp } from 'antd'; +import { SKILL_TEMPLATES } from '../skillTemplates'; +import { AgentAPI } from '../api'; + +interface Props { + open: boolean; + agentId: string; + skillId?: string | null; + onClose: () => void; + onSaved: () => void; +} + +export default function SkillEditor({ open, agentId, skillId, onClose, onSaved }: Props) { + const isNew = !skillId; + const { message } = AntApp.useApp(); + const [content, setContent] = useState(''); + const [tplKey, setTplKey] = useState<'prompt' | 'http' | 'js'>('prompt'); + const [saving, setSaving] = useState(false); + + useEffect(() => { + if (!open) return; + if (isNew) { + setContent(SKILL_TEMPLATES.prompt.content); + setTplKey('prompt'); + } else if (skillId) { + AgentAPI.getSkill(agentId, skillId).then((d) => setContent(d.content || '')); + } + }, [open, skillId, isNew, agentId]); + + // 简单解析 frontmatter(仅前端预览用) + const preview = useMemo(() => { + const m = content.match(/^---\s*\n([\s\S]*?)\n---/); + if (!m) return { warning: '⚠️ 未检测到 YAML frontmatter,将作为 prompt 类型注入' }; + const yaml = m[1]; + const get = (k: string) => { + const r = new RegExp(`^${k}\\s*:\\s*(.+?)$`, 'm'); + return yaml.match(r)?.[1]?.trim(); + }; + return { + name: get('name'), + description: get('description'), + type: get('type') || 'prompt', + handler: get('handler') + } as any; + }, [content]); + + const handleSave = async () => { + setSaving(true); + try { + if (isNew) { + await AgentAPI.createSkill(agentId, { + name: preview.name || 'skill', + content + }); + message.success('已创建'); + } else { + await AgentAPI.updateSkill(agentId, skillId!, { content }); + message.success('已保存'); + } + onSaved(); + onClose(); + } catch (e: any) { + message.error('保存失败:' + (e?.message ?? e)); + } finally { + setSaving(false); + } + }; + + return ( + + {isNew && ( + + 从模板开始: + setAgentName(e.target.value)} + style={{ borderRadius: 12, height: 42 }} + /> + + + + +
+ + ({ value: t.id, label: t.name }))} + /> + +
+
+ ), + }, + ]} + /> + +
+
+ + 模型设置 +
+
+ + + + +
+ + 控制随机性,数值越高越发散 +
+
+
+
+ + + + 知识库 ({agent?.knowledge?.length ?? 0}) + + ), + children: ( +
+
+ 上传文档以增强 AI 知识 + + + +
+ ( + AgentAPI.deleteKnowledge(id!, item.id).then(refresh)} + > + + , + ]} + > +
+ {item.originalName} + + {(item.size / 1024).toFixed(1)} KB ·{' '} + + {STATUS_TAG[item.status].text} + + +
+
+ )} + /> +
+ ), + }, + { + key: 'skills', + label: ( +
+ + 技能 & 工具 ({agent?.skills?.length ?? 0}) +
+ ), + children: ( +
+
+ 通过工具扩展 AI 功能 + +
+ ( + AgentAPI.updateSkill(id!, item.id, { enabled: v }).then(refresh)} + />, + , + ]} + > +
+ + {TYPE_TAG[item.type].label} + + {item.name} +
+
+ )} + /> +
+ ), + }, + { + key: 'mcp', + label: ( +
+ + MCP 集成 +
+ ), + children: id ? :
保存后启用 MCP
, + }, + ]} + /> + +
+
+
+ + 联网搜索 +
+ + + +
+
启用后,智能体可以在回答时通过 DuckDuckGo 搜索实时信息。
+
+ + + + + {/* Right Column: Preview */} +
+
+
+
+

预览

+

一边调整人设和能力,一边看对话气质是否符合你的预期。

+
+ + + Live Preview + +
+
+
当前预览角色
+
{currentName} 会基于左侧 Prompt 与中栏设置立即更新。你可以直接在这里检查语气、头像和整体观感。
+
+
+ +
+
+
+ + + {!isNew && ( + setSkillEditorOpen(false)} + onSaved={refresh} + /> + )} + + + navigate('/marketplace')} + footer={null} + width={720} + centered + maskClosable={false} + destroyOnHidden + > +
+
+
+ + 第一步 · 定义智能体形象 +
+
先给你的智能体一个更完整的开场
+
先决定它的形象、名字和一句话定位。确认后会进入三栏工作台,继续完成个性化、能力配置和实时预览。
+
+ +
+
+
+ {isImageUrl(selectedAvatar) ? ( + avatar + ) : ( + (agentName?.charAt(0) || '?').toUpperCase() + )} +
+
+
{agentName || '你的新智能体'}
+
这里会实时映射你输入的名字与选择的形象。
+
+
+ +
{ + if (changed.name !== undefined) setAgentName(changed.name); + }} + className="agent-editor-modal-card" + style={{ padding: 20 }} + > + + 智能体名称 + + } + rules={[{ required: true, message: '请输入智能体名称' }]} + > + + + + + 描述(选填) + + } + > + + + +
+ {['客服助理', '内容创作', '数据分析', '私人教练'].map((label) => ( + + {label} + + ))} +
+ +
+ + +
+
+
+ +
+
选择你的智能体形象
+
+
默认会使用系统头像,你也可以上传自己的图片替换。
+ + + +
+
+ {[DEFAULT_AVATAR, ...PRESET_AVATARS].map((url) => ( +
setSelectedAvatar(url)} + className={`relative aspect-square rounded-full cursor-pointer transition-all duration-300 overflow-hidden border-2 ${selectedAvatar === url ? 'scale-110 shadow-lg z-10' : 'border-transparent opacity-70 hover:opacity-100 hover:scale-105'}`} + style={{ borderColor: selectedAvatar === url ? 'var(--color-brand)' : 'transparent' }} + > + preset + {selectedAvatar === url && ( +
+
+
+
+
+ )} +
+ ))} +
+
+
+ + setAvatarSelectorOpen(false)} + footer={null} + width={520} + centered + > +
+
+
点击即可更换
+ + + +
+
+ {/* 默认与内置图片 */} + {[DEFAULT_AVATAR, ...PRESET_AVATARS].map((url) => ( +
{ + await AgentAPI.update(id!, { avatar: url }); + setAvatarSelectorOpen(false); + refresh(); + }} + className={`relative aspect-square rounded-full cursor-pointer transition-all duration-300 overflow-hidden border-2 ${agent?.avatar === url ? 'scale-110 shadow-lg z-10' : 'border-transparent opacity-70 hover:opacity-100 hover:scale-105'}`} + style={{ borderColor: agent?.avatar === url ? 'var(--color-brand)' : 'transparent' }} + > + preset + {agent?.avatar === url && ( +
+
+
+
+
+ )} +
+ ))} +
+
+ + + ); +} diff --git a/src/pages/AgentList.tsx b/src/pages/AgentList.tsx new file mode 100644 index 0000000..bbc444e --- /dev/null +++ b/src/pages/AgentList.tsx @@ -0,0 +1,285 @@ +import { useEffect, useMemo, useState } from 'react'; +import { + ArrowRightOutlined, + CompassOutlined, + DeleteOutlined, + EditOutlined, + MessageOutlined, + RobotOutlined +} from '@ant-design/icons'; +import { Button, Col, Row, Empty, Popconfirm, App as AntApp, Tag, Space } from 'antd'; +import { Link, useNavigate } from 'react-router-dom'; +import dayjs from 'dayjs'; +import { Agent, AgentAPI } from '../api'; + +export default function AgentList() { + const [list, setList] = useState([]); + const [loading, setLoading] = useState(false); + const navigate = useNavigate(); + const { message } = AntApp.useApp(); + + const load = async () => { + setLoading(true); + try { + setList(await AgentAPI.list()); + } finally { + setLoading(false); + } + }; + useEffect(() => { + load(); + }, []); + + const handleDelete = async (id: string) => { + await AgentAPI.remove(id); + message.success('已删除'); + load(); + }; + + const isImageUrl = (url: string) => url?.startsWith('http') || url?.startsWith('/'); + const publicCount = useMemo(() => list.filter((a) => a.visibility === 'public').length, [list]); + const teamCount = useMemo(() => list.filter((a) => a.visibility === 'team').length, [list]); + + return ( +
+
+
+
+
+ + 我的 Agent 资产 +
+ +

+ 我的智能体 +

+
+ 把你的 AI 助手沉淀成一组可管理、可协作、可持续进化的能力单元。创建入口统一在智能体广场,这里负责查看、进入和运营它们。 +
+
+ +
+ +
+ {[ + { label: '已创建智能体', value: list.length, tone: 'rgba(8, 145, 178, 0.10)', color: 'var(--color-brand)' }, + { label: '公开可分享', value: publicCount, tone: 'rgba(34, 197, 94, 0.10)', color: 'var(--color-success)' }, + { label: '团队协作中', value: teamCount, tone: 'rgba(14, 165, 233, 0.10)', color: 'var(--color-info)' } + ].map((item) => ( +
+
{item.label}
+
+ {item.value} + + 实时统计 + +
+
+ ))} +
+
+ + {!loading && list.length === 0 ? ( +
+ + + +
+ ) : ( + + {list.map((a) => ( + +
+
+
+ {isImageUrl(a.avatar) ? ( + avatar + ) : ( + (a.name?.charAt(0) || '?').toUpperCase() + )} +
+
+
{a.name}
+
+ 最近更新于 {dayjs(a.updated_at).format('YYYY-MM-DD')} +
+
+
+ +
+
+ {a.description || '还没有填写描述,可以补充这个智能体适合解决什么问题。'} +
+
+ + + {a.visibility === 'public' && ( + + 公开 + + )} + {a.visibility === 'team' && ( + + 团队 + + )} + {a.visibility === 'private' && ( + + 私有 + + )} + {a.model && ( + + + {a.model} + + + )} + + T={a.temperature} + + {(a.fork_count ?? 0) > 0 && ( + + Fork {a.fork_count} + + )} + + +
+ + + + + + + handleDelete(a.id)} + okText="删除" + cancelText="取消" + > +
+
+ + ))} +
+ )} + + {list.length > 0 && ( +
+
+
+ 想创建新的智能体入口? +
+
+ 统一从智能体广场进入,保证创建流程和发现体验保持一致。 +
+
+ +
+ )} +
+ ); +} diff --git a/src/pages/ChatPage.tsx b/src/pages/ChatPage.tsx new file mode 100644 index 0000000..e99d2a5 --- /dev/null +++ b/src/pages/ChatPage.tsx @@ -0,0 +1,1206 @@ +import { useEffect, useRef, useState } from 'react'; +import { Button, Input, Space, Tag, App as AntApp, Popconfirm, Empty, Collapse, Switch, Drawer, Slider, InputNumber, Upload, Tooltip, Modal, Image as AntImage, Divider, Dropdown } from 'antd'; +import { SettingOutlined, ApiOutlined, EditOutlined, DeleteOutlined, PaperClipOutlined, BookOutlined, ArrowUpOutlined, CloseOutlined, DownOutlined } from '@ant-design/icons'; +import { useNavigate, useParams, useSearchParams } from 'react-router-dom'; +import ReactMarkdown from 'react-markdown'; +import { + Agent, + AgentAPI, + BranchInfo, + ChatAPI, + ChatAttachment, + ChatAttachmentsAPI, + ChatMessage, + ImageAPI, + LLMProvider, + LLMProviderAPI, + ModelOverrides, + RetrievedSnippet, + SessionAPI, + regenerateMessage, + streamChat, + ToolCallTrace +} from '../api'; +import SessionSidebar from '../components/SessionSidebar'; +import McpResourcesDrawer from '../components/McpResourcesDrawer'; +import PromptLibraryPage from './PromptLibraryPage'; + +interface StreamingState { + active: boolean; + text: string; + retrieved: RetrievedSnippet[]; + toolCalls: ToolCallTrace[]; +} + +export default function ChatPage() { + const { id } = useParams(); + const navigate = useNavigate(); + const [searchParams, setSearchParams] = useSearchParams(); + const { message: msg } = AntApp.useApp(); + const [agent, setAgent] = useState(null); + const [messages, setMessages] = useState([]); + const [branches, setBranches] = useState>({}); + const [input, setInput] = useState(''); + const [sending, setSending] = useState(false); + const [useStream, setUseStream] = useState(true); + const [sessionId, setSessionId] = useState(null); + const [highlightId, setHighlightId] = useState(null); + const [sessionRefresh, setSessionRefresh] = useState(0); + const [mcpDrawerOpen, setMcpDrawerOpen] = useState(false); + const [paramsDrawerOpen, setParamsDrawerOpen] = useState(false); + const [tplDrawerOpen, setTplDrawerOpen] = useState(false); + const [overrides, setOverrides] = useState({}); + const [providers, setProviders] = useState([]); + const [attachments, setAttachments] = useState([]); + const [imageUrls, setImageUrls] = useState([]); + const [uploadingAtt, setUploadingAtt] = useState(false); + const [streaming, setStreaming] = useState({ + active: false, + text: '', + retrieved: [], + toolCalls: [] + }); + const bodyRef = useRef(null); + const abortRef = useRef(null); + + // URL 参数 ?session=xxx&msg=yyy + useEffect(() => { + const s = searchParams.get('session'); + const m = searchParams.get('msg'); + if (s) { + setSessionId(s); + if (m) setHighlightId(m); + const next = new URLSearchParams(searchParams); + next.delete('session'); + next.delete('msg'); + setSearchParams(next, { replace: true }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [searchParams]); + + const scrollBottom = () => { + requestAnimationFrame(() => { + bodyRef.current?.scrollTo({ top: bodyRef.current.scrollHeight, behavior: 'smooth' }); + }); + }; + + const loadAgent = async () => { + if (!id) return; + const a = await AgentAPI.detail(id); + setAgent(a); + }; + + const loadProviders = async () => { + try { + const list = await LLMProviderAPI.list(); + setProviders(list.filter((item) => item.enabled)); + } catch (e: any) { + msg.error('加载模型列表失败:' + (e?.message ?? e)); + } + }; + + const loadMessages = async () => { + if (!id || !sessionId) return; + const his = await ChatAPI.history(id, sessionId); + setMessages(his.messages); + setBranches(his.branches); + requestAnimationFrame(() => { + if (highlightId) { + const el = document.getElementById('msg-' + highlightId); + if (el) { + el.scrollIntoView({ behavior: 'smooth', block: 'center' }); + setTimeout(() => setHighlightId(null), 3000); + return; + } + } + scrollBottom(); + }); + }; + + useEffect(() => { + loadAgent(); + loadProviders(); + return () => abortRef.current?.abort(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [id]); + + useEffect(() => { + loadMessages(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sessionId, highlightId]); + + /** 把附件文本拼成 system 注入字符串 */ + const buildAttachmentsText = () => { + if (!attachments.length) return ''; + return attachments + .map( + (a, i) => + `### 附件 ${i + 1}: ${a.name}${a.truncated ? ' (已截断)' : ''}\n${a.text}` + ) + .join('\n\n---\n\n'); + }; + + const handleSendStream = async (text: string) => { + if (!id || !sessionId) return; + const tempUser: ChatMessage = { + id: 'tmp-' + Date.now(), + role: 'user', + content: text, + createdAt: Date.now() + }; + setMessages((m) => [...m, tempUser]); + setStreaming({ active: true, text: '', retrieved: [], toolCalls: [] }); + scrollBottom(); + + abortRef.current?.abort(); + const ctrl = new AbortController(); + abortRef.current = ctrl; + + const attText = buildAttachmentsText(); + + try { + await streamChat( + id, + text, + { + onMeta: (m) => setStreaming((s) => ({ ...s, retrieved: m.retrieved || [] })), + onDelta: (chunk) => + setStreaming((s) => { + const next = { ...s, text: s.text + chunk }; + scrollBottom(); + return next; + }), + onToolCall: (data) => + setStreaming((s) => ({ + ...s, + toolCalls: [...s.toolCalls, { name: data.name, args: data.args, result: { pending: true } }] + })), + onToolResult: (data) => + setStreaming((s) => { + const list = [...s.toolCalls]; + for (let i = list.length - 1; i >= 0; i--) { + if (list[i].name === data.name && (list[i].result as any)?.pending) { + list[i] = { ...list[i], result: data.result }; + break; + } + } + return { ...s, toolCalls: list }; + }), + onDone: (data) => { + setMessages((m) => [...m.filter((x) => x.id !== tempUser.id), data.user, data.assistant]); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + setSessionRefresh((t) => t + 1); + setAttachments([]); // 用完即清 + setImageUrls([]); + scrollBottom(); + }, + onAborted: (data) => { + // 已停止:保留已生成内容;user 消息也留下(用 tempUser 占位) + setMessages((m) => [ + ...m.filter((x) => x.id !== tempUser.id), + { ...tempUser, id: 'u-' + data.assistant.id }, // 占位 + data.assistant + ]); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + setSessionRefresh((t) => t + 1); + // 重新拉一次确保和后端一致(user 真实 id 在那边) + loadMessages(); + }, + onError: (errMsg) => { + msg.error('流式失败:' + errMsg); + setMessages((m) => m.filter((x) => x.id !== tempUser.id)); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + } + }, + ctrl.signal, + sessionId, + overrides, + attText || undefined, + imageUrls.length > 0 ? imageUrls : undefined + ); + } catch (e: any) { + if (e?.name !== 'AbortError') { + msg.error('请求失败:' + (e?.message ?? e)); + } + setMessages((m) => m.filter((x) => x.id !== tempUser.id)); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + } + }; + + const handleSendNonStream = async (text: string) => { + if (!id || !sessionId) return; + const tempUser: ChatMessage = { + id: 'tmp-' + Date.now(), + role: 'user', + content: text, + createdAt: Date.now() + }; + setMessages((m) => [...m, tempUser]); + scrollBottom(); + const attText = buildAttachmentsText(); + try { + const res = await ChatAPI.send( + id, + text, + sessionId, + overrides, + attText || undefined, + imageUrls.length > 0 ? imageUrls : undefined + ); + setMessages((m) => [...m.filter((x) => x.id !== tempUser.id), res.user, res.assistant]); + setSessionRefresh((t) => t + 1); + setAttachments([]); + setImageUrls([]); + scrollBottom(); + } catch (e: any) { + msg.error('发送失败:' + (e?.message ?? e)); + setMessages((m) => m.filter((x) => x.id !== tempUser.id)); + } + }; + + const handleSend = async () => { + const text = input.trim(); + if (!text || !id || sending || !sessionId) return; + setInput(''); + setSending(true); + try { + if (useStream) await handleSendStream(text); + else await handleSendNonStream(text); + } finally { + setSending(false); + } + }; + + const handleStop = () => { + abortRef.current?.abort(); + setSending(false); + }; + + const handleClear = async () => { + if (!id || !sessionId) return; + await ChatAPI.clear(id, sessionId); + setMessages([]); + setBranches({}); + msg.success('对话已清空'); + }; + + const handleRegenerate = async (assistantId: string) => { + if (!id || sending) return; + setSending(true); + setStreaming({ active: true, text: '', retrieved: [], toolCalls: [] }); + abortRef.current?.abort(); + const ctrl = new AbortController(); + abortRef.current = ctrl; + try { + await regenerateMessage( + id, + assistantId, + { + onMeta: (m) => setStreaming((s) => ({ ...s, retrieved: m.retrieved || [] })), + onDelta: (chunk) => + setStreaming((s) => { + const next = { ...s, text: s.text + chunk }; + scrollBottom(); + return next; + }), + onToolCall: (data) => + setStreaming((s) => ({ + ...s, + toolCalls: [...s.toolCalls, { name: data.name, args: data.args, result: { pending: true } }] + })), + onToolResult: (data) => + setStreaming((s) => { + const list = [...s.toolCalls]; + for (let i = list.length - 1; i >= 0; i--) { + if (list[i].name === data.name && (list[i].result as any)?.pending) { + list[i] = { ...list[i], result: data.result }; + break; + } + } + return { ...s, toolCalls: list }; + }), + onDone: () => { + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + loadMessages(); + }, + onAborted: () => { + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + loadMessages(); + }, + onError: (errMsg) => { + msg.error('重新生成失败:' + errMsg); + setStreaming({ active: false, text: '', retrieved: [], toolCalls: [] }); + loadMessages(); + } + }, + ctrl.signal, + overrides + ); + } finally { + setSending(false); + } + }; + + const handleSwitchBranch = async (userMsgId: string, branchId: string) => { + if (!id) return; + await ChatAPI.switchBranch(id, userMsgId, branchId); + await loadMessages(); + }; + + const handleAttach = async (files: File[]) => { + if (!files.length) return; + setUploadingAtt(true); + try { + // v1.0: 自动按类型分流。图片 → 图床;其他 → 文本附件 + const images = files.filter((f) => f.type.startsWith('image/')); + const docs = files.filter((f) => !f.type.startsWith('image/')); + let imgN = 0, docN = 0; + if (images.length) { + const r = await ImageAPI.upload(images); + setImageUrls((arr) => [...arr, ...r.files.map((f) => f.url)]); + imgN = r.files.length; + } + if (docs.length) { + const r = await ChatAttachmentsAPI.upload(docs); + setAttachments((a) => [...a, ...r.files]); + docN = r.files.length; + } + const parts = []; + if (imgN) parts.push(`${imgN} 张图片`); + if (docN) parts.push(`${docN} 个文档`); + if (parts.length) msg.success(`已附加 ${parts.join(' + ')}`); + } catch (e: any) { + msg.error('附件上传失败:' + (e?.message ?? e)); + } finally { + setUploadingAtt(false); + } + }; + + const isImageUrl = (url: string) => url?.startsWith('http') || url?.startsWith('/'); + const agentModel = agent?.model || ''; + const activeModelValue = overrides.model || agentModel; + const defaultProvider = providers.find((item) => item.isDefault) || providers[0]; + const modelOptions = providers.flatMap((provider) => + (provider.models?.length ? provider.models : [provider.defaultModel]).filter(Boolean).map((modelName) => ({ + value: `${provider.id}/${modelName}`, + label: `${modelName}`, + providerName: provider.name + })) + ); + const activeModelOption = modelOptions.find((item) => item.value === activeModelValue); + const fallbackModelName = activeModelValue.includes('/') ? activeModelValue.split('/').slice(1).join('/') : activeModelValue; + const currentModelName = activeModelOption?.label || fallbackModelName || agentModel || defaultProvider?.defaultModel || '默认模型'; + const currentProviderName = + activeModelOption?.providerName || + (activeModelValue.includes('/') ? providers.find((item) => item.id === activeModelValue.split('/')[0])?.name : defaultProvider?.name) || + (agentModel ? '当前 Agent 配置' : defaultProvider?.name || '系统默认'); + + if (!agent) return null; + + return ( +
+ {/* 1. 二级侧边栏:会话列表 */} + + + {/* 2. 主聊天区 */} +
+ {/* Header */} +
+
+
{agent.name}
+
+ {agent.model || '默认模型'} · T={agent.temperature} +
+
+
+ + {/* Body */} +
+
+ {messages.length === 0 && !streaming.active ? ( +
+
+ {isImageUrl(agent.avatar) ? ( + avatar + ) : ( + (agent.name?.charAt(0) || '?').toUpperCase() + )} +
+

+ 你好,今天想一起完成什么? +

+

+ {agent.description || '我是你的专属 AI 助手,随时准备为你服务。'} +

+
+ ) : ( + <> + {messages.map((m) => ( + { + navigator.clipboard?.writeText(text).then(() => msg.success('已复制')); + }} + /> + ))} + {streaming.active && ( +
+
+ {streaming.text ? ( + {streaming.text + '▍'} + ) : ( + 思考中… + )} +
+ {(streaming.retrieved.length > 0 || streaming.toolCalls.length > 0) && ( +
+ {streaming.retrieved.length > 0 && ( + + )} + {streaming.toolCalls.length > 0 && ( + + )} +
+ )} +
+ )} + + )} +
+
+ + {/* Input Footer */} +
+ {/* Attachments Preview */} +
+ {attachments.map((a, i) => ( + setAttachments((arr) => arr.filter((_, j) => j !== i))} + > + 📎 {a.name} + + ))} + {imageUrls.map((u, i) => ( +
+ +
+ ))} +
+ +
+
+ setInput(e.target.value)} + placeholder="问我任何问题..." + autoSize={{ minRows: 3, maxRows: 10 }} + onPressEnter={(e) => { + if (!e.shiftKey) { + e.preventDefault(); + handleSend(); + } + }} + className="chat-input-textarea" + disabled={sending} + style={{ width: '100%' }} + /> + +
+
+ + setOverrides((o) => ({ + ...o, + model: String(key) === '__default__' ? undefined : String(key) + })), + items: [ + { + key: '__default__', + label: `跟随默认 · ${agentModel || defaultProvider?.defaultModel || '默认模型'}` + }, + ...modelOptions.map((item) => ({ + key: item.value, + label: `${item.label}`, + extra: item.providerName + })) + ] + }} + > + + + + { + handleAttach(files as File[]); + return false; + }} + showUploadList={false} + accept=".txt,.md,.markdown,.json,.csv,.pdf,.docx,.html,.htm,image/png,image/jpeg,image/webp,image/gif" + > +
+ + {sending ? ( +
+
+
+
+ AI 可能会产生错误信息,请核实重要信息。 +
+
+
+ + {/* ---- 抽屉组件保持不变 ---- */} + {id && ( + setMcpDrawerOpen(false)} + onUse={(text) => setInput((cur) => cur + text)} + /> + )} + + setTplDrawerOpen(false)} + width={520} + > + { + setInput((cur) => (cur ? cur + '\n\n' : '') + t.body); + setTplDrawerOpen(false); + msg.success('已插入到输入框'); + }} + /> + + + setParamsDrawerOpen(false)} + width={380} + > +
+ 💡 这里设置的参数会临时覆盖智能体的默认配置,仅作用于当前浏览器会话,不会写回到智能体本身。
+ 关闭页面或清空字段即可恢复默认。 +
+ +
+
+ 🌡 Temperature(创造性) + + 默认:{agent?.temperature ?? 0.7} + +
+ setOverrides((o) => ({ ...o, temperature: v as number }))} + marks={{ 0: '严谨', 0.7: '默认', 1.4: '发散', 2: '混沌' }} + /> + {overrides.temperature !== undefined && ( + + )} +
+ +
+
+ 🎯 Top P(核采样) + 未设置时跟随模型默认 +
+ setOverrides((o) => ({ ...o, topP: v as number }))} + disabled={overrides.topP === undefined} + /> + {overrides.topP === undefined ? ( + + ) : ( + + )} +
+ +
+
+ 📏 Max Tokens(生成长度上限) + 未设置时由模型决定 +
+ setOverrides((o) => ({ ...o, maxTokens: v == null ? undefined : Number(v) }))} + min={1} + max={16384} + placeholder="例如 2048" + style={{ width: '100%' }} + /> +
+ + +
+
+ ); +} + +/** 输入栏子组件 */ +function MonicaInputBar({ + input, setInput, sending, attachments, imageUrls, uploadingAtt, + onSend, onStop, onAttach, onRemoveAtt, onRemoveImg, onOpenTpl +}: { + input: string; + setInput: (v: string) => void; + sending: boolean; + attachments: ChatAttachment[]; + imageUrls: string[]; + uploadingAtt: boolean; + onSend: () => void; + onStop: () => void; + onAttach: (files: File[]) => void; + onRemoveAtt: (i: number) => void; + onRemoveImg: (i: number) => void; + onOpenTpl: () => void; +}) { + return ( +
+ {/* 附件/图片预览 */} + {(attachments.length > 0 || imageUrls.length > 0) && ( +
+ {attachments.map((a, i) => ( + onRemoveAtt(i)} + > + 📎 {a.name} + + ))} + {imageUrls.map((u, i) => ( +
+ + +
+ ))} +
+ )} + + {/* 输入行 */} +
+ setInput(e.target.value)} + placeholder="问我任何问题..." + autoSize={{ minRows: 1, maxRows: 6 }} + onPressEnter={(e) => { + if (!e.shiftKey) { + e.preventDefault(); + onSend(); + } + }} + disabled={sending} + /> + {sending ? ( + + )} +
+ + {/* 工具栏 */} +
+ { + onAttach(files as File[]); + return false; + }} + showUploadList={false} + accept=".txt,.md,.markdown,.json,.csv,.pdf,.docx,.html,.htm,image/png,image/jpeg,image/webp,image/gif" + > +
+ ); +} + +function MessageItem({ + message, + highlighted, + branch, + busy, + onRegenerate, + onSwitchBranch, + onCopy +}: { + message: ChatMessage; + highlighted?: boolean; + branch?: BranchInfo; + busy?: boolean; + onRegenerate?: (id: string) => void; + onSwitchBranch?: (userMsgId: string, branchId: string) => void; + onCopy?: (text: string) => void; +}) { + const hasBranches = !!branch && branch.total > 1; + const activeIdx = branch?.activeIndex ?? 0; + const total = branch?.total ?? 1; + + const goPrev = () => { + if (!branch || !message.parentId) return; + const i = Math.max(0, activeIdx - 1); + onSwitchBranch?.(message.parentId, branch.ids[i]); + }; + const goNext = () => { + if (!branch || !message.parentId) return; + const i = Math.min(total - 1, activeIdx + 1); + onSwitchBranch?.(message.parentId, branch.ids[i]); + }; + + return ( +
+
+ {message.role === 'assistant' ? ( + {message.content} + ) : message.content.includes('![image](') ? ( + // user 消息含图片:用 markdown 渲染 + {message.content} + ) : ( + message.content + )} +
+ {message.role === 'assistant' && ( +
+ {hasBranches && ( + + + + {activeIdx + 1} / {total} + + + + )} + {message.meta?.aborted && 已停止} + + + + + + +
+ )} + {message.role === 'assistant' && message.meta && ( +
+ {!!message.meta.retrieved?.length && } + {!!message.meta.toolCalls?.length && } +
+ )} +
+ ); +} + +function RetrievedView({ retrieved, liveStyle }: { retrieved: RetrievedSnippet[]; liveStyle?: boolean }) { + return ( + + 🔍 RAG 命中片段 ({retrieved.length}) + + ), + children: ( +
+ {retrieved.map((r, i) => ( +
+
+ 📄 {r.fileName} · 切片#{r.chunkIndex} · score {r.score.toFixed(3)} +
+
+ {r.preview} + {r.preview.length >= 200 ? '…' : ''} +
+
+ ))} +
+ ) + } + ]} + /> + ); +} + +function ToolCallView({ calls, liveStyle }: { calls: ToolCallTrace[]; liveStyle?: boolean }) { + return ( + + 🛠 工具调用 ({calls.length}) + + ), + children: ( +
+ {calls.map((t, i) => { + const isPending = (t.result as any)?.pending; + const isFailed = t.result?.ok === false; + return ( +
+
+ ⚙️ {t.name}{' '} + {isPending && 运行中…} + {!isPending && t.result?.durationMs != null && {t.result.durationMs}ms} + {isFailed && 失败} +
+
+ args: {JSON.stringify(t.args)} +
+ {!isPending && ( +
+ result:{' '} + + {JSON.stringify(t.result?.result ?? t.result?.error ?? t.result).slice(0, 500)} + +
+ )} +
+ ); + })} +
+ ) + } + ]} + /> + ); +} diff --git a/src/pages/LLMProvidersPage.tsx b/src/pages/LLMProvidersPage.tsx new file mode 100644 index 0000000..0d28935 --- /dev/null +++ b/src/pages/LLMProvidersPage.tsx @@ -0,0 +1,420 @@ +import { useEffect, useState } from 'react'; +import { + ApiOutlined, + CheckCircleOutlined, + LockOutlined, + PlusOutlined, + RocketOutlined, + StarFilled +} from '@ant-design/icons'; +import { + Button, + Modal, + Form, + Input, + Select, + Space, + Tag, + App as AntApp, + Empty, + Popconfirm, + Tooltip +} from 'antd'; +import { LLMKind, LLMProvider, LLMProviderAPI } from '../api'; + +const KIND_OPTIONS: { value: LLMKind; label: string; baseUrl: string; hint?: string }[] = [ + { value: 'openai', label: 'OpenAI 官方', baseUrl: 'https://api.openai.com/v1' }, + { + value: 'openai-compatible', + label: 'OpenAI 兼容(GLM/通义/DeepSeek/腾讯 Token Plan)', + baseUrl: '', + hint: '智谱:https://open.bigmodel.cn/api/paas/v4 · 通义:https://dashscope.aliyuncs.com/compatible-mode/v1 · DeepSeek:https://api.deepseek.com' + }, + { value: 'anthropic', label: 'Anthropic Claude', baseUrl: 'https://api.anthropic.com' }, + { value: 'ollama', label: 'Ollama 本地', baseUrl: 'http://localhost:11434' } +]; + +export default function LLMProvidersPage() { + const { message } = AntApp.useApp(); + const [list, setList] = useState([]); + const [editorOpen, setEditorOpen] = useState(false); + const [editing, setEditing] = useState(null); + const [form] = Form.useForm(); + const [testing, setTesting] = useState(null); + + const load = async () => { + try { + setList(await LLMProviderAPI.list()); + } catch (e: any) { + message.error('加载失败:' + (e?.message ?? e)); + } + }; + useEffect(() => { + load(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const openCreate = () => { + setEditing(null); + form.resetFields(); + form.setFieldsValue({ kind: 'openai-compatible', enabled: true, isDefault: false }); + setEditorOpen(true); + }; + const openEdit = (p: LLMProvider) => { + setEditing(p); + form.setFieldsValue({ + name: p.name, + kind: p.kind, + baseUrl: p.baseUrl, + models: p.models?.join(', ') || '', + defaultModel: p.defaultModel, + enabled: p.enabled, + isDefault: p.isDefault + }); + setEditorOpen(true); + }; + const onSave = async () => { + const v = await form.validateFields(); + const payload = { + ...v, + models: typeof v.models === 'string' + ? v.models.split(/[,,]/).map((s: string) => s.trim()).filter(Boolean) + : v.models + }; + try { + if (editing) { + await LLMProviderAPI.update(editing.id, payload); + message.success('已更新'); + } else { + await LLMProviderAPI.create(payload); + message.success('已创建'); + } + setEditorOpen(false); + load(); + } catch (e: any) { + message.error('保存失败:' + (e?.response?.data?.error ?? e?.message ?? e)); + } + }; + const onDelete = async (p: LLMProvider) => { + await LLMProviderAPI.remove(p.id); + message.success('已删除'); + load(); + }; + const onTest = async (p: LLMProvider) => { + setTesting(p.id); + try { + const r = await LLMProviderAPI.test(p.id, p.defaultModel); + if (r.ok) { + message.success(`✅ 连通:${r.model} · 用量 ${(r as any).usage?.TotalTokens ?? '?'} tokens`); + } else { + message.error('❌ 失败:' + (r.error || 'unknown')); + } + } catch (e: any) { + message.error('测试失败:' + (e?.response?.data?.error ?? e?.message ?? e)); + } finally { + setTesting(null); + } + }; + const onSetDefault = async (p: LLMProvider) => { + await LLMProviderAPI.setDefault(p.id); + message.success('已设为默认'); + load(); + }; + + return ( +
+
+
+
+
+ + 模型接入中心 +
+

LLM 提供商

+
+ 把不同的模型能力接入到同一个工作台里。这里不只是存放接口配置,更是管理默认模型、候选模型与稳定连接状态的地方。 +
+
+ +
+ +
+ {[ + { label: '已接入提供商', value: list.length, tone: 'rgba(8, 145, 178, 0.10)', color: 'var(--color-brand)' }, + { label: '可用连接数', value: list.filter((item) => item.enabled).length, tone: 'rgba(34, 197, 94, 0.10)', color: 'var(--color-success)' }, + { label: '默认模型源', value: list.filter((item) => item.isDefault).length, tone: 'rgba(249, 115, 22, 0.10)', color: 'var(--color-warning)' } + ].map((item) => ( +
+
{item.label}
+
+ {item.value} + + 实时状态 + +
+
+ ))} +
+
+ + {list.length === 0 ? ( +
+ +
+ ) : ( +
+ {list.map((p) => ( +
+
+
+
+ {p.name} + {p.isDefault && ( + } style={{ background: 'var(--color-success-soft)', color: 'var(--color-success)', borderRadius: 999, margin: 0 }}> + 默认 + + )} + {!p.enabled && ( + + 已禁用 + + )} +
+
{p.baseUrl}
+
+ + + + + + {!p.isDefault && ( + + + + )} + +
+ +
+
+
接入类型
+ + {p.kind} + +
+
+
默认模型
+
{p.defaultModel || '未设置'}
+
+
+ +
+
+ + 密钥状态 +
+
+ {p.hasApiKey ? ( + + + 已配置 {p.apiKeyMasked} + + ) : ( + 尚未配置 API Key + )} +
+
{p.baseUrl}
+
+ + {p.models?.length > 0 && ( +
+
候选模型
+ + {p.models.map((m) => ( + + {m} + + ))} + +
+ )} + +
+ + + {p.enabled ? '可用于聊天、工作流和测试连接' : '当前已暂停使用,需要重新启用'} + + + + onDelete(p)}> + + + +
+
+ ))} +
+ )} + + setEditorOpen(false)} + onOk={onSave} + width={600} + okText="保存" + cancelText="取消" + destroyOnHidden + > +
{ + if (changed.kind) { + const opt = KIND_OPTIONS.find((o) => o.value === changed.kind); + if (opt?.baseUrl && !form.getFieldValue('baseUrl')) { + form.setFieldsValue({ baseUrl: opt.baseUrl }); + } + } + }} + > + + + + + + + k.value === form.getFieldValue('kind'))?.hint} + > + + + + + + + + + + + +
+
+
+ ); +} diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx new file mode 100644 index 0000000..2062546 --- /dev/null +++ b/src/pages/LoginPage.tsx @@ -0,0 +1,319 @@ +import { useState } from 'react'; +import { Form, Input, Button, Tabs, App as AntApp, Alert } from 'antd'; +import { useNavigate, useSearchParams } from 'react-router-dom'; +import { useAuth } from '../store/auth'; + +export default function LoginPage() { + const [tab, setTab] = useState<'login' | 'register'>('login'); + const navigate = useNavigate(); + const [params] = useSearchParams(); + const next = params.get('next') || '/'; + const { login, register } = useAuth(); + const { message } = AntApp.useApp(); + const [loading, setLoading] = useState(false); + + const onLogin = async (values: any) => { + setLoading(true); + try { + await login(values.email, values.password); + message.success('登录成功'); + navigate(next, { replace: true }); + } catch (e: any) { + message.error(e?.response?.data?.error ?? e?.message ?? '登录失败'); + } finally { + setLoading(false); + } + }; + + const onRegister = async (values: any) => { + setLoading(true); + try { + await register({ + email: values.email, + password: values.password, + name: values.name, + inviteCode: values.inviteCode || undefined + }); + message.success('注册成功,已自动登录'); + navigate(next, { replace: true }); + } catch (e: any) { + message.error(e?.response?.data?.error ?? e?.message ?? '注册失败'); + } finally { + setLoading(false); + } + }; + + return ( +
+ {/* 装饰光斑 */} +
+
+ + {/* 左侧品牌区 */} +
+
+
+ A +
+ + Agent Studio + +
+ +

+ 为你的工作流构建 +
+ + 专属 AI 智能体 + +

+ +

+ 可视化编排提示词、知识库与工具,让每一位团队成员都能调用最契合的 AI 能力。 +

+ +
+ {[ + { icon: '✦', text: '多模型即插即用' }, + { icon: '✦', text: '知识库 + RAG 检索' }, + { icon: '✦', text: '可分享智能体' } + ].map((it) => ( +
+ {it.icon} + {it.text} +
+ ))} +
+
+ + {/* 右侧表单 */} +
+
+
+

+ 欢迎回来 +

+
+ 使用邮箱登录或注册以继续 +
+
+ + setTab(k as any)} + items={[ + { + key: 'login', + label: '登录', + children: ( +
+ + + + + + + +
+ ) + }, + { + key: 'register', + label: '注册', + children: ( +
+ + + + + + + + + + + + + + + + ) + } + ]} + /> + +
+ 登录即表示你已同意我们的服务条款与隐私政策 +
+
+
+
+ ); +} diff --git a/src/pages/MarketplacePage.tsx b/src/pages/MarketplacePage.tsx new file mode 100644 index 0000000..fc63f97 --- /dev/null +++ b/src/pages/MarketplacePage.tsx @@ -0,0 +1,272 @@ +import { useEffect, useState } from 'react'; +import { Col, Row, Empty, Button, Tag, Space, App as AntApp, Input, Spin } from 'antd'; +import { useNavigate } from 'react-router-dom'; +import { MarketplaceAPI, MarketplaceAgent } from '../api'; +import { PlusOutlined, SearchOutlined, CompassOutlined, FireOutlined } from '@ant-design/icons'; + +export default function MarketplacePage() { + const [list, setList] = useState([]); + const [loading, setLoading] = useState(false); + const [q, setQ] = useState(''); + const navigate = useNavigate(); + const { message } = AntApp.useApp(); + + const load = async () => { + setLoading(true); + try { + setList(await MarketplaceAPI.list()); + } finally { + setLoading(false); + } + }; + useEffect(() => { + load(); + }, []); + + const filtered = q + ? list.filter( + (a) => + a.name.includes(q) || + a.description?.includes(q) || + (a.ownerName || '').includes(q) + ) + : list; + + const handleFork = async (a: MarketplaceAgent) => { + try { + const r = await MarketplaceAPI.fork(a.id); + message.success(`已复制到「${r.name}」`); + navigate(`/agents/${r.id}`); + } catch (e: any) { + message.error(e?.response?.data?.error ?? e?.message ?? '复制失败'); + } + }; + + const isImageUrl = (url: string) => url?.startsWith('http') || url?.startsWith('/'); + + return ( +
+
+
+
+ + 探索社区智能体 +
+

找到更适合你的 AI 伙伴

+

+ 浏览社区创建的智能体,快速复制、微调并投入你的日常工作流。 +

+
+
+ +
+
+
+ } + value={q} + onChange={(e) => setQ(e.target.value)} + style={{ height: 44, borderRadius: 12 }} + allowClear + /> +
+ +
+ + {loading ? ( +
+ +
+ ) : ( + + {/* Create New Card (First Item) */} + {!q && ( + +
navigate('/agents/new')} className="create-card"> +
+
+ +
+
+ +
+
+ 新建智能体 +
+
+ 从空白开始 +
+
+ 从名称、提示词、模型和能力配置开始,搭建你的专属 AI 助手。 +
+
+ +
+ +
+
+ + )} + + {filtered.map((a) => ( + +
+
+
+ {isImageUrl(a.avatar) ? ( + avatar + ) : ( + (a.name?.charAt(0) || '?').toUpperCase() + )} +
+ {a.fork_count > 10 && ( + } + style={{ + borderRadius: 999, + margin: 0, + background: 'var(--color-warning-soft)', + color: 'var(--color-warning)' + }} + > + 热门 + + )} +
+ +
+
+ {a.name} +
+
+ by {a.ownerName || '匿名作者'} +
+
{a.description || '暂无详细描述'}
+
+ +
+ + {a.kbCount > 0 && ( + + 📚 {a.kbCount} 知识 + + )} + {a.skillCount > 0 && ( + + 🛠 {a.skillCount} 技能 + + )} + + + +
+
+ + ))} +
+ )} + + {filtered.length === 0 && !loading && ( + + )} +
+
+ ); +} diff --git a/src/pages/PromptLibraryPage.tsx b/src/pages/PromptLibraryPage.tsx new file mode 100644 index 0000000..0d50b45 --- /dev/null +++ b/src/pages/PromptLibraryPage.tsx @@ -0,0 +1,494 @@ +import { useEffect, useState } from 'react'; +import { + AppstoreOutlined, + ClockCircleOutlined, + CopyOutlined, + EditOutlined, + GlobalOutlined, + LockOutlined, + PlusOutlined, + SearchOutlined +} from '@ant-design/icons'; +import { + Button, + Input, + Modal, + Form, + Select, + Space, + Tag, + App as AntApp, + Empty, + Tooltip, + Popconfirm, + Spin +} from 'antd'; +import { PromptTemplate, PromptTemplateAPI } from '../api'; + +const CATEGORIES = ['通用', '编程', '写作', '翻译', '分析', '客服', '其他']; +const SCOPE_OPTIONS: Array<{ key: 'all' | 'mine' | 'public'; label: string }> = [ + { key: 'all', label: '全部模板' }, + { key: 'mine', label: '我的沉淀' }, + { key: 'public', label: '公开灵感' } +]; + +const CATEGORY_STYLES: Record = { + 通用: { bg: 'rgba(8, 145, 178, 0.10)', text: '#0f766e' }, + 编程: { bg: 'rgba(59, 130, 246, 0.10)', text: '#1d4ed8' }, + 写作: { bg: 'rgba(217, 70, 239, 0.10)', text: '#a21caf' }, + 翻译: { bg: 'rgba(249, 115, 22, 0.10)', text: '#c2410c' }, + 分析: { bg: 'rgba(14, 165, 233, 0.10)', text: '#0369a1' }, + 客服: { bg: 'rgba(34, 197, 94, 0.10)', text: '#15803d' }, + 其他: { bg: 'rgba(100, 116, 139, 0.12)', text: '#475569' } +}; + +export default function PromptLibraryPage({ + onSelect +}: { + onSelect?: (tpl: PromptTemplate) => void; +}) { + const { message } = AntApp.useApp(); + const [scope, setScope] = useState<'all' | 'mine' | 'public'>('all'); + const [q, setQ] = useState(''); + const [list, setList] = useState([]); + const [loading, setLoading] = useState(false); + const [editorOpen, setEditorOpen] = useState(false); + const [editing, setEditing] = useState(null); + const [form] = Form.useForm(); + + const load = async () => { + setLoading(true); + try { + const data = await PromptTemplateAPI.list({ scope, q }); + setList(data); + } catch (e: any) { + message.error('加载失败:' + (e?.message ?? e)); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + load(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [scope]); + + const openCreate = () => { + setEditing(null); + form.resetFields(); + form.setFieldsValue({ visibility: 'private', category: '通用' }); + setEditorOpen(true); + }; + const openEdit = (t: PromptTemplate) => { + setEditing(t); + form.setFieldsValue({ + title: t.title, + body: t.body, + category: t.category, + visibility: t.visibility + }); + setEditorOpen(true); + }; + const onSave = async () => { + const v = await form.validateFields(); + try { + if (editing) { + await PromptTemplateAPI.update(editing.id, v); + message.success('已更新'); + } else { + await PromptTemplateAPI.create(v); + message.success('已创建'); + } + setEditorOpen(false); + load(); + } catch (e: any) { + message.error('保存失败:' + (e?.response?.data?.error ?? e?.message ?? e)); + } + }; + const onUse = async (t: PromptTemplate) => { + await PromptTemplateAPI.use(t.id).catch(() => {}); + if (onSelect) onSelect(t); + else { + navigator.clipboard?.writeText(t.body).then(() => message.success('内容已复制到剪贴板')); + } + }; + const onDelete = async (t: PromptTemplate) => { + await PromptTemplateAPI.remove(t.id); + message.success('已删除'); + load(); + }; + + const formatDate = (ts: number) => + new Date(ts).toLocaleDateString('zh-CN', { + month: 'numeric', + day: 'numeric' + }); + + return ( +
+
+
+
+
+ + 灵感模板中心 +
+ +

+ Prompt 模板库 +

+
+ 把高质量提示词沉淀成可复用模板,像挑选灵感卡片一样快速使用,而不是面对一页页生硬的配置项。 +
+
+ + +
+ +
+ setQ(e.target.value)} + onPressEnter={load} + prefix={} + suffix={ + q ? ( + + ) : null + } + style={{ height: 48, borderRadius: 14, background: 'rgba(255,255,255,0.88)' }} + allowClear + /> + +
+ {SCOPE_OPTIONS.map((item) => { + const active = scope === item.key; + return ( + + ); + })} +
+
+
+ + {loading ? ( +
+ +
+ ) : list.length === 0 ? ( +
+ +
+ ) : ( +
+ {list.map((t) => ( +
+
+
+ + {t.category || '其他'} + + : } + style={{ + margin: 0, + borderRadius: 999, + paddingInline: 10, + height: 28, + lineHeight: '28px', + fontSize: 12, + background: 'var(--color-surface-2)', + color: 'var(--color-text-secondary)' + }} + > + {t.visibility === 'public' ? '公开灵感' : '仅自己可见'} + +
+ + + + +
+ +
+
+
+ {t.title} +
+
+ by {t.ownerName || '我'} +
+
+ +
+ 使用 {t.useCount} +
+
+ +
+
+
+ {t.body.slice(0, 220)} + {t.body.length > 220 ? '…' : ''} +
+
+ +
+ + 最近更新于 {formatDate(t.updatedAt)} + + + + onDelete(t)}> + + + +
+
+ ))} +
+ )} + + setEditorOpen(false)} + onOk={onSave} + width={680} + okText="保存" + cancelText="取消" + destroyOnHidden + > +
+ + + + + + + + + + + + +
+
+
+ ); +} diff --git a/src/pages/SharedSessionPage.tsx b/src/pages/SharedSessionPage.tsx new file mode 100644 index 0000000..472f84a --- /dev/null +++ b/src/pages/SharedSessionPage.tsx @@ -0,0 +1,129 @@ +import { useEffect, useState } from 'react'; +import { useParams } from 'react-router-dom'; +import ReactMarkdown from 'react-markdown'; +import { Empty, Spin, App as AntApp } from 'antd'; +import { SharedAPI } from '../api'; + +interface Data { + agent: { name: string; description: string }; + session: { id: string; title: string; createdAt: number; updatedAt: number }; + messages: { id: string; role: 'user' | 'assistant'; content: string; createdAt: number }[]; +} + +export default function SharedSessionPage() { + const { token } = useParams(); + const [data, setData] = useState(null); + const [loading, setLoading] = useState(true); + const [err, setErr] = useState(''); + const { message } = AntApp.useApp(); + + useEffect(() => { + if (!token) return; + SharedAPI.get(token) + .then(setData) + .catch((e) => { + const msg = e?.response?.data?.error ?? e?.message ?? '加载失败'; + setErr(msg); + message.error(msg); + }) + .finally(() => setLoading(false)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [token]); + + if (loading) return ; + if (err || !data) + return ( + + ); + + return ( +
+
+
+
公开分享
+

{data.session.title}

+
+ 🤖 {data.agent.name} · {data.messages.length} 条消息 + + {new Date(data.session.updatedAt).toLocaleString('zh-CN')} + +
+ {data.agent.description && ( +
+ {data.agent.description} +
+ )} +
+ + {data.messages.map((m) => ( +
+
+ {m.role === 'user' ? '🧑 用户' : '🤖 助手'} ·{' '} + {new Date(m.createdAt).toLocaleString('zh-CN')} +
+
+ {m.role === 'assistant' ? ( + {m.content} + ) : ( +
{m.content}
+ )} +
+
+ ))} + +
+ 由 Agent Studio 生成 · 登录创建你自己的 agent +
+
+
+ ); +} diff --git a/src/pages/StatsPage.tsx b/src/pages/StatsPage.tsx new file mode 100644 index 0000000..d0598b6 --- /dev/null +++ b/src/pages/StatsPage.tsx @@ -0,0 +1,255 @@ +import { useEffect, useState } from 'react'; +import { BarChartOutlined, LineChartOutlined, MessageOutlined, RobotOutlined } from '@ant-design/icons'; +import { Card, Empty, App as AntApp, Spin, Tag } from 'antd'; +import { Link } from 'react-router-dom'; +import { StatsAPI, StatsOverview } from '../api'; + +export default function StatsPage() { + const { message } = AntApp.useApp(); + const [data, setData] = useState(null); + const [loading, setLoading] = useState(false); + + useEffect(() => { + setLoading(true); + StatsAPI.overview() + .then(setData) + .catch((e) => message.error('加载失败:' + (e?.message ?? e))) + .finally(() => setLoading(false)); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + if (loading) return ; + if (!data) return ; + + const maxDaily = Math.max(1, ...data.daily.map((d) => d.total)); + const maxAgent = Math.max(1, ...data.topAgents.map((a) => a.messageCount)); + const last7Days = data.daily.slice(-7).reduce((sum, item) => sum + item.total, 0); + const avgSessionMessages = data.sessionCount > 0 ? (data.messageCount / data.sessionCount).toFixed(1) : '0.0'; + + return ( +
+
+
+
+
+ + 数据洞察看板 +
+

调用统计

+
+ 不只是查看调用数量,而是帮助你感知哪些智能体正在被频繁使用、最近的消息趋势如何,以及整体会话是否健康增长。 +
+
+
+
近 7 天消息总量
+
{last7Days}
+
平均每个会话 {avgSessionMessages} 条消息
+
+
+ +
+ {[ + { icon: , label: '智能体数量', value: data.agentCount, tone: 'rgba(8, 145, 178, 0.10)', color: 'var(--color-brand)' }, + { icon: , label: '会话总数', value: data.sessionCount, tone: 'rgba(14, 165, 233, 0.10)', color: 'var(--color-info)' }, + { icon: , label: '消息总数', value: data.messageCount, tone: 'rgba(34, 197, 94, 0.10)', color: 'var(--color-success)' } + ].map((item) => ( +
+
+ + {item.icon} + + {item.label} +
+
{item.value}
+
+ ))} +
+
+ +
+ 仅统计你的数据} + style={{ borderRadius: 22, boxShadow: '0 12px 28px rgba(15, 23, 42, 0.045)' }} + > +
+ 深色柱代表用户消息,浅绿柱代表助手响应,用来快速判断近期对话活跃度。 +
+ {data.daily.length === 0 ? ( + + ) : ( +
+ {data.daily.map((d) => { + const userH = (d.user / maxDaily) * 180; + const aH = (d.assistant / maxDaily) * 180; + return ( +
+
+
+
+
+
+ {d.day.slice(5)} +
+
+ ); + })} +
+ )} +
+ + + 用户消息 + + + + 助手消息 + +
+ + + +
+ 哪些智能体正在被频繁使用,一眼就能看出来。 +
+ {data.topAgents.length === 0 ? ( + + ) : ( +
+ {data.topAgents.map((a, index) => ( +
+
+
+ {index + 1} +
+ + {a.name} + + + {a.messageCount} 条 + +
+
+
+
+
+ ))} +
+ )} + +
+
+ ); +} diff --git a/src/pages/TeamsPage.tsx b/src/pages/TeamsPage.tsx new file mode 100644 index 0000000..1f37345 --- /dev/null +++ b/src/pages/TeamsPage.tsx @@ -0,0 +1,395 @@ +import { useEffect, useState } from 'react'; +import { + CopyOutlined, + DeleteOutlined, + MailOutlined, + PlusOutlined, + TeamOutlined, + UserOutlined +} from '@ant-design/icons'; +import { Card, Button, List, Tag, Space, Popconfirm, App as AntApp, Modal, Form, Input, Empty } from 'antd'; +import { AuthAPI, Team, TeamAPI } from '../api'; + +export default function TeamsPage() { + const { message } = AntApp.useApp(); + const [list, setList] = useState([]); + const [active, setActive] = useState(null); + const [createOpen, setCreateOpen] = useState(false); + const [inviteOpen, setInviteOpen] = useState(false); + const [lastInviteCode, setLastInviteCode] = useState(null); + + const load = async () => { + const l = await TeamAPI.list(); + setList(l); + if (l.length && !active) setActive(await TeamAPI.detail(l[0].id)); + }; + + useEffect(() => { + load(); + }, []); + + const handleCreate = async (v: any) => { + const t = await TeamAPI.create(v.name); + setCreateOpen(false); + message.success('已创建'); + await load(); + setActive(await TeamAPI.detail(t.id)); + }; + + const handleInvite = async (v: any) => { + if (!active) return; + const inv = await AuthAPI.createInvite({ + teamId: active.id, + email: v.email || undefined, + ttlHours: Number(v.ttlHours) || 168 + }); + setLastInviteCode(inv.code); + }; + + return ( +
+
+
+
+
+ + 协作组织空间 +
+

团队管理

+
+ 团队不只是成员列表,更是共享智能体、协同运营和权限分工的组织单元。这里统一查看团队、成员和邀请状态。 +
+
+ +
+ +
+ {[ + { label: '团队数量', value: list.length, tone: 'rgba(8, 145, 178, 0.10)', color: 'var(--color-brand)' }, + { label: '当前成员数', value: active?.members?.length ?? 0, tone: 'rgba(14, 165, 233, 0.10)', color: 'var(--color-info)' }, + { label: '共享智能体', value: active?.agentCount ?? 0, tone: 'rgba(34, 197, 94, 0.10)', color: 'var(--color-success)' } + ].map((item) => ( +
+
{item.label}
+
+ {item.value} + + 当前选中 + +
+
+ ))} +
+
+ +
+
+
+
团队列表
+
选择一个团队查看成员与邀请
+
+ {list.length === 0 ? ( + + ) : ( + ( +
setActive(await TeamAPI.detail(item.id))} + style={{ + padding: '10px 12px', + borderRadius: 14, + cursor: 'pointer', + marginBottom: 6, + background: active?.id === item.id ? 'rgba(8, 145, 178, 0.10)' : 'transparent', + color: active?.id === item.id ? 'var(--color-brand)' : 'var(--color-text-secondary)', + fontWeight: active?.id === item.id ? 600 : 500, + border: active?.id === item.id ? '1px solid rgba(8, 145, 178, 0.16)' : '1px solid transparent' + }} + > +
{item.name}
+
+ {item.agentCount ?? 0} 个智能体 +
+
+ )} + /> + )} +
+ +
+ {active ? ( + +
+
+
+ {active.name} + {active.myRole} + {active.agentCount ?? 0} 智能体 +
+
+ 管理成员权限、邀请新伙伴,并协同维护团队共享的智能体资产。 +
+
+ + {(active.myRole === 'owner' || active.myRole === 'admin') && ( + + )} + {active.myRole === 'owner' && ( + { + await TeamAPI.remove(active.id); + message.success('已删除'); + setActive(null); + load(); + }} + > + + + )} + +
+ +
+
+
成员规模
+
{active.members?.length || 0}
+
+
+
共享智能体
+
{active.agentCount ?? 0}
+
+
+
当前身份
+
{active.myRole}
+
+
+ +
+ 成员 ({active.members?.length || 0}) +
+ ( + { + await TeamAPI.removeMember(active.id, m.id); + message.success('已移除'); + setActive(await TeamAPI.detail(active.id)); + }} + > + + + ] + : [] + } + > + + +
+ } + title={ + + {m.name} + + {m.role} + + + } + description={ +
+ {m.email} + + 加入时间 {new Date(m.joinedAt).toLocaleDateString('zh-CN')} + +
+ } + /> + + )} + /> + + ) : ( + + )} +
+
+ + setCreateOpen(false)} + footer={null} + destroyOnHidden + > +
+ + + + +
+
+ + { + setInviteOpen(false); + setLastInviteCode(null); + }} + footer={null} + destroyOnHidden + > + {lastInviteCode ? ( +
+
邀请码生成成功,请发给受邀者:
+ + +
+ 受邀者在注册页填入此邀请码即可加入团队 +
+
+ ) : ( +
+ + + + + + + +
+ )} +
+
+ ); +} diff --git a/src/pages/WorkflowsPage.tsx b/src/pages/WorkflowsPage.tsx new file mode 100644 index 0000000..1687dbd --- /dev/null +++ b/src/pages/WorkflowsPage.tsx @@ -0,0 +1,775 @@ +import { useEffect, useMemo, useState } from 'react'; +import { + ApartmentOutlined, + ClockCircleOutlined, + PlayCircleOutlined, + PlusOutlined, + ThunderboltOutlined +} from '@ant-design/icons'; +import { + Button, + Card, + Drawer, + Empty, + Form, + Input, + Modal, + Select, + Space, + Switch, + Table, + Tag, + Tooltip, + Typography, + App as AntApp, + Popconfirm, + Tabs +} from 'antd'; +import { + Workflow, + WorkflowAPI, + WorkflowGraph, + WorkflowNode, + WorkflowNodeType, + WorkflowRun, + WorkflowRunDetail, + streamWorkflowRun +} from '../api'; + +const { Text, Paragraph } = Typography; + +const NODE_TYPE_LABEL: Record = { + agent: '🤖 Agent', + skill: '🛠️ Skill', + http: '🌐 HTTP', + transform: '🔧 Transform', + branch: '🔀 Branch' +}; + +const STATUS_COLOR: Record = { + running: 'blue', + success: 'green', + failed: 'red', + aborted: 'orange', + skipped: 'default' +}; + +const SAMPLE_GRAPH: WorkflowGraph = { + entry: 'fetch', + variables: { topic: 'Go 1.23 新特性' }, + nodes: [ + { + id: 'fetch', + type: 'agent', + name: '搜集资料', + config: { + agentId: '', + prompt: '请围绕主题"{{vars.topic}}"列出 5 条最近的关键信息,要点形式。' + }, + next: 'summarize' + }, + { + id: 'summarize', + type: 'agent', + name: '总结成稿', + config: { + agentId: '', + prompt: '基于以下要点写一段 200 字日报:\n{{steps.fetch.output.text}}' + }, + next: '' + } + ] +}; + +export default function WorkflowsPage() { + const { message, modal } = AntApp.useApp(); + const [list, setList] = useState([]); + const [loading, setLoading] = useState(false); + const [editorOpen, setEditorOpen] = useState(false); + const [editing, setEditing] = useState(null); + const [runsOpen, setRunsOpen] = useState(false); + const [runsFor, setRunsFor] = useState(null); + + const load = async () => { + setLoading(true); + try { + const data = await WorkflowAPI.list(); + setList(data); + } catch (e: any) { + message.error('加载失败:' + (e?.message ?? e)); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + load(); + }, []); + + const onCreate = () => { + setEditing({ + id: '', + name: '新工作流', + description: '', + graph: SAMPLE_GRAPH, + scheduleCron: '', + scheduleEnabled: false, + enabled: true, + lastRunAt: 0, + runCount: 0, + createdAt: 0, + updatedAt: 0 + }); + setEditorOpen(true); + }; + + const onEdit = (w: Workflow) => { + setEditing(w); + setEditorOpen(true); + }; + + const onDelete = async (w: Workflow) => { + await WorkflowAPI.remove(w.id); + message.success('已删除'); + load(); + }; + + return ( +
+
+
+
+
+ + 自动化编排中心 +
+

工作流编排

+
+ 让多个 Agent、技能、HTTP 请求与数据转换连成一条可运行的自动化链路。这里更像一个流程画廊,而不是传统表格后台。 +
+
+ +
+ +
+ {[ + { label: '工作流数量', value: list.length, tone: 'rgba(8, 145, 178, 0.10)', color: 'var(--color-brand)' }, + { label: '启用中', value: list.filter((item) => item.enabled).length, tone: 'rgba(34, 197, 94, 0.10)', color: 'var(--color-success)' }, + { label: '定时运行', value: list.filter((item) => item.scheduleEnabled && item.scheduleCron).length, tone: 'rgba(249, 115, 22, 0.10)', color: 'var(--color-warning)' } + ].map((item) => ( +
+
{item.label}
+
+ {item.value} + + 实时状态 + +
+
+ ))} +
+
+ + {loading ? null : list.length === 0 ? ( +
+ +
+ ) : ( +
+ {list.map((r) => ( +
+
+
+
{r.name}
+
+ {r.description || '还没有补充描述,可以说明这个流程负责什么自动化任务。'} +
+
+ + {r.enabled ? '已启用' : '已停用'} + +
+ +
+
+
节点数
+
{r.graph?.nodes?.length ?? 0}
+
+
+
运行次数
+
{r.runCount}
+
+
+
触发方式
+
+ {r.scheduleEnabled && r.scheduleCron ? '定时' : '手动'} +
+
+
+ +
+
+ + 调度与运行 +
+ {r.scheduleEnabled && r.scheduleCron ? ( + + cron: {r.scheduleCron} + + ) : ( + + 手动触发 + + )} +
+ 上次运行 {r.lastRunAt ? new Date(r.lastRunAt).toLocaleString() : '尚未运行'} +
+
+ +
+ + + onDelete(r)}> + + +
+
+ ))} +
+ )} + + {editing && ( + setEditorOpen(false)} + onSaved={() => { + setEditorOpen(false); + load(); + }} + /> + )} + + {runsFor && ( + setRunsOpen(false)} + /> + )} +
+ ); +} + +// ================== 编辑器 ================== + +function WorkflowEditor({ + open, workflow, onClose, onSaved +}: { + open: boolean; + workflow: Workflow; + onClose: () => void; + onSaved: () => void; +}) { + const { message } = AntApp.useApp(); + const [form] = Form.useForm(); + const [graphText, setGraphText] = useState(JSON.stringify(workflow.graph, null, 2)); + const [saving, setSaving] = useState(false); + + useEffect(() => { + form.setFieldsValue({ + name: workflow.name, + description: workflow.description, + scheduleCron: workflow.scheduleCron, + scheduleEnabled: workflow.scheduleEnabled, + enabled: workflow.enabled + }); + setGraphText(JSON.stringify(workflow.graph, null, 2)); + }, [workflow]); + + const onSave = async () => { + const values = await form.validateFields(); + let graph: WorkflowGraph; + try { + graph = JSON.parse(graphText); + } catch (e: any) { + message.error('Graph JSON 解析失败:' + e.message); + return; + } + if (!graph.entry || !Array.isArray(graph.nodes)) { + message.error('Graph 必须包含 entry + nodes 数组'); + return; + } + setSaving(true); + try { + const payload = { ...values, graph }; + if (workflow.id) { + await WorkflowAPI.update(workflow.id, payload); + } else { + await WorkflowAPI.create(payload); + } + message.success('已保存'); + onSaved(); + } catch (e: any) { + message.error('保存失败:' + (e?.message ?? e)); + } finally { + setSaving(false); + } + }; + + return ( + + 保存 + + } + > +
+ + + + + + + + + + + + + + + + Cron 表达式 + 5 段:分 时 日 月 周,例如 "*/30 * * * *" + + } + name="scheduleCron" + > + + +
+ + { + try { + const g: WorkflowGraph = JSON.parse(graphText); + g.nodes = [...(g.nodes || []), node]; + if (!g.entry) g.entry = node.id; + setGraphText(JSON.stringify(g, null, 2)); + } catch { + message.error('Graph JSON 不合法,无法追加'); + } + }} + /> + + Graph JSON(节点列表)} + style={{ marginTop: 12, borderRadius: 16, boxShadow: 'var(--shadow-xs)' }} + extra={ + + + + } + > + setGraphText(e.target.value)} + style={{ fontFamily: 'ui-monospace, monospace', fontSize: 12 }} + /> + + 支持模板 {'{{input.x}} {{vars.x}} {{steps..output...}}'}
+ 节点类型:agent / skill / http / transform / branch;branch 节点用 condition(返回 bool 的 JS 片段),引擎按 next/elseNext 走。 +
+
+
+ ); +} + +function NodeQuickAdd({ onAdd }: { onAdd: (n: WorkflowNode) => void }) { + const [type, setType] = useState('agent'); + const [id, setId] = useState(''); + return ( + + + setId(e.target.value)} + style={{ width: 200 }} + /> + + + + ); +} + +function defaultConfig(type: WorkflowNodeType): Record { + switch (type) { + case 'agent': + return { agentId: '', prompt: '请帮我处理:{{input.text}}' }; + case 'skill': + return { skillId: '', args: {} }; + case 'http': + return { method: 'GET', url: 'https://example.com/api', headers: {}, body: null }; + case 'transform': + return { code: 'return { value: input.text };' }; + case 'branch': + return { condition: 'steps.prev?.output?.value === true' }; + } +} + +// ================== 运行抽屉 ================== + +function RunsDrawer({ + open, workflow, onClose +}: { + open: boolean; + workflow: Workflow; + onClose: () => void; +}) { + const { message } = AntApp.useApp(); + const [tab, setTab] = useState('run'); + const [runs, setRuns] = useState([]); + const [detail, setDetail] = useState(null); + const [streaming, setStreaming] = useState(false); + const [steps, setSteps] = useState([]); + const [finalRun, setFinalRun] = useState(null); + const [inputJson, setInputJson] = useState('{}'); + + const loadRuns = async () => { + try { + const data = await WorkflowAPI.listRuns(workflow.id, 30); + setRuns(data); + } catch (e: any) { + message.error('加载历史失败:' + (e?.message ?? e)); + } + }; + + useEffect(() => { + if (open) loadRuns(); + }, [open]); + + const onRunStream = () => { + let input: any = undefined; + if (inputJson.trim()) { + try { + input = JSON.parse(inputJson); + } catch (e: any) { + message.error('input JSON 不合法'); + return; + } + } + setSteps([]); + setFinalRun(null); + setStreaming(true); + streamWorkflowRun(workflow.id, input, { + onStepStart: (d) => { + setSteps((s) => [...s, { ...d, status: 'running' }]); + }, + onStepFinish: (d) => { + setSteps((s) => { + const idx = [...s].reverse().findIndex((x) => x.nodeId === d.nodeId && x.status === 'running'); + if (idx === -1) return [...s, d]; + const realIdx = s.length - 1 - idx; + const cp = [...s]; + cp[realIdx] = d; + return cp; + }); + }, + onRunFinish: (d) => { + setStreaming(false); + setFinalRun(d); + loadRuns(); + }, + onError: (msg) => { + setStreaming(false); + message.error(msg); + } + }); + }; + + const showDetail = async (runId: string) => { + try { + const d = await WorkflowAPI.getRun(runId); + setDetail(d); + } catch (e: any) { + message.error('加载详情失败:' + (e?.message ?? e)); + } + }; + + return ( + { setDetail(null); onClose(); }} + styles={{ body: { background: '#fcfcfd' }, header: { background: '#fff', borderBottom: '1px solid var(--color-border)' } }} + > + +
+ + setInputJson(e.target.value)} + placeholder='{"text":"hello"}' + /> + +
+ + + + + + {steps.length > 0 && ( + + {steps.map((s, i) => ( +
+ + {s.status} + {s.nodeId} + {s.nodeType} + {s.durationMs != null && {s.durationMs}ms} + + {s.error && {s.error}} + {s.output != null && ( +
+                            {JSON.stringify(s.output, null, 2)}
+                          
+ )} +
+ ))} +
+ )} + + {finalRun && ( + +
+                      {JSON.stringify(finalRun, null, 2)}
+                    
+
+ )} +
+ ) + }, + { + key: 'history', + label: `历史 (${runs.length})`, + children: ( +
+ + + rowKey="id" + size="small" + pagination={false} + dataSource={runs} + columns={[ + { title: '状态', dataIndex: 'status', render: (s) => {s}, width: 100 }, + { title: '触发', dataIndex: 'trigger', width: 80 }, + { title: '开始', dataIndex: 'startedAt', render: (v) => new Date(v).toLocaleString(), width: 180 }, + { title: '耗时', dataIndex: 'durationMs', render: (v) => `${v} ms`, width: 100 }, + { title: '', render: (_, r) => } + ]} + /> + {detail && ( + setDetail(null)} + onOk={() => setDetail(null)} + width={680} + > +

状态:{detail.status}{detail.error && {detail.error}}

+

耗时:{detail.durationMs} ms

+

Input:

+
{JSON.stringify(detail.input, null, 2)}
+

Steps:

+ {detail.steps.map((s) => ( + + + {s.status} + {s.nodeId} + {s.nodeType} + {s.durationMs} ms + + {s.error &&

{s.error}

} + {s.output != null && ( +
+                            {JSON.stringify(s.output, null, 2)}
+                          
+ )} +
+ ))} +
+ )} +
+ ) + } + ]} + /> + + ); +} diff --git a/src/skillTemplates.ts b/src/skillTemplates.ts new file mode 100644 index 0000000..dfaa629 --- /dev/null +++ b/src/skillTemplates.ts @@ -0,0 +1,75 @@ +export const SKILL_TEMPLATES: Record = { + prompt: { + label: '📝 Prompt 注入式(SOP / 工作流)', + content: `--- +name: customer_service_sop +description: 客服回复 SOP,注入到 System Prompt +type: prompt +--- + +# 客服回复 SOP + +## 回复风格 +- 礼貌、简洁、不超过 3 段 +- 优先解决问题,再表达共情 + +## 流程 +1. 复述用户问题,确认理解 +2. 给出解决方案(步骤化) +3. 询问是否还有其他问题 +` + }, + http: { + label: '🌐 HTTP 工具(外部 API)', + content: `--- +name: get_weather +description: 查询某城市当前天气 +type: http +parameters: + type: object + properties: + city: + type: string + description: 城市的中文名或拼音 + required: + - city +handler: https://wttr.in/{{city}}?format=j1 +config: + method: GET + timeout: 8000 +--- + +# 天气查询工具 + +模型可通过 function calling 自动调用。 +\`{{city}}\` 会被替换为参数值。 +` + }, + js: { + label: '⚙️ JavaScript 工具(沙箱执行)', + content: `--- +name: calc_compound_interest +description: 计算复利收益。本金 principal, 年利率 rate (0.05=5%), 年限 years +type: js +parameters: + type: object + properties: + principal: { type: number, description: 本金 } + rate: { type: number, description: 年利率(小数,如 0.05) } + years: { type: number, description: 年数 } + required: [principal, rate, years] +config: + timeout: 3000 +--- + +const { principal, rate, years } = args; +const final = principal * Math.pow(1 + rate, years); +const profit = final - principal; +return { + finalValue: Number(final.toFixed(2)), + profit: Number(profit.toFixed(2)), + summary: \`本金 \${principal} 经 \${years} 年, 年化 \${(rate*100).toFixed(2)}% 复利后变成 \${final.toFixed(2)}\` +}; +` + } +}; diff --git a/src/store/auth.ts b/src/store/auth.ts new file mode 100644 index 0000000..230395e --- /dev/null +++ b/src/store/auth.ts @@ -0,0 +1,37 @@ +import { create } from 'zustand'; +import { AuthAPI, AuthUser } from '../api'; + +interface AuthState { + user: AuthUser | null; + loading: boolean; + /** 启动时调用:从后端拉当前登录态 */ + bootstrap: () => Promise; + login: (email: string, password: string) => Promise; + register: (p: { email: string; password: string; name: string; inviteCode?: string }) => Promise; + logout: () => Promise; +} + +export const useAuth = create((set) => ({ + user: null, + loading: true, + bootstrap: async () => { + try { + const u = await AuthAPI.me(); + set({ user: u, loading: false }); + } catch { + set({ user: null, loading: false }); + } + }, + login: async (email, password) => { + const u = await AuthAPI.login(email, password); + set({ user: u }); + }, + register: async (p) => { + const u = await AuthAPI.register(p); + set({ user: u }); + }, + logout: async () => { + await AuthAPI.logout(); + set({ user: null }); + } +})); diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..2f6ffc4 --- /dev/null +++ b/src/styles.css @@ -0,0 +1,780 @@ +:root, +[data-theme='light'] { + --color-bg: #faf9f5; + --color-surface: #ffffff; + --color-surface-2: #f4f2ea; + --color-surface-3: #ece9de; + --color-border: #ebe7da; + --color-border-strong: #d8d2c0; + --color-border-focus: #c2541f; + --color-text: #2a2622; + --color-text-secondary: #6b6660; + --color-text-tertiary: #a09a8e; + --color-brand: #c2541f; + --color-brand-hover: #a64419; + --color-brand-soft: #fdf2ea; + --color-brand-soft-2: #fae3d2; + --color-success: #4f8a4d; + --color-success-soft: #ecf3ec; + --color-warning: #b8782a; + --color-warning-soft: #fdf3e3; + --color-danger: #c0392b; + --color-danger-soft: #fbeae8; + --color-info: #4a6fa5; + --color-info-soft: #ecf1f8; + --shadow-xs: 0 1px 2px rgba(40, 30, 20, 0.04); + --shadow-sm: 0 1px 2px rgba(40, 30, 20, 0.04), 0 1px 3px rgba(40, 30, 20, 0.05); + --shadow-md: 0 2px 4px rgba(40, 30, 20, 0.04), 0 6px 16px rgba(40, 30, 20, 0.06); + --shadow-lg: 0 4px 12px rgba(40, 30, 20, 0.06), 0 16px 40px rgba(40, 30, 20, 0.08); + --shadow-xl: 0 8px 24px rgba(40, 30, 20, 0.08), 0 24px 60px rgba(40, 30, 20, 0.12); + --shadow-focus: 0 0 0 3px rgba(194, 84, 31, 0.18); + --gradient-brand: linear-gradient(135deg, #c2541f, #e07b3e); + --gradient-hero: radial-gradient(1200px 600px at 0% 0%, #fae3d2 0%, transparent 60%), + radial-gradient(900px 500px at 100% 0%, #f0e8d6 0%, transparent 55%), + linear-gradient(180deg, #faf9f5 0%, #f4f2ea 100%); +} + +[data-theme='dark'] { + --color-bg: #1a1816; + --color-surface: #221f1c; + --color-surface-2: #2b2824; + --color-surface-3: #36322c; + --color-border: #36322c; + --color-border-strong: #4a443c; + --color-border-focus: #e07b3e; + --color-text: #f3efe6; + --color-text-secondary: #b6afa3; + --color-text-tertiary: #7e7869; + --color-brand: #e07b3e; + --color-brand-hover: #f0935a; + --color-brand-soft: #2d2017; + --color-brand-soft-2: #3a2a1c; + --color-success: #7fb87d; + --color-success-soft: #1e2a1d; + --color-warning: #d49a4a; + --color-warning-soft: #2c2316; + --color-danger: #e07060; + --color-danger-soft: #2a1a17; + --color-info: #8aa9d6; + --color-info-soft: #1a2230; + --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.2); + --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.3); + --shadow-md: 0 2px 4px rgba(0, 0, 0, 0.25), 0 6px 16px rgba(0, 0, 0, 0.35); + --shadow-lg: 0 4px 12px rgba(0, 0, 0, 0.3), 0 16px 40px rgba(0, 0, 0, 0.45); + --shadow-xl: 0 8px 24px rgba(0, 0, 0, 0.4), 0 24px 60px rgba(0, 0, 0, 0.55); + --shadow-focus: 0 0 0 3px rgba(224, 123, 62, 0.25); + --gradient-brand: linear-gradient(135deg, #c2541f, #e07b3e); + --gradient-hero: radial-gradient(1200px 600px at 0% 0%, #3a2a1c 0%, transparent 60%), + radial-gradient(900px 500px at 100% 0%, #2a2620 0%, transparent 55%), + linear-gradient(180deg, #1a1816 0%, #221f1c 100%); +} + +* { + box-sizing: border-box; +} + +html, +body, +#root { + height: 100%; + margin: 0; + padding: 0; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', 'Microsoft YaHei', sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background: var(--color-bg); + color: var(--color-text); +} + +body { + transition: background-color 0.2s ease, color 0.2s ease; +} + +.layout-shell { + display: flex; + height: 100vh; + background: var(--color-bg); +} + +.main { + flex: 1; + overflow: auto; + background: var(--color-bg); +} + +.main-chat { + overflow: hidden; +} + +.sidebar { + width: 248px; + background: var(--color-surface); + border-right: 1px solid var(--color-border); + color: var(--color-text); + display: flex; + flex-direction: column; + padding: 14px 12px; +} + +.sidebar .brand { + font-size: 15px; + font-weight: 700; + color: var(--color-text); + padding: 6px 10px 18px; + display: flex; + align-items: center; + gap: 10px; +} + +.sidebar .brand .brand-mark { + width: 28px; + height: 28px; + border-radius: 8px; + background: var(--gradient-brand); + color: #fff; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 14px; + box-shadow: var(--shadow-sm); +} + +.sidebar .nav-section-label { + font-size: 11px; + font-weight: 600; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--color-text-tertiary); + padding: 14px 12px 6px; +} + +.sidebar .nav-item { + padding: 7px 12px; + border-radius: 8px; + cursor: pointer; + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 1px; + color: var(--color-text-secondary); + text-decoration: none; + font-size: 13.5px; + font-weight: 500; + transition: background 0.15s ease, color 0.15s ease; +} + +.sidebar .nav-item:hover { + background: var(--color-surface-2); + color: var(--color-text); +} + +.sidebar .nav-item.active { + background: var(--color-brand-soft); + color: var(--color-brand); + font-weight: 600; +} + +.sidebar .nav-item .nav-icon { + width: 18px; + height: 18px; + display: inline-flex; + align-items: center; + justify-content: center; + font-size: 16px; +} + +.sidebar .kbd { + font-size: 10.5px; + color: var(--color-text-tertiary); + background: var(--color-surface-2); + border: 1px solid var(--color-border); + padding: 1px 5px; + border-radius: 4px; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; +} + +.sidebar-user { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 10px; + cursor: pointer; + border-radius: 10px; + background: var(--color-surface-2); + border: 1px solid var(--color-border); +} + +.agent-card { + background: var(--color-surface); + border-radius: 14px; + padding: 20px; + border: 1px solid var(--color-border); + height: 100%; + display: flex; + flex-direction: column; + gap: 12px; + transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease; + box-shadow: var(--shadow-xs); +} + +.agent-card:hover { + transform: translateY(-2px); + box-shadow: var(--shadow-md); + border-color: var(--color-border-strong); +} + +.agent-card .avatar { + width: 48px; + height: 48px; + border-radius: 50%; + background: var(--gradient-brand); + color: #fff; + display: flex; + align-items: center; + justify-content: center; + font-size: 19px; + font-weight: 700; + overflow: hidden; + box-shadow: var(--shadow-sm); +} + +.agent-card .desc { + color: var(--color-text-secondary); + font-size: 13px; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + min-height: 40px; + line-height: 1.55; +} + +.empty-state { + text-align: center; + padding: 60px 0; + color: var(--color-text-tertiary); +} + +.page-hero { + background: var(--gradient-hero); + border-bottom: 1px solid var(--color-border); + padding: 56px 32px 40px; +} + +.page-hero .hero-title { + font-size: 32px; + font-weight: 700; + color: var(--color-text); + margin: 0 0 8px; +} + +.page-hero .hero-subtitle { + font-size: 15px; + color: var(--color-text-secondary); + margin: 0; + max-width: 640px; +} + +.chat-shell { + display: flex; + height: 100vh; + background: var(--color-bg); +} + +.chat-side { + width: 280px; + border-right: 1px solid var(--color-border); + padding: 16px; + overflow: hidden; + display: flex; + flex-direction: column; + height: 100%; + background: var(--color-surface); +} + +.chat-main { + flex: 1; + display: flex; + flex-direction: column; + background: var(--color-bg); + min-width: 0; +} + +.chat-header { + height: 60px; + padding: 0 24px; + border-bottom: 1px solid var(--color-border); + display: flex; + align-items: center; + justify-content: center; + background: var(--color-surface); +} + +.chat-body { + flex: 1; + overflow-y: auto; + background: var(--color-bg); +} + +.chat-body .messages-container { + max-width: 780px; + width: 100%; + margin: 0 auto; + padding: 28px 24px 100px; +} + +.bubble { + max-width: 78%; + padding: 14px 18px; + border-radius: 14px; + margin-bottom: 14px; + white-space: pre-wrap; + word-wrap: break-word; + line-height: 1.65; + font-size: 14.5px; +} + +.bubble.user { + background: var(--color-brand-soft); + color: var(--color-text); + margin-left: auto; + border-bottom-right-radius: 5px; +} + +.bubble.assistant { + background: var(--color-surface); + color: var(--color-text); + border: 1px solid var(--color-border); + border-bottom-left-radius: 5px; + box-shadow: var(--shadow-xs); +} + +.bubble.assistant p { + margin: 0 0 10px; +} + +.bubble.assistant p:last-child { + margin-bottom: 0; +} + +.chat-input-wrapper { + width: 100%; + max-width: 820px; + margin: 0 auto; + padding: 0 24px 24px; +} + +.chat-input-card { + width: 100%; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: 20px; + padding: 14px 16px 12px; + min-height: 110px; + box-shadow: var(--shadow-sm); +} + +.chat-input-card:focus-within { + border-color: var(--color-border-focus); + box-shadow: var(--shadow-focus); +} + +.chat-input-textarea { + border: none !important; + box-shadow: none !important; + padding: 10px 4px !important; + font-size: 16px; + line-height: 1.7; + resize: none; + background: transparent !important; + color: var(--color-text) !important; +} + +.monica-editor-column { + height: 100%; + overflow-y: auto; + padding: 24px; +} + +.monica-section-title { + font-size: 15px; + font-weight: 600; + color: var(--color-text); + margin-bottom: 14px; +} + +.monica-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: 12px; + padding: 16px; + margin-bottom: 16px; +} + +.monica-header { + height: 56px; + border-bottom: 1px solid var(--color-border); + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 24px; + background: var(--color-surface); +} + +.agent-editor-shell { + background: + radial-gradient(circle at top left, rgba(8, 145, 178, 0.08), transparent 24%), + radial-gradient(circle at top right, rgba(59, 130, 246, 0.07), transparent 22%), + var(--color-bg); +} + +.agent-editor-header { + height: 72px; + padding: 0 28px; + border-bottom: 1px solid var(--color-border); + background: rgba(255, 255, 255, 0.84); + backdrop-filter: blur(14px); +} + +.agent-editor-workbench { + display: flex; + gap: 14px; + padding: 14px; + min-height: 0; +} + +.agent-editor-pane { + min-width: 0; + border: 1px solid rgba(148, 163, 184, 0.14); + border-radius: 24px; + background: linear-gradient(180deg, rgba(255,255,255,0.98) 0%, rgba(252,252,253,1) 100%); + box-shadow: 0 14px 34px rgba(15, 23, 42, 0.045); + overflow: hidden; +} + +.agent-editor-pane-body { + height: 100%; + overflow-y: auto; + padding: 22px; +} + +.agent-editor-pane-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + margin-bottom: 18px; +} + +.agent-editor-pane-title { + font-size: 18px; + font-weight: 700; + color: var(--color-text); + margin: 0 0 6px; + letter-spacing: -0.02em; +} + +.agent-editor-pane-subtitle { + font-size: 13px; + line-height: 1.7; + color: var(--color-text-secondary); + margin: 0; +} + +.agent-editor-badge { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 6px 12px; + border-radius: 999px; + background: rgba(8, 145, 178, 0.08); + color: var(--color-brand); + font-size: 12px; + font-weight: 600; + white-space: nowrap; +} + +.agent-editor-intro { + border-radius: 18px; + padding: 16px 18px; + background: linear-gradient(135deg, rgba(236,253,245,0.92) 0%, rgba(240,249,255,0.92) 100%); + border: 1px solid rgba(8, 145, 178, 0.12); + margin-bottom: 16px; +} + +.agent-editor-intro-title { + font-size: 14px; + font-weight: 700; + color: var(--color-text); + margin-bottom: 6px; +} + +.agent-editor-intro-text { + font-size: 12.5px; + line-height: 1.7; + color: var(--color-text-secondary); +} + +.agent-editor-surface { + border-radius: 18px; + border: 1px solid rgba(148, 163, 184, 0.14); + background: linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(248,250,252,0.88) 100%); + box-shadow: inset 0 1px 0 rgba(255,255,255,0.65); +} + +.agent-editor-prompt-wrap { + padding: 12px; +} + +.agent-editor-prompt { + border-radius: 16px; + border: 1px solid rgba(148, 163, 184, 0.12); + background: rgba(255,255,255,0.72); +} + +.agent-editor-preview-shell { + height: 100%; + display: flex; + flex-direction: column; +} + +.agent-editor-modal-hero { + display: grid; + grid-template-columns: 220px minmax(0, 1fr); + gap: 18px; + margin-bottom: 20px; +} + +.agent-editor-modal-card { + border-radius: 20px; + border: 1px solid rgba(148, 163, 184, 0.14); + background: linear-gradient(180deg, rgba(255,255,255,0.96) 0%, rgba(248,250,252,0.88) 100%); +} + +.agent-editor-avatar-grid { + display: grid; + grid-template-columns: repeat(6, minmax(0, 1fr)); + gap: 12px; + padding: 16px; + border-radius: 20px; + background: linear-gradient(180deg, rgba(248,250,252,0.9) 0%, rgba(255,255,255,0.92) 100%); + border: 1px solid rgba(148, 163, 184, 0.12); + max-height: 280px; + overflow-y: auto; +} + +.page-container { + max-width: 1240px; + margin: 0 auto; + padding: 40px 32px 60px; +} + +.page-header { + margin-bottom: 32px; +} + +.page-title { + font-size: 28px; + font-weight: 700; + color: var(--color-text); + margin: 0 0 6px; +} + +.page-subtitle { + font-size: 14px; + color: var(--color-text-secondary); + margin: 0; +} + +.create-card { + min-height: 240px; + height: 100%; + border: 1.5px dashed var(--color-border-strong); + border-radius: 14px; + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: flex-start; + padding: 20px; + gap: 12px; + cursor: pointer; + transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease, background 0.25s ease; + background: var(--color-surface); + box-shadow: var(--shadow-xs); +} + +.create-card:hover { + transform: translateY(-2px); + border-color: var(--color-brand); + background: var(--color-brand-soft); + box-shadow: var(--shadow-md); +} + +.create-card .create-icon { + width: 52px; + height: 52px; + border-radius: 50%; + background: var(--color-surface); + display: flex; + align-items: center; + justify-content: center; + box-shadow: var(--shadow-sm); + color: var(--color-brand); + font-size: 22px; + border: 1px solid var(--color-border); +} + +.theme-toggle { + width: 32px; + height: 32px; + border-radius: 8px; + border: 1px solid var(--color-border); + background: var(--color-surface); + color: var(--color-text-secondary); + cursor: pointer; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.theme-toggle:hover { + border-color: var(--color-border-strong); + color: var(--color-text); + background: var(--color-surface-2); +} + +.flex { display: flex; } +.flex-col { flex-direction: column; } +.flex-row { flex-direction: row; } +.flex-1 { flex: 1; } +.items-center { align-items: center; } +.justify-between { justify-content: space-between; } +.justify-center { justify-content: center; } +.justify-start { justify-content: flex-start; } +.justify-end { justify-content: flex-end; } +.h-full { height: 100%; } +.w-full { width: 100%; } +.overflow-hidden { overflow: hidden; } +.overflow-auto { overflow: auto; } +.object-cover { object-fit: cover; } +.fixed { position: fixed; } +.absolute { position: absolute; } +.relative { position: relative; } +.inset-0 { top: 0; right: 0; bottom: 0; left: 0; } +.z-100 { z-index: 100; } +.p-4 { padding: 1rem; } +.p-2 { padding: 0.5rem; } +.px-1 { padding-left: 0.25rem; padding-right: 0.25rem; } +.mb-0 { margin-bottom: 0; } +.mb-2 { margin-bottom: 0.5rem; } +.mb-3 { margin-bottom: 0.75rem; } +.mb-4 { margin-bottom: 1rem; } +.mt-2 { margin-top: 0.5rem; } +.mt-6 { margin-top: 1.5rem; } +.gap-1 { gap: 0.25rem; } +.gap-2 { gap: 0.5rem; } +.gap-4 { gap: 1rem; } +.rounded-full { border-radius: 9999px; } +.rounded-lg { border-radius: 0.5rem; } +.text-xs { font-size: 0.75rem; } +.text-sm { font-size: 0.875rem; } +.text-lg { font-size: 1.125rem; } +.font-bold { font-weight: 700; } +.font-medium { font-weight: 500; } +.bg-white { background: var(--color-surface); } +.bg-gray-50 { background: var(--color-surface-2); } +.text-gray-400 { color: var(--color-text-tertiary); } +.text-gray-500 { color: var(--color-text-secondary); } +.text-gray-700 { color: var(--color-text); } +.text-gray-800 { color: var(--color-text); } +.border-none { border: none; } +.border-t { border-top: 1px solid var(--color-border); } +.border-l { border-left: 1px solid var(--color-border); } +.shadow-lg { box-shadow: var(--shadow-lg); } + +.ant-btn-primary { + box-shadow: 0 1px 2px rgba(194, 84, 31, 0.18) !important; +} + +.ant-input, +.ant-input-affix-wrapper, +.ant-input-number, +.ant-select-selector, +.ant-picker { + background: var(--color-surface) !important; + border-color: var(--color-border) !important; + color: var(--color-text) !important; +} + +.ant-input::placeholder { + color: var(--color-text-tertiary) !important; +} + +.ant-input-affix-wrapper:hover, +.ant-input:hover, +.ant-select:hover .ant-select-selector, +.ant-picker:hover { + border-color: var(--color-border-strong) !important; +} + +.ant-input-affix-wrapper-focused, +.ant-input:focus, +.ant-select-focused .ant-select-selector, +.ant-picker-focused { + border-color: var(--color-brand) !important; + box-shadow: var(--shadow-focus) !important; +} + +.ant-card { + background: var(--color-surface) !important; + border-color: var(--color-border) !important; +} + +.ant-modal-content, +.ant-modal-header, +.ant-drawer-content { + background: var(--color-surface) !important; +} + +.ant-modal-title, +.ant-collapse-header { + color: var(--color-text) !important; +} + +.ant-divider, +.ant-drawer-header, +.ant-collapse, +.ant-collapse-item, +.ant-collapse-content { + border-color: var(--color-border) !important; +} + +.ant-collapse-content { + background: var(--color-surface) !important; + color: var(--color-text) !important; +} + +.ant-tabs-tab.ant-tabs-tab-active .ant-tabs-tab-btn { + color: var(--color-brand) !important; +} + +.ant-tabs-ink-bar { + background: var(--color-brand) !important; +} + +[data-theme='dark'] .ant-btn-default { + background: var(--color-surface-2) !important; + border-color: var(--color-border) !important; + color: var(--color-text) !important; +} + +[data-theme='dark'] .ant-btn-default:hover { + background: var(--color-surface-3) !important; + border-color: var(--color-border-strong) !important; +} + +[data-theme='dark'] .ant-tag { + background: var(--color-surface-2); + border-color: var(--color-border); + color: var(--color-text-secondary); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0a3996c --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true + }, + "include": ["src"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..8c7b68d --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,27 @@ +import { defineConfig, loadEnv } from 'vite'; +import react from '@vitejs/plugin-react'; + +// 默认走 Go 后端 :4001;要回退 Node 后端就 set VITE_API_TARGET=http://localhost:4000 +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd(), ''); + const target = env.VITE_API_TARGET || 'http://localhost:4001'; + return { + plugins: [react()], + server: { + port: 5173, + proxy: { + '/api': { + target, + changeOrigin: true, + // SSE 不要被压缩;保持长连接 + configure: (proxy) => { + proxy.on('proxyReq', (proxyReq) => { + proxyReq.setHeader('Accept-Encoding', 'identity'); + }); + } + } + } + } + }; +}); +