diff --git a/.env b/.env new file mode 100644 index 0000000..d35c8db --- /dev/null +++ b/.env @@ -0,0 +1,15 @@ +# Environment variables declared in this file are NOT automatically loaded by Prisma. +# Please add `import "dotenv/config";` to your `prisma.config.ts` file, or use the Prisma CLI with Bun +# to load environment variables from .env files: https://pris.ly/prisma-config-env-vars. + +# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. +# See the documentation for all the connection string options: https://pris.ly/d/connection-strings + +DATABASE_URL="mysql://mohe001:Mohe168899%23@rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai?charset=utf8mb4" + +NEXTAUTH_URL="http://localhost:8301" +NEXTAUTH_SECRET="zhuiguang-ai-dev-secret" + +GITHUB_TOKEN="" + +DEEPSEEK_API_KEY="sk-91d1671855e44089b792b8147e17963f" \ No newline at end of file diff --git a/.gitignore b/.gitignore index fd3dbb5..0008ac8 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +/src/generated/prisma diff --git a/.trae/CHANGELOG b/.trae/CHANGELOG new file mode 100644 index 0000000..47e88fa --- /dev/null +++ b/.trae/CHANGELOG @@ -0,0 +1,275 @@ +# 追光AI 变更日志 + +## v0.11.1 (2026-05-22) - AI发现管线质量优化 + +### 全链路测试 +- 跑通全部AI自动化管线:GitHub搜索 → DeepSeek评测 → 入库 → 内容生成 +- 2个脚本(automatic-review + daily-discover) + 4个API端点全部验证通过 +- 连测创建12条技能+评测记录,DeepSeek生成1篇日报+长文+视频脚本+社交卡片 + +### 质量过滤修复 +- **非AI项目过滤**: auto-review.mjs + daily-discover.mjs 新增 `isValidAIProject()` 函数 + - 关键词过滤: `book/guide/tutorial/awesome/interview/notes/handbook/cheatsheet/roadmap/curated-list` 等 + - 语言过滤: 纯Markdown/HTML文档Repo(Stars<5000)自动拒绝 + - 主题过滤: 有GitHub Topics的Repo必须包含AI相关Topic(ai/llm/rag/agent/gpt等) +- 清理5条误入库非AI数据:AgentGuide、JavaGuide、pathway、StableDiffusionBook、Claude-Code-Everything + +### JSON解析健壮性 +- 新增 `extractJSON()` 统一工具函数 → `src/lib/utils.ts` +- 支持markdown代码块包裹(`\`\`\`json...\`\`\``)、花括号/方括号容错 +- 替换 deepseek.ts、auto-review.mjs、daily-discover.mjs、daily-reports/generate 的旧解析逻辑 +- 新增 `scripts/test-content-generation.mjs` 全管线测试脚本 + +### 新增脚本 +- `scripts/cleanup-non-ai.mjs` — 一键清理误入库非AI技能数据 + +--- + +## v0.11.0 (2026-05-22) - 权限体系重构 + +### 架构变更 +- **新增数据模型**: `Role`(角色), `Permission`(权限点), `RolePermission`(角色-权限关联) 三张表 +- **User 模型**: 新增 `roleId` 字段关联 `Role`,与原有 `role` 字符串字段并行(向后兼容) +- 默认角色:**超级管理员**(Admin, 全部53权限)、**VIP成员**(Vip, 19个精选权限) + +### 权限体系 +- **53个精细化权限点**,按页面分组管理: + - 工具管理 14项 · 技能库 12项 · 评测管理 8项 + - AI发现 7项 · 内容管理 8项 · 系统管理 4项 +- 所有后台按钮/操作均已对应权限点,可逐个勾选控制 + +### 新增页面 +- **`/admin/roles` 角色权限管理**: 左侧角色列表 + 右侧按分组的权限勾选网格 + - 新建/删除自定义角色(系统角色受保护) + - 分组全选/取消全选 + - 保存按钮实时同步到数据库 + +### 新增 API +- `GET/POST /api/admin/roles` — 角色列表/创建 +- `PUT/DELETE /api/admin/roles/[id]` — 角色编辑/删除 +- `GET /api/admin/permissions` — 全部权限点列表 +- `GET /api/admin/user-permissions` — 用户权限查询(支持roleId/userId/当前用户) + +### 鉴权升级 +- **middleware.ts**: 从硬编码 `role==="admin"` 改为认证检查 + 路由层委派 +- **admin-auth.ts**: `requireAdmin()` 兼容旧 `role` 字符串 + 新 `roleId` 关联角色双重逻辑 +- 新增 `requirePermission(key)` — 细粒度权限点校验 +- 新增 `getAllUserPermissions()` — 获取当前用户全部权限集合 + +### 前端工具 +- 新增 `usePermission()` hook — 提供 `can(key)`, `canAny(keys)`, `canAll(keys)` 方法 +- 侧边栏新增"角色权限"菜单入口 + +### 种子脚本 +- `scripts/seed-permissions.mjs` — 一键初始化全部权限点+角色 + +--- + +## v0.10.1 (2026-05-22) - 全面修复与优化 + +### 安全修复 +- **Admin API 鉴权增强**: 中间件matcher新增`/api/admin/:path*`路由保护,未登录或非管理员角色返回403 +- 所有关键admin路由已内置`requireAdmin()`双重校验(中间件+路由层防御深度) + +### Bug 修复 +- **Category ID 动态化**: `skill-discoverer.ts`、`daily-discover.mjs`、`auto-review.mjs`三个文件的硬编码Category ID(120-127)替换为数据库查询+关键词匹配,消除分类错配风险 +- **reviews统计卡片**: 修复评测管理页面统计(已发布/草稿/平均评分)只显示当前页数据的问题,改为从全局groupBy统计获取 +- **内容生成日志完善**: `/api/admin/reviews/[id]/generate`成功和失败均写入`ReviewGenerationLog` + +### 功能增强 +- **待审核技能编辑增强**: 编辑对话框新增"功能特性(JSON)"和"标签(逗号分隔)"输入框,支持直接编辑上传 +- **已发布技能编辑增强**: 编辑对话框新增"分类"下拉选择、"功能特性(JSON)"、"标签"字段,功能对齐待审核页面 +- **日报AI一键生成**: 新增`/api/admin/daily-reports/generate`端点,前端新增"一键AI生成"按钮,直接调用DeepSeek生成日报并自动填充表单,替代原有的"复制提示词→粘贴JSON"手动流程 + +### 内部改进 +- `ReviewGenerationLog`确认已在`skill-discoverer.ts`和两个脚本中正常使用,非僵尸表 +- 三个脚本文件统一使用数据库查询获取分类ID,消除代码不一致 + +--- + +## v0.10.0 (2026-05-20) - 五维评测系统 + +### 新增 +- **数据库扩展**: SkillReview模型(五维评测)、ReviewGenerationLog模型(评测日志)、ReviewStatus枚举(DRAFT/PUBLISHED/REJECTED/OUTDATED) +- **Skill模型扩展**: 新增lastReviewedAt(最近评测时间)、githubStarsHistory(Star历史)字段,关联skillReview +- **GitHub数据采集模块** (`src/lib/github.ts`): octokit封装,支持searchHotRepos搜索热门仓库、getRepoReadme获取README +- **DeepSeek评测生成模块** (`src/lib/deepseek.ts`): OpenAI兼容接口,五维评测提示词模板,综合分自动校验 +- **自动化评测脚本** (`scripts/auto-review.mjs`): GitHub搜索→README获取→DeepSeek评测→入库全流程,每日限制8个 +- **评测API** (`/api/skills/[slug]/review`): 获取PUBLISHED状态的五维评测数据 +- **SkillReviewCard组件**: Chart.js雷达图+维度详情卡片,dynamic import(ssr:false),紫色主色调 +- **技能详情页集成**: 在标签卡片和评论之间展示五维评测雷达图 +- **发布评测脚本** (`scripts/publish-reviews.mjs`): 批量将DRAFT评测改为PUBLISHED +- **测试脚本**: test-github.mjs(GitHub API)、test-deepseek.mjs(DeepSeek API) +- **新依赖**: octokit, openai, chart.js, react-chartjs-2 + +### 修改 +- .env新增GITHUB_TOKEN、DEEPSEEK_API_KEY配置 +- 开发规则更新: 允许服务端脚本调用外部AI API,前端仍禁止 +- 迁移记录: 第10次迁移 add_skill_reviews + +### 踩坑 +- Prisma 7.8需通过PrismaMariaDb适配器初始化,脚本中不能直接new PrismaClient() +- Chart.js组件需dynamic import + ssr:false,不支持服务端渲染 +- 服务器环境SSL证书问题: 运行脚本需设置$env:NODE_TLS_REJECT_UNAUTHORIZED="0" +- Chart.js font.weight只接受bold/normal/bolder/lighter,不接受数字字符串如"500" + +--- + +## v0.9.0 (2026-05-09) + +### 重大变更 +- **移除所有外部AI API调用**: discover-tools、discover-skills、discover-news三个API不再调用DeepSeek API,改为接收前端提交的JSON数据 +- **端口迁移**: 开发端口从3100-3110迁移至8301-8310,默认端口8301 +- **五大操作指令模式重构**: 从"一键调用API"模式改为"提示词+JSON粘贴导入"模式 + +### 新增 +- AI新闻发现页面 `/admin/discover-news`:3步流程(复制提示词→粘贴JSON→查看日报),6大分类+热度评分 +- AI新闻发现API `POST /api/admin/discover-news`:接收新闻JSON数组,自动生成今日AI日报 +- AI新闻发现API `GET /api/admin/discover-news`:获取今日AI日报 +- `fetchLogoWithMethod()` 函数:返回Logo URL + 成功方法名(如"HTML Link图标"、"OG/Twitter图片"等) +- 检测AI工具页面增加Logo抓取功能:检测时同步抓取缺失Logo,记录成功方法名统计 +- 检测AI工具页面增加Logo抓取方法统计面板:按成功次数排序展示每种方法的效果 +- 检测AI工具页面增加Logo新抓取成功列表:展示Logo预览和使用的抓取方法名 +- 导入10天100条真实AI新闻(4月30日-5月9日) + +### 修改 +- discover-tools API: 从调用DeepSeek API改为接收 `{tools: [...], categoryId}` JSON数组 +- discover-skills API: 从调用DeepSeek API改为接收 `{skills: [...], categoryId}` JSON数组 +- discover-tools页面: 从一键发现改为4步流程(选分类→复制提示词→粘贴JSON→抓取Logo) +- discover-skills页面: 从一键发现改为3步流程(选分类→复制提示词→粘贴JSON) +- discover-news页面: 从一键发现改为3步流程(复制提示词→粘贴JSON→查看日报) +- check-tools API: 增加Logo抓取功能,返回logoFetched/logoMethod/logoUrl字段,GET请求获取HTML用于Logo抓取 +- check-tools页面: 默认选中待审核工具,4步流程卡片,增加Logo抓取方法统计和新抓取成功列表 +- update-skills页面: 去掉复制提示词,保留快速更新Star +- logo-fetcher.ts: 新增 `fetchLogoWithMethod()` 导出,每种成功方法返回中文名称 +- package.json: 端口3100→8301 +- .env: NEXTAUTH_URL端口3100→8301 +- restart.ps1: 端口扫描范围3100-3110→8301-8310 +- project_rules.md: 端口规范8301-8310,新增强制要求;五大操作指令改为提示词+JSON粘贴模式;禁止硬编码API Key;禁止调用外部AI API + +### 删除 +- 移除3个API文件中的DeepSeek API调用逻辑(硬编码API Key、callDeepSeek函数等) +- 移除discover-tools页面的"一键发现"按钮和DeepSeek API调用 +- 移除discover-skills页面的"一键发现"按钮和DeepSeek API调用 +- 移除discover-news页面的DeepSeek API调用 +- 清除旧的虚构AI新闻数据 + +--- + +## v0.8.0 (2026-05-05) + +### 新增 +- 用户系统:邮箱注册/登录、GitHub OAuth登录、用户中心页面 +- 收藏功能:工具/技能收藏、收藏列表页面、乐观更新按钮 +- 浏览历史:自动记录浏览过的工具/技能 +- 评论评价系统:ReviewSection组件,支持评分和文字评论 +- LoginModal组件:登录/注册弹窗,支持模式切换 +- FavoriteButton组件:收藏按钮,乐观更新 +- CategorySidebar组件:通用分类侧边栏 +- 用户API: `/api/user/favorites`, `/api/user/history` +- 评论API: `/api/reviews` +- 首页API: `/api/homepage`(含嵌套分类结构) + +### 改进 +- **UI主题重构:暗色→浅色主题** + - 全局CSS变量从暗色切换为浅色(background: 210 20% 98%, card: 0 0% 100%等) + - 所有页面和组件适配浅色主题(7个前台页面+12个后台页面+5个组件) + - 颜色规范:文字-600/-700、背景-50、边框-200/60 + - 卡片样式:bg-white/60/80 + shadow-sm,hover时bg-white + shadow-md + - 输入框:bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10 + - 毛玻璃效果:bg-white/80 backdrop-blur-xl + - 渐变文字:蓝→紫→粉渐变保持科技感 + - 移除noise纹理,新增dot-grid点阵背景 +- **层级分类导航重构** + - 首页/技能页:左侧固定一级分类导航 + 右侧二级分类标签切换 + - 每个一级类目下有"全部"标签显示该分类下所有内容 + - 左侧导航sticky跟随页面滚动 +- **安全加固** + - 新增admin-auth.ts中间件,requireAdmin函数 + - 28个后台API端点全部添加requireAdmin中间件验证 + - 移除硬编码API密钥,改用环境变量 +- Header组件:滚动时bg-white/80 backdrop-blur-2xl,搜索框bg-muted/50 +- Logo位置修复:Header容器宽度统一为max-w-[1440px] + +### 修复 +- 修复webpack缓存损坏导致的页面加载失败(清除.next目录) +- 修复左侧导航栏sticky定位不生效(flex容器添加self-start) +- 修复Logo被左侧导航遮挡(统一容器宽度) + +--- + +## v0.5.0 (2026-05-03) + +### 新增 +- 待审核工具页面批量多选功能:全选/批量通过/批量拒绝 +- 待审核技能页面批量多选功能:全选/批量通过/批量拒绝 +- 待审核技能一键全部通过功能 +- 所有列表页面分页功能(每页20条) +- 批量拒绝API: `/api/admin/pending/batch-reject`, `/api/admin/pending-skills/batch-reject` +- 一键全部发布API: `/api/admin/pending-skills/publish-all` +- AI技能自动探索API: `/api/admin/discover-skills/run` +- 探索脚本存入系统配置,discover-skills页面展示脚本和调用说明 +- 一键自动探索按钮(服务端调用DeepSeek API) +- Logo抓取策略改进:新增manifest.json解析、更多link/img匹配模式、图片URL验证 +- 工具库与脚本模块文档: `.trae/specs/modules/07-lib-and-scripts.md` + +### 改进 +- Logo抓取引擎增强:6种策略按优先级,minFileSize降至50字节,timeout增至10秒 +- 待审核工具页面:新增Logo状态列、Logo筛选、抓取缺失Logo/重新抓取全部Logo按钮 +- 待审核技能页面:新增Star数展示、GitHub链接、分类标签 +- pending API和pending-skills API支持分页参数 +- 技术文档全面更新(7个模块文档+索引+开发规则+变更日志) + +--- + +## v0.4.0 (2026-05-02) + +### 新增 +- 系统配置页面:Logo抓取配置、发现提示词配置 +- 四个AI发现菜单:探索AI工具、检测AI工具、探索Skill技能、更新Skill技能 +- AI技能发现脚本 `scripts/discover-skills.mjs` +- GitHub中文友好判断标准(4步标准) +- 技能分类管理页面 +- DeepSeek V4 Pro API配置 + +### 改进 +- 配置驱动模式:提示词和Logo抓取策略存储在SystemConfig表 +- 去掉DeepSeek API配置功能,改为配置项驱动 +- 技能发现提示词优化 + +--- + +## v0.3.0 (2026-05-01) + +### 新增 +- 技能库模块:Skill/PendingSkill数据模型、API、管理页面 +- API接口配置:ApiProvider数据模型和管理页面 +- 发现配置:DiscoveryConfig与分类管理集成 +- 公共Logo抓取工具 `src/lib/logo-fetcher.ts` +- 服务重启脚本 `restart.ps1` + +### 改进 +- 去除爬虫功能,改为AI发现模式 +- UI全面优化:暗色主题、毛玻璃效果、动画 +- 端口从3000改为3100 + +--- + +## v0.2.0 (2026-04-30) + +### 新增 +- 后台管理页面:工具管理、分类管理、待审核工具 +- NextAuth认证系统 +- Prisma ORM + MySQL数据库 +- AI智能发现新工具功能(DeepSeek API) +- 批量导入工具脚本 + +--- + +## v0.1.0 (2026-04-28) + +### 新增 +- Next.js 14项目初始化 +- Tailwind CSS + shadcn/ui配置 +- 前台页面:首页、工具列表、工具详情、分类页 +- Header/Footer布局组件 diff --git a/.trae/rules/project_rules.md b/.trae/rules/project_rules.md new file mode 100644 index 0000000..4f4530a --- /dev/null +++ b/.trae/rules/project_rules.md @@ -0,0 +1,126 @@ +# 追光AI 项目开发规则 + +## 端口规范 +- 开发端口: 8301-8310 +- 默认端口: 8301 +- 重启脚本仅扫描8301-8310范围 +- **强制要求:本项目端口必须锁定在8301-8310区间内,禁止使用其他端口,因为本服务器同时运行其他产品** + +## 技术栈 +- Next.js 14 (App Router) + TypeScript +- Tailwind CSS + shadcn/ui +- Prisma 7.8 + MySQL (阿里云RDS) +- NextAuth.js v4 (Credentials Provider) +- DeepSeek API (deepseek-v4-pro) — 用于技能五维评测生成(服务端脚本调用) + +## 代码风格 +- 不添加注释(除非明确要求) +- 使用中文作为UI文案和提示词语言 +- TypeScript严格模式,零编译错误 +- 组件使用 `"use client"` 标记客户端组件 +- 路径别名: `@/*` → `./src/*` +- **禁止在代码中硬编码任何AI API Key** +- **禁止在代码中调用任何外部AI API(DeepSeek、OpenAI等)** — 前台/后台页面代码中禁止调用;服务端脚本(scripts/)中允许通过环境变量调用DeepSeek API和GitHub API +- 所有发现/导入功能通过页面提示词+JSON粘贴方式完成,不调用外部接口 + +## 构建与检查 +- 修改代码后必须运行 `npx tsc --noEmit` 确认零错误 +- 重启服务使用 `pwsh -ExecutionPolicy Bypass -File restart.ps1` +- 开发服务器: `npm run dev` (端口8301) + +## 数据库 +- 云数据库: 阿里云RDS MySQL +- 连接: `mysql://mohe001:***@rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai` +- Prisma单例模式防止热重载多实例 +- 修改Schema后: `npx prisma migrate dev --name <描述>` + +## 认证 +- 管理员: admin@zhuiguang.ai / admin123 +- JWT Session策略 +- middleware.ts保护/admin路由(跳过/admin/login) +- 后台API需requireAdmin中间件验证(src/lib/admin-auth.ts) +- 用户注册/登录: NextAuth Credentials Provider,支持邮箱+密码 + +## API约定 +- 前台API: `/api/` 前缀,无需认证 +- 后台API: `/api/admin/` 前缀,需NextAuth认证 +- 分页参数: `page`(默认1), `pageSize`(默认20) +- 返回格式: `{ data, total, page, pageSize }` 或 `{ success, error }` +- 批量操作: body中传 `ids` 数组 + +## 页面路由 +- 前台: `/`, `/tools`, `/tools/[slug]`, `/categories/[slug]`, `/skills`, `/skills/[slug]`, `/login`, `/user`, `/user/favorites` +- 后台: `/admin/login`, `/admin/pending`, `/admin/pending-skills`, `/admin/tools`, `/admin/skills`, `/admin/categories`, `/admin/skill-categories`, `/admin/discover-tools`, `/admin/check-tools`, `/admin/discover-skills`, `/admin/update-skills`, `/admin/discover-news`, `/admin/system-config` + +## 五大操作指令 + +用户使用以下五个命令时,必须跳转到对应页面理解流程并按流程执行。 +所有页面均为"提示词+JSON粘贴导入"模式,不调用任何外部AI API。 + +### 探索AI工具 +- 页面: `/admin/discover-tools` +- 流程: 选分类 → 复制提示词发给AI → 粘贴JSON → 导入审核列表 → 抓取Logo +- 导入API: POST `/api/admin/discover-tools` body: `{ tools: [...], categoryId }` +- API接收前端提交的工具JSON数组,自动去重导入待审核列表 +- Logo抓取API: POST `/api/admin/pending/fetch-logos` +- 工具分类(20个): 文本生成(165), 图像生成(174), 视频生成(183), 音频与语音(191), 代码开发(199), AI Agent(208), 办公效率(216), 设计与创意(224), 营销与SEO(231), 数据分析(238), 教育与学习(245), 搜索与信息(252), 安全与合规(258), 医疗健康(264), 金融与法律(270), 电商与零售(276), 3D与游戏(282), 科学研究(288), 模型与框架(294), 聊天机器人(302) + +### 检测AI工具 +- 页面: `/admin/check-tools` +- 流程: 选择范围(已发布/待审核) → 一键检测+抓取Logo → 处理失效工具 +- 检测API: POST `/api/admin/check-tools` body: `{ type: "published" | "pending" }` +- 系统自动逐一GET请求检测网站可访问性,同时自动抓取缺失Logo并记录成功方法名 +- 删除API: DELETE `/api/admin/tools/{id}` / `/api/admin/pending/{id}` + +### 探索AI技能 +- 页面: `/admin/discover-skills` +- 流程: 选分类 → 复制提示词发给AI → 粘贴JSON → 导入审核列表 +- 导入API: POST `/api/admin/discover-skills` body: `{ skills: [...], categoryId }` +- API接收前端提交的技能JSON数组,自动去重导入待审核列表 +- 技能分类(20个父分类): 代码生成(1), 测试(10), 代码质量与分析(20), 安全(29), 文档(36), 架构与设计(43), 需求工程(49), DevOps与部署(56), 调试与错误处理(62), 形式化验证(69), 维护与重构(76), 版本控制与协作(82), 开发工具(86), UI/UX设计(91), 科学研究(95), 金融(103), 云服务(109), 移动开发(115), AI/ML工程(120), 营销与增长(127) + +### 更新Skill技能 +- 页面: `/admin/update-skills` +- 流程: 选择范围(已发布/待审核) → 一键更新 → 自动同步星级 +- 更新API: POST `/api/admin/update-stars` body: `{ type: "published" | "pending" }` +- 系统自动从GitHub/Gitee/GitCode API获取最新星级评分并写入数据库 + +### AI新闻发现 +- 页面: `/admin/discover-news` +- 流程: 复制提示词发给AI → 粘贴JSON → 导入今日新闻 +- 导入API: POST `/api/admin/discover-news` body: `{ items: [...] }` +- API接收前端提交的新闻JSON数组,自动生成今日AI日报 +- 新闻分类: 产品发布/融资投资/技术突破/政策法规/开源项目/行业事件 + +### 通用执行规则 +1. **禁止调用任何外部AI API**,所有发现/导入功能通过页面提示词+JSON粘贴方式完成 +2. 页面提供提示词模板(含排除列表),用户复制发给AI助手获取JSON,粘贴到页面导入 +3. 导入API接收JSON数组,自动去重(名称+网址),导入待审核列表 +4. 导入工具后建议执行Logo抓取,确保所有工具有图标 +5. 所有提示词要求: 优先推荐国产AI工具/技能,国内可直连,中文友好 +6. 检测工具时:系统自动GET请求检测网站可访问性,同时抓取缺失Logo +7. 更新技能时:系统自动从GitHub/Gitee/GitCode API获取最新星级 + +## 设计系统 +- 浅色主题,HSL CSS变量 +- 圆角: rounded-xl / rounded-2xl +- 边框: border-border/40 (40%透明度) +- 背景: bg-white/80 (毛玻璃) / bg-white/60 (卡片) / bg-muted/50 (输入框) +- 阴影: shadow-sm (卡片) / shadow-md (悬浮) +- 动画: transition-all duration-200 +- 自定义工具类: .glow-sm, .gradient-text, .glass, .card-shine, .dot-grid, .animate-fade-in +- 颜色规范: 文字用 -600/-700 (非-400),背景用 -50 (非-500/10),边框用 -200/60 (非-500/20) +- 输入框: bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10 + +## 环境变量 +- GITHUB_TOKEN: GitHub Personal Access Token(可选,提升API限流从60→5000次/小时) +- DEEPSEEK_API_KEY: DeepSeek API Key(用于技能评测生成脚本) + +## 踩坑记录 +- Next.js 14不支持useActionState,登录页用原生表单POST +- Prisma MariaDB adapter需要连接字符串方式初始化 +- 图片域名需在next.config.mjs中配置remotePatterns +- 热重载后需清除.next缓存: 删除.next目录后重启 +- Chart.js组件需用dynamic import + ssr: false,不支持服务端渲染 +- Prisma 7.8需通过PrismaMariaDb适配器初始化,不能直接new PrismaClient() +- 服务器环境SSL证书问题: 运行脚本需设置$env:NODE_TLS_REJECT_UNAUTHORIZED="0" diff --git a/.trae/specs/modules.md b/.trae/specs/modules.md new file mode 100644 index 0000000..9321cce --- /dev/null +++ b/.trae/specs/modules.md @@ -0,0 +1,90 @@ +# 追光AI - 模块文档索引 + +## 项目概述 +追光AI是一个AI工具与开源技能目录网站,支持提示词驱动的工具/技能发现、审核管理和前台展示。 + +## 技术栈 + +| 类别 | 技术 | 版本 | +|------|------|------| +| 框架 | Next.js (App Router) | 14.2.35 | +| 语言 | TypeScript | 5.x | +| 样式 | Tailwind CSS + shadcn/ui | 3.x | +| 数据库 | MySQL (阿里云RDS) + Prisma | 7.8 | +| 认证 | NextAuth.js | v4 | +| AI | DeepSeek API (技能评测生成) | deepseek-v4-pro | +| 图表 | Chart.js + react-chartjs-2 | 4.x | +| 部署 | Node.js | 18+ | +| 端口 | 8301-8310 | 默认8301 | + +## 项目结构 +``` +zhuiguang-ai/ +├── prisma/ # 数据库Schema + 迁移 + 种子 +├── public/ # 静态资源 (logo.png, logos/) +├── scripts/ # 独立脚本 (discover-skills, import-tools) +├── src/ +│ ├── app/ +│ │ ├── (admin)/admin/ # 后台页面 (15个页面) +│ │ ├── api/ # API路由 (36+个端点) +│ │ ├── categories/ # 前台分类页 +│ │ ├── skills/ # 前台技能页 +│ │ ├── tools/ # 前台工具页 +│ │ ├── login/ # 用户登录页 +│ │ ├── user/ # 用户中心(个人资料/收藏) +│ │ ├── globals.css # 全局样式 +│ │ ├── layout.tsx # 前台布局 +│ │ └── page.tsx # 首页 +│ ├── components/ # 组件 (Header, Footer, UI, Common) +│ ├── lib/ # 工具库 (prisma, auth, admin-auth, github, deepseek, logo-fetcher, logo-storage, utils) +│ └── middleware.ts # 路由保护 +├── .env # 环境变量 +├── restart.ps1 # 服务重启脚本(端口8301-8310) +└── package.json # 依赖配置 +``` + +## 模块文档 + +| 序号 | 模块 | 文档 | 说明 | +|------|------|------|------| +| 01 | 数据库 | [01-database.md](./modules/01-database.md) | 数据模型、枚举、索引、迁移历史 | +| 02 | API | [02-api.md](./modules/02-api.md) | 前台/后台API端点、SystemConfig配置键 | +| 03 | 页面 | [03-pages.md](./modules/03-pages.md) | 前台/后台页面路由、布局、功能说明 | +| 04 | 组件与样式 | [04-components-and-styles.md](./modules/04-components-and-styles.md) | UI组件、样式系统、设计规范 | +| 05 | AI发现 | [05-ai-discovery.md](./modules/05-ai-discovery.md) | 提示词驱动发现流程、Logo抓取引擎、新闻发现 | +| 06 | 认证 | [06-auth.md](./modules/06-auth.md) | NextAuth配置、路由保护、登录流程 | +| 07 | 工具库与脚本 | [07-lib-and-scripts.md](./modules/07-lib-and-scripts.md) | 工具函数、独立脚本、运维脚本 | + +## 环境变量 +``` +DATABASE_URL=mysql://mohe001:***@rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai +NEXTAUTH_URL=http://localhost:8301 +NEXTAUTH_SECRET= +GITHUB_TOKEN= +DEEPSEEK_API_KEY= +``` + +## 核心业务流程 +``` +提示词模板(页面内嵌) → 用户复制发给AI助手 → AI返回JSON → 粘贴到页面导入 + → PendingTool / PendingSkill (待审核) + → 管理员审核(编辑/发布/拒绝/批量操作) + → Tool / Skill (已发布) + → 前台展示(分类浏览/搜索/详情) +``` + +## 关键特性 +- **提示词驱动**: 页面内嵌提示词模板(含排除列表),用户复制发给AI获取JSON后粘贴导入,不调用外部AI API +- **Logo自动抓取**: 10种策略按优先级执行,fetchLogoWithMethod返回成功方法名,支持20+常见路径和5个Favicon服务 +- **检测+Logo联动**: 检测AI工具时同步抓取缺失Logo,记录每种抓取方法的成功次数统计 +- **双轨内容**: 工具(Tool)面向商业AI产品,技能(Skill)面向GitHub开源项目 +- **批量操作**: 批量导入、批量发布、批量拒绝、一键全部通过 +- **GitHub Star同步**: 通过GitHub API定期更新技能Star数 +- **AI新闻发现**: 提示词驱动发现AI新闻,按日生成日报,6大分类+热度评分 +- **五维评测系统**: GitHub数据采集 + DeepSeek AI评测 + 雷达图展示,5维度(capability/devExp/costLicense/community/performance)评分 +- **分页**: 所有列表页面支持分页(每页20条) +- **浅色主题**: 科技感浅色设计系统,毛玻璃效果+渐变文字+精致阴影 +- **层级分类**: 一级分类+二级分类,左侧导航+标签切换 +- **用户系统**: 邮箱注册/登录、收藏功能、浏览历史 +- **安全加固**: 28个后台API全部添加requireAdmin中间件验证 +- **端口锁定**: 8301-8310区间,禁止使用其他端口 diff --git a/.trae/specs/modules/01-database.md b/.trae/specs/modules/01-database.md new file mode 100644 index 0000000..96bb97e --- /dev/null +++ b/.trae/specs/modules/01-database.md @@ -0,0 +1,136 @@ +# 数据库模块 + +## 技术栈 +- Prisma 7.8 + @prisma/adapter-mariadb +- MySQL (阿里云RDS) +- 连接字符串: `mysql://mohe001:***@rm-0jlbgr2rv6dj3t6jngo.mysql.rds.aliyuncs.com:3306/zhuiguang_ai` + +## 数据模型 + +### Category (工具分类) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Int @id @default(autoincrement()) | 主键 | +| name | String @db.VarChar(100) | 分类名称 | +| slug | String @unique @db.VarChar(100) | URL标识 | +| icon | String? | 图标 | +| parentId | Int? | 父分类ID(自引用) | +| sortOrder | Int @default(0) | 排序权重 | +| createdAt | DateTime | 创建时间 | +| updatedAt | DateTime | 更新时间 | + +### SkillCategory (技能分类) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Int @id @default(autoincrement()) | 主键 | +| name | String @db.VarChar(100) | 分类名称 | +| slug | String @unique @db.VarChar(100) | URL标识 | +| icon | String? | 图标 | +| parentId | Int? | 父分类ID(自引用) | +| sortOrder | Int @default(0) | 排序权重 | +| createdAt | DateTime | 创建时间 | +| updatedAt | DateTime | 更新时间 | + +### Tool (已发布工具) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Int @id | 主键 | +| name | String | 工具名称 | +| slug | String @unique | URL标识 | +| categoryId | Int | 分类ID(必填) | +| description | String @db.Text | 简介 | +| logoUrl | String? | Logo地址 | +| websiteUrl | String | 官网地址 | +| pricingModel | PricingModel | 定价模型(free/freemium/paid/subscription) | +| pricingDetail | String? | 定价详情 | +| features | Json? | 功能特性数组 | +| tags | Json? | 标签数组 | +| viewCount | Int @default(0) | 浏览次数 | +| status | Status @default(draft) | 状态(draft/published) | +| createdAt/updatedAt | DateTime | 时间戳 | + +### PendingTool (待审核工具) +与Tool类似,但categoryId/description/websiteUrl等可为空,额外有sourceUrl和status(pending/approved/rejected)。 + +### Skill (已发布技能) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Int @id | 主键 | +| name | String | 技能名称 | +| slug | String @unique | URL标识 | +| categoryId | Int | 分类ID(必填) | +| description | String @db.Text | 简介 | +| logoUrl | String? | Logo地址 | +| sourceUrl | String | GitHub仓库地址 | +| sourceType | String @default("gitee") | 来源类型 | +| rating | Float @default(0) | 综合评分 | +| features | Json? | 功能特性(含forks/language/license/topics) | +| tags | Json? | 标签数组 | +| viewCount | Int @default(0) | 浏览次数 | +| status | Status | 状态 | +| lastReviewedAt | DateTime? | 最近评测时间 | +| githubStarsHistory | Json? | Star历史数据 | + +### PendingSkill (待审核技能) +与Skill类似,但多个字段可为空。 + +### SystemConfig (系统配置) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Int @id | 主键 | +| key | String @unique | 配置键 | +| value | Json | 配置值(JSON) | + +### SkillReview (技能评测) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Int @id @default(autoincrement()) | 主键 | +| skillId | Int @unique | 关联Skill(一对一) | +| capability | Float | 场景与能力评分(1-5) | +| devExp | Float | 开发体验评分(1-5) | +| costLicense | Float | 成本与许可评分(1-5) | +| community | Float | 社区健康评分(1-5) | +| performance | Float | 性能稳定评分(1-5) | +| overall | Float | 综合评分(五维均值) | +| reviews | Json | 完整评测数据(含各维度summary/detail) | +| longArticle | String? @db.Text | 长文评测 | +| videoScript | String? @db.Text | 视频脚本 | +| socialCards | Json? | 社交卡片数据 | +| status | ReviewStatus @default(DRAFT) | 评测状态 | +| reviewedAt | DateTime @updatedAt | 评测时间 | +| createdAt | DateTime | 创建时间 | + +### ReviewGenerationLog (评测生成日志) +| 字段 | 类型 | 说明 | +|------|------|------| +| id | Int @id @default(autoincrement()) | 主键 | +| skillId | Int | 关联Skill ID | +| status | String @db.VarChar(20) | SUCCESS/FAILED | +| prompt | String @db.Text | 生成提示词 | +| response | String? @db.Text | API响应内容 | +| error | String? @db.Text | 错误信息 | +| createdAt | DateTime | 创建时间 | + +## 枚举 +- `PricingModel`: free, freemium, paid, subscription +- `Status`: draft, published +- `PendingStatus`: pending, approved, rejected +- `ReviewStatus`: DRAFT, PUBLISHED, REJECTED, OUTDATED + +## 索引 +- Tool: categoryId+status联合索引, name+description全文索引 +- Skill: categoryId+status联合索引 +- SkillReview: skillId索引(唯一), overall索引 +- ReviewGenerationLog: skillId索引 + +## 迁移历史 +1. init - 初始化 +2. remove_scraped_at - 移除scrapedAt字段 +3. add_discovery_configs - 添加发现配置 +4. fix_tag_pool_column - 修复标签池列 +5. add_discovery_configs_v2 - 发现配置V2 +6. add_api_providers_and_skills - 添加API提供者和技能 +7. add_skill_categories - 添加技能分类 +8. add_pendingtool_category_relation - 添加待审核工具分类关联 +9. add_hot_score - 添加热度评分 +10. add_skill_reviews - 添加技能评测表(SkillReview/ReviewGenerationLog)、Skill新增lastReviewedAt/githubStarsHistory字段 diff --git a/.trae/specs/modules/02-api.md b/.trae/specs/modules/02-api.md new file mode 100644 index 0000000..f0db86b --- /dev/null +++ b/.trae/specs/modules/02-api.md @@ -0,0 +1,140 @@ +# API模块 + +## 前台API(无需认证) + +### GET /api/homepage +获取首页数据(含嵌套分类结构,一级分类+二级子分类)。 +- 返回: `{ categories: CategoryWithChildren[], skillCategories: SkillCategoryWithChildren[] }` + +### GET /api/categories +获取工具分类树形结构(含子分类),按sortOrder排序。 + +### GET /api/skill-categories +获取技能分类树形结构(含子分类),按sortOrder排序。 + +### GET /api/tools +获取已发布工具列表。 +- Query: `categoryId`, `pricingModel`, `search`, `page`(默认1), `pageSize`(默认20) +- 返回: `{ tools: Tool[], total, page, pageSize }` + +### GET /api/tools/[slug] +获取工具详情(by slug),浏览计数+1。 + +### GET /api/skills +获取已发布技能列表。 +- Query: `category`, `search`, `page`, `pageSize` +- 返回: `{ skills: Skill[], total, page, pageSize }` + +### GET /api/skills/[slug] +获取技能详情(by slug),浏览计数+1。 + +### GET /api/skills/[slug]/review +获取技能的五维评测数据(仅返回PUBLISHED状态)。 +- 返回: `{ capability, devExp, costLicense, community, performance, overall, reviews, longArticle?, videoScript?, socialCards?, reviewedAt }` + +### GET/POST /api/auth/[...nextauth] +NextAuth认证端点(登录/回调/CSRF等)。 + +### 用户相关API(需NextAuth用户认证) + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/user/favorites | GET | 获取当前用户收藏列表(工具+技能) | +| /api/user/favorites | POST | 添加收藏(body: { targetType, targetId }) | +| /api/user/favorites | DELETE | 取消收藏(body: { targetType, targetId }) | +| /api/user/history | GET | 获取浏览历史 | + +--- + +## 后台API(需NextAuth认证) + +### 分类管理 + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/admin/categories | GET | 获取所有分类(含工具数/子分类数) | +| /api/admin/categories | POST | 创建分类 | +| /api/admin/categories/[id] | PUT | 更新分类 | +| /api/admin/categories/[id] | DELETE | 删除分类(有工具/子分类时拒绝) | +| /api/admin/skill-categories | GET | 获取技能分类列表 | +| /api/admin/skill-categories | POST | 创建技能分类 | +| /api/admin/skill-categories/[id] | PUT | 更新技能分类 | +| /api/admin/skill-categories/[id] | DELETE | 删除技能分类 | + +### 工具管理 + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/admin/tools | GET | 获取所有工具(分页) | +| /api/admin/tools | POST | 创建工具 | +| /api/admin/tools/[id] | PUT | 更新工具 | +| /api/admin/tools/[id] | DELETE | 删除工具 | + +### 技能管理 + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/admin/skills | GET | 获取所有技能(分页) | +| /api/admin/skills/[id] | PUT | 更新技能 | +| /api/admin/skills/[id] | DELETE | 删除技能 | + +### 待审核工具 + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/admin/pending | GET | 获取待审核工具列表(分页) | +| /api/admin/pending | DELETE | 清空所有待审核工具 | +| /api/admin/pending/[id] | PUT | 编辑待审核工具(websiteUrl变更时自动抓Logo) | +| /api/admin/pending/[id] | DELETE | 删除单个待审核工具 | +| /api/admin/pending/[id]/publish | POST | 发布为正式工具 | +| /api/admin/pending/batch | POST | 批量导入(去重+自动抓Logo) | +| /api/admin/pending/batch-publish | POST | 批量发布(ids数组) | +| /api/admin/pending/batch-reject | POST | 批量拒绝(ids数组) | +| /api/admin/pending/fetch-logos | POST | 批量抓取Logo(body: {scope, refetch?}) | + +### 待审核技能 + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/admin/pending-skills | GET | 获取待审核技能列表(分页) | +| /api/admin/pending-skills | DELETE | 清空所有待审核技能 | +| /api/admin/pending-skills/[id] | PUT | 编辑待审核技能 | +| /api/admin/pending-skills/[id] | DELETE | 删除单个待审核技能 | +| /api/admin/pending-skills/[id]/publish | POST | 发布为正式技能 | +| /api/admin/pending-skills/batch | POST | 批量导入(去重) | +| /api/admin/pending-skills/batch-publish | POST | 批量发布(ids数组) | +| /api/admin/pending-skills/batch-reject | POST | 批量拒绝(ids数组) | +| /api/admin/pending-skills/publish-all | POST | 一键发布所有待审核技能 | + +### AI发现与检测(提示词+JSON粘贴模式,不调用外部AI API) + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/admin/discover-tools | POST | 导入工具JSON数组(body: {tools: [...], categoryId}),自动去重导入待审核列表 | +| /api/admin/discover-skills | POST | 导入技能JSON数组(body: {skills: [...], categoryId}),自动去重导入待审核列表 | +| /api/admin/discover-news | POST | 导入新闻JSON数组(body: {items: [...]}),自动生成今日AI日报 | +| /api/admin/discover-news | GET | 获取今日AI日报 | +| /api/admin/check-tools | POST | 检测工具网站可访问性+抓取缺失Logo(body: {type: "published"/"pending"}),返回logoFetched/logoMethod/logoUrl | +| /api/admin/update-stars | POST | 更新GitHub Star数(body: {type: "published"/"pending"}) | + +### 系统配置 + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/admin/system-config | GET | 获取所有配置 | +| /api/admin/system-config | PUT | 批量更新配置(upsert) | + +### 评论API(需NextAuth用户认证) + +| 路由 | 方法 | 功能 | +|------|------|------| +| /api/reviews | GET | 获取评论列表(query: type, targetId) | +| /api/reviews | POST | 创建评论(body: { type, targetId, content, rating? }) | + +## SystemConfig 配置键 + +| Key | 类型 | 说明 | +|-----|------|------| +| discoveryPromptConfig | JSON | AI发现提示词配置(含toolPrompt/skillPrompt/newsPrompt/tagPool等) | +| logoFetchConfig | JSON | Logo抓取策略配置 | +| discoverSkillsScript | string | 技能探索脚本源码 | diff --git a/.trae/specs/modules/03-pages.md b/.trae/specs/modules/03-pages.md new file mode 100644 index 0000000..a710d5a --- /dev/null +++ b/.trae/specs/modules/03-pages.md @@ -0,0 +1,137 @@ +# 页面模块 + +## 前台页面 + +### / (首页) +- 文件: `src/app/page.tsx` +- 功能: 搜索框、AI工具分类网格(一级+二级分类,左侧导航+标签切换)、技能分类网格、最新上架工具、热门工具、CTA区块 +- 数据源: `/api/homepage`, `/api/categories`, `/api/skill-categories`, `/api/tools` + +### /tools (工具列表) +- 文件: `src/app/tools/page.tsx` +- 功能: 分类筛选侧边栏(一级分类)、定价模型筛选、搜索、分页 +- 数据源: `/api/categories`, `/api/tools` + +### /tools/[slug] (工具详情) +- 文件: `src/app/tools/[slug]/page.tsx` +- 功能: 工具完整信息展示、浏览计数+1、收藏按钮、评论评价 +- 数据源: `/api/tools/[slug]` + +### /categories/[slug] (分类详情) +- 文件: `src/app/categories/[slug]/page.tsx` +- 功能: 按分类slug展示该分类下的工具 +- 数据源: `/api/categories`, `/api/tools` + +### /skills (技能库) +- 文件: `src/app/skills/page.tsx` +- 功能: 技能分类筛选(一级+二级分类,左侧导航+标签切换)、搜索 +- 数据源: `/api/skill-categories`, `/api/skills` + +### /skills/[slug] (技能详情) +- 文件: `src/app/skills/[slug]/page.tsx` +- 功能: 技能完整信息展示、浏览计数+1、收藏按钮、五维评测雷达图(SkillReviewCard)、评论评价 +- 数据源: `/api/skills/[slug]`, `/api/skills/[slug]/review` + +### /login (用户登录) +- 文件: `src/app/login/page.tsx` +- 功能: 用户邮箱+密码登录/注册,GitHub OAuth登录 +- 数据源: NextAuth Credentials Provider + +### /user (用户中心) +- 文件: `src/app/user/page.tsx` +- 功能: 用户资料编辑、快捷入口、浏览历史 +- 数据源: NextAuth session, `/api/user/history` + +### /user/favorites (我的收藏) +- 文件: `src/app/user/favorites/page.tsx` +- 功能: 收藏的工具和技能列表,支持筛选和搜索 +- 数据源: `/api/user/favorites` + +--- + +## 后台页面 + +### /admin/login (登录) +- 文件: `src/app/(admin)/admin/login/page.tsx` +- 功能: 管理员登录表单,CSRF token + 原生POST +- 凭证: admin@zhuiguang.ai / admin123 + +### /admin/pending (待审核工具) +- 文件: `src/app/(admin)/admin/pending/page.tsx` +- 功能: 审核列表表格、多选复选框、全选、批量通过/拒绝、抓取缺失Logo/重新抓取全部Logo、编辑弹窗、单个通过/拒绝 +- 数据源: `/api/admin/pending`, `/api/admin/pending/batch-publish`, `/api/admin/pending/batch-reject`, `/api/admin/pending/fetch-logos` + +### /admin/pending-skills (待审核技能) +- 文件: `src/app/(admin)/admin/pending-skills/page.tsx` +- 功能: 审核列表表格、多选复选框、全选、批量通过/拒绝、一键全部通过、编辑弹窗、Star数展示、GitHub链接 +- 数据源: `/api/admin/pending-skills`, `/api/admin/pending-skills/batch-publish`, `/api/admin/pending-skills/batch-reject`, `/api/admin/pending-skills/publish-all` + +### /admin/tools (已发布工具) +- 文件: `src/app/(admin)/admin/tools/page.tsx` +- 功能: 工具管理表格、新增/编辑/删除、分页 +- 数据源: `/api/admin/tools`, `/api/admin/categories` + +### /admin/skills (已发布技能) +- 文件: `src/app/(admin)/admin/skills/page.tsx` +- 功能: 技能管理表格、编辑/删除、分页 +- 数据源: `/api/admin/skills`, `/api/admin/skill-categories` + +### /admin/categories (工具分类管理) +- 文件: `src/app/(admin)/admin/categories/page.tsx` +- 功能: 分类CRUD、树形展示、排序 +- 数据源: `/api/admin/categories` + +### /admin/skill-categories (技能分类管理) +- 文件: `src/app/(admin)/admin/skill-categories/page.tsx` +- 功能: 技能分类CRUD +- 数据源: `/api/admin/skill-categories` + +### /admin/discover-tools (探索AI工具) +- 文件: `src/app/(admin)/admin/discover-tools/page.tsx` +- 功能: 选分类→复制提示词→粘贴JSON→导入审核列表→抓取Logo +- 流程: 4步流程(选分类/复制提示词/粘贴导入/抓取Logo),提示词含排除列表,JSON粘贴区+导入按钮,Logo批量抓取 +- 数据源: `/api/admin/discover-tools`, `/api/admin/pending/fetch-logos` + +### /admin/check-tools (检测AI工具) +- 文件: `src/app/(admin)/admin/check-tools/page.tsx` +- 功能: 4步流程(选范围/检测+抓取/Logo方法统计/处理失效),检测可访问性同时自动抓取缺失Logo,记录成功方法名统计 +- 数据源: `/api/admin/check-tools`, `/api/admin/tools/[id]`, `/api/admin/pending/[id]` + +### /admin/discover-skills (探索AI技能) +- 文件: `src/app/(admin)/admin/discover-skills/page.tsx` +- 功能: 选分类→复制提示词→粘贴JSON→导入审核列表 +- 流程: 3步流程(选分类/复制提示词/粘贴导入),提示词含排除列表,JSON粘贴区+导入按钮 +- 数据源: `/api/admin/discover-skills` + +### /admin/update-skills (更新Skill技能) +- 文件: `src/app/(admin)/admin/update-skills/page.tsx` +- 功能: 3步流程(选范围/一键更新/自动同步),更新GitHub/Gitee/GitCode星级,展示Star变化表格 +- 数据源: `/api/admin/update-stars` + +### /admin/discover-news (AI新闻发现) +- 文件: `src/app/(admin)/admin/discover-news/page.tsx` +- 功能: 3步流程(复制提示词/粘贴导入/查看日报),新闻6大分类+热度评分,展示今日AI日报 +- 数据源: `/api/admin/discover-news` + +### /admin/system-config (系统配置) +- 文件: `src/app/(admin)/admin/system-config/page.tsx` +- 功能: Logo抓取配置、发现提示词配置等全局设置 +- 数据源: `/api/admin/system-config` + +--- + +## 布局 + +### 前台布局 +- 文件: `src/app/layout.tsx` +- 结构: Geist字体 → AuthProvider → Header + main + Footer + +### 后台布局 +- 文件: `src/app/(admin)/admin/layout.tsx` +- 结构: 左侧边栏(4组菜单) + 右侧内容区 +- 菜单分组: + - 工具管理: 待审核工具、已发布工具、工具分类 + - 技能库: 待审核技能、已发布技能、技能分类 + - AI发现: 探索AI工具、检测AI工具、探索Skill技能、更新Skill技能、AI新闻发现 + - 系统配置: 系统配置 +- 登录页不显示侧边栏 diff --git a/.trae/specs/modules/04-components-and-styles.md b/.trae/specs/modules/04-components-and-styles.md new file mode 100644 index 0000000..64efbde --- /dev/null +++ b/.trae/specs/modules/04-components-and-styles.md @@ -0,0 +1,117 @@ +# 组件与样式模块 + +## 组件 + +### 布局组件 + +#### Header (`src/components/layout/Header.tsx`) +- 前台顶部导航栏 +- Logo + 导航链接(工具库/技能库/分类浏览) + 搜索框 + 登录/用户按钮 +- 移动端汉堡菜单 +- 滚动时背景模糊效果(bg-white/80 backdrop-blur-2xl) +- 搜索框: bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10 + +#### Footer (`src/components/layout/Footer.tsx`) +- 前台底部页脚 +- Logo + 简介 + 发现/分类/关于链接 + 社交图标(GitHub/Twitter) + +### Provider组件 + +#### AuthProvider (`src/components/providers/auth-provider.tsx`) +- NextAuth SessionProvider 包裹组件 +- 用于在客户端组件中访问session + +### 公共组件 + +#### LoginModal (`src/components/common/LoginModal.tsx`) +- 登录/注册弹窗,支持模式切换 +- 邮箱+密码认证,注册可选填昵称 +- bg-white/95 backdrop-blur-xl + +#### SkillReviewCard (五维评测雷达图) +- 文件: `src/components/common/SkillReviewCard.tsx` +- 用途: 技能详情页展示五维评测雷达图和维度详情卡片 +- 依赖: chart.js, react-chartjs-2 (dynamic import, ssr: false) +- Props: `{ slug: string }` +- 数据源: `/api/skills/${slug}/review` +- 五维度: 场景与能力(capability) / 开发体验(devExp) / 成本与许可(costLicense) / 社区健康(community) / 性能稳定(performance) +- 评分色标: ≥4绿色(emerald) / ≥3黄色(amber) / <3红色(red) +- 设计规范: 遵循浅色主题设计系统,紫色(violet)主色调雷达图 + +### ReviewSection (`src/components/common/ReviewSection.tsx`) +- 用户评论/评价组件,支持评分和文字评论 +- 支持tool和skill两种类型 +- bg-white/80卡片,bg-white/60评论项 + +#### FavoriteButton (`src/components/common/FavoriteButton.tsx`) +- 收藏按钮,乐观更新 +- text-gray-500 hover:text-red-500 + +#### CategorySidebar (`src/components/common/CategorySidebar.tsx`) +- 分类侧边栏,支持搜索和分类选择 +- bg-muted/50搜索框 + +### UI组件 (shadcn/ui) + +#### Button (`src/components/ui/button.tsx`) +- 6种变体: default, outline, secondary, ghost, destructive, link +- 4种尺寸: default, sm, lg, icon + +#### Card (`src/components/ui/card.tsx`) +- Card/CardHeader/CardTitle/CardDescription/CardContent/CardFooter + +#### Dialog (`src/components/ui/dialog.tsx`) +- 基于 @radix-ui/react-dialog +- Dialog/DialogTrigger/DialogContent/DialogHeader/DialogTitle/DialogDescription/DialogFooter/DialogClose +- 遮罩层: bg-black/80 + +--- + +## 样式系统 + +### 全局样式 (`src/app/globals.css`) +- 浅色主题CSS变量(HSL色系) +- shadcn/ui 主题变量 +- 自定义工具类: + - `.glow-sm` / `.glow-md` / `.glow-lg` - 发光效果 + - `.gradient-text` - 渐变文字(蓝→紫→粉) + - `.gradient-border` - 渐变边框 + - `.glass` / `.glass-sm` - 毛玻璃效果(bg-white/80 + backdrop-blur) + - `.card-shine` - 卡片光泽动画 + - `.dot-grid` - 点阵网格背景 + - `.animate-fade-in` - 淡入动画 + - `.animate-slide-up` - 上滑动画 + - `.animate-float` - 浮动动画 + - `.animate-pulse-glow` - 脉冲发光 + +### Tailwind配置 (`tailwind.config.ts`) +- 浅色模式: class策略 +- 主题色系: HSL CSS变量(background: 210 20% 98%, foreground: 222 47% 11%, primary: 221 83% 53%等) +- 动画: fade-in, slide-up, float, glow-pulse +- 自定义字体: Geist Sans, Geist Mono + +### 设计规范 +- 圆角: 统一使用 rounded-xl (12px) 或 rounded-2xl (16px) +- 边框: border-border/40 (40%透明度) +- 背景: bg-white/80 (毛玻璃) / bg-white/60 (卡片) / bg-muted/50 (输入框) +- 阴影: shadow-sm (卡片) / shadow-md (悬浮) +- 间距: 统一使用 Tailwind 间距系统 +- 动画: transition-all duration-200 + +### 颜色规范(浅色主题) +- 文字颜色: 使用 -600/-700 系列(如 text-blue-700, text-emerald-600) +- 背景颜色: 使用 -50 系列(如 bg-blue-50, bg-emerald-50) +- 边框颜色: 使用 -200/60 系列(如 border-blue-200/60, border-emerald-200/60) +- 严禁使用暗色主题的 -400 文字、-500/10 背景、-500/20 边框 +- 输入框: bg-muted/50 focus:bg-white focus:ring-2 focus:ring-primary/10 + +### 定价模型颜色 +- free: bg-emerald-50 text-emerald-700 border-emerald-200/60 +- freemium: bg-blue-50 text-blue-700 border-blue-200/60 +- paid: bg-amber-50 text-amber-700 border-amber-200/60 +- subscription: bg-purple-50 text-purple-700 border-purple-200/60 + +### 来源类型颜色 +- github: bg-slate-50 text-slate-700 +- gitlab: bg-orange-50 text-orange-700 +- huggingface: bg-yellow-50 text-yellow-700 diff --git a/.trae/specs/modules/05-ai-discovery.md b/.trae/specs/modules/05-ai-discovery.md new file mode 100644 index 0000000..d8d65e7 --- /dev/null +++ b/.trae/specs/modules/05-ai-discovery.md @@ -0,0 +1,132 @@ +# AI发现模块 + +## 概述 +AI发现模块是追光AI的核心功能,采用"提示词+JSON粘贴导入"模式,用户复制页面内嵌的提示词发给AI助手,获取JSON后粘贴到页面导入,不调用任何外部AI API。 + +## 架构 +``` +页面内嵌提示词模板(含排除列表) → 用户复制发给AI助手 → AI返回JSON → 粘贴到页面 → API去重导入 → PendingTool/PendingSkill → 管理员审核 → Tool/Skill +``` + +## 五大操作指令 + +### 探索AI工具 (`/admin/discover-tools`) +1. 选择分类(20个工具分类) +2. 复制提示词(自动注入排除列表) +3. 粘贴AI返回的JSON到输入框 +4. 点击导入按钮,API自动去重导入待审核列表 +5. 可选:批量抓取Logo + +### 检测AI工具 (`/admin/check-tools`) +1. 选择范围(已发布/待审核) +2. 一键检测+抓取Logo +3. 系统自动逐一GET请求检测网站可访问性 +4. 同时自动抓取缺失Logo,记录成功方法名 +5. 展示Logo抓取方法统计(按成功次数排序) +6. 失效工具可一键删除 + +### 探索AI技能 (`/admin/discover-skills`) +1. 选择分类(20个技能分类) +2. 复制提示词(自动注入排除列表) +3. 粘贴AI返回的JSON到输入框 +4. 点击导入按钮,API自动去重导入待审核列表 + +### 更新Skill技能 (`/admin/update-skills`) +1. 选择范围(已发布/待审核) +2. 一键更新Star +3. 系统自动从GitHub/Gitee/GitCode API获取最新星级 +4. 展示Star变化表格(上升/下降/不变) + +### AI新闻发现 (`/admin/discover-news`) +1. 复制新闻发现提示词 +2. 粘贴AI返回的JSON到输入框 +3. 点击导入按钮,自动生成今日AI日报 +4. 新闻6大分类:产品发布/融资投资/技术突破/政策法规/开源项目/行业事件 +5. 每条新闻含热度评分(1-100) + +## Logo抓取引擎 (`src/lib/logo-fetcher.ts`) + +### 核心API +- `fetchLogo(websiteUrl, html?): Promise` — 返回Logo URL +- `fetchLogoWithMethod(websiteUrl, html?): Promise<{url, method}>` — 返回Logo URL + 成功方法名 + +### 抓取策略(按优先级,共10种) +1. **HTML Link图标**: 解析 `` 标签 +2. **OG/Twitter图片**: 解析 `` 标签 +3. **HTML Manifest**: 解析 `manifest.json` 中的icons数组 +4. **HTML img标签**: 查找class/alt含"logo"的img标签 +5. **Header区域Logo**: 解析header/nav区域内的img标签 +6. **SVG Logo**: 查找内联SVG logo +7. **常见路径**: 尝试 /apple-touch-icon.png, /logo.png, /favicon.ico 等 +8. **Favicon服务**: + - favicon.im + - Google Favicons (sz=128/64) + - Clearbit + - DuckDuckGo + - Favicon Grabr (API解析) + - Icon Horse (API解析) +9. **Brandfetch品牌库**: 通过Brandfetch API获取品牌Logo +10. **截图兜底**: 通过截图服务获取网站截图 + +### 配置项 +- `enabledMethods`: 启用的抓取方法 +- `commonPaths`: 常见图标路径列表 +- `faviconServices`: Favicon服务列表 +- `minFileSize`: 最小文件大小(默认50字节) +- `requestTimeout`: 请求超时(默认10秒) + +### Logo本地存储 (`src/lib/logo-storage.ts`) +- `downloadLogo(url, filename): Promise` — 下载Logo到 `/public/logos/` 目录 +- 返回本地路径如 `/logos/filename.png` + +## 脚本 + +### discover-skills.mjs +- 独立运行的AI技能发现脚本 +- 遍历20个技能分类,每类调用DeepSeek API推荐10个GitHub开源项目 +- 通过 `/api/admin/pending-skills/batch` 批量导入 +- 每分类间隔3秒避免限流 +- 自动排除已收录技能 + +### import-tools-batch1.mjs / import-tools-batch2.mjs +- 硬编码的AI工具数据导入脚本 +- 通过 `/api/admin/pending/batch` 批量导入 + +## 自动化评测流程 + +### 架构概览 +``` +GitHub API (octokit) → 搜索热门仓库 → 获取README + ↓ +DeepSeek API (openai兼容) → 五维评测生成 → JSON解析+校验 + ↓ +Prisma → Skill记录 + SkillReview记录 + ReviewGenerationLog日志 + ↓ +前端 → /api/skills/[slug]/review → SkillReviewCard雷达图展示 +``` + +### 评测脚本 (scripts/auto-review.mjs) +- 搜索关键词: ai agent, llm framework, rag, prompt engineering +- 每日限制: 8个项目 (DAILY_LIMIT可配置) +- 最低Star数: 500 +- 去重: 通过sourceUrl检查是否已存在 +- 综合分校验: 自动计算五维均分,偏差>0.3时修正 +- 评测状态: 初始为DRAFT,需手动或通过脚本改为PUBLISHED + +### 五维评测维度 +| 维度 | 字段 | 说明 | +|------|------|------| +| 场景与能力 | capability | 场景覆盖度和核心能力 | +| 开发体验 | devExp | 安装、文档、API易用性 | +| 成本与许可 | costLicense | 硬件成本、API定价、许可证风险 | +| 社区健康 | community | Issue响应、PR频率、生态 | +| 性能稳定 | performance | 运行效率、稳定性、输出质量 | + +### 评测标签分类 +LLM框架, Agent框架, RAG, 提示工程, 多模态, 代码助手, 模型训练, 数据工程, 部署工具, 评测工具, 安全对齐, 其他 + +### 发布评测脚本 (scripts/publish-reviews.mjs) +- 将DRAFT状态评测改为PUBLISHED +- 同时将对应Skill状态从draft改为published + +## 踩坑记录 diff --git a/.trae/specs/modules/06-auth.md b/.trae/specs/modules/06-auth.md new file mode 100644 index 0000000..3d25ce0 --- /dev/null +++ b/.trae/specs/modules/06-auth.md @@ -0,0 +1,58 @@ +# 认证模块 + +## 技术栈 +- NextAuth.js v4 +- Credentials Provider(用户名密码 + 用户邮箱密码) +- JWT Session策略 + +## 配置 (`src/lib/auth.ts`) + +### 管理员认证 +- 唯一凭证: `admin@zhuiguang.ai` / `admin123` +- 硬编码在auth.ts中,非数据库查询 + +### 用户认证 +- 邮箱+密码注册/登录 +- 用户数据存储在User表 +- 密码bcrypt加密 + +### Session策略 +- 使用JWT,不使用数据库session +- JWT密钥: `NEXTAUTH_SECRET` 环境变量 + +### 回调函数 +- `jwt`: 登录时将用户信息加入token +- `session`: 将token中的用户信息传递给session + +## 路由保护 (`src/middleware.ts`) + +### 保护规则 +- 保护 `/admin` 下所有路由 +- 跳过 `/admin/login` +- 使用NextAuth middleware进行认证检查 + +### 登录流程 +1. 访问 `/admin/*` → middleware检查session +2. 未登录 → 重定向到 `/admin/login` +3. 登录页提交表单 → Server Action验证凭证 +4. 验证成功 → 重定向到 `/admin` + +## 管理员API认证 (`src/lib/admin-auth.ts`) + +### requireAdmin中间件 +- 所有 `/api/admin/` 路由必须使用requireAdmin中间件 +- 验证流程: 检查session → 验证邮箱是否为admin@zhuiguang.ai +- 已覆盖28个后台API端点 + +## 登录页 +- 管理员登录: `src/app/(admin)/admin/login/page.tsx` (原生HTML表单 + CSRF Token) +- 用户登录: `src/app/login/page.tsx` (NextAuth Credentials + GitHub OAuth) +- 用户登录弹窗: `src/components/common/LoginModal.tsx` + +## 环境变量 +``` +NEXTAUTH_URL=http://localhost:3100 +NEXTAUTH_SECRET= +GITHUB_ID= +GITHUB_SECRET= +``` diff --git a/.trae/specs/modules/07-lib-and-scripts.md b/.trae/specs/modules/07-lib-and-scripts.md new file mode 100644 index 0000000..808fe53 --- /dev/null +++ b/.trae/specs/modules/07-lib-and-scripts.md @@ -0,0 +1,110 @@ +# 工具库与脚本模块 + +## 工具库 (`src/lib/`) + +### src/lib/github.ts (GitHub数据采集) +- 依赖: octokit +- 认证: process.env.GITHUB_TOKEN (可选,提升限流60→5000次/小时) +- `searchHotRepos(query, minStars, maxResults)`: 搜索热门仓库,按Star降序 +- `getRepoReadme(owner, repo)`: 获取仓库README内容(base64解码) +- `GitHubRepo` 接口: id, full_name, html_url, description, stargazers_count, forks_count, language, license, topics, updated_at, readme + +### src/lib/deepseek.ts (DeepSeek评测生成) +- 依赖: openai (兼容OpenAI接口) +- 认证: process.env.DEEPSEEK_API_KEY +- baseURL: https://api.deepseek.com/v1 +- 模型: deepseek-v4-pro +- `generateReview(repoName, description, stars, license, readme)`: 调用DeepSeek生成五维评测 +- `ReviewDimension` 接口: { score, summary, detail } +- `ReviewResult` 接口: capability, devExp, costLicense, community, performance, overall, tags +- 综合分校验: 自动计算五维均分,偏差>0.3时修正 +- JSON提取: 兼容markdown代码块包裹的响应 + +### prisma.ts - 数据库客户端 +- Prisma单例模式,防止开发环境热重载创建多实例 +- 使用PrismaMariaDb adapter +- 连接池配置 + +### auth.ts - 认证配置 +- NextAuth配置导出 +- Credentials Provider(管理员+用户) +- JWT策略 +- GitHub OAuth Provider +- 导出GET/POST handler + +### admin-auth.ts - 管理员API认证 +- 导出 `requireAdmin()` 中间件函数 +- 验证session中邮箱是否为admin@zhuiguang.ai +- 所有 `/api/admin/` 路由必须使用此中间件 +- 返回401/403错误响应 + +### utils.ts - 工具函数 +- `cn()`: 合并clsx + tailwind-merge的className工具 + +### logo-fetcher.ts - Logo抓取引擎 +- 导出 `fetchLogo(websiteUrl, html?): Promise` — 返回Logo URL +- 导出 `fetchLogoWithMethod(websiteUrl, html?): Promise` — 返回 `{url, method}` +- 10种抓取策略按优先级执行 +- 支持从SystemConfig读取配置 +- 每种成功方法返回中文名称(如"HTML Link图标"、"OG/Twitter图片"等) +- 详见 [05-ai-discovery.md](./05-ai-discovery.md) + +### logo-storage.ts - Logo本地存储 +- 导出 `downloadLogo(url, filename): Promise` +- 下载远程Logo到 `/public/logos/` 目录 +- 返回本地路径如 `/logos/filename.png` + +--- + +## 脚本 (`scripts/`) + +### discover-skills.mjs - AI技能发现 +- 独立运行的Node.js脚本 +- 遍历20个技能分类,每类调用DeepSeek API推荐10个GitHub开源项目 +- 通过 `/api/admin/pending-skills/batch` 批量导入 +- 自动排除已收录技能 +- 每分类间隔3秒 +- 运行: `node scripts/discover-skills.mjs` + +### import-tools-batch1.mjs - 第一批工具导入 +- 硬编码约80个国产AI工具 +- 分类: 文本生成(165)/图像生成(174)/视频生成(183)/音频与语音(191) + +### import-tools-batch2.mjs - 第二批工具导入 +- 硬编码约200个国产AI工具 +- 分类: 代码开发/AI Agent/办公效率/设计创意/营销SEO/数据分析/教育学习/搜索信息/安全合规/医疗健康/金融法律/电商零售/3D游戏/科学研究/模型框架/聊天机器人 + +--- + +## 运维脚本 + +### scripts/auto-review.mjs (自动化评测脚本) +- 依赖: @prisma/client, @prisma/adapter-mariadb, octokit, openai +- 流程: GitHub搜索→README获取→DeepSeek评测→Skill入库→SkillReview入库→日志记录 +- 配置: SEARCH_QUERIES(4个关键词), MIN_STARS(500), MAX_PER_QUERY(5), DAILY_LIMIT(8) +- 去重: 通过sourceUrl检查 +- slug生成: repo full_name转小写+连字符 +- 默认分类ID: 120 (AI/ML工程) +- 运行: `$env:NODE_TLS_REJECT_UNAUTHORIZED="0"; node scripts/auto-review.mjs` + +### scripts/publish-reviews.mjs (发布评测脚本) +- 将DRAFT状态SkillReview改为PUBLISHED +- 将对应draft状态Skill改为published + +### scripts/test-github.mjs (GitHub API测试) +- 测试searchHotRepos和getRepoReadme功能 +- 运行: `$env:NODE_TLS_REJECT_UNAUTHORIZED="0"; node -r dotenv/config scripts/test-github.mjs` + +### scripts/test-deepseek.mjs (DeepSeek API测试) +- 测试generateReview功能,使用langflow作为测试用例 +- 运行: `$env:NODE_TLS_REJECT_UNAUTHORIZED="0"; node scripts/test-deepseek.mjs` + +### restart.ps1 - 服务重启 +- PowerShell脚本 +- 扫描8301-8310端口 +- 杀死占用进程 +- 执行 `npm run dev` 启动服务(端口8301) +- 运行: `pwsh -ExecutionPolicy Bypass -File restart.ps1` + +### temp_clear.mjs - 临时清理 +- 清空pending_tools表 diff --git a/_skill-prompts/01_代码生成.txt b/_skill-prompts/01_代码生成.txt new file mode 100644 index 0000000..56cdbb9 --- /dev/null +++ b/_skill-prompts/01_代码生成.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"代码生成"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/02_测试.txt b/_skill-prompts/02_测试.txt new file mode 100644 index 0000000..75460b5 --- /dev/null +++ b/_skill-prompts/02_测试.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"测试"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/03_代码质量与分析.txt b/_skill-prompts/03_代码质量与分析.txt new file mode 100644 index 0000000..aa320a0 --- /dev/null +++ b/_skill-prompts/03_代码质量与分析.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"代码质量与分析"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/04_安全.txt b/_skill-prompts/04_安全.txt new file mode 100644 index 0000000..bbbe4a7 --- /dev/null +++ b/_skill-prompts/04_安全.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"安全"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/05_文档.txt b/_skill-prompts/05_文档.txt new file mode 100644 index 0000000..f1d8416 --- /dev/null +++ b/_skill-prompts/05_文档.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"文档"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/06_架构与设计.txt b/_skill-prompts/06_架构与设计.txt new file mode 100644 index 0000000..bae0266 --- /dev/null +++ b/_skill-prompts/06_架构与设计.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"架构与设计"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/07_需求工程.txt b/_skill-prompts/07_需求工程.txt new file mode 100644 index 0000000..2e5e55e --- /dev/null +++ b/_skill-prompts/07_需求工程.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"需求工程"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/08_DevOps 与部署.txt b/_skill-prompts/08_DevOps 与部署.txt new file mode 100644 index 0000000..5f6a1a4 --- /dev/null +++ b/_skill-prompts/08_DevOps 与部署.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"DevOps 与部署"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/09_调试与错误处理.txt b/_skill-prompts/09_调试与错误处理.txt new file mode 100644 index 0000000..3895209 --- /dev/null +++ b/_skill-prompts/09_调试与错误处理.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"调试与错误处理"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/10_形式化验证.txt b/_skill-prompts/10_形式化验证.txt new file mode 100644 index 0000000..1c5d58e --- /dev/null +++ b/_skill-prompts/10_形式化验证.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"形式化验证"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/11_维护与重构.txt b/_skill-prompts/11_维护与重构.txt new file mode 100644 index 0000000..deb1f5d --- /dev/null +++ b/_skill-prompts/11_维护与重构.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"维护与重构"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/12_版本控制与协作.txt b/_skill-prompts/12_版本控制与协作.txt new file mode 100644 index 0000000..9eb4124 --- /dev/null +++ b/_skill-prompts/12_版本控制与协作.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"版本控制与协作"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/13_开发工具.txt b/_skill-prompts/13_开发工具.txt new file mode 100644 index 0000000..bfe74d4 --- /dev/null +++ b/_skill-prompts/13_开发工具.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"开发工具"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/14_UI-UX 设计.txt b/_skill-prompts/14_UI-UX 设计.txt new file mode 100644 index 0000000..85e2954 --- /dev/null +++ b/_skill-prompts/14_UI-UX 设计.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"UI/UX 设计"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/15_科学研究.txt b/_skill-prompts/15_科学研究.txt new file mode 100644 index 0000000..1036a53 --- /dev/null +++ b/_skill-prompts/15_科学研究.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"科学研究"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/16_金融.txt b/_skill-prompts/16_金融.txt new file mode 100644 index 0000000..71a22f8 --- /dev/null +++ b/_skill-prompts/16_金融.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"金融"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/17_云服务.txt b/_skill-prompts/17_云服务.txt new file mode 100644 index 0000000..996411f --- /dev/null +++ b/_skill-prompts/17_云服务.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"云服务"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/18_移动开发.txt b/_skill-prompts/18_移动开发.txt new file mode 100644 index 0000000..29d431d --- /dev/null +++ b/_skill-prompts/18_移动开发.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"移动开发"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/19_AI-ML 工程.txt b/_skill-prompts/19_AI-ML 工程.txt new file mode 100644 index 0000000..da55be8 --- /dev/null +++ b/_skill-prompts/19_AI-ML 工程.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"AI/ML 工程"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/20_营销与增长.txt b/_skill-prompts/20_营销与增长.txt new file mode 100644 index 0000000..af18bb5 --- /dev/null +++ b/_skill-prompts/20_营销与增长.txt @@ -0,0 +1,20 @@ +你是AI编程技能专家。请为"营销与增长"领域推荐 12 个真实存在且活跃的AI编程技能(Prompt/Agent/Workflow/开源项目)。 + +严格要求: +1. 优先推荐 Gitee(gitee.com)和 GitCode(gitcode.com)上的国内开源项目,也接受少量优秀的国际开源项目 +2. 推荐的技能必须是真实可用的AI编程技能,可以是开源项目、Prompt模板、AI Agent配置或自动化工作流 +3. sourceUrl必须是真实可访问的链接(Gitee仓库、GitCode仓库、GitHub仓库等) +4. 每个技能的name、sourceUrl必须唯一,不能与已有技能重复 +5. 技能应该有实用价值,能直接用于编程开发场景 +6. rating为该技能在来源平台上的用户评分(1.0-5.0分),如无评分则根据star数和活跃度估算 + +每个技能包含以下字段: +- name: 技能名称(简洁明了,如"React组件生成器"、"SQL注入检测Agent") +- description: 一句话中文简介(50字以内,突出核心能力和使用场景) +- sourceUrl: 来源链接(Gitee仓库URL、GitCode仓库URL或GitHub仓库URL,必须以http://或https://开头) +- sourceType: 来源类型,只能是以下之一:"gitee"、"gitcode"、"github"、"other" +- rating: 用户评分(1.0-5.0之间的浮点数,如4.5、3.8) +- features: 功能特性数组(3-5个关键特性,每个特性10字以内) +- tags: 标签数组(3-5个标签,从限定标签池中选取:代码生成、代码审查、自动化测试、安全检测、文档生成、DevOps、重构、调试、AI Agent、Prompt工程、RAG、MCP、前端开发、后端开发、移动开发、云原生、开源项目、中文优化、开箱即用、企业级) + +返回纯JSON数组,不要包含任何其他文字、markdown标记或代码块标记。 \ No newline at end of file diff --git a/_skill-prompts/_summary.json b/_skill-prompts/_summary.json new file mode 100644 index 0000000..7c2059f --- /dev/null +++ b/_skill-prompts/_summary.json @@ -0,0 +1,162 @@ +[ + { + "index": 1, + "categoryId": 1, + "categoryName": "代码生成", + "filename": "01_代码生成.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 2, + "categoryId": 10, + "categoryName": "测试", + "filename": "02_测试.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 3, + "categoryId": 20, + "categoryName": "代码质量与分析", + "filename": "03_代码质量与分析.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 4, + "categoryId": 29, + "categoryName": "安全", + "filename": "04_安全.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 5, + "categoryId": 36, + "categoryName": "文档", + "filename": "05_文档.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 6, + "categoryId": 43, + "categoryName": "架构与设计", + "filename": "06_架构与设计.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 7, + "categoryId": 49, + "categoryName": "需求工程", + "filename": "07_需求工程.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 8, + "categoryId": 56, + "categoryName": "DevOps 与部署", + "filename": "08_DevOps 与部署.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 9, + "categoryId": 62, + "categoryName": "调试与错误处理", + "filename": "09_调试与错误处理.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 10, + "categoryId": 69, + "categoryName": "形式化验证", + "filename": "10_形式化验证.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 11, + "categoryId": 76, + "categoryName": "维护与重构", + "filename": "11_维护与重构.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 12, + "categoryId": 82, + "categoryName": "版本控制与协作", + "filename": "12_版本控制与协作.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 13, + "categoryId": 86, + "categoryName": "开发工具", + "filename": "13_开发工具.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 14, + "categoryId": 91, + "categoryName": "UI/UX 设计", + "filename": "14_UI-UX 设计.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 15, + "categoryId": 95, + "categoryName": "科学研究", + "filename": "15_科学研究.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 16, + "categoryId": 103, + "categoryName": "金融", + "filename": "16_金融.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 17, + "categoryId": 109, + "categoryName": "云服务", + "filename": "17_云服务.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 18, + "categoryId": 115, + "categoryName": "移动开发", + "filename": "18_移动开发.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 19, + "categoryId": 120, + "categoryName": "AI/ML 工程", + "filename": "19_AI-ML 工程.txt", + "currentCount": 0, + "needCount": 10 + }, + { + "index": 20, + "categoryId": 127, + "categoryName": "营销与增长", + "filename": "20_营销与增长.txt", + "currentCount": 0, + "needCount": 10 + } +] \ No newline at end of file diff --git a/components.json b/components.json new file mode 100644 index 0000000..3baf6c5 --- /dev/null +++ b/components.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "base-nova", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app/globals.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "rtl": false, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "menuColor": "default", + "menuAccent": "subtle", + "registries": {} +} diff --git a/next.config.mjs b/next.config.mjs index 4678774..0887c8a 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,4 +1,78 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {}; +const nextConfig = { + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "**", + }, + ], + minimumCacheTTL: 3600, + formats: ["image/avif", "image/webp"], + }, + compress: true, + poweredByHeader: false, + reactStrictMode: true, + webpack: (config, { isServer }) => { + config.watchOptions = { + ...config.watchOptions, + ignored: [ + "**/node_modules/**", + "**/.git/**", + "**/System Volume Information/**", + "**/DumpStack.log.tmp", + "**/pagefile.sys", + ], + poll: false, + }; + return config; + }, + onDemandEntries: { + maxInactiveAge: 60 * 1000, + pagesBufferLength: 5, + }, + experimental: { + optimizeCss: false, + }, + headers: async () => { + const isDev = process.env.NODE_ENV === "development"; + + const headers = [ + { + source: "/api/:path*", + headers: [ + { key: "X-Content-Type-Options", value: "nosniff" }, + { key: "X-Frame-Options", value: "DENY" }, + { key: "X-XSS-Protection", value: "1; mode=block" }, + { key: "Referrer-Policy", value: "strict-origin-when-cross-origin" }, + ], + }, + { + source: "/logos/:path*", + headers: [ + { key: "Cache-Control", value: isDev ? "no-cache" : "public, max-age=86400, immutable" }, + ], + }, + ]; + + if (isDev) { + headers.push({ + source: "/(.*)", + headers: [ + { key: "Cache-Control", value: "no-store, no-cache, must-revalidate, proxy-revalidate" }, + ], + }); + } else { + headers.push({ + source: "/_next/static/:path*", + headers: [ + { key: "Cache-Control", value: "public, max-age=31536000, immutable" }, + ], + }); + } + + return headers; + }, +}; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index ac33cfd..43ea689 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,16 +8,38 @@ "name": "zhuiguang-ai", "version": "0.1.0", "dependencies": { + "@base-ui/react": "^1.4.1", + "@prisma/adapter-mariadb": "^7.8.0", + "@prisma/client": "^7.8.0", + "@radix-ui/react-dialog": "^1.1.15", + "@types/bcryptjs": "^2.4.6", + "axios": "^1.15.2", + "bcryptjs": "^3.0.3", + "chart.js": "^4.5.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^1.11.0", "next": "14.2.35", + "next-auth": "^4.24.14", + "octokit": "^5.0.5", + "openai": "^6.38.0", + "prisma": "^7.8.0", "react": "^18", - "react-dom": "^18" + "react-chartjs-2": "^5.3.1", + "react-dom": "^18", + "shadcn": "^4.5.0", + "tailwind-merge": "^3.5.0", + "tw-animate-css": "^1.4.0" }, "devDependencies": { "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "dotenv": "^17.4.2", + "mysql2": "^3.22.3", "postcss": "^8", "tailwindcss": "^3.4.1", + "ts-node": "^10.9.2", "typescript": "^5" } }, @@ -34,22 +56,861 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "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.npmmirror.com/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "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-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "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-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "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.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "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-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "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.npmmirror.com/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "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.npmmirror.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base-ui/react": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/@base-ui/react/-/react-1.4.1.tgz", + "integrity": "sha512-Ab5/LIhcmL8BQcsBUYiOfkSDRdLpvgUBzMK30cu684JPcLclYlztharvCZyNNgzJtbAiREzI9q0pI5erHCMgCw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@base-ui/utils": "0.2.8", + "@floating-ui/react-dom": "^2.1.8", + "@floating-ui/utils": "^0.2.11", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@date-fns/tz": "^1.2.0", + "@types/react": "^17 || ^18 || ^19", + "date-fns": "^4.0.0", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@date-fns/tz": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "date-fns": { + "optional": true + } + } + }, + "node_modules/@base-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmmirror.com/@base-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-jvOi+c+ftGlGotNcKnzPVg2IhCaDTB6/6R3JeqdjdXktuAJi3wKH9T7+svuaKh1mmfVU11UWzUZVH74JDfi/wQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@floating-ui/utils": "^0.2.11", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "peerDependencies": { + "@types/react": "^17 || ^18 || ^19", + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dotenvx/dotenvx": { + "version": "1.64.0", + "resolved": "https://registry.npmmirror.com/@dotenvx/dotenvx/-/dotenvx-1.64.0.tgz", + "integrity": "sha512-6+xRpZaWuHXEqnhBjae+VmQI9Uaqw5Uzu/ScpO+W7ww9Zp3lHSNBoNjFcUxhrCyc7pRGQzyDjhKzloqrPHERiQ==", + "license": "BSD-3-Clause", + "dependencies": { + "commander": "^11.1.0", + "dotenv": "^17.2.1", + "eciesjs": "^0.4.10", + "execa": "^5.1.1", + "fdir": "^6.2.0", + "ignore": "^5.3.0", + "object-treeify": "1.1.33", + "picomatch": "^4.0.4", + "which": "^4.0.0", + "yocto-spinner": "^1.1.0" + }, + "bin": { + "dotenvx": "src/cli/dotenvx.js" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@dotenvx/dotenvx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/@dotenvx/dotenvx/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@ecies/ciphers": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/@ecies/ciphers/-/ciphers-0.2.6.tgz", + "integrity": "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g==", + "license": "MIT", + "engines": { + "bun": ">=1", + "deno": ">=2.7.10", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" + } + }, + "node_modules/@electric-sql/pglite": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@electric-sql/pglite/-/pglite-0.4.1.tgz", + "integrity": "sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==", + "license": "Apache-2.0" + }, + "node_modules/@electric-sql/pglite-socket": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/@electric-sql/pglite-socket/-/pglite-socket-0.1.1.tgz", + "integrity": "sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==", + "license": "Apache-2.0", + "bin": { + "pglite-server": "dist/scripts/server.js" + }, + "peerDependencies": { + "@electric-sql/pglite": "0.4.1" + } + }, + "node_modules/@electric-sql/pglite-tools": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/@electric-sql/pglite-tools/-/pglite-tools-0.3.1.tgz", + "integrity": "sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==", + "license": "Apache-2.0", + "peerDependencies": { + "@electric-sql/pglite": "0.4.1" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@hono/node-server": { + "version": "1.19.14", + "resolved": "https://registry.npmmirror.com/@hono/node-server/-/node-server-1.19.14.tgz", + "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@inquirer/ansi": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@inquirer/ansi/-/ansi-2.0.5.tgz", + "integrity": "sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.0.12", + "resolved": "https://registry.npmmirror.com/@inquirer/confirm/-/confirm-6.0.12.tgz", + "integrity": "sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.1.9", + "@inquirer/type": "^4.0.5" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "11.1.9", + "resolved": "https://registry.npmmirror.com/@inquirer/core/-/core-11.1.9.tgz", + "integrity": "sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.5", + "@inquirer/figures": "^2.0.5", + "@inquirer/type": "^4.0.5", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@inquirer/figures/-/figures-2.0.5.tgz", + "integrity": "sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + } + }, + "node_modules/@inquirer/type": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/@inquirer/type/-/type-4.0.5.tgz", + "integrity": "sha512-aetVUNeKNc/VriqXlw1NRSW0zhMBB0W4bNbWRJgzRl/3d0QNDQFfk0GO5SDdtjMZVg6o8ZKEiadd7SCCzoOn5Q==", + "license": "MIT", + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmmirror.com/@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.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "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.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -59,20 +920,87 @@ "version": "1.5.5", "resolved": "https://registry.npmmirror.com/@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.npmmirror.com/@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/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@mswjs/interceptors": { + "version": "0.41.6", + "resolved": "https://registry.npmmirror.com/@mswjs/interceptors/-/interceptors-0.41.6.tgz", + "integrity": "sha512-qmDvJIjcNsZ6tXWy2G9yuCgMPTTn35GMA3dPpSLm7QJVpbQzYdw0ALy1bKoivXnEM3U93/OrK+/M719b+fg84Q==", + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mswjs/interceptors/node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "license": "MIT" + }, "node_modules/@next/env": { "version": "14.2.35", "resolved": "https://registry.npmmirror.com/@next/env/-/env-14.2.35.tgz", @@ -223,11 +1151,49 @@ "node": ">= 10" } }, + "node_modules/@noble/ciphers": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/@noble/ciphers/-/ciphers-1.3.0.tgz", + "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves": { + "version": "1.9.7", + "resolved": "https://registry.npmmirror.com/@noble/curves/-/curves-1.9.7.tgz", + "integrity": "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.8.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmmirror.com/@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", @@ -241,7 +1207,6 @@ "version": "2.0.5", "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -251,7 +1216,6 @@ "version": "1.2.8", "resolved": "https://registry.npmmirror.com/@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", @@ -261,6 +1225,993 @@ "node": ">= 8" } }, + "node_modules/@octokit/app": { + "version": "16.1.2", + "resolved": "https://registry.npmmirror.com/@octokit/app/-/app-16.1.2.tgz", + "integrity": "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ==", + "license": "MIT", + "dependencies": { + "@octokit/auth-app": "^8.1.2", + "@octokit/auth-unauthenticated": "^7.0.3", + "@octokit/core": "^7.0.6", + "@octokit/oauth-app": "^8.0.3", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/types": "^16.0.0", + "@octokit/webhooks": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-app": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/@octokit/auth-app/-/auth-app-8.2.0.tgz", + "integrity": "sha512-vVjdtQQwomrZ4V46B9LaCsxsySxGoHsyw6IYBov/TqJVROrlYdyNgw5q6tQbB7KZt53v1l1W53RiqTvpzL907g==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "toad-cache": "^3.7.0", + "universal-github-app-jwt": "^2.2.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-app": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/@octokit/auth-oauth-app/-/auth-oauth-app-9.0.3.tgz", + "integrity": "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/auth-oauth-user": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-device": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/@octokit/auth-oauth-device/-/auth-oauth-device-8.0.3.tgz", + "integrity": "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw==", + "license": "MIT", + "dependencies": { + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-oauth-user": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/@octokit/auth-oauth-user/-/auth-oauth-user-6.0.2.tgz", + "integrity": "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-device": "^8.0.3", + "@octokit/oauth-methods": "^6.0.2", + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/auth-unauthenticated": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-7.0.3.tgz", + "integrity": "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g==", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/@octokit/core/-/core-7.0.6.tgz", + "integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.3", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-11.0.3.tgz", + "integrity": "sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/@octokit/graphql/-/graphql-9.0.3.tgz", + "integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^10.0.6", + "@octokit/types": "^16.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-app": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/@octokit/oauth-app/-/oauth-app-8.0.3.tgz", + "integrity": "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-oauth-app": "^9.0.2", + "@octokit/auth-oauth-user": "^6.0.1", + "@octokit/auth-unauthenticated": "^7.0.2", + "@octokit/core": "^7.0.5", + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/oauth-methods": "^6.0.1", + "@types/aws-lambda": "^8.10.83", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-authorization-url": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-8.0.0.tgz", + "integrity": "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/oauth-methods": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/@octokit/oauth-methods/-/oauth-methods-6.0.2.tgz", + "integrity": "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng==", + "license": "MIT", + "dependencies": { + "@octokit/oauth-authorization-url": "^8.0.0", + "@octokit/request": "^10.0.6", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "license": "MIT" + }, + "node_modules/@octokit/openapi-webhooks-types": { + "version": "12.1.0", + "resolved": "https://registry.npmmirror.com/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz", + "integrity": "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-graphql": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-6.0.0.tgz", + "integrity": "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-retry": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@octokit/plugin-retry/-/plugin-retry-8.1.0.tgz", + "integrity": "sha512-O1FZgXeiGb2sowEr/hYTr6YunGdSAFWnr2fyW39Ah85H8O33ELASQxcvOFF5LE6Tjekcyu2ms4qAzJVhSaJxTw==", + "license": "MIT", + "dependencies": { + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=7" + } + }, + "node_modules/@octokit/plugin-throttling": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@octokit/plugin-throttling/-/plugin-throttling-11.0.3.tgz", + "integrity": "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0", + "bottleneck": "^2.15.3" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": "^7.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.9", + "resolved": "https://registry.npmmirror.com/@octokit/request/-/request-10.0.9.tgz", + "integrity": "sha512-o8Bi3f608eyM+7BmBiUWxFsdjLb3/ym1cQek5LZOv9KkZcxRrHCPhhRzm6xjO6HVZ85ItD6+sTsjxo821SVa/A==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^11.0.3", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "content-type": "^2.0.0", + "fast-content-type-parse": "^3.0.0", + "json-with-bigint": "^3.5.3", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/@octokit/request-error/-/request-error-7.1.0.tgz", + "integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@octokit/webhooks": { + "version": "14.2.0", + "resolved": "https://registry.npmmirror.com/@octokit/webhooks/-/webhooks-14.2.0.tgz", + "integrity": "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-webhooks-types": "12.1.0", + "@octokit/request-error": "^7.0.0", + "@octokit/webhooks-methods": "^6.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/webhooks-methods": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz", + "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@open-draft/deferred-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", + "integrity": "sha512-XW375UK8/9SqUVNVa6M0yEy8+iTi4QN5VZ7aZuRFQmy76LRwI9wy5F4YIBU6T+eTe2/DNDo8tqu8RHlwLHM6RA==", + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "license": "MIT" + }, + "node_modules/@panva/hkdf": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@panva/hkdf/-/hkdf-1.2.1.tgz", + "integrity": "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/@prisma/adapter-mariadb": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/adapter-mariadb/-/adapter-mariadb-7.8.0.tgz", + "integrity": "sha512-mWsgcfbUjxB3qSzRlLs8E03vsKrqXzYK2zpx3e8u6wIgeHJM/sE46cuOGcYvHiZGmeQLCd3xL6YSSGM9QOLI6w==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/driver-adapter-utils": "7.8.0", + "mariadb": "3.4.5" + } + }, + "node_modules/@prisma/client": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/client/-/client-7.8.0.tgz", + "integrity": "sha512-HFp3Dawv/3sU3JtlPha90IB+48lS7zHiH4LKZPjmcE8YH5P9DOXGPvo8dqOtO7MqLDd1p2hOWMcFlRT1DMblHw==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/client-runtime-utils": "7.8.0" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24.0" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/client-runtime-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/client-runtime-utils/-/client-runtime-utils-7.8.0.tgz", + "integrity": "sha512-5NQZztQ0oY/ADFkmd9gPuweH5A1/CCY8YQPorLLO0Mu6a87mY5gsnDkzmFmIHs9NFaLnZojzgddFVN4RpKYrdw==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/config": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/config/-/config-7.8.0.tgz", + "integrity": "sha512-HFESzd9rx2ZQxlK+TL7tu1HPvCqrHiL6LCxYykI2c34mvaUuIVVl3lYuicJD/MNnzgPnyeBEMlK4WTomJCV5jw==", + "license": "Apache-2.0", + "dependencies": { + "c12": "3.3.4", + "deepmerge-ts": "7.1.5", + "effect": "3.20.0", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/debug/-/debug-7.8.0.tgz", + "integrity": "sha512-p+QZReysDUqXC+mk17q9a+Y/qzh4c2KYliDK30buYUyfrGeTGSyfmc0AIrJRhZJrLHhRiJa9Au/J72h3C+szvA==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/dev": { + "version": "0.24.3", + "resolved": "https://registry.npmmirror.com/@prisma/dev/-/dev-0.24.3.tgz", + "integrity": "sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==", + "license": "ISC", + "dependencies": { + "@electric-sql/pglite": "0.4.1", + "@electric-sql/pglite-socket": "0.1.1", + "@electric-sql/pglite-tools": "0.3.1", + "@hono/node-server": "1.19.11", + "@prisma/get-platform": "7.2.0", + "@prisma/query-plan-executor": "7.2.0", + "@prisma/streams-local": "0.1.2", + "foreground-child": "3.3.1", + "get-port-please": "3.2.0", + "hono": "^4.12.8", + "http-status-codes": "2.3.0", + "pathe": "2.0.3", + "proper-lockfile": "4.1.2", + "remeda": "2.33.4", + "std-env": "3.10.0", + "valibot": "1.2.0", + "zeptomatch": "2.1.0" + } + }, + "node_modules/@prisma/dev/node_modules/@hono/node-server": { + "version": "1.19.11", + "resolved": "https://registry.npmmirror.com/@hono/node-server/-/node-server-1.19.11.tgz", + "integrity": "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@prisma/driver-adapter-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/driver-adapter-utils/-/driver-adapter-utils-7.8.0.tgz", + "integrity": "sha512-/Q13o0ZT0rjc1Xk0Q9KhZYwuq2EW/vSbWUBKfgEKkaCuB/Sg6bqnjmTZqC5cD4d6y1vfFAEwBRzfzoSMIVJ55A==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.8.0" + } + }, + "node_modules/@prisma/engines": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/engines/-/engines-7.8.0.tgz", + "integrity": "sha512-jx3rCnNNrt5uzbkKlegtQ2GZHxSlihMCzutgT/BP6UIDF1r9tDI39hV/0T/cHZgzJ3ELbuQPXlVZy+Y1n0pcgw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.8.0", + "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", + "@prisma/fetch-engine": "7.8.0", + "@prisma/get-platform": "7.8.0" + } + }, + "node_modules/@prisma/engines-version": { + "version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", + "resolved": "https://registry.npmmirror.com/@prisma/engines-version/-/engines-version-7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a.tgz", + "integrity": "sha512-fJPQxCkLgA5EayWaW8eArgCvjJ+N+Kz3VyeNKMEeYiQC4alNkxRKFVAGxv/ZUzuJISKqdw+zGeDbS6mn6RCPOA==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines/node_modules/@prisma/get-platform": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/get-platform/-/get-platform-7.8.0.tgz", + "integrity": "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.8.0" + } + }, + "node_modules/@prisma/fetch-engine": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/fetch-engine/-/fetch-engine-7.8.0.tgz", + "integrity": "sha512-gwB0Euiz/DDRyxFRpLXYlK3RfaZUj1c5dAYMuhZYfApg7arknJlcb9bIsOHDppJmbqYaVA+yBIiFMDBfprsNPQ==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.8.0", + "@prisma/engines-version": "7.8.0-6.3c6e192761c0362d496ed980de936e2f3cebcd3a", + "@prisma/get-platform": "7.8.0" + } + }, + "node_modules/@prisma/fetch-engine/node_modules/@prisma/get-platform": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/@prisma/get-platform/-/get-platform-7.8.0.tgz", + "integrity": "sha512-WlxgRGnolL8VH2EmkH1R/DkKNr/mVdS3G2h42IZFFZ3eUrH9OT6t73kIOSlkkrv50wG123Iq8d96ufv5LlZktw==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.8.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@prisma/get-platform/-/get-platform-7.2.0.tgz", + "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.2.0" + } + }, + "node_modules/@prisma/get-platform/node_modules/@prisma/debug": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@prisma/debug/-/debug-7.2.0.tgz", + "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/query-plan-executor": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz", + "integrity": "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/streams-local": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/@prisma/streams-local/-/streams-local-0.1.2.tgz", + "integrity": "sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "better-result": "^2.7.0", + "env-paths": "^3.0.0", + "proper-lockfile": "^4.1.2" + }, + "engines": { + "bun": ">=1.3.6", + "node": ">=22.0.0" + } + }, + "node_modules/@prisma/streams-local/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@prisma/studio-core": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@prisma/studio-core/-/studio-core-0.27.3.tgz", + "integrity": "sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==", + "license": "Apache-2.0", + "dependencies": { + "@radix-ui/react-toggle": "1.1.10", + "chart.js": "4.5.1" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24.0", + "pnpm": "8" + }, + "peerDependencies": { + "@types/react": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/@prisma/studio-core/node_modules/@radix-ui/react-toggle": { + "version": "1.1.10", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle/-/react-toggle-1.1.10.tgz", + "integrity": "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.3.tgz", + "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", + "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.2.tgz", + "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.15.tgz", + "integrity": "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.11", + "@radix-ui/react-focus-guards": "1.1.3", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.5", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", + "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.3", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.3.tgz", + "integrity": "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.7.tgz", + "integrity": "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.1.tgz", + "integrity": "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", + "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", + "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", + "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", + "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", + "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", + "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", + "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", + "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", + "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmmirror.com/@swc/counter/-/counter-0.1.3.tgz", @@ -277,11 +2228,67 @@ "tslib": "^2.4.0" } }, + "node_modules/@ts-morph/common": { + "version": "0.27.0", + "resolved": "https://registry.npmmirror.com/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.161", + "resolved": "https://registry.npmmirror.com/@types/aws-lambda/-/aws-lambda-8.10.161.tgz", + "integrity": "sha512-rUYdp+MQwSFocxIOcSsYSF3YYYC/uUpMbCY/mbO21vGqfrEYvNSoPyKYDj6RhXXpPfS0KstW9RwG3qXh9sL7FQ==", + "license": "MIT" + }, + "node_modules/@types/bcryptjs": { + "version": "2.4.6", + "resolved": "https://registry.npmmirror.com/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", + "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "20.19.39", "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.39.tgz", "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -291,14 +2298,12 @@ "version": "15.7.15", "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.15.tgz", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.3.28", "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.28.tgz", "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", - "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -309,12 +2314,141 @@ "version": "18.3.7", "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" } }, + "node_modules/@types/set-cookie-parser": { + "version": "2.4.10", + "resolved": "https://registry.npmmirror.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.10.tgz", + "integrity": "sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/statuses": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/@types/statuses/-/statuses-2.0.6.tgz", + "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", + "license": "MIT" + }, + "node_modules/@types/validate-npm-package-name": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/@types/validate-npm-package-name/-/validate-npm-package-name-4.0.2.tgz", + "integrity": "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==", + "license": "MIT" + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/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-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", @@ -343,6 +2477,104 @@ "dev": true, "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "resolved": "https://registry.npmmirror.com/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/axios": { + "version": "1.15.2", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.23", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.23.tgz", + "integrity": "sha512-xwVXGqevyKPsiuQdLj+dZMVjidjJV508TBqexND5HrF89cGdCYCJFB3qhcxRHSeMctdCfbR1jrxBajhDy7o29g==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "license": "Apache-2.0" + }, + "node_modules/better-result": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/better-result/-/better-result-2.8.2.tgz", + "integrity": "sha512-YOf0VSj5nUPI27doTtXF+BBnsiRq3qY7avHqfIWnppxTLGyvkLq1QV2RTxkwoZwJ60ywLfZ0raFF4J/G886i7A==", + "license": "MIT" + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -356,11 +2588,52 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/bottleneck": { + "version": "2.19.5", + "resolved": "https://registry.npmmirror.com/bottleneck/-/bottleneck-2.19.5.tgz", + "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -369,6 +2642,54 @@ "node": ">=8" } }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz", @@ -380,6 +2701,118 @@ "node": ">=10.16.0" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c12": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/c12/-/c12-3.3.4.tgz", + "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.4", + "defu": "^6.1.6", + "dotenv": "^17.3.1", + "exsolve": "^1.0.8", + "giget": "^3.2.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.0", + "rc9": "^3.0.1" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/c12/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/c12/node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/c12/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "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.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "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.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -410,6 +2843,30 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmmirror.com/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", @@ -448,12 +2905,160 @@ "node": ">= 6" } }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmmirror.com/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/code-block-writer": { + "version": "13.0.3", + "resolved": "https://registry.npmmirror.com/code-block-writer/-/code-block-writer-13.0.3.tgz", + "integrity": "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", @@ -464,11 +3069,147 @@ "node": ">= 6" } }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" @@ -481,7 +3222,149 @@ "version": "3.2.3", "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmmirror.com/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", "license": "MIT" }, "node_modules/didyoumean": { @@ -491,6 +3374,15 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/diff": { + "version": "8.0.4", + "resolved": "https://registry.npmmirror.com/diff/-/diff-8.0.4.tgz", + "integrity": "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", @@ -498,21 +3390,357 @@ "dev": true, "license": "MIT" }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "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/eciesjs": { + "version": "0.4.18", + "resolved": "https://registry.npmmirror.com/eciesjs/-/eciesjs-0.4.18.tgz", + "integrity": "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ==", + "license": "MIT", + "dependencies": { + "@ecies/ciphers": "^0.2.5", + "@noble/ciphers": "^1.3.0", + "@noble/curves": "^1.9.7", + "@noble/hashes": "^1.8.0" + }, + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/effect": { + "version": "3.20.0", + "resolved": "https://registry.npmmirror.com/effect/-/effect-3.20.0.tgz", + "integrity": "sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.344", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", "engines": { "node": ">= 0.4" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "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/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.8", + "resolved": "https://registry.npmmirror.com/eventsource-parser/-/eventsource-parser-3.0.8.tgz", + "integrity": "sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.4.1", + "resolved": "https://registry.npmmirror.com/express-rate-limit/-/express-rate-limit-8.4.1.tgz", + "integrity": "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmmirror.com/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fast-content-type-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", + "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -529,7 +3757,6 @@ "version": "5.1.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -538,21 +3765,97 @@ "node": ">= 6" } }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/fast-wrap-ansi/-/fast-wrap-ansi-0.2.0.tgz", + "integrity": "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -561,6 +3864,144 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/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" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "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/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.3.4", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.4.tgz", + "integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", @@ -580,12 +4021,145 @@ "version": "1.1.2", "resolved": "https://registry.npmmirror.com/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/fuzzysort": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/fuzzysort/-/fuzzysort-3.1.0.tgz", + "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==", + "license": "MIT" + }, + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "license": "MIT", + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "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-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-own-enumerable-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-own-enumerable-keys/-/get-own-enumerable-keys-1.0.0.tgz", + "integrity": "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-port-please": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", + "license": "MIT" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giget": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/giget/-/giget-3.2.0.tgz", + "integrity": "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==", + "license": "MIT", + "bin": { + "giget": "dist/cli.mjs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", @@ -599,17 +4173,76 @@ "node": ">=10.13.0" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/grammex": { + "version": "3.1.12", + "resolved": "https://registry.npmmirror.com/grammex/-/grammex-3.1.12.tgz", + "integrity": "sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==", + "license": "MIT" + }, + "node_modules/graphmatch": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/graphmatch/-/graphmatch-1.1.1.tgz", + "integrity": "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==", + "license": "MIT" + }, + "node_modules/graphql": { + "version": "16.13.2", + "resolved": "https://registry.npmmirror.com/graphql/-/graphql-16.13.2.tgz", + "integrity": "sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "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.npmmirror.com/hasown/-/hasown-2.0.3.tgz", "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -618,6 +4251,144 @@ "node": ">= 0.4" } }, + "node_modules/headers-polyfill": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/headers-polyfill/-/headers-polyfill-5.0.1.tgz", + "integrity": "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA==", + "license": "MIT", + "dependencies": { + "@types/set-cookie-parser": "^2.4.10", + "set-cookie-parser": "^3.0.1" + } + }, + "node_modules/hono": { + "version": "4.12.15", + "resolved": "https://registry.npmmirror.com/hono/-/hono-4.12.15.tgz", + "integrity": "sha512-qM0jDhFEaCBb4TxoW7f53Qrpv9RBiayUHo0S52JudprkhvpjIrGoU1mnnr29Fvd1U335ZFPZQY1wlkqgfGXyLg==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "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/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -647,21 +4418,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -670,16 +4463,159 @@ "node": ">=0.10.0" } }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" } }, + "node_modules/is-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-3.0.0.tgz", + "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", + "license": "MIT" + }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", @@ -690,12 +4626,102 @@ "jiti": "bin/jiti.js" } }, + "node_modules/jose": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/jose/-/jose-6.2.3.tgz", + "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/json-with-bigint": { + "version": "3.5.8", + "resolved": "https://registry.npmmirror.com/json-with-bigint/-/json-with-bigint-3.5.8.tgz", + "integrity": "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", @@ -713,9 +4739,42 @@ "version": "1.2.4", "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, "license": "MIT" }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", @@ -728,11 +4787,135 @@ "loose-envify": "cli.js" } }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lru.min": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/lru.min/-/lru.min-1.1.4.tgz", + "integrity": "sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==", + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/lucide-react": { + "version": "1.11.0", + "resolved": "https://registry.npmmirror.com/lucide-react/-/lucide-react-1.11.0.tgz", + "integrity": "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/mariadb": { + "version": "3.4.5", + "resolved": "https://registry.npmmirror.com/mariadb/-/mariadb-3.4.5.tgz", + "integrity": "sha512-gThTYkhIS5rRqkVr+Y0cIdzr+GRqJ9sA2Q34e0yzmyhMCwyApf3OKAC1jnF23aSlIOqJuyaUFUcj7O1qZslmmQ==", + "license": "LGPL-2.1-or-later", + "dependencies": { + "@types/geojson": "^7946.0.16", + "@types/node": "^24.0.13", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.4.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mariadb/node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/mariadb/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mariadb/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/mariadb/node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 8" @@ -742,7 +4925,6 @@ "version": "4.0.8", "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -752,6 +4934,171 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.13.6", + "resolved": "https://registry.npmmirror.com/msw/-/msw-2.13.6.tgz", + "integrity": "sha512-GAJbQy8Ra/Ydjt0Hb2MGT2qhzd83J3+QZMHdH85uW7r/XkKc846+Ma2PLif5hGvTm5Yqa+wkcstpim0WeLZU9g==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@inquirer/confirm": "^6.0.11", + "@mswjs/interceptors": "^0.41.3", + "@open-draft/deferred-promise": "^3.0.0", + "@types/statuses": "^2.0.6", + "cookie": "^1.1.1", + "graphql": "^16.13.2", + "headers-polyfill": "^5.0.1", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "rettime": "^0.11.7", + "statuses": "^2.0.2", + "strict-event-emitter": "^0.5.1", + "tough-cookie": "^6.0.1", + "type-fest": "^5.5.0", + "until-async": "^3.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mute-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-3.0.0.tgz", + "integrity": "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/mysql2": { + "version": "3.22.3", + "resolved": "https://registry.npmmirror.com/mysql2/-/mysql2-3.22.3.tgz", + "integrity": "sha512-uWWxvZSRvRhtBdh2CdcuK83YcOfPdmEeEYB069bAmPnV93QApDGVPuvCQOLjlh7tYHEWdgQPrn6kosDxHBVLkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.2", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.2", + "long": "^5.3.2", + "lru.min": "^1.1.4", + "named-placeholders": "^1.1.6", + "sql-escaper": "^1.3.3" + }, + "engines": { + "node": ">= 8.0" + }, + "peerDependencies": { + "@types/node": ">= 8" + } + }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", @@ -764,6 +5111,18 @@ "thenify-all": "^1.0.0" } }, + "node_modules/named-placeholders": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/named-placeholders/-/named-placeholders-1.1.6.tgz", + "integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==", + "license": "MIT", + "dependencies": { + "lru.min": "^1.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", @@ -782,6 +5141,15 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/next": { "version": "14.2.35", "resolved": "https://registry.npmmirror.com/next/-/next-14.2.35.tgz", @@ -832,6 +5200,47 @@ } } }, + "node_modules/next-auth": { + "version": "4.24.14", + "resolved": "https://registry.npmmirror.com/next-auth/-/next-auth-4.24.14.tgz", + "integrity": "sha512-YRz6xFDXKUwiXSMMChbrBEWyFktZ1qZXEgeSHQQ3nsy08B4c/xLk6REeutRsIFwkjY/1+ShHnu07DN3JeJguig==", + "license": "ISC", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@panva/hkdf": "^1.0.2", + "cookie": "^0.7.0", + "jose": "^4.15.5", + "oauth": "^0.9.15", + "openid-client": "^5.4.0", + "preact": "^10.6.3", + "preact-render-to-string": "^5.1.19", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "@auth/core": "0.34.3", + "next": "^12.2.5 || ^13 || ^14 || ^15 || ^16", + "nodemailer": "^7.0.7", + "react": "^17.0.2 || ^18 || ^19", + "react-dom": "^17.0.2 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@auth/core": { + "optional": true + }, + "nodemailer": { + "optional": true + } + } + }, + "node_modules/next-auth/node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmmirror.com/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/next/node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.31.tgz", @@ -860,6 +5269,50 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "license": "MIT" + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", @@ -870,11 +5323,44 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmmirror.com/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==", + "license": "MIT" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -890,6 +5376,287 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-treeify": { + "version": "1.1.33", + "resolved": "https://registry.npmmirror.com/object-treeify/-/object-treeify-1.1.33.tgz", + "integrity": "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/octokit": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/octokit/-/octokit-5.0.5.tgz", + "integrity": "sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw==", + "license": "MIT", + "dependencies": { + "@octokit/app": "^16.1.2", + "@octokit/core": "^7.0.6", + "@octokit/oauth-app": "^8.0.3", + "@octokit/plugin-paginate-graphql": "^6.0.0", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0", + "@octokit/plugin-retry": "^8.0.3", + "@octokit/plugin-throttling": "^11.0.3", + "@octokit/request-error": "^7.0.2", + "@octokit/types": "^16.0.0", + "@octokit/webhooks": "^14.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oidc-token-hash": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/oidc-token-hash/-/oidc-token-hash-5.2.0.tgz", + "integrity": "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "11.0.0", + "resolved": "https://registry.npmmirror.com/open/-/open-11.0.0.tgz", + "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", + "license": "MIT", + "dependencies": { + "default-browser": "^5.4.0", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.1.0", + "wsl-utils": "^0.3.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openai": { + "version": "6.38.0", + "resolved": "https://registry.npmmirror.com/openai/-/openai-6.38.0.tgz", + "integrity": "sha512-AoMplt2UalrpgUDMh3L09QWjNRlgJPipclQvA6sYAaeF6nHNBMgmikAZGmcYLn8on4d9sQY9Q8bOLfrBS7Lc8g==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openid-client": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/openid-client/-/openid-client-5.7.1.tgz", + "integrity": "sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==", + "license": "MIT", + "dependencies": { + "jose": "^4.15.9", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmmirror.com/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/openid-client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmmirror.com/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", @@ -897,6 +5664,24 @@ "dev": true, "license": "MIT" }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", @@ -907,7 +5692,6 @@ "version": "2.3.2", "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -936,11 +5720,30 @@ "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.1.tgz", + "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.4", + "exsolve": "^1.0.8", + "pathe": "^2.0.3" + } + }, "node_modules/postcss": { "version": "8.5.12", "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.12.tgz", "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -1099,11 +5902,223 @@ "dev": true, "license": "MIT" }, + "node_modules/postgres": { + "version": "3.4.7", + "resolved": "https://registry.npmmirror.com/postgres/-/postgres-3.4.7.tgz", + "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==", + "license": "Unlicense", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/preact": { + "version": "10.29.1", + "resolved": "https://registry.npmmirror.com/preact/-/preact-10.29.1.tgz", + "integrity": "sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/preact-render-to-string": { + "version": "5.2.6", + "resolved": "https://registry.npmmirror.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", + "license": "MIT", + "dependencies": { + "pretty-format": "^3.8.0" + }, + "peerDependencies": { + "preact": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "3.8.0", + "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-3.8.0.tgz", + "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==", + "license": "MIT" + }, + "node_modules/pretty-ms": { + "version": "9.3.0", + "resolved": "https://registry.npmmirror.com/pretty-ms/-/pretty-ms-9.3.0.tgz", + "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prisma": { + "version": "7.8.0", + "resolved": "https://registry.npmmirror.com/prisma/-/prisma-7.8.0.tgz", + "integrity": "sha512-yfN4yrw7HV9kEJhoy1+jgah0jafEIQsf7uWouSsM8MvJtlubsk+kM7AIBWZ8+GJl74Yj3c+nbYqBkMOxtsZ3Lw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/config": "7.8.0", + "@prisma/dev": "0.24.3", + "@prisma/engines": "7.8.0", + "@prisma/studio-core": "0.27.3", + "mysql2": "3.15.3", + "postgres": "3.4.7" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": "^20.19 || ^22.12 || >=24.0" + }, + "peerDependencies": { + "better-sqlite3": ">=9.0.0", + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "better-sqlite3": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/prisma/node_modules/mysql2": { + "version": "3.15.3", + "resolved": "https://registry.npmmirror.com/mysql2/-/mysql2-3.15.3.tgz", + "integrity": "sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==", + "license": "MIT", + "dependencies": { + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.7.0", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prompts/node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -1120,6 +6135,40 @@ ], "license": "MIT" }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/rc9": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rc9/-/rc9-3.0.1.tgz", + "integrity": "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.6", + "destr": "^2.0.5" + } + }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz", @@ -1132,6 +6181,16 @@ "node": ">=0.10.0" } }, + "node_modules/react-chartjs-2": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", + "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz", @@ -1145,6 +6204,75 @@ "react": "^18.3.1" } }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", @@ -1168,6 +6296,55 @@ "node": ">=8.10.0" } }, + "node_modules/recast": { + "version": "0.23.11", + "resolved": "https://registry.npmmirror.com/recast/-/recast-0.23.11.tgz", + "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/remeda": { + "version": "2.33.4", + "resolved": "https://registry.npmmirror.com/remeda/-/remeda-2.33.4.tgz", + "integrity": "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/remeda" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.12.tgz", @@ -1190,22 +6367,98 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rettime": { + "version": "0.11.8", + "resolved": "https://registry.npmmirror.com/rettime/-/rettime-0.11.8.tgz", + "integrity": "sha512-0fERGXktJTyJ+h8fBEiPxHPEFOu0h15JY7JtwrOVqR5K+vb99ho6IyOo7ekLS3h4sJCzIDy4VWKIbZUfe9njmg==", + "license": "MIT" + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/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/router": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -1225,6 +6478,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz", @@ -1234,6 +6493,264 @@ "loose-envify": "^1.1.0" } }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-3.1.0.tgz", + "integrity": "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shadcn": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/shadcn/-/shadcn-4.5.0.tgz", + "integrity": "sha512-ZpNOz7IMI5aezbMEWNxBvl2aJ1ek6NuAMqpL/FUnk5IuRxERl8ohYEnqqAmhPOcur8RbGuCoqTZLQ3Oi4Xkf8A==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/plugin-transform-typescript": "^7.28.0", + "@babel/preset-typescript": "^7.27.1", + "@dotenvx/dotenvx": "^1.48.4", + "@modelcontextprotocol/sdk": "^1.26.0", + "@types/validate-npm-package-name": "^4.0.2", + "browserslist": "^4.26.2", + "commander": "^14.0.0", + "cosmiconfig": "^9.0.0", + "dedent": "^1.6.0", + "deepmerge": "^4.3.1", + "diff": "^8.0.2", + "execa": "^9.6.0", + "fast-glob": "^3.3.3", + "fs-extra": "^11.3.1", + "fuzzysort": "^3.1.0", + "https-proxy-agent": "^7.0.6", + "kleur": "^4.1.5", + "msw": "^2.10.4", + "node-fetch": "^3.3.2", + "open": "^11.0.0", + "ora": "^8.2.0", + "postcss": "^8.5.6", + "postcss-selector-parser": "^7.1.0", + "prompts": "^2.4.2", + "recast": "^0.23.11", + "stringify-object": "^5.0.0", + "tailwind-merge": "^3.0.1", + "ts-morph": "^26.0.0", + "tsconfig-paths": "^4.2.0", + "validate-npm-package-name": "^7.0.1", + "zod": "^3.24.1", + "zod-to-json-schema": "^3.24.6" + }, + "bin": { + "shadcn": "dist/index.js" + } + }, + "node_modules/shadcn/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/shadcn/node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "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.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "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.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "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.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", @@ -1243,6 +6760,58 @@ "node": ">=0.10.0" } }, + "node_modules/sql-escaper": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/sql-escaper/-/sql-escaper-1.3.3.tgz", + "integrity": "sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==", + "dev": true, + "license": "MIT", + "engines": { + "bun": ">=1.0.0", + "deno": ">=2.0.0", + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/mysqljs/sql-escaper?sponsor=1" + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz", @@ -1251,6 +6820,82 @@ "node": ">=10.0.0" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmmirror.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/stringify-object/-/stringify-object-5.0.0.tgz", + "integrity": "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-keys": "^1.0.0", + "is-obj": "^3.0.0", + "is-regexp": "^3.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/stringify-object?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -1310,6 +6955,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tailwind-merge": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.5.0.tgz", + "integrity": "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "3.4.19", "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.19.tgz", @@ -1371,6 +7038,12 @@ "node": ">=0.8" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.16.tgz", @@ -1419,11 +7092,28 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tldts": { + "version": "7.0.29", + "resolved": "https://registry.npmmirror.com/tldts/-/tldts-7.0.29.tgz", + "integrity": "sha512-JIXCerhudr/N6OWLwLF1HVsTTUo7ry6qHa5eWZEkiMuxsIiAACL55tGLfqfHfoH7QaMQUW8fngD7u7TxWexYQg==", + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.29" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.29", + "resolved": "https://registry.npmmirror.com/tldts-core/-/tldts-core-7.0.29.tgz", + "integrity": "sha512-W99NuU7b1DcG3uJ3v9k9VztCH3WialNbBkBft5wCs8V8mexu0XQqaZEYb9l9RNNzK8+3EJ9PKWB0/RUtTQ/o+Q==", + "license": "MIT" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmmirror.com/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" @@ -1432,6 +7122,36 @@ "node": ">=8.0" } }, + "node_modules/toad-cache": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/toad-cache/-/toad-cache-3.7.1.tgz", + "integrity": "sha512-5DXWzE4Vz7xNHsv+xQ+MGfJYyC78Aok3tEr0MNwHoRf7vZnga1mQXZ4/Nsodld4VR6Wd+VhfmqnNrsRJyYPfrQ==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -1439,17 +7159,140 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/ts-morph": { + "version": "26.0.0", + "resolved": "https://registry.npmmirror.com/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.27.0", + "code-block-writer": "^13.0.3" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-fest": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-5.6.0.tgz", + "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -1463,15 +7306,446 @@ "version": "6.21.0", "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-github-app-jwt": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/universal-github-app-jwt/-/universal-github-app-jwt-2.2.2.tgz", + "integrity": "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw==", + "license": "MIT" + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "license": "ISC" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/until-async": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/until-async/-/until-async-3.0.2.tgz", + "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/kettanaito" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" + }, + "node_modules/valibot": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/valibot/-/valibot-1.2.0.tgz", + "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/validate-npm-package-name": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/validate-npm-package-name/-/validate-npm-package-name-7.0.2.tgz", + "integrity": "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==", + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/wsl-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.3.1.tgz", + "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-spinner": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/yocto-spinner/-/yocto-spinner-1.1.0.tgz", + "integrity": "sha512-/BY0AUXnS7IKO354uLLA2eRcWiqDifEbd6unXCsOxkFDAkhgUL3PH9X2bFoaU0YchnDXsF+iKleeTLJGckbXfA==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zeptomatch": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/zeptomatch/-/zeptomatch-2.1.0.tgz", + "integrity": "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==", + "license": "MIT", + "dependencies": { + "grammex": "^3.1.11", + "graphmatch": "^1.1.0" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmmirror.com/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } } } } diff --git a/package.json b/package.json index 9ab8c5f..8e34d5b 100644 --- a/package.json +++ b/package.json @@ -3,22 +3,47 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev --turbo --port 8301", "build": "next build", - "start": "next start", + "start": "next start --port 8301", "lint": "next lint" }, "dependencies": { + "@base-ui/react": "^1.4.1", + "@prisma/adapter-mariadb": "^7.8.0", + "@prisma/client": "^7.8.0", + "@radix-ui/react-dialog": "^1.1.15", + "@types/bcryptjs": "^2.4.6", + "axios": "^1.15.2", + "bcryptjs": "^3.0.3", + "chart.js": "^4.5.1", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^1.11.0", + "next": "14.2.35", + "next-auth": "^4.24.14", + "octokit": "^5.0.5", + "openai": "^6.38.0", + "prisma": "^7.8.0", "react": "^18", + "react-chartjs-2": "^5.3.1", "react-dom": "^18", - "next": "14.2.35" + "shadcn": "^4.5.0", + "tailwind-merge": "^3.5.0", + "tw-animate-css": "^1.4.0" }, "devDependencies": { - "typescript": "^5", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "dotenv": "^17.4.2", + "mysql2": "^3.22.3", "postcss": "^8", - "tailwindcss": "^3.4.1" + "tailwindcss": "^3.4.1", + "ts-node": "^10.9.2", + "typescript": "^5" + }, + "prisma": { + "seed": "ts-node --compiler-options {\"module\":\"CommonJS\"} prisma/seed.ts" } } diff --git a/prisma.config.ts b/prisma.config.ts new file mode 100644 index 0000000..b847ba5 --- /dev/null +++ b/prisma.config.ts @@ -0,0 +1,15 @@ +// This file was generated by Prisma, and assumes you have installed the following: +// npm install --save-dev prisma dotenv +import "dotenv/config"; +import { defineConfig } from "prisma/config"; + +export default defineConfig({ + schema: "prisma/schema.prisma", + migrations: { + path: "prisma/migrations", + seed: 'ts-node --compiler-options {"module":"CommonJS"} prisma/seed.ts', + }, + datasource: { + url: process.env["DATABASE_URL"], + }, +}); diff --git a/prisma/migrations/20260428143533_init/migration.sql b/prisma/migrations/20260428143533_init/migration.sql new file mode 100644 index 0000000..68ddfbf --- /dev/null +++ b/prisma/migrations/20260428143533_init/migration.sql @@ -0,0 +1,66 @@ +-- CreateTable +CREATE TABLE `categories` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `slug` VARCHAR(50) NOT NULL, + `icon` VARCHAR(100) NULL, + `parent_id` INTEGER NULL, + `sort_order` INTEGER NOT NULL DEFAULT 0, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + UNIQUE INDEX `categories_slug_key`(`slug`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `tools` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `slug` VARCHAR(100) NOT NULL, + `category_id` INTEGER NOT NULL, + `description` TEXT NOT NULL, + `logo_url` VARCHAR(255) NULL, + `website_url` VARCHAR(255) NOT NULL, + `pricing_model` ENUM('free', 'freemium', 'paid', 'subscription') NOT NULL DEFAULT 'freemium', + `pricing_detail` VARCHAR(200) NULL, + `features` JSON NULL, + `tags` JSON NULL, + `view_count` INTEGER NOT NULL DEFAULT 0, + `status` ENUM('draft', 'published') NOT NULL DEFAULT 'draft', + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + UNIQUE INDEX `tools_slug_key`(`slug`), + INDEX `tools_category_id_status_idx`(`category_id`, `status`), + FULLTEXT INDEX `tools_name_description_idx`(`name`, `description`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `pending_tools` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `slug` VARCHAR(100) NULL, + `category_id` INTEGER NULL, + `description` TEXT NULL, + `logo_url` VARCHAR(255) NULL, + `website_url` VARCHAR(255) NULL, + `pricing_model` ENUM('free', 'freemium', 'paid', 'subscription') NULL DEFAULT 'freemium', + `pricing_detail` VARCHAR(200) NULL, + `features` JSON NULL, + `tags` JSON NULL, + `source_url` VARCHAR(255) NULL, + `scraped_at` DATETIME(3) NULL, + `status` ENUM('pending', 'approved', 'rejected') NOT NULL DEFAULT 'pending', + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `categories` ADD CONSTRAINT `categories_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `categories`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `tools` ADD CONSTRAINT `tools_category_id_fkey` FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20260501123651_remove_scraped_at/migration.sql b/prisma/migrations/20260501123651_remove_scraped_at/migration.sql new file mode 100644 index 0000000..6e87bd7 --- /dev/null +++ b/prisma/migrations/20260501123651_remove_scraped_at/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the column `scraped_at` on the `pending_tools` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE `pending_tools` DROP COLUMN `scraped_at`; diff --git a/prisma/migrations/20260501131456_add_discovery_configs/migration.sql b/prisma/migrations/20260501131456_add_discovery_configs/migration.sql new file mode 100644 index 0000000..0cb3757 --- /dev/null +++ b/prisma/migrations/20260501131456_add_discovery_configs/migration.sql @@ -0,0 +1,13 @@ +-- CreateTable +CREATE TABLE `discovery_configs` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `category_id` INTEGER NULL, + `prompt` TEXT NOT NULL, + `tagPool` JSON NULL, + `temperature` DOUBLE NOT NULL DEFAULT 0.7, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + UNIQUE INDEX `discovery_configs_category_id_key`(`category_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/prisma/migrations/20260501132237_fix_tag_pool_column/migration.sql b/prisma/migrations/20260501132237_fix_tag_pool_column/migration.sql new file mode 100644 index 0000000..7d9583e --- /dev/null +++ b/prisma/migrations/20260501132237_fix_tag_pool_column/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `tagPool` on the `discovery_configs` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE `discovery_configs` DROP COLUMN `tagPool`, + ADD COLUMN `tag_pool` JSON NULL; diff --git a/prisma/migrations/20260502040713_add_discovery_configs_v2/migration.sql b/prisma/migrations/20260502040713_add_discovery_configs_v2/migration.sql new file mode 100644 index 0000000..a281c77 --- /dev/null +++ b/prisma/migrations/20260502040713_add_discovery_configs_v2/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable +ALTER TABLE `discovery_configs` ADD COLUMN `apiBaseUrl` VARCHAR(255) NULL, + ADD COLUMN `apiKey` VARCHAR(255) NULL, + ADD COLUMN `modelName` VARCHAR(100) NULL; diff --git a/prisma/migrations/20260502043549_add_api_providers_and_skills/migration.sql b/prisma/migrations/20260502043549_add_api_providers_and_skills/migration.sql new file mode 100644 index 0000000..e38e1fc --- /dev/null +++ b/prisma/migrations/20260502043549_add_api_providers_and_skills/migration.sql @@ -0,0 +1,71 @@ +/* + Warnings: + + - You are about to drop the column `apiBaseUrl` on the `discovery_configs` table. All the data in the column will be lost. + - You are about to drop the column `apiKey` on the `discovery_configs` table. All the data in the column will be lost. + - You are about to drop the column `modelName` on the `discovery_configs` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE `discovery_configs` DROP COLUMN `apiBaseUrl`, + DROP COLUMN `apiKey`, + DROP COLUMN `modelName`, + ADD COLUMN `api_provider_id` INTEGER NULL; + +-- CreateTable +CREATE TABLE `skills` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `slug` VARCHAR(100) NOT NULL, + `category_id` INTEGER NOT NULL, + `description` TEXT NOT NULL, + `logo_url` VARCHAR(255) NULL, + `source_url` VARCHAR(255) NOT NULL, + `source_type` VARCHAR(20) NOT NULL DEFAULT 'github', + `features` JSON NULL, + `tags` JSON NULL, + `view_count` INTEGER NOT NULL DEFAULT 0, + `status` ENUM('draft', 'published') NOT NULL DEFAULT 'draft', + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + UNIQUE INDEX `skills_slug_key`(`slug`), + INDEX `skills_category_id_status_idx`(`category_id`, `status`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `pending_skills` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(100) NOT NULL, + `slug` VARCHAR(100) NULL, + `category_id` INTEGER NULL, + `description` TEXT NULL, + `logo_url` VARCHAR(255) NULL, + `source_url` VARCHAR(255) NULL, + `source_type` VARCHAR(20) NULL, + `features` JSON NULL, + `tags` JSON NULL, + `status` ENUM('pending', 'approved', 'rejected') NOT NULL DEFAULT 'pending', + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `api_providers` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `baseUrl` VARCHAR(255) NOT NULL, + `apiKey` VARCHAR(255) NOT NULL, + `model` VARCHAR(100) NOT NULL, + `isDefault` BOOLEAN NOT NULL DEFAULT false, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `skills` ADD CONSTRAINT `skills_category_id_fkey` FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20260502111200_add_skill_categories/migration.sql b/prisma/migrations/20260502111200_add_skill_categories/migration.sql new file mode 100644 index 0000000..17f3299 --- /dev/null +++ b/prisma/migrations/20260502111200_add_skill_categories/migration.sql @@ -0,0 +1,23 @@ +-- DropForeignKey +ALTER TABLE `skills` DROP FOREIGN KEY `skills_category_id_fkey`; + +-- CreateTable +CREATE TABLE `skill_categories` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `name` VARCHAR(50) NOT NULL, + `slug` VARCHAR(50) NOT NULL, + `icon` VARCHAR(100) NULL, + `parent_id` INTEGER NULL, + `sort_order` INTEGER NOT NULL DEFAULT 0, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `updated_at` DATETIME(3) NOT NULL, + + UNIQUE INDEX `skill_categories_slug_key`(`slug`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `skill_categories` ADD CONSTRAINT `skill_categories_parent_id_fkey` FOREIGN KEY (`parent_id`) REFERENCES `skill_categories`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE `skills` ADD CONSTRAINT `skills_category_id_fkey` FOREIGN KEY (`category_id`) REFERENCES `skill_categories`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20260502123807_add_pendingtool_category_relation/migration.sql b/prisma/migrations/20260502123807_add_pendingtool_category_relation/migration.sql new file mode 100644 index 0000000..02bf3ac --- /dev/null +++ b/prisma/migrations/20260502123807_add_pendingtool_category_relation/migration.sql @@ -0,0 +1,2 @@ +-- AddForeignKey +ALTER TABLE `pending_tools` ADD CONSTRAINT `pending_tools_category_id_fkey` FOREIGN KEY (`category_id`) REFERENCES `categories`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/migrations/20260508000000_add_hot_score/migration.sql b/prisma/migrations/20260508000000_add_hot_score/migration.sql new file mode 100644 index 0000000..34b78e5 --- /dev/null +++ b/prisma/migrations/20260508000000_add_hot_score/migration.sql @@ -0,0 +1 @@ +ALTER TABLE `daily_report_items` ADD COLUMN `hot_score` INT NOT NULL DEFAULT 0; diff --git a/prisma/migrations/20260520000000_add_skill_reviews/migration.sql b/prisma/migrations/20260520000000_add_skill_reviews/migration.sql new file mode 100644 index 0000000..36b14c7 --- /dev/null +++ b/prisma/migrations/20260520000000_add_skill_reviews/migration.sql @@ -0,0 +1,44 @@ +-- AlterTable +ALTER TABLE `skills` ADD COLUMN `last_reviewed_at` DATETIME(3) NULL, + ADD COLUMN `github_stars_history` JSON NULL; + +-- CreateTable +CREATE TABLE `skill_reviews` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `skill_id` INTEGER NOT NULL, + `capability` DOUBLE NOT NULL, + `dev_exp` DOUBLE NOT NULL, + `cost_license` DOUBLE NOT NULL, + `community` DOUBLE NOT NULL, + `performance` DOUBLE NOT NULL, + `overall` DOUBLE NOT NULL, + `reviews` JSON NOT NULL, + `long_article` TEXT NULL, + `video_script` TEXT NULL, + `social_cards` JSON NULL, + `status` ENUM('DRAFT', 'PUBLISHED', 'REJECTED', 'OUTDATED') NOT NULL DEFAULT 'DRAFT', + `reviewed_at` DATETIME(3) NOT NULL, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + UNIQUE INDEX `skill_reviews_skill_id_key`(`skill_id`), + INDEX `skill_reviews_skill_id_idx`(`skill_id`), + INDEX `skill_reviews_overall_idx`(`overall`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- CreateTable +CREATE TABLE `review_generation_logs` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `skill_id` INTEGER NOT NULL, + `status` VARCHAR(20) NOT NULL, + `prompt` TEXT NOT NULL, + `response` TEXT NULL, + `error` TEXT NULL, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + + INDEX `review_generation_logs_skill_id_idx`(`skill_id`), + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- AddForeignKey +ALTER TABLE `skill_reviews` ADD CONSTRAINT `skill_reviews_skill_id_fkey` FOREIGN KEY (`skill_id`) REFERENCES `skills`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..592fc0b --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "mysql" diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..b7048ba --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,404 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "mysql" +} + +model Category { + id Int @id @default(autoincrement()) + name String @db.VarChar(50) + slug String @unique @db.VarChar(50) + icon String? @db.VarChar(100) + parentId Int? @map("parent_id") + sortOrder Int @default(0) @map("sort_order") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + tools Tool[] + pendingTools PendingTool[] + parent Category? @relation("CategoryToCategory", fields: [parentId], references: [id]) + children Category[] @relation("CategoryToCategory") + + @@map("categories") +} + +model SkillCategory { + id Int @id @default(autoincrement()) + name String @db.VarChar(50) + slug String @unique @db.VarChar(50) + icon String? @db.VarChar(100) + parentId Int? @map("parent_id") + sortOrder Int @default(0) @map("sort_order") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + skills Skill[] + pendingSkills PendingSkill[] + parent SkillCategory? @relation("SkillCategoryToSkillCategory", fields: [parentId], references: [id]) + children SkillCategory[] @relation("SkillCategoryToSkillCategory") + + @@map("skill_categories") +} + +model Tool { + id Int @id @default(autoincrement()) + name String @db.VarChar(100) + slug String @unique @db.VarChar(100) + categoryId Int @map("category_id") + description String @db.Text + logoUrl String? @map("logo_url") @db.VarChar(255) + websiteUrl String @map("website_url") @db.VarChar(255) + pricingModel PricingModel @default(freemium) @map("pricing_model") + pricingDetail String? @map("pricing_detail") @db.VarChar(200) + features Json? + tags Json? + viewCount Int @default(0) @map("view_count") + status Status @default(draft) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + category Category @relation(fields: [categoryId], references: [id]) + favorites Favorite[] + browsingHistory BrowsingHistory[] + reviews Review[] + collectionItems CollectionItem[] + + @@index([categoryId, status]) + @@fulltext([name, description]) + @@map("tools") +} + +model PendingTool { + id Int @id @default(autoincrement()) + name String @db.VarChar(100) + slug String? @db.VarChar(100) + categoryId Int? @map("category_id") + description String? @db.Text + logoUrl String? @map("logo_url") @db.VarChar(255) + websiteUrl String? @map("website_url") @db.VarChar(255) + pricingModel PricingModel? @default(freemium) @map("pricing_model") + pricingDetail String? @map("pricing_detail") @db.VarChar(200) + features Json? + tags Json? + sourceUrl String? @map("source_url") @db.VarChar(255) + status PendingStatus @default(pending) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + category Category? @relation(fields: [categoryId], references: [id]) + + @@map("pending_tools") +} + +model Skill { + id Int @id @default(autoincrement()) + name String @db.VarChar(100) + slug String @unique @db.VarChar(100) + categoryId Int @map("category_id") + description String @db.Text + logoUrl String? @map("logo_url") @db.VarChar(255) + sourceUrl String @map("source_url") @db.VarChar(255) + sourceType String @default("gitee") @map("source_type") @db.VarChar(20) + rating Float @default(0) @db.Float + features Json? + tags Json? + viewCount Int @default(0) @map("view_count") + status Status @default(draft) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + category SkillCategory @relation(fields: [categoryId], references: [id]) + favorites Favorite[] + browsingHistory BrowsingHistory[] + reviews Review[] + collectionItems CollectionItem[] + skillReview SkillReview? + + lastReviewedAt DateTime? @map("last_reviewed_at") + githubStarsHistory Json? @map("github_stars_history") + + @@index([categoryId, status]) + @@map("skills") +} + +model PendingSkill { + id Int @id @default(autoincrement()) + name String @db.VarChar(100) + slug String? @db.VarChar(100) + categoryId Int? @map("category_id") + description String? @db.Text + logoUrl String? @map("logo_url") @db.VarChar(255) + sourceUrl String? @map("source_url") @db.VarChar(255) + sourceType String? @map("source_type") @db.VarChar(20) + rating Float @default(0) @db.Float + features Json? + tags Json? + status PendingStatus @default(pending) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + category SkillCategory? @relation(fields: [categoryId], references: [id]) + + @@map("pending_skills") +} + +enum PricingModel { + free + freemium + paid + subscription +} + +enum Status { + draft + published +} + +enum PendingStatus { + pending + approved + rejected +} + +model SystemConfig { + id Int @id @default(autoincrement()) + key String @unique @db.VarChar(50) + value Json + @@map("system_configs") +} + +model User { + id Int @id @default(autoincrement()) + email String @unique @db.VarChar(255) + passwordHash String? @db.VarChar(255) + name String? @db.VarChar(100) + avatarUrl String? + oauthProvider String? @db.VarChar(50) + oauthId String? @unique @db.VarChar(255) + role String @default("user") @db.VarChar(20) + roleId Int? @map("role_id") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + assignedRole Role? @relation(fields: [roleId], references: [id]) + favorites Favorite[] + browsingHistory BrowsingHistory[] + reviews Review[] + collections Collection[] + + @@unique([oauthProvider, oauthId]) + @@map("users") +} + +model Role { + id Int @id @default(autoincrement()) + name String @db.VarChar(50) + slug String @unique @db.VarChar(50) + isSystem Boolean @default(false) @map("is_system") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + permissions RolePermission[] + users User[] + + @@map("roles") +} + +model Permission { + id Int @id @default(autoincrement()) + groupName String @map("group_name") @db.VarChar(50) + name String @db.VarChar(50) + key String @unique @db.VarChar(80) + sortOrder Int @default(0) @map("sort_order") + createdAt DateTime @default(now()) @map("created_at") + + rolePermissions RolePermission[] + + @@index([groupName, sortOrder]) + @@map("permissions") +} + +model RolePermission { + roleId Int @map("role_id") + permissionId Int @map("permission_id") + + role Role @relation(fields: [roleId], references: [id], onDelete: Cascade) + permission Permission @relation(fields: [permissionId], references: [id], onDelete: Cascade) + + @@id([roleId, permissionId]) + @@map("role_permissions") +} + +model Favorite { + id Int @id @default(autoincrement()) + userId Int @map("user_id") + toolId Int? @map("tool_id") + skillId Int? @map("skill_id") + createdAt DateTime @default(now()) @map("created_at") + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + tool Tool? @relation(fields: [toolId], references: [id], onDelete: Cascade) + skill Skill? @relation(fields: [skillId], references: [id], onDelete: Cascade) + + @@unique([userId, toolId]) + @@unique([userId, skillId]) + @@index([userId]) + @@map("favorites") +} + +model BrowsingHistory { + id Int @id @default(autoincrement()) + userId Int @map("user_id") + toolId Int? @map("tool_id") + skillId Int? @map("skill_id") + viewedAt DateTime @default(now()) @updatedAt @map("viewed_at") + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + tool Tool? @relation(fields: [toolId], references: [id], onDelete: Cascade) + skill Skill? @relation(fields: [skillId], references: [id], onDelete: Cascade) + + @@unique([userId, toolId]) + @@unique([userId, skillId]) + @@index([userId, viewedAt]) + @@map("browsing_histories") +} + +model Review { + id Int @id @default(autoincrement()) + userId Int @map("user_id") + toolId Int? @map("tool_id") + skillId Int? @map("skill_id") + rating Int? + comment String @db.Text + createdAt DateTime @default(now()) @map("created_at") + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + tool Tool? @relation(fields: [toolId], references: [id], onDelete: Cascade) + skill Skill? @relation(fields: [skillId], references: [id], onDelete: Cascade) + + @@unique([userId, toolId]) + @@unique([userId, skillId]) + @@index([toolId, createdAt]) + @@index([skillId, createdAt]) + @@map("reviews") +} + +model Collection { + id Int @id @default(autoincrement()) + userId Int @map("user_id") + name String @db.VarChar(50) + description String? @db.Text + sortOrder Int @default(0) @map("sort_order") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + items CollectionItem[] + + @@index([userId]) + @@map("collections") +} + +model CollectionItem { + id Int @id @default(autoincrement()) + collectionId Int @map("collection_id") + toolId Int? @map("tool_id") + skillId Int? @map("skill_id") + addedAt DateTime @default(now()) @map("added_at") + + collection Collection @relation(fields: [collectionId], references: [id], onDelete: Cascade) + tool Tool? @relation(fields: [toolId], references: [id], onDelete: Cascade) + skill Skill? @relation(fields: [skillId], references: [id], onDelete: Cascade) + + @@unique([collectionId, toolId]) + @@unique([collectionId, skillId]) + @@index([collectionId]) + @@map("collection_items") +} + +model DailyReport { + id Int @id @default(autoincrement()) + date DateTime @unique @db.Date + title String @db.VarChar(200) + summary String? @db.Text + hotCount Int @default(0) @map("hot_count") + coverUrl String? @map("cover_url") @db.VarChar(255) + status Status @default(draft) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + + items DailyReportItem[] + + @@index([date]) + @@index([status]) + @@map("daily_reports") +} + +model DailyReportItem { + id Int @id @default(autoincrement()) + reportId Int @map("report_id") + sortOrder Int @default(0) @map("sort_order") + category String @default("tech") @db.VarChar(20) + title String @db.VarChar(200) + summary String? @db.Text + detail String? @db.Text + sourceUrl String? @map("source_url") @db.VarChar(500) + imageUrl String? @map("image_url") @db.VarChar(255) + hotScore Int @default(0) @map("hot_score") + createdAt DateTime @default(now()) @map("created_at") + + report DailyReport @relation(fields: [reportId], references: [id], onDelete: Cascade) + + @@index([reportId, sortOrder]) + @@map("daily_report_items") +} + +model SkillReview { + id Int @id @default(autoincrement()) + skillId Int @unique @map("skill_id") + skill Skill @relation(fields: [skillId], references: [id]) + + capability Float + devExp Float @map("dev_exp") + costLicense Float @map("cost_license") + community Float + performance Float + overall Float + + reviews Json + + longArticle String? @map("long_article") @db.Text + videoScript String? @map("video_script") @db.Text + socialCards Json? @map("social_cards") + + status ReviewStatus @default(DRAFT) + reviewedAt DateTime @updatedAt @map("reviewed_at") + createdAt DateTime @default(now()) @map("created_at") + + @@index([skillId]) + @@index([overall]) + @@map("skill_reviews") +} + +model ReviewGenerationLog { + id Int @id @default(autoincrement()) + skillId Int @map("skill_id") + status String @db.VarChar(20) + prompt String @db.Text + response String? @db.Text + error String? @db.Text + createdAt DateTime @default(now()) @map("created_at") + + @@index([skillId]) + @@map("review_generation_logs") +} + +enum ReviewStatus { + DRAFT + PUBLISHED + REJECTED + OUTDATED +} + diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..67e8ae0 --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,41 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; + +const adapter = new PrismaMariaDb(process.env.DATABASE_URL!); +const prisma = new PrismaClient({ adapter }); + +const categories = [ + { name: "文本生成", slug: "text-generation", icon: "", sortOrder: 1 }, + { name: "图像生成", slug: "image-generation", icon: "", sortOrder: 2 }, + { name: "视频生成", slug: "video-generation", icon: "", sortOrder: 3 }, + { name: "音频处理", slug: "audio-processing", icon: "", sortOrder: 4 }, + { name: "代码助手", slug: "code-assistant", icon: "", sortOrder: 5 }, + { name: "办公效率", slug: "office-efficiency", icon: "", sortOrder: 6 }, + { name: "AI 角色", slug: "ai-character", icon: "", sortOrder: 7 }, + { name: "设计工具", slug: "design-tools", icon: "", sortOrder: 8 }, + { name: "数据分析", slug: "data-analysis", icon: "", sortOrder: 9 }, + { name: "内容检测", slug: "content-detection", icon: "", sortOrder: 10 }, +]; + +async function main() { + console.log("Seeding categories..."); + + for (const category of categories) { + await prisma.category.upsert({ + where: { slug: category.slug }, + update: { name: category.name, sortOrder: category.sortOrder }, + create: category, + }); + } + + console.log(`Seeded ${categories.length} categories.`); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..ae6d9a9 Binary files /dev/null and b/public/logo.png differ diff --git a/public/logos/10jqka.com.cn_672e10d4.ico b/public/logos/10jqka.com.cn_672e10d4.ico new file mode 100644 index 0000000..fac31fb Binary files /dev/null and b/public/logos/10jqka.com.cn_672e10d4.ico differ diff --git a/public/logos/4paradigm.com_36a57f11.ico b/public/logos/4paradigm.com_36a57f11.ico new file mode 100644 index 0000000..c5b4ca9 Binary files /dev/null and b/public/logos/4paradigm.com_36a57f11.ico differ diff --git a/public/logos/7n.bczcdn.com_f5843a1a.png b/public/logos/7n.bczcdn.com_f5843a1a.png new file mode 100644 index 0000000..eb2904c Binary files /dev/null and b/public/logos/7n.bczcdn.com_f5843a1a.png differ diff --git a/public/logos/ai.chinaz.com_a0a5b708.png b/public/logos/ai.chinaz.com_a0a5b708.png new file mode 100644 index 0000000..ab98e9a Binary files /dev/null and b/public/logos/ai.chinaz.com_a0a5b708.png differ diff --git a/public/logos/ai.jd.com_cbc81096.ico b/public/logos/ai.jd.com_cbc81096.ico new file mode 100644 index 0000000..96cd072 Binary files /dev/null and b/public/logos/ai.jd.com_cbc81096.ico differ diff --git a/public/logos/airdoc.com_27fed445.ico b/public/logos/airdoc.com_27fed445.ico new file mode 100644 index 0000000..45180e1 Binary files /dev/null and b/public/logos/airdoc.com_27fed445.ico differ diff --git a/public/logos/aispeech.com_265bd6b4.ico b/public/logos/aispeech.com_265bd6b4.ico new file mode 100644 index 0000000..99b605a Binary files /dev/null and b/public/logos/aispeech.com_265bd6b4.ico differ diff --git a/public/logos/assets.mubu.com_2ec63493.ico b/public/logos/assets.mubu.com_2ec63493.ico new file mode 100644 index 0000000..796d10d Binary files /dev/null and b/public/logos/assets.mubu.com_2ec63493.ico differ diff --git a/public/logos/assets.weibanzhushou.com_5fb5aca1.png b/public/logos/assets.weibanzhushou.com_5fb5aca1.png new file mode 100644 index 0000000..a3dac0b Binary files /dev/null and b/public/logos/assets.weibanzhushou.com_5fb5aca1.png differ diff --git a/public/logos/baidu.com_9d52e8eb.ico b/public/logos/baidu.com_9d52e8eb.ico new file mode 100644 index 0000000..0013c7e Binary files /dev/null and b/public/logos/baidu.com_9d52e8eb.ico differ diff --git a/public/logos/beschannels.com_a8863fd5.svg b/public/logos/beschannels.com_a8863fd5.svg new file mode 100644 index 0000000..658c0f9 --- /dev/null +++ b/public/logos/beschannels.com_a8863fd5.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/logos/bocha.io_9f4d0469.ico b/public/logos/bocha.io_9f4d0469.ico new file mode 100644 index 0000000..1569e91 Binary files /dev/null and b/public/logos/bocha.io_9f4d0469.ico differ diff --git a/public/logos/cas.cn_0049aecf.png b/public/logos/cas.cn_0049aecf.png new file mode 100644 index 0000000..9cc8830 Binary files /dev/null and b/public/logos/cas.cn_0049aecf.png differ diff --git a/public/logos/cdn-3d-prod.hunyuan.tencent.com_a6250256.png b/public/logos/cdn-3d-prod.hunyuan.tencent.com_a6250256.png new file mode 100644 index 0000000..64db9e1 Binary files /dev/null and b/public/logos/cdn-3d-prod.hunyuan.tencent.com_a6250256.png differ diff --git a/public/logos/cdn-static.chanmama.com_1459bfd8.ico b/public/logos/cdn-static.chanmama.com_1459bfd8.ico new file mode 100644 index 0000000..a160810 Binary files /dev/null and b/public/logos/cdn-static.chanmama.com_1459bfd8.ico differ diff --git a/public/logos/cdn.baichuan-ai.com_28209e13.png b/public/logos/cdn.baichuan-ai.com_28209e13.png new file mode 100644 index 0000000..150a2a1 Binary files /dev/null and b/public/logos/cdn.baichuan-ai.com_28209e13.png differ diff --git a/public/logos/cdn.chat2db-ai.com_f45acc14.svg b/public/logos/cdn.chat2db-ai.com_f45acc14.svg new file mode 100644 index 0000000..6d2aa39 --- /dev/null +++ b/public/logos/cdn.chat2db-ai.com_f45acc14.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/logos/cdn.w.wanfangdata.com.cn_4df309b7.ico b/public/logos/cdn.w.wanfangdata.com.cn_4df309b7.ico new file mode 100644 index 0000000..4dfd601 Binary files /dev/null and b/public/logos/cdn.w.wanfangdata.com.cn_4df309b7.ico differ diff --git a/public/logos/cdn.xiaowei.qq.com_f1083a93.png b/public/logos/cdn.xiaowei.qq.com_f1083a93.png new file mode 100644 index 0000000..aabace1 Binary files /dev/null and b/public/logos/cdn.xiaowei.qq.com_f1083a93.png differ diff --git a/public/logos/cdn2.weimob.com_a2236d81.ico b/public/logos/cdn2.weimob.com_a2236d81.ico new file mode 100644 index 0000000..fd81006 Binary files /dev/null and b/public/logos/cdn2.weimob.com_a2236d81.ico differ diff --git a/public/logos/chat-ppt.com_4af6db63.ico b/public/logos/chat-ppt.com_4af6db63.ico new file mode 100644 index 0000000..84e13f3 Binary files /dev/null and b/public/logos/chat-ppt.com_4af6db63.ico differ diff --git a/public/logos/chatglm.cn_dc50efac.ico b/public/logos/chatglm.cn_dc50efac.ico new file mode 100644 index 0000000..c5a46cc Binary files /dev/null and b/public/logos/chatglm.cn_dc50efac.ico differ diff --git a/public/logos/chs.newrank.cn_cc0284d4.ico b/public/logos/chs.newrank.cn_cc0284d4.ico new file mode 100644 index 0000000..19f0222 Binary files /dev/null and b/public/logos/chs.newrank.cn_cc0284d4.ico differ diff --git a/public/logos/chuangkit.com_952974aa.ico b/public/logos/chuangkit.com_952974aa.ico new file mode 100644 index 0000000..a652427 Binary files /dev/null and b/public/logos/chuangkit.com_952974aa.ico differ diff --git a/public/logos/chumenwenwen.com_ea3b81dd.ico b/public/logos/chumenwenwen.com_ea3b81dd.ico new file mode 100644 index 0000000..71e7e73 Binary files /dev/null and b/public/logos/chumenwenwen.com_ea3b81dd.ico differ diff --git a/public/logos/cloud.tencent.com_c9d28e0f.ico b/public/logos/cloud.tencent.com_c9d28e0f.ico new file mode 100644 index 0000000..1e94a78 Binary files /dev/null and b/public/logos/cloud.tencent.com_c9d28e0f.ico differ diff --git a/public/logos/cloudcache.tencent-cloud.com_108d310a.ico b/public/logos/cloudcache.tencent-cloud.com_108d310a.ico new file mode 100644 index 0000000..1e94a78 Binary files /dev/null and b/public/logos/cloudcache.tencent-cloud.com_108d310a.ico differ diff --git a/public/logos/cms.boardmix.cn_8a0761dd.ico b/public/logos/cms.boardmix.cn_8a0761dd.ico new file mode 100644 index 0000000..b8a3e42 Binary files /dev/null and b/public/logos/cms.boardmix.cn_8a0761dd.ico differ diff --git a/public/logos/cms.pixso.cn_bb8d2134.ico b/public/logos/cms.pixso.cn_bb8d2134.ico new file mode 100644 index 0000000..602b917 Binary files /dev/null and b/public/logos/cms.pixso.cn_bb8d2134.ico differ diff --git a/public/logos/codegeex.cn_ed41f769.png b/public/logos/codegeex.cn_ed41f769.png new file mode 100644 index 0000000..224eafb Binary files /dev/null and b/public/logos/codegeex.cn_ed41f769.png differ diff --git a/public/logos/colossalai.org_739adaf2.ico b/public/logos/colossalai.org_739adaf2.ico new file mode 100644 index 0000000..82dd5f8 Binary files /dev/null and b/public/logos/colossalai.org_739adaf2.ico differ diff --git a/public/logos/comate.baidu.com_c2e7cfda.ico b/public/logos/comate.baidu.com_c2e7cfda.ico new file mode 100644 index 0000000..9aa3dab Binary files /dev/null and b/public/logos/comate.baidu.com_c2e7cfda.ico differ diff --git a/public/logos/convertlab.com_09278ccf.png b/public/logos/convertlab.com_09278ccf.png new file mode 100644 index 0000000..6b5d63b Binary files /dev/null and b/public/logos/convertlab.com_09278ccf.png differ diff --git a/public/logos/creator.nolibox.com_7e835fb0.png b/public/logos/creator.nolibox.com_7e835fb0.png new file mode 100644 index 0000000..9312fbf Binary files /dev/null and b/public/logos/creator.nolibox.com_7e835fb0.png differ diff --git a/public/logos/d35aaqx5ub95lt.cloudfront.net_e421e239.png b/public/logos/d35aaqx5ub95lt.cloudfront.net_e421e239.png new file mode 100644 index 0000000..6b85e52 Binary files /dev/null and b/public/logos/d35aaqx5ub95lt.cloudfront.net_e421e239.png differ diff --git a/public/logos/data-baker.com_a41fc865.ico b/public/logos/data-baker.com_a41fc865.ico new file mode 100644 index 0000000..24de422 Binary files /dev/null and b/public/logos/data-baker.com_a41fc865.ico differ diff --git a/public/logos/datafocus.ai_5dfaebbd.ico b/public/logos/datafocus.ai_5dfaebbd.ico new file mode 100644 index 0000000..7067b22 Binary files /dev/null and b/public/logos/datafocus.ai_5dfaebbd.ico differ diff --git a/public/logos/datagrand.com_2958e290.ico b/public/logos/datagrand.com_2958e290.ico new file mode 100644 index 0000000..62cc0fa Binary files /dev/null and b/public/logos/datagrand.com_2958e290.ico differ diff --git a/public/logos/dazd.cn_fdc4f453.png b/public/logos/dazd.cn_fdc4f453.png new file mode 100644 index 0000000..c7d8360 Binary files /dev/null and b/public/logos/dazd.cn_fdc4f453.png differ diff --git a/public/logos/dbappsecurity.com.cn_4e74d3cc.ico b/public/logos/dbappsecurity.com.cn_4e74d3cc.ico new file mode 100644 index 0000000..9b954ff Binary files /dev/null and b/public/logos/dbappsecurity.com.cn_4e74d3cc.ico differ diff --git a/public/logos/deepseek.com_4eb65e98.ico b/public/logos/deepseek.com_4eb65e98.ico new file mode 100644 index 0000000..8e78c0b Binary files /dev/null and b/public/logos/deepseek.com_4eb65e98.ico differ diff --git a/public/logos/dewu.com_a12d29f8.ico b/public/logos/dewu.com_a12d29f8.ico new file mode 100644 index 0000000..d4fd607 Binary files /dev/null and b/public/logos/dewu.com_a12d29f8.ico differ diff --git a/public/logos/dingxiang-inc.com_e7b32d1f.ico b/public/logos/dingxiang-inc.com_e7b32d1f.ico new file mode 100644 index 0000000..a7e244a Binary files /dev/null and b/public/logos/dingxiang-inc.com_e7b32d1f.ico differ diff --git a/public/logos/docs.idqqimg.com_bf1eb18e.ico b/public/logos/docs.idqqimg.com_bf1eb18e.ico new file mode 100644 index 0000000..3b9b4a6 Binary files /dev/null and b/public/logos/docs.idqqimg.com_bf1eb18e.ico differ diff --git a/public/logos/download.sangfor.com.cn_58fe4e5a.png b/public/logos/download.sangfor.com.cn_58fe4e5a.png new file mode 100644 index 0000000..d0d6ff1 Binary files /dev/null and b/public/logos/download.sangfor.com.cn_58fe4e5a.png differ diff --git a/public/logos/dtstack.com_2242a9cc.ico b/public/logos/dtstack.com_2242a9cc.ico new file mode 100644 index 0000000..41b85ab Binary files /dev/null and b/public/logos/dtstack.com_2242a9cc.ico differ diff --git a/public/logos/dtwave.com_5f8fd43e.ico b/public/logos/dtwave.com_5f8fd43e.ico new file mode 100644 index 0000000..40d1100 Binary files /dev/null and b/public/logos/dtwave.com_5f8fd43e.ico differ diff --git a/public/logos/dun.163.com_9715e57d.ico b/public/logos/dun.163.com_9715e57d.ico new file mode 100644 index 0000000..ea16e28 Binary files /dev/null and b/public/logos/dun.163.com_9715e57d.ico differ diff --git a/public/logos/edu-wenku.bdimg.com_3446645d.ico b/public/logos/edu-wenku.bdimg.com_3446645d.ico new file mode 100644 index 0000000..0013c7e Binary files /dev/null and b/public/logos/edu-wenku.bdimg.com_3446645d.ico differ diff --git a/public/logos/faas.llscdn.com_071efccf.ico b/public/logos/faas.llscdn.com_071efccf.ico new file mode 100644 index 0000000..66f3df3 Binary files /dev/null and b/public/logos/faas.llscdn.com_071efccf.ico differ diff --git a/public/logos/fadada.com_f61402d8.png b/public/logos/fadada.com_f61402d8.png new file mode 100644 index 0000000..3beefe3 Binary files /dev/null and b/public/logos/fadada.com_f61402d8.png differ diff --git a/public/logos/fastgpt.in_c61cdc7c.png b/public/logos/fastgpt.in_c61cdc7c.png new file mode 100644 index 0000000..db96f84 Binary files /dev/null and b/public/logos/fastgpt.in_c61cdc7c.png differ diff --git a/public/logos/favicon.im_0854a300.ico b/public/logos/favicon.im_0854a300.ico new file mode 100644 index 0000000..e448337 Binary files /dev/null and b/public/logos/favicon.im_0854a300.ico differ diff --git a/public/logos/favicon.im_19aeae60.ico b/public/logos/favicon.im_19aeae60.ico new file mode 100644 index 0000000..4bc8807 Binary files /dev/null and b/public/logos/favicon.im_19aeae60.ico differ diff --git a/public/logos/favicon.im_310760b3.ico b/public/logos/favicon.im_310760b3.ico new file mode 100644 index 0000000..ef4ec0f Binary files /dev/null and b/public/logos/favicon.im_310760b3.ico differ diff --git a/public/logos/favicon.im_3ab89bdd.ico b/public/logos/favicon.im_3ab89bdd.ico new file mode 100644 index 0000000..eec280c Binary files /dev/null and b/public/logos/favicon.im_3ab89bdd.ico differ diff --git a/public/logos/favicon.im_6bb40520.ico b/public/logos/favicon.im_6bb40520.ico new file mode 100644 index 0000000..6085608 Binary files /dev/null and b/public/logos/favicon.im_6bb40520.ico differ diff --git a/public/logos/favicon.im_74b04d42.ico b/public/logos/favicon.im_74b04d42.ico new file mode 100644 index 0000000..1a95503 Binary files /dev/null and b/public/logos/favicon.im_74b04d42.ico differ diff --git a/public/logos/favicon.im_9a0010b8.png b/public/logos/favicon.im_9a0010b8.png new file mode 100644 index 0000000..c8f7e26 Binary files /dev/null and b/public/logos/favicon.im_9a0010b8.png differ diff --git a/public/logos/favicon.im_9bff76be.ico b/public/logos/favicon.im_9bff76be.ico new file mode 100644 index 0000000..3e5174c Binary files /dev/null and b/public/logos/favicon.im_9bff76be.ico differ diff --git a/public/logos/favicon.im_a90822a1.png b/public/logos/favicon.im_a90822a1.png new file mode 100644 index 0000000..d833f50 Binary files /dev/null and b/public/logos/favicon.im_a90822a1.png differ diff --git a/public/logos/favicon.im_ae5dd9a1.png b/public/logos/favicon.im_ae5dd9a1.png new file mode 100644 index 0000000..090e8c6 Binary files /dev/null and b/public/logos/favicon.im_ae5dd9a1.png differ diff --git a/public/logos/favicon.im_b213e14f.png b/public/logos/favicon.im_b213e14f.png new file mode 100644 index 0000000..f4e5a35 Binary files /dev/null and b/public/logos/favicon.im_b213e14f.png differ diff --git a/public/logos/favicon.im_b798a2d9.png b/public/logos/favicon.im_b798a2d9.png new file mode 100644 index 0000000..d5883ec Binary files /dev/null and b/public/logos/favicon.im_b798a2d9.png differ diff --git a/public/logos/favicon.im_c77e6e9e.png b/public/logos/favicon.im_c77e6e9e.png new file mode 100644 index 0000000..be705bb Binary files /dev/null and b/public/logos/favicon.im_c77e6e9e.png differ diff --git a/public/logos/favicon.im_cc4e893d.png b/public/logos/favicon.im_cc4e893d.png new file mode 100644 index 0000000..907719e Binary files /dev/null and b/public/logos/favicon.im_cc4e893d.png differ diff --git a/public/logos/favicon.im_fe688f9d.ico b/public/logos/favicon.im_fe688f9d.ico new file mode 100644 index 0000000..467a980 Binary files /dev/null and b/public/logos/favicon.im_fe688f9d.ico differ diff --git a/public/logos/fe-video-qc.xhscdn.com_2db5e379.ico b/public/logos/fe-video-qc.xhscdn.com_2db5e379.ico new file mode 100644 index 0000000..779e285 Binary files /dev/null and b/public/logos/fe-video-qc.xhscdn.com_2db5e379.ico differ diff --git a/public/logos/feishu.cn_489a517e.ico b/public/logos/feishu.cn_489a517e.ico new file mode 100644 index 0000000..4a5baac Binary files /dev/null and b/public/logos/feishu.cn_489a517e.ico differ diff --git a/public/logos/fotor.com.cn_6aa3a047.ico b/public/logos/fotor.com.cn_6aa3a047.ico new file mode 100644 index 0000000..e5a2934 Binary files /dev/null and b/public/logos/fotor.com.cn_6aa3a047.ico differ diff --git a/public/logos/framerusercontent.com_33f169a6.png b/public/logos/framerusercontent.com_33f169a6.png new file mode 100644 index 0000000..565fc61 Binary files /dev/null and b/public/logos/framerusercontent.com_33f169a6.png differ diff --git a/public/logos/fuxi.163.com_304976ab.ico b/public/logos/fuxi.163.com_304976ab.ico new file mode 100644 index 0000000..b567055 Binary files /dev/null and b/public/logos/fuxi.163.com_304976ab.ico differ diff --git a/public/logos/gaoding.com_b6a84454.png b/public/logos/gaoding.com_b6a84454.png new file mode 100644 index 0000000..afe31ea Binary files /dev/null and b/public/logos/gaoding.com_b6a84454.png differ diff --git a/public/logos/growingio.com_4e0473d0.ico b/public/logos/growingio.com_4e0473d0.ico new file mode 100644 index 0000000..66073f9 Binary files /dev/null and b/public/logos/growingio.com_4e0473d0.ico differ diff --git a/public/logos/guandata-official-website.oss-cn-hangzho_36ed2278.ico b/public/logos/guandata-official-website.oss-cn-hangzho_36ed2278.ico new file mode 100644 index 0000000..e402063 Binary files /dev/null and b/public/logos/guandata-official-website.oss-cn-hangzho_36ed2278.ico differ diff --git a/public/logos/gw.alicdn.com_3078fb76.png b/public/logos/gw.alicdn.com_3078fb76.png new file mode 100644 index 0000000..26213be Binary files /dev/null and b/public/logos/gw.alicdn.com_3078fb76.png differ diff --git a/public/logos/gw.alicdn.com_ed32651a.ico b/public/logos/gw.alicdn.com_ed32651a.ico new file mode 100644 index 0000000..cc2df9a Binary files /dev/null and b/public/logos/gw.alicdn.com_ed32651a.ico differ diff --git a/public/logos/haizhi.com_f1b87871.ico b/public/logos/haizhi.com_f1b87871.ico new file mode 100644 index 0000000..6e72089 Binary files /dev/null and b/public/logos/haizhi.com_f1b87871.ico differ diff --git a/public/logos/haoxinqing.cn_bf220f25.ico b/public/logos/haoxinqing.cn_bf220f25.ico new file mode 100644 index 0000000..e961a32 Binary files /dev/null and b/public/logos/haoxinqing.cn_bf220f25.ico differ diff --git a/public/logos/help-assets.codehub.cn_e1be4afd.ico b/public/logos/help-assets.codehub.cn_e1be4afd.ico new file mode 100644 index 0000000..1130cd0 Binary files /dev/null and b/public/logos/help-assets.codehub.cn_e1be4afd.ico differ diff --git a/public/logos/hengshi.com_cc295d55.ico b/public/logos/hengshi.com_cc295d55.ico new file mode 100644 index 0000000..7b94ec8 Binary files /dev/null and b/public/logos/hengshi.com_cc295d55.ico differ diff --git a/public/logos/hillstonenet.com.cn_2cfbfdeb.png b/public/logos/hillstonenet.com.cn_2cfbfdeb.png new file mode 100644 index 0000000..3770026 Binary files /dev/null and b/public/logos/hillstonenet.com.cn_2cfbfdeb.png differ diff --git a/public/logos/huawei.com_685a6f43.ico b/public/logos/huawei.com_685a6f43.ico new file mode 100644 index 0000000..302a882 Binary files /dev/null and b/public/logos/huawei.com_685a6f43.ico differ diff --git a/public/logos/huaweicloud.com_8da2ec13.ico b/public/logos/huaweicloud.com_8da2ec13.ico new file mode 100644 index 0000000..bd9490b Binary files /dev/null and b/public/logos/huaweicloud.com_8da2ec13.ico differ diff --git a/public/logos/hundsun.com_80a85ad5.ico b/public/logos/hundsun.com_80a85ad5.ico new file mode 100644 index 0000000..6fe73e1 Binary files /dev/null and b/public/logos/hundsun.com_80a85ad5.ico differ diff --git a/public/logos/hupun.com_32da35a6.ico b/public/logos/hupun.com_32da35a6.ico new file mode 100644 index 0000000..176e6f9 Binary files /dev/null and b/public/logos/hupun.com_32da35a6.ico differ diff --git a/public/logos/hypergryph.com_d08992a4.ico b/public/logos/hypergryph.com_d08992a4.ico new file mode 100644 index 0000000..b556bc6 Binary files /dev/null and b/public/logos/hypergryph.com_d08992a4.ico differ diff --git a/public/logos/icekredit.com_edec0386.ico b/public/logos/icekredit.com_edec0386.ico new file mode 100644 index 0000000..eb800ef Binary files /dev/null and b/public/logos/icekredit.com_edec0386.ico differ diff --git a/public/logos/images.modao.cc_d078d298.ico b/public/logos/images.modao.cc_d078d298.ico new file mode 100644 index 0000000..11a6e12 Binary files /dev/null and b/public/logos/images.modao.cc_d078d298.ico differ diff --git a/public/logos/img.acadsoc.com.cn_ebcc4812.ico b/public/logos/img.acadsoc.com.cn_ebcc4812.ico new file mode 100644 index 0000000..2bd46f2 Binary files /dev/null and b/public/logos/img.acadsoc.com.cn_ebcc4812.ico differ diff --git a/public/logos/img.alicdn.com_0985ef9b.png b/public/logos/img.alicdn.com_0985ef9b.png new file mode 100644 index 0000000..8750f3a Binary files /dev/null and b/public/logos/img.alicdn.com_0985ef9b.png differ diff --git a/public/logos/img.alicdn.com_81f9f314.png b/public/logos/img.alicdn.com_81f9f314.png new file mode 100644 index 0000000..57681e9 Binary files /dev/null and b/public/logos/img.alicdn.com_81f9f314.png differ diff --git a/public/logos/img.alicdn.com_97c917f7.ico b/public/logos/img.alicdn.com_97c917f7.ico new file mode 100644 index 0000000..a566910 Binary files /dev/null and b/public/logos/img.alicdn.com_97c917f7.ico differ diff --git a/public/logos/img.alicdn.com_ad1a771e.svg b/public/logos/img.alicdn.com_ad1a771e.svg new file mode 100644 index 0000000..3ee24ae --- /dev/null +++ b/public/logos/img.alicdn.com_ad1a771e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/img.alicdn.com_b39ee24a.png b/public/logos/img.alicdn.com_b39ee24a.png new file mode 100644 index 0000000..b926c38 Binary files /dev/null and b/public/logos/img.alicdn.com_b39ee24a.png differ diff --git a/public/logos/img.alicdn.com_e3908587.png b/public/logos/img.alicdn.com_e3908587.png new file mode 100644 index 0000000..16619e8 Binary files /dev/null and b/public/logos/img.alicdn.com_e3908587.png differ diff --git a/public/logos/img.atom.com_24e95830.jpg b/public/logos/img.atom.com_24e95830.jpg new file mode 100644 index 0000000..edafbca Binary files /dev/null and b/public/logos/img.atom.com_24e95830.jpg differ diff --git a/public/logos/img.jiguang.cn_a65f867c.ico b/public/logos/img.jiguang.cn_a65f867c.ico new file mode 100644 index 0000000..2ce9475 Binary files /dev/null and b/public/logos/img.jiguang.cn_a65f867c.ico differ diff --git a/public/logos/img.sedoparking.com_1e8b1d89.png b/public/logos/img.sedoparking.com_1e8b1d89.png new file mode 100644 index 0000000..05ad9fb Binary files /dev/null and b/public/logos/img.sedoparking.com_1e8b1d89.png differ diff --git a/public/logos/img.wedoctor.com_fbe847bf.ico b/public/logos/img.wedoctor.com_fbe847bf.ico new file mode 100644 index 0000000..ebb3a80 Binary files /dev/null and b/public/logos/img.wedoctor.com_fbe847bf.ico differ diff --git a/public/logos/img.yzcdn.cn_220547ba.ico b/public/logos/img.yzcdn.cn_220547ba.ico new file mode 100644 index 0000000..e703b1b Binary files /dev/null and b/public/logos/img.yzcdn.cn_220547ba.ico differ diff --git a/public/logos/img1.jcloudcs.com_dec117bb.ico b/public/logos/img1.jcloudcs.com_dec117bb.ico new file mode 100644 index 0000000..eb2af68 Binary files /dev/null and b/public/logos/img1.jcloudcs.com_dec117bb.ico differ diff --git a/public/logos/internlm.intern-ai.org.cn_c72f823b.png b/public/logos/internlm.intern-ai.org.cn_c72f823b.png new file mode 100644 index 0000000..327d3d3 Binary files /dev/null and b/public/logos/internlm.intern-ai.org.cn_c72f823b.png differ diff --git a/public/logos/isheji.com_c888cecb.ico b/public/logos/isheji.com_c888cecb.ico new file mode 100644 index 0000000..85f1716 Binary files /dev/null and b/public/logos/isheji.com_c888cecb.ico differ diff --git a/public/logos/jiushuyun.com_6ae0dc6f.ico b/public/logos/jiushuyun.com_6ae0dc6f.ico new file mode 100644 index 0000000..9c66bdd Binary files /dev/null and b/public/logos/jiushuyun.com_6ae0dc6f.ico differ diff --git a/public/logos/jiuzhang.com_c373eadd.ico b/public/logos/jiuzhang.com_c373eadd.ico new file mode 100644 index 0000000..3047885 Binary files /dev/null and b/public/logos/jiuzhang.com_c373eadd.ico differ diff --git a/public/logos/jk.cn_c3bbeef1.ico b/public/logos/jk.cn_c3bbeef1.ico new file mode 100644 index 0000000..d71682d Binary files /dev/null and b/public/logos/jk.cn_c3bbeef1.ico differ diff --git a/public/logos/js.app.meitudata.com_b668893e.svg b/public/logos/js.app.meitudata.com_b668893e.svg new file mode 100644 index 0000000..71898c0 --- /dev/null +++ b/public/logos/js.app.meitudata.com_b668893e.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/logos/jushuitan.com_23dcdde8.ico b/public/logos/jushuitan.com_23dcdde8.ico new file mode 100644 index 0000000..cb48fc5 Binary files /dev/null and b/public/logos/jushuitan.com_23dcdde8.ico differ diff --git a/public/logos/kdgc.cn_e4b78a77.png b/public/logos/kdgc.cn_e4b78a77.png new file mode 100644 index 0000000..95aeb5b Binary files /dev/null and b/public/logos/kdgc.cn_e4b78a77.png differ diff --git a/public/logos/keyamedical.com_b52dbd56.png b/public/logos/keyamedical.com_b52dbd56.png new file mode 100644 index 0000000..c9cfbbb Binary files /dev/null and b/public/logos/keyamedical.com_b52dbd56.png differ diff --git a/public/logos/kns.cnki.net_3c8396ea.ico b/public/logos/kns.cnki.net_3c8396ea.ico new file mode 100644 index 0000000..736811d Binary files /dev/null and b/public/logos/kns.cnki.net_3c8396ea.ico differ diff --git a/public/logos/kylin.apache.org_09569032.svg b/public/logos/kylin.apache.org_09569032.svg new file mode 100644 index 0000000..9db6d0d --- /dev/null +++ b/public/logos/kylin.apache.org_09569032.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/laiye.com_835c0782.ico b/public/logos/laiye.com_835c0782.ico new file mode 100644 index 0000000..ac7872e Binary files /dev/null and b/public/logos/laiye.com_835c0782.ico differ diff --git a/public/logos/langboat.com_34680128.ico b/public/logos/langboat.com_34680128.ico new file mode 100644 index 0000000..3703d4b Binary files /dev/null and b/public/logos/langboat.com_34680128.ico differ diff --git a/public/logos/law.metaso.cn_7fe0246e.ico b/public/logos/law.metaso.cn_7fe0246e.ico new file mode 100644 index 0000000..98fa9f9 Binary files /dev/null and b/public/logos/law.metaso.cn_7fe0246e.ico differ diff --git a/public/logos/lf-cdn.marscode.com_c5427a98.png b/public/logos/lf-cdn.marscode.com_c5427a98.png new file mode 100644 index 0000000..e46c382 Binary files /dev/null and b/public/logos/lf-cdn.marscode.com_c5427a98.png differ diff --git a/public/logos/lf-coze-web-cdn.coze.cn_d165e422.ico b/public/logos/lf-coze-web-cdn.coze.cn_d165e422.ico new file mode 100644 index 0000000..1c01189 Binary files /dev/null and b/public/logos/lf-coze-web-cdn.coze.cn_d165e422.ico differ diff --git a/public/logos/lf-flow-web-cdn.doubao.com_26184ff5.png b/public/logos/lf-flow-web-cdn.doubao.com_26184ff5.png new file mode 100644 index 0000000..b984b76 Binary files /dev/null and b/public/logos/lf-flow-web-cdn.doubao.com_26184ff5.png differ diff --git a/public/logos/lf3-s.vlabstatic.com_336662da.ico b/public/logos/lf3-s.vlabstatic.com_336662da.ico new file mode 100644 index 0000000..c89f355 Binary files /dev/null and b/public/logos/lf3-s.vlabstatic.com_336662da.ico differ diff --git a/public/logos/lilithimage.lilithcdn.com_b90ad80b.ico b/public/logos/lilithimage.lilithcdn.com_b90ad80b.ico new file mode 100644 index 0000000..248b043 Binary files /dev/null and b/public/logos/lilithimage.lilithcdn.com_b90ad80b.ico differ diff --git a/public/logos/linkdoc.com_1c5bade8.ico b/public/logos/linkdoc.com_1c5bade8.ico new file mode 100644 index 0000000..e53d087 Binary files /dev/null and b/public/logos/linkdoc.com_1c5bade8.ico differ diff --git a/public/logos/logoai.com_885a27c8.svg b/public/logos/logoai.com_885a27c8.svg new file mode 100644 index 0000000..b583db2 --- /dev/null +++ b/public/logos/logoai.com_885a27c8.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/mastergo.com_6c834b71.ico b/public/logos/mastergo.com_6c834b71.ico new file mode 100644 index 0000000..31e772a Binary files /dev/null and b/public/logos/mastergo.com_6c834b71.ico differ diff --git a/public/logos/maxkb.cn_a23bd271.png b/public/logos/maxkb.cn_a23bd271.png new file mode 100644 index 0000000..7d9781e Binary files /dev/null and b/public/logos/maxkb.cn_a23bd271.png differ diff --git a/public/logos/mdn.alipayobjects.com_90a4ebb5.svg b/public/logos/mdn.alipayobjects.com_90a4ebb5.svg new file mode 100644 index 0000000..b525b74 --- /dev/null +++ b/public/logos/mdn.alipayobjects.com_90a4ebb5.svg @@ -0,0 +1,42 @@ + + + 品牌LOGO/APP应用图形-外 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logos/medlive.cn_f1135258.ico b/public/logos/medlive.cn_f1135258.ico new file mode 100644 index 0000000..367fc0f Binary files /dev/null and b/public/logos/medlive.cn_f1135258.ico differ diff --git a/public/logos/meituan.com_bdbac730.ico b/public/logos/meituan.com_bdbac730.ico new file mode 100644 index 0000000..bee2e81 Binary files /dev/null and b/public/logos/meituan.com_bdbac730.ico differ diff --git a/public/logos/meshy.ai_b1ca081d.ico b/public/logos/meshy.ai_b1ca081d.ico new file mode 100644 index 0000000..d225b25 Binary files /dev/null and b/public/logos/meshy.ai_b1ca081d.ico differ diff --git a/public/logos/metaso.cn_11752a66.png b/public/logos/metaso.cn_11752a66.png new file mode 100644 index 0000000..2c6b4e5 Binary files /dev/null and b/public/logos/metaso.cn_11752a66.png differ diff --git a/public/logos/mihoyo.com_9f08a8f6.ico b/public/logos/mihoyo.com_9f08a8f6.ico new file mode 100644 index 0000000..eb5b478 Binary files /dev/null and b/public/logos/mihoyo.com_9f08a8f6.ico differ diff --git a/public/logos/milian.com_eee114b7.ico b/public/logos/milian.com_eee114b7.ico new file mode 100644 index 0000000..54ef188 Binary files /dev/null and b/public/logos/milian.com_eee114b7.ico differ diff --git a/public/logos/milvus.io_013fa8b4.png b/public/logos/milvus.io_013fa8b4.png new file mode 100644 index 0000000..46ea712 Binary files /dev/null and b/public/logos/milvus.io_013fa8b4.png differ diff --git a/public/logos/minimax.com_4f2fa167.png b/public/logos/minimax.com_4f2fa167.png new file mode 100644 index 0000000..c59b4d0 Binary files /dev/null and b/public/logos/minimax.com_4f2fa167.png differ diff --git a/public/logos/mininglamp.com_2969e778.png b/public/logos/mininglamp.com_2969e778.png new file mode 100644 index 0000000..eb51739 Binary files /dev/null and b/public/logos/mininglamp.com_2969e778.png differ diff --git a/public/logos/mockplus.com_4eff214d.ico b/public/logos/mockplus.com_4eff214d.ico new file mode 100644 index 0000000..21c5fd2 Binary files /dev/null and b/public/logos/mockplus.com_4eff214d.ico differ diff --git a/public/logos/motiff.com_3672d0d8.ico b/public/logos/motiff.com_3672d0d8.ico new file mode 100644 index 0000000..aa5fe8f Binary files /dev/null and b/public/logos/motiff.com_3672d0d8.ico differ diff --git a/public/logos/nodestatic.fbstatic.cn_e07ae698.ico b/public/logos/nodestatic.fbstatic.cn_e07ae698.ico new file mode 100644 index 0000000..ec30f7e Binary files /dev/null and b/public/logos/nodestatic.fbstatic.cn_e07ae698.ico differ diff --git a/public/logos/note.youdao.com_8fe691ec.ico b/public/logos/note.youdao.com_8fe691ec.ico new file mode 100644 index 0000000..2b5c3b2 Binary files /dev/null and b/public/logos/note.youdao.com_8fe691ec.ico differ diff --git a/public/logos/oneflow.org_4e721874.png b/public/logos/oneflow.org_4e721874.png new file mode 100644 index 0000000..0afd48a Binary files /dev/null and b/public/logos/oneflow.org_4e721874.png differ diff --git a/public/logos/open.bigmodel.cn_46c2126c.png b/public/logos/open.bigmodel.cn_46c2126c.png new file mode 100644 index 0000000..0cc7d36 Binary files /dev/null and b/public/logos/open.bigmodel.cn_46c2126c.png differ diff --git a/public/logos/oss.jianzeppt.com_787a5971.png b/public/logos/oss.jianzeppt.com_787a5971.png new file mode 100644 index 0000000..8150046 Binary files /dev/null and b/public/logos/oss.jianzeppt.com_787a5971.png differ diff --git a/public/logos/p1.ssl.qhimg.com_80474817.png b/public/logos/p1.ssl.qhimg.com_80474817.png new file mode 100644 index 0000000..d250160 Binary files /dev/null and b/public/logos/p1.ssl.qhimg.com_80474817.png differ diff --git a/public/logos/paddlepaddle-org-cn.cdn.bcebos.com_e1fc7bbc.png b/public/logos/paddlepaddle-org-cn.cdn.bcebos.com_e1fc7bbc.png new file mode 100644 index 0000000..e140795 Binary files /dev/null and b/public/logos/paddlepaddle-org-cn.cdn.bcebos.com_e1fc7bbc.png differ diff --git a/public/logos/personal-act.wpscdn.cn_7468eac2.ico b/public/logos/personal-act.wpscdn.cn_7468eac2.ico new file mode 100644 index 0000000..10407d4 Binary files /dev/null and b/public/logos/personal-act.wpscdn.cn_7468eac2.ico differ diff --git a/public/logos/pic1.zhimg.com_a4b530f8.png b/public/logos/pic1.zhimg.com_a4b530f8.png new file mode 100644 index 0000000..8c52832 Binary files /dev/null and b/public/logos/pic1.zhimg.com_a4b530f8.png differ diff --git a/public/logos/piccache.cnki.net_ffafcde6.png b/public/logos/piccache.cnki.net_ffafcde6.png new file mode 100644 index 0000000..f9127eb Binary files /dev/null and b/public/logos/piccache.cnki.net_ffafcde6.png differ diff --git a/public/logos/pinduoduo.com_eb530fd4.png b/public/logos/pinduoduo.com_eb530fd4.png new file mode 100644 index 0000000..a4139fc Binary files /dev/null and b/public/logos/pinduoduo.com_eb530fd4.png differ diff --git a/public/logos/pingcap.com_305b3e85.png b/public/logos/pingcap.com_305b3e85.png new file mode 100644 index 0000000..8ce3b77 Binary files /dev/null and b/public/logos/pingcap.com_305b3e85.png differ diff --git a/public/logos/pku.edu.cn_25b8a92f.png b/public/logos/pku.edu.cn_25b8a92f.png new file mode 100644 index 0000000..6ada1ba Binary files /dev/null and b/public/logos/pku.edu.cn_25b8a92f.png differ diff --git a/public/logos/portal.volccdn.com_0c0a536d.png b/public/logos/portal.volccdn.com_0c0a536d.png new file mode 100644 index 0000000..87017b5 Binary files /dev/null and b/public/logos/portal.volccdn.com_0c0a536d.png differ diff --git a/public/logos/powerlaw.ai_3b4eee32.ico b/public/logos/powerlaw.ai_3b4eee32.ico new file mode 100644 index 0000000..ff28151 Binary files /dev/null and b/public/logos/powerlaw.ai_3b4eee32.ico differ diff --git a/public/logos/qianxin.com_d11bd051.png b/public/logos/qianxin.com_d11bd051.png new file mode 100644 index 0000000..5488743 Binary files /dev/null and b/public/logos/qianxin.com_d11bd051.png differ diff --git a/public/logos/rcrai.com_febea90d.png b/public/logos/rcrai.com_febea90d.png new file mode 100644 index 0000000..ada2496 Binary files /dev/null and b/public/logos/rcrai.com_febea90d.png differ diff --git a/public/logos/res.srcgptbots.com_9e3ae131.png b/public/logos/res.srcgptbots.com_9e3ae131.png new file mode 100644 index 0000000..da8535f Binary files /dev/null and b/public/logos/res.srcgptbots.com_9e3ae131.png differ diff --git a/public/logos/resource.chunyu.mobi_5b526b2d.ico b/public/logos/resource.chunyu.mobi_5b526b2d.ico new file mode 100644 index 0000000..b300461 Binary files /dev/null and b/public/logos/resource.chunyu.mobi_5b526b2d.ico differ diff --git a/public/logos/rishiqing.com_148bef0d.ico b/public/logos/rishiqing.com_148bef0d.ico new file mode 100644 index 0000000..d6df603 Binary files /dev/null and b/public/logos/rishiqing.com_148bef0d.ico differ diff --git a/public/logos/riversecurity.com_dbdd469a.png b/public/logos/riversecurity.com_dbdd469a.png new file mode 100644 index 0000000..583fe7b Binary files /dev/null and b/public/logos/riversecurity.com_dbdd469a.png differ diff --git a/public/logos/s.wanfangdata.com.cn_2ca15228.ico b/public/logos/s.wanfangdata.com.cn_2ca15228.ico new file mode 100644 index 0000000..4dfd601 Binary files /dev/null and b/public/logos/s.wanfangdata.com.cn_2ca15228.ico differ diff --git a/public/logos/s3plus.meituan.net_b681b31f.ico b/public/logos/s3plus.meituan.net_b681b31f.ico new file mode 100644 index 0000000..bee2e81 Binary files /dev/null and b/public/logos/s3plus.meituan.net_b681b31f.ico differ diff --git a/public/logos/s5.ssl.qhres2.com_6082e12c.svg b/public/logos/s5.ssl.qhres2.com_6082e12c.svg new file mode 100644 index 0000000..b06cba4 --- /dev/null +++ b/public/logos/s5.ssl.qhres2.com_6082e12c.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/logos/sensecore.cn_b4aeefcc.ico b/public/logos/sensecore.cn_b4aeefcc.ico new file mode 100644 index 0000000..307bb57 Binary files /dev/null and b/public/logos/sensecore.cn_b4aeefcc.ico differ diff --git a/public/logos/sensorsdata.cn_a4699c9e.ico b/public/logos/sensorsdata.cn_a4699c9e.ico new file mode 100644 index 0000000..c3a5f30 Binary files /dev/null and b/public/logos/sensorsdata.cn_a4699c9e.ico differ diff --git a/public/logos/sf.163.com_35720372.ico b/public/logos/sf.163.com_35720372.ico new file mode 100644 index 0000000..2477044 Binary files /dev/null and b/public/logos/sf.163.com_35720372.ico differ diff --git a/public/logos/shared-https.ydstatic.com_6dc89aeb.ico b/public/logos/shared-https.ydstatic.com_6dc89aeb.ico new file mode 100644 index 0000000..1ad7e9b Binary files /dev/null and b/public/logos/shared-https.ydstatic.com_6dc89aeb.ico differ diff --git a/public/logos/sinovoice.com_bb727bfb.ico b/public/logos/sinovoice.com_bb727bfb.ico new file mode 100644 index 0000000..1928fd6 Binary files /dev/null and b/public/logos/sinovoice.com_bb727bfb.ico differ diff --git a/public/logos/smartbi.com.cn_56257bf4.ico b/public/logos/smartbi.com.cn_56257bf4.ico new file mode 100644 index 0000000..03955e7 Binary files /dev/null and b/public/logos/smartbi.com.cn_56257bf4.ico differ diff --git a/public/logos/soundai.com_059a7c9b.png b/public/logos/soundai.com_059a7c9b.png new file mode 100644 index 0000000..5999b2f Binary files /dev/null and b/public/logos/soundai.com_059a7c9b.png differ diff --git a/public/logos/squirrelai.com_e0bcec72.svg b/public/logos/squirrelai.com_e0bcec72.svg new file mode 100644 index 0000000..b6bd3a4 --- /dev/null +++ b/public/logos/squirrelai.com_e0bcec72.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/src.fanruan.com_9eecfce9.png b/public/logos/src.fanruan.com_9eecfce9.png new file mode 100644 index 0000000..eb54e5e Binary files /dev/null and b/public/logos/src.fanruan.com_9eecfce9.png differ diff --git a/public/logos/static.canva.cn_2004211e.ico b/public/logos/static.canva.cn_2004211e.ico new file mode 100644 index 0000000..ddaf9ee Binary files /dev/null and b/public/logos/static.canva.cn_2004211e.ico differ diff --git a/public/logos/static.tiangong.cn_da457dd9.ico b/public/logos/static.tiangong.cn_da457dd9.ico new file mode 100644 index 0000000..d19c8df Binary files /dev/null and b/public/logos/static.tiangong.cn_da457dd9.ico differ diff --git a/public/logos/static.tildacdn.net_5ba79b33.ico b/public/logos/static.tildacdn.net_5ba79b33.ico new file mode 100644 index 0000000..e7287cc Binary files /dev/null and b/public/logos/static.tildacdn.net_5ba79b33.ico differ diff --git a/public/logos/static.wusong.com_aa6bf15e.png b/public/logos/static.wusong.com_aa6bf15e.png new file mode 100644 index 0000000..d9c0edb Binary files /dev/null and b/public/logos/static.wusong.com_aa6bf15e.png differ diff --git a/public/logos/static.yuanbao.tencent.com_e3b855be.png b/public/logos/static.yuanbao.tencent.com_e3b855be.png new file mode 100644 index 0000000..5b1ed6f Binary files /dev/null and b/public/logos/static.yuanbao.tencent.com_e3b855be.png differ diff --git a/public/logos/statics.aizhan.com_b6b3849c.ico b/public/logos/statics.aizhan.com_b6b3849c.ico new file mode 100644 index 0000000..ffd04d3 Binary files /dev/null and b/public/logos/statics.aizhan.com_b6b3849c.ico differ diff --git a/public/logos/statics.moonshot.cn_c8d259f6.ico b/public/logos/statics.moonshot.cn_c8d259f6.ico new file mode 100644 index 0000000..9b4870b Binary files /dev/null and b/public/logos/statics.moonshot.cn_c8d259f6.ico differ diff --git a/public/logos/storage.360buyimg.com_3d747549.ico b/public/logos/storage.360buyimg.com_3d747549.ico new file mode 100644 index 0000000..681a56c Binary files /dev/null and b/public/logos/storage.360buyimg.com_3d747549.ico differ diff --git a/public/logos/sugar-portal.cdn.bcebos.com_ac24ae51.ico b/public/logos/sugar-portal.cdn.bcebos.com_ac24ae51.ico new file mode 100644 index 0000000..32070ff Binary files /dev/null and b/public/logos/sugar-portal.cdn.bcebos.com_ac24ae51.ico differ diff --git a/public/logos/suxieai.com_12208a6c.ico b/public/logos/suxieai.com_12208a6c.ico new file mode 100644 index 0000000..18993ad Binary files /dev/null and b/public/logos/suxieai.com_12208a6c.ico differ diff --git a/public/logos/teambition.com_9f1979d5.ico b/public/logos/teambition.com_9f1979d5.ico new file mode 100644 index 0000000..11188d7 Binary files /dev/null and b/public/logos/teambition.com_9f1979d5.ico differ diff --git a/public/logos/tongdun.cn_634dc627.ico b/public/logos/tongdun.cn_634dc627.ico new file mode 100644 index 0000000..55d4772 Binary files /dev/null and b/public/logos/tongdun.cn_634dc627.ico differ diff --git a/public/logos/tongdun.cn_9e240972.png b/public/logos/tongdun.cn_9e240972.png new file mode 100644 index 0000000..d3768a7 Binary files /dev/null and b/public/logos/tongdun.cn_9e240972.png differ diff --git a/public/logos/topsec.com.cn_dfb7021e.ico b/public/logos/topsec.com.cn_dfb7021e.ico new file mode 100644 index 0000000..997d1b5 Binary files /dev/null and b/public/logos/topsec.com.cn_dfb7021e.ico differ diff --git a/public/logos/transwarp.cn_67242d7d.ico b/public/logos/transwarp.cn_67242d7d.ico new file mode 100644 index 0000000..0214831 Binary files /dev/null and b/public/logos/transwarp.cn_67242d7d.ico differ diff --git a/public/logos/trs.com.cn_c3c3939c.ico b/public/logos/trs.com.cn_c3c3939c.ico new file mode 100644 index 0000000..9215566 Binary files /dev/null and b/public/logos/trs.com.cn_c3c3939c.ico differ diff --git a/public/logos/uibot.com.cn_4f6cc193.ico b/public/logos/uibot.com.cn_4f6cc193.ico new file mode 100644 index 0000000..19295e5 Binary files /dev/null and b/public/logos/uibot.com.cn_4f6cc193.ico differ diff --git a/public/logos/user-assets.sxlcdn.com_a1682d75.png b/public/logos/user-assets.sxlcdn.com_a1682d75.png new file mode 100644 index 0000000..0819a64 Binary files /dev/null and b/public/logos/user-assets.sxlcdn.com_a1682d75.png differ diff --git a/public/logos/vast.ai_ffa0d9c7.png b/public/logos/vast.ai_ffa0d9c7.png new file mode 100644 index 0000000..bbe8159 Binary files /dev/null and b/public/logos/vast.ai_ffa0d9c7.png differ diff --git a/public/logos/vip.com_9282ee1b.ico b/public/logos/vip.com_9282ee1b.ico new file mode 100644 index 0000000..fe3a52a Binary files /dev/null and b/public/logos/vip.com_9282ee1b.ico differ diff --git a/public/logos/whee.com_def9e60d.ico b/public/logos/whee.com_def9e60d.ico new file mode 100644 index 0000000..f54d2a5 Binary files /dev/null and b/public/logos/whee.com_def9e60d.ico differ diff --git a/public/logos/winrobot-pub-a-oss.winrobot360.com_507b937c.ico b/public/logos/winrobot-pub-a-oss.winrobot360.com_507b937c.ico new file mode 100644 index 0000000..448a2cc Binary files /dev/null and b/public/logos/winrobot-pub-a-oss.winrobot360.com_507b937c.ico differ diff --git a/public/logos/xfe.cdnjtzy.com_b973f62a.ico b/public/logos/xfe.cdnjtzy.com_b973f62a.ico new file mode 100644 index 0000000..a2ed7a4 Binary files /dev/null and b/public/logos/xfe.cdnjtzy.com_b973f62a.ico differ diff --git a/public/logos/xiaoice.com_7420b4c3.ico b/public/logos/xiaoice.com_7420b4c3.ico new file mode 100644 index 0000000..43da88d Binary files /dev/null and b/public/logos/xiaoice.com_7420b4c3.ico differ diff --git a/public/logos/xiaoice.com_aef61aea.ico b/public/logos/xiaoice.com_aef61aea.ico new file mode 100644 index 0000000..43da88d Binary files /dev/null and b/public/logos/xiaoice.com_aef61aea.ico differ diff --git a/public/logos/ximalaya.com_4dea491c.ico b/public/logos/ximalaya.com_4dea491c.ico new file mode 100644 index 0000000..1e0db5f Binary files /dev/null and b/public/logos/ximalaya.com_4dea491c.ico differ diff --git a/public/logos/xin-static.cdn.bcebos.com_a923f990.ico b/public/logos/xin-static.cdn.bcebos.com_a923f990.ico new file mode 100644 index 0000000..d42cd8a Binary files /dev/null and b/public/logos/xin-static.cdn.bcebos.com_a923f990.ico differ diff --git a/public/logos/xinghuo.xfyun.cn_bdae8b42.ico b/public/logos/xinghuo.xfyun.cn_bdae8b42.ico new file mode 100644 index 0000000..1f7b280 Binary files /dev/null and b/public/logos/xinghuo.xfyun.cn_bdae8b42.ico differ diff --git a/public/logos/xtalpi.com_4e574834.svg b/public/logos/xtalpi.com_4e574834.svg new file mode 100644 index 0000000..fe6d0fb --- /dev/null +++ b/public/logos/xtalpi.com_4e574834.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/xtalpi.com_6e6a55cb.svg b/public/logos/xtalpi.com_6e6a55cb.svg new file mode 100644 index 0000000..e4d0150 --- /dev/null +++ b/public/logos/xtalpi.com_6e6a55cb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/logos/xueshu.baidu.com_9ea59d43.ico b/public/logos/xueshu.baidu.com_9ea59d43.ico new file mode 100644 index 0000000..c80d987 Binary files /dev/null and b/public/logos/xueshu.baidu.com_9ea59d43.ico differ diff --git a/public/logos/yfdpc.fbcontent.cn_8b712d4e.ico b/public/logos/yfdpc.fbcontent.cn_8b712d4e.ico new file mode 100644 index 0000000..30eb983 Binary files /dev/null and b/public/logos/yfdpc.fbcontent.cn_8b712d4e.ico differ diff --git a/public/logos/yiducloud.com.cn_e9b7760f.ico b/public/logos/yiducloud.com.cn_e9b7760f.ico new file mode 100644 index 0000000..f4152d8 Binary files /dev/null and b/public/logos/yiducloud.com.cn_e9b7760f.ico differ diff --git a/public/logos/yinxiang.com_a30e6da6.png b/public/logos/yinxiang.com_a30e6da6.png new file mode 100644 index 0000000..02049cd Binary files /dev/null and b/public/logos/yinxiang.com_a30e6da6.png differ diff --git a/public/logos/youzu.com_b98ecdf6.ico b/public/logos/youzu.com_b98ecdf6.ico new file mode 100644 index 0000000..d75b187 Binary files /dev/null and b/public/logos/youzu.com_b98ecdf6.ico differ diff --git a/public/logos/yuanfudao.com_c2c226d8.ico b/public/logos/yuanfudao.com_c2c226d8.ico new file mode 100644 index 0000000..30eb983 Binary files /dev/null and b/public/logos/yuanfudao.com_c2c226d8.ico differ diff --git a/public/logos/yunaq.com_bdc57c1d.ico b/public/logos/yunaq.com_bdc57c1d.ico new file mode 100644 index 0000000..817e573 Binary files /dev/null and b/public/logos/yunaq.com_bdc57c1d.ico differ diff --git a/public/logos/zhaixing.ai_8368881f.png b/public/logos/zhaixing.ai_8368881f.png new file mode 100644 index 0000000..c537347 Binary files /dev/null and b/public/logos/zhaixing.ai_8368881f.png differ diff --git a/public/logos/zhaoyang120.com_bfe4c39b.ico b/public/logos/zhaoyang120.com_bfe4c39b.ico new file mode 100644 index 0000000..1f985ff Binary files /dev/null and b/public/logos/zhaoyang120.com_bfe4c39b.ico differ diff --git a/public/logos/zhugeio.com_811ae530.ico b/public/logos/zhugeio.com_811ae530.ico new file mode 100644 index 0000000..91934b4 Binary files /dev/null and b/public/logos/zhugeio.com_811ae530.ico differ diff --git a/restart.ps1 b/restart.ps1 new file mode 100644 index 0000000..2221a6c --- /dev/null +++ b/restart.ps1 @@ -0,0 +1,54 @@ +$projectDir = "E:\ZG_Dev\ZhuiGuangAI\zhuiguang-ai" +$defaultPort = 8301 + +Write-Host "========================================" -ForegroundColor Cyan +Write-Host " 追光AI 服务重启脚本" -ForegroundColor Cyan +Write-Host "========================================" -ForegroundColor Cyan + +Write-Host "`n[1/3] 扫描项目端口 (8301-8310)..." -ForegroundColor Yellow + +$foundPids = @() +foreach ($port in 8301..8310) { + $conn = Get-NetTCPConnection -LocalPort $port -State Listen -ErrorAction SilentlyContinue + if ($conn) { + foreach ($c in $conn) { + if ($c.OwningProcess -gt 0 -and $foundPids -notcontains $c.OwningProcess) { + $proc = Get-Process -Id $c.OwningProcess -ErrorAction SilentlyContinue + if ($proc) { + $foundPids += $c.OwningProcess + Write-Host " 发现进程 PID=$($c.OwningProcess) ($($proc.ProcessName)) 监听端口 $port" -ForegroundColor Red + } + } + } + } +} + +if ($foundPids.Count -gt 0) { + Write-Host "`n[2/3] 关闭已有服务..." -ForegroundColor Yellow + foreach ($procId in $foundPids) { + try { + Stop-Process -Id $procId -Force -ErrorAction Stop + Write-Host " 已终止 PID=$procId" -ForegroundColor Green + } catch { + Write-Host " 终止失败 PID=$procId : $_" -ForegroundColor Red + } + } + Start-Sleep -Seconds 1 +} else { + Write-Host "`n[2/3] 无需关闭,未检测到运行中的服务" -ForegroundColor Green +} + +Write-Host "`n[3/3] 启动服务 (端口 $defaultPort)..." -ForegroundColor Yellow + +Start-Process -FilePath "cmd.exe" -ArgumentList "/c", "npm run dev" -WorkingDirectory $projectDir + +Start-Sleep -Seconds 4 + +$check = Get-NetTCPConnection -LocalPort $defaultPort -State Listen -ErrorAction SilentlyContinue +if ($check) { + Write-Host "`n========================================" -ForegroundColor Green + Write-Host " 服务已启动: http://localhost:$defaultPort" -ForegroundColor Green + Write-Host "========================================" -ForegroundColor Green +} else { + Write-Host "`n 服务启动中,请稍后访问 http://localhost:$defaultPort" -ForegroundColor Yellow +} diff --git a/scripts/auto-review.mjs b/scripts/auto-review.mjs new file mode 100644 index 0000000..479eeab --- /dev/null +++ b/scripts/auto-review.mjs @@ -0,0 +1,373 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import { Octokit } from "octokit"; +import OpenAI from "openai"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +const octokit = new Octokit({ + auth: process.env.GITHUB_TOKEN || undefined, +}); + +const openai = new OpenAI({ + apiKey: process.env.DEEPSEEK_API_KEY, + baseURL: "https://api.deepseek.com/v1", +}); + +const CATEGORY_KEYWORDS = { + "AI Agent": ["agent", "autonomous", "workflow", "tool call"], + "代码生成": ["code", "programming", "developer", "copilot"], + "测试": ["test", "testing", "qa", "quality"], + "文档": ["documentation", "docs", "readme"], + "安全": ["security", "vulnerability", "safety", "alignment"], + "DevOps与部署": ["deployment", "deploy", "devops", "ci/cd", "docker", "kubernetes"], + "RAG": ["rag", "retrieval", "vector", "embedding"], + "AI/ML工程": ["training", "fine-tun", "model", "machine learning", "ml"], + "多模态": ["multimodal", "vision", "image", "video", "audio"], + "Prompt工程": ["prompt", "prompting", "instruction"], +}; + +const NON_AI_KEYWORDS = [ + "book", "guide", "tutorial", "awesome", "interview", + "notes", "handbook", "cheatsheet", "cheat-sheet", "roadmap", + "everything you need to know", "curated list", "collection", +]; + +const AI_TOPICS = [ + "ai", "artificial-intelligence", "machine-learning", "deep-learning", + "llm", "large-language-model", "nlp", "natural-language-processing", + "agent", "rag", "gpt", "transformer", "generative-ai", "chatgpt", + "langchain", "prompt-engineering", "multimodal", "text-generation", + "vector-database", "embedding", "model-training", "fine-tuning", +]; + +function isValidAIProject(repo) { + const name = (repo.full_name || "").toLowerCase(); + const desc = (repo.description || "").toLowerCase(); + const text = `${name} ${desc}`; + + for (const kw of NON_AI_KEYWORDS) { + if (text.includes(kw)) { + console.log( + ` 🚫 过滤(非AI): ${repo.full_name} (命中关键词: "${kw}")` + ); + return false; + } + } + + const language = (repo.language || "").toLowerCase(); + if (["markdown", "html", "tex", "latex"].includes(language) && repo.stargazers_count < 5000) { + console.log( + ` 🚫 过滤(文档): ${repo.full_name} (语言: ${repo.language}, ⭐${repo.stargazers_count})` + ); + return false; + } + + const topics = (repo.topics || []).map((t) => t.toLowerCase()); + if (topics.length > 0) { + const hasAITopic = topics.some((t) => + AI_TOPICS.some((ai) => t.includes(ai)) + ); + if (!hasAITopic) { + console.log( + ` 🚫 过滤(无AI主题): ${repo.full_name} (topics: ${topics.join(", ").substring(0, 100)})` + ); + return false; + } + } + + return true; +} + +function extractJSON(str) { + const trimmed = str.trim(); + const codeBlockMatch = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/); + let jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : trimmed; + const braceMatch = jsonStr.match(/\{[\s\S]*\}/); + if (braceMatch) { + try { return JSON.parse(braceMatch[0]); } catch {} + } + const arrayMatch = jsonStr.match(/\[[\s\S]*\]/); + if (arrayMatch) { + try { return JSON.parse(arrayMatch[0]); } catch {} + } + return JSON.parse(jsonStr); +} + +async function guessCategory(name, desc, tags) { + const categories = await prisma.skillCategory.findMany({ + select: { id: true, name: true }, + orderBy: { sortOrder: "asc" }, + }); + if (categories.length === 0) { + throw new Error("数据库中没有技能分类,请先创建分类"); + } + const text = `${name} ${desc} ${tags.join(" ")}`.toLowerCase(); + for (const [categoryName, keywords] of Object.entries(CATEGORY_KEYWORDS)) { + for (const kw of keywords) { + if (text.includes(kw)) { + const match = categories.find((c) => c.name === categoryName); + if (match) return match.id; + } + } + } + return categories[0].id; +} + +const REVIEW_PROMPT = `你是一个GitHub开源项目评测专家。请基于以下项目信息进行五维深度评测,并以JSON格式返回。务必只返回JSON,不要包含任何其他文字或Markdown格式。 + +项目信息: +- 仓库全名:{repoName} +- 简介:{description} +- GitHub Stars:{stars} +- 开源许可证:{license} +- README摘要(前1500字):{readmeSummary} + +请严格按照以下JSON结构输出: +{ + "capability": { "score": 4.5, "summary": "一句话亮点(15字内)", "detail": "80-120字场景能力分析" }, + "devExp": { "score": 3.5, "summary": "上手体验总结", "detail": "80-120字,包含安装、文档、API评价" }, + "costLicense": { "score": 4.0, "summary": "成本与许可总结", "detail": "80-120字,包含硬件成本、API定价、许可证风险" }, + "community": { "score": 4.5, "summary": "社区健康度总结", "detail": "80-120字,包含Issue响应、PR频率、生态描述" }, + "performance": { "score": 3.5, "summary": "性能稳定性总结", "detail": "80-120字,包含运行效率、稳定性、输出质量" }, + "overall": 4.0, + "tags": ["标签1", "标签2", "标签3"] +} + +评分要求: +- 分数为1-5之间,可使用0.5步长 +- 综合分应为五个维度分数的算术平均值(保留1位小数) +- 每个维度的summary需严格控制在15字以内 +- 每个维度的detail需严格控制在80-120字 +- 标签从以下类别中选择最匹配的3-5个:LLM框架, Agent框架, RAG, 提示工程, 多模态, 代码助手, 模型训练, 数据工程, 部署工具, 评测工具, 安全对齐, 其他`; + +async function searchHotRepos(query, minStars = 500, maxResults = 10) { + const q = `${query} stars:>${minStars} pushed:>2024-01-01`; + const { data } = await octokit.rest.search.repos({ + q, + sort: "stars", + order: "desc", + per_page: maxResults, + }); + return data.items; +} + +async function getRepoReadme(owner, repo) { + try { + const { data } = await octokit.rest.repos.getReadme({ owner, repo }); + return Buffer.from(data.content, "base64").toString("utf-8"); + } catch { + return ""; + } +} + +async function generateReview(repoName, description, stars, license, readme) { + const prompt = REVIEW_PROMPT + .replace("{repoName}", repoName) + .replace("{description}", description || "暂无描述") + .replace("{stars}", stars.toString()) + .replace("{license}", license || "未知") + .replace("{readmeSummary}", readme.substring(0, 1500)); + + const completion = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: prompt }], + temperature: 0.3, + }); + + const content = completion.choices[0]?.message?.content; + if (!content) { + throw new Error("DeepSeek API 返回内容为空"); + } + + let review = extractJSON(content); + if (review.data && typeof review.data === "object") review = review.data; + if (review.result && typeof review.result === "object") review = review.result; + if (!review.capability || !review.devExp) { + throw new Error("评测JSON结构不完整: " + JSON.stringify(Object.keys(review)).substring(0, 200)); + } + + const dims = [ + review.capability.score, + review.devExp.score, + review.costLicense.score, + review.community.score, + review.performance.score, + ]; + const avg = dims.reduce((a, b) => a + b, 0) / 5; + if (Math.abs(review.overall - avg) > 0.3) { + console.warn( + `⚠️ 综合分 ${review.overall} 与均分 ${avg.toFixed(1)} 偏差较大,已自动修正为均分` + ); + review.overall = Math.round(avg * 10) / 10; + } + + return review; +} + +function generateSlug(fullName) { + return fullName + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-|-$/g, "") + .substring(0, 100); +} + +async function main() { + console.log("🚀 [Auto Review] 开始自动化评测任务...\n"); + + const SEARCH_QUERIES = [ + "ai agent", + "llm framework", + "rag", + "prompt engineering", + ]; + const MIN_STARS = 500; + const MAX_PER_QUERY = 5; + const DAILY_LIMIT = 8; + + let reviewedCount = 0; + + for (const query of SEARCH_QUERIES) { + if (reviewedCount >= DAILY_LIMIT) break; + + console.log(`🔍 搜索关键词: "${query}" (min ${MIN_STARS} stars)`); + + const repos = await searchHotRepos(query, MIN_STARS, MAX_PER_QUERY); + console.log(` 找到 ${repos.length} 个仓库\n`); + + for (const repo of repos) { + if (reviewedCount >= DAILY_LIMIT) break; + + const existing = await prisma.skill.findFirst({ + where: { sourceUrl: repo.html_url }, + }); + + if (existing) { + console.log( + ` ⏭️ 跳过已存在: ${repo.full_name} (⭐${repo.stargazers_count})` + ); + continue; + } + + if (!isValidAIProject(repo)) { + continue; + } + + console.log( + `\n📦 [${reviewedCount + 1}/${DAILY_LIMIT}] 处理: ${repo.full_name} (⭐${repo.stargazers_count})` + ); + + try { + console.log(" 📖 获取 README..."); + const [owner, name] = repo.full_name.split("/"); + const readme = await getRepoReadme(owner, name); + console.log(` ✅ README 长度: ${readme.length} 字符`); + + console.log(" 🤖 生成五维评测..."); + const reviewData = await generateReview( + repo.full_name, + repo.description || "", + repo.stargazers_count, + repo.license?.spdx_id || "Unknown", + readme + ); + console.log(` ✅ 综合评分: ${reviewData.overall}`); + + const slug = generateSlug(repo.full_name); + + const slugExists = await prisma.skill.findUnique({ where: { slug } }); + if (slugExists) { + console.log(` ⏭️ 跳过slug冲突: ${slug}`); + continue; + } + + const categoryId = await guessCategory(repo.full_name, repo.description || "", reviewData?.tags || []); + + const skill = await prisma.skill.create({ + data: { + name: repo.full_name.substring(0, 100), + slug, + categoryId, + description: repo.description || "", + sourceUrl: repo.html_url, + sourceType: "github", + rating: reviewData.overall, + features: { + forks: repo.forks_count, + language: repo.language, + license: repo.license?.spdx_id || null, + topics: repo.topics || [], + }, + tags: reviewData.tags || [], + status: "draft", + lastReviewedAt: new Date(), + githubStarsHistory: [ + { + date: new Date().toISOString().split("T")[0], + stars: repo.stargazers_count, + }, + ], + }, + }); + console.log(` ✅ Skill 已创建 (ID: ${skill.id})`); + + await prisma.skillReview.create({ + data: { + skillId: skill.id, + capability: reviewData.capability.score, + devExp: reviewData.devExp.score, + costLicense: reviewData.costLicense.score, + community: reviewData.community.score, + performance: reviewData.performance.score, + overall: reviewData.overall, + reviews: reviewData, + status: "DRAFT", + }, + }); + console.log(" ✅ 评测记录已保存"); + + await prisma.reviewGenerationLog.create({ + data: { + skillId: skill.id, + status: "SUCCESS", + prompt: repo.full_name, + response: JSON.stringify(reviewData), + }, + }); + + reviewedCount++; + console.log(" 🎉 完成!\n"); + } catch (error) { + console.error(` ❌ 失败: ${error.message}`); + + await prisma.reviewGenerationLog.create({ + data: { + skillId: 0, + status: "FAILED", + prompt: repo.full_name, + error: error.message?.substring(0, 500) || "Unknown error", + }, + }); + } + } + } + + console.log( + `\n🏁 [Auto Review] 完成。今日评测: ${reviewedCount} 个项目` + ); +} + +main() + .catch((e) => { + console.error("💥 脚本异常:", e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/scripts/cleanup-non-ai.mjs b/scripts/cleanup-non-ai.mjs new file mode 100644 index 0000000..ee2bfc9 --- /dev/null +++ b/scripts/cleanup-non-ai.mjs @@ -0,0 +1,55 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +const NON_AI_PATTERNS = [ + "book", "guide", "tutorial", "awesome", "interview", + "notes", "handbook", "cheatsheet", "cheat-sheet", "roadmap", + "everything you need to know", + "StableDiffusionBook", + "Claude-Code-Everything-You-Need-to-Know", + "Snailclimb/JavaGuide", + "pathwaycom/pathway", + "Shubhamsaboo/awesome-llm-apps", +]; + +async function main() { + console.log("🧹 清理误入库的非AI技能数据\n"); + + const skills = await prisma.skill.findMany({ + select: { id: true, name: true, sourceUrl: true, status: true }, + }); + + let cleaned = 0; + for (const skill of skills) { + const name = skill.name.toLowerCase(); + const isNonAI = NON_AI_PATTERNS.some((p) => name.includes(p.toLowerCase())); + if (isNonAI && skill.status === "draft") { + await prisma.skillReview.deleteMany({ where: { skillId: skill.id } }); + await prisma.reviewGenerationLog.deleteMany({ where: { skillId: skill.id } }); + await prisma.skill.delete({ where: { id: skill.id } }); + console.log(`🗑️ 已删除: ${skill.name}`); + cleaned++; + } else if (isNonAI) { + await prisma.skill.update({ + where: { id: skill.id }, + data: { status: "draft" }, + }); + console.log(`📝 已标记为draft: ${skill.name}`); + cleaned++; + } + } + + if (cleaned === 0) console.log("✅ 没有需要清理的误入数据"); + else console.log(`\n✅ 已清理 ${cleaned} 条数据`); +} + +main() + .catch((e) => { console.error("💥 清理失败:", e.message); process.exit(1); }) + .finally(() => prisma.$disconnect()); \ No newline at end of file diff --git a/scripts/daily-discover.mjs b/scripts/daily-discover.mjs new file mode 100644 index 0000000..64cb906 --- /dev/null +++ b/scripts/daily-discover.mjs @@ -0,0 +1,275 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import { Octokit } from "octokit"; +import OpenAI from "openai"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +const octokit = new Octokit({ + auth: process.env.GITHUB_TOKEN || undefined, +}); + +const openai = new OpenAI({ + apiKey: process.env.DEEPSEEK_API_KEY, + baseURL: "https://api.deepseek.com/v1", +}); + +const REVIEW_PROMPT = `你是一个GitHub开源项目评测专家。请基于以下项目信息进行五维深度评测,并以JSON格式返回。务必只返回JSON,不要包含任何其他文字或Markdown格式。 + +项目信息: +- 仓库全名:{repoName} +- 简介:{description} +- GitHub Stars:{stars} +- 开源许可证:{license} +- README摘要(前1500字):{readmeSummary} + +请严格按照以下JSON结构输出: +{ + "capability": { "score": 4.5, "summary": "一句话亮点(15字内)", "detail": "80-120字场景能力分析" }, + "devExp": { "score": 3.5, "summary": "上手体验总结", "detail": "80-120字,包含安装、文档、API评价" }, + "costLicense": { "score": 4.0, "summary": "成本与许可总结", "detail": "80-120字,包含硬件成本、API定价、许可证风险" }, + "community": { "score": 4.5, "summary": "社区健康度总结", "detail": "80-120字,包含Issue响应、PR频率、生态描述" }, + "performance": { "score": 3.5, "summary": "性能稳定性总结", "detail": "80-120字,包含运行效率、稳定性、输出质量" }, + "overall": 4.0, + "tags": ["标签1", "标签2", "标签3"] +} + +评分要求: +- 分数为1-5之间,可使用0.5步长 +- 综合分应为五个维度分数的算术平均值(保留1位小数) +- 每个维度的summary需严格控制在15字以内 +- 每个维度的detail需严格控制在80-120字 +- 标签从以下类别中选择最匹配的3-5个:LLM框架, Agent框架, RAG, 提示工程, 多模态, 代码助手, 模型训练, 数据工程, 部署工具, 评测工具, 安全对齐, 其他`; + +const SEARCH_QUERIES = [ + "ai agent framework", + "llm framework", + "rag framework", + "prompt engineering tool", + "ai code assistant", + "multimodal ai", + "ai model training", + "ai deployment tool", + "ai evaluation benchmark", + "ai safety alignment", +]; + +const CATEGORY_KEYWORDS = { + "AI Agent": ["agent", "autonomous", "workflow", "tool call"], + "代码生成": ["code", "programming", "developer", "copilot"], + "测试": ["test", "testing", "qa", "quality"], + "文档": ["documentation", "docs", "readme"], + "安全": ["security", "vulnerability", "safety", "alignment"], + "DevOps与部署": ["deployment", "deploy", "devops", "ci/cd", "docker", "kubernetes"], + "RAG": ["rag", "retrieval", "vector", "embedding"], + "AI/ML工程": ["training", "fine-tun", "model", "machine learning", "ml"], + "多模态": ["multimodal", "vision", "image", "video", "audio"], + "Prompt工程": ["prompt", "prompting", "instruction"], +}; + +const NON_AI_KEYWORDS = [ + "book", "guide", "tutorial", "awesome", "interview", + "notes", "handbook", "cheatsheet", "cheat-sheet", "roadmap", + "everything you need to know", "curated list", "collection", +]; + +const AI_TOPICS = [ + "ai", "artificial-intelligence", "machine-learning", "deep-learning", + "llm", "large-language-model", "nlp", "natural-language-processing", + "agent", "rag", "gpt", "transformer", "generative-ai", "chatgpt", + "langchain", "prompt-engineering", "multimodal", "text-generation", + "vector-database", "embedding", "model-training", "fine-tuning", +]; + +function isValidAIProject(repo) { + const name = (repo.full_name || "").toLowerCase(); + const desc = (repo.description || "").toLowerCase(); + const text = `${name} ${desc}`; + + for (const kw of NON_AI_KEYWORDS) { + if (text.includes(kw)) { + console.log( + ` 🚫 过滤(非AI): ${repo.full_name} (命中关键词: "${kw}")` + ); + return false; + } + } + + const language = (repo.language || "").toLowerCase(); + if (["markdown", "html", "tex", "latex"].includes(language) && repo.stargazers_count < 5000) { + console.log( + ` 🚫 过滤(文档): ${repo.full_name} (语言: ${repo.language}, ⭐${repo.stargazers_count})` + ); + return false; + } + + const topics = (repo.topics || []).map((t) => t.toLowerCase()); + if (topics.length > 0) { + const hasAITopic = topics.some((t) => + AI_TOPICS.some((ai) => t.includes(ai)) + ); + if (!hasAITopic) { + console.log( + ` 🚫 过滤(无AI主题): ${repo.full_name} (topics: ${topics.join(", ").substring(0, 100)})` + ); + return false; + } + } + + return true; +} + +function extractJSON(str) { + const trimmed = str.trim(); + const codeBlockMatch = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/); + let jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : trimmed; + const braceMatch = jsonStr.match(/\{[\s\S]*\}/); + if (braceMatch) { + try { return JSON.parse(braceMatch[0]); } catch {} + } + const arrayMatch = jsonStr.match(/\[[\s\S]*\]/); + if (arrayMatch) { + try { return JSON.parse(arrayMatch[0]); } catch {} + } + return JSON.parse(jsonStr); +} + +async function guessCategory(name, desc, tags) { + const categories = await prisma.skillCategory.findMany({ + select: { id: true, name: true }, + orderBy: { sortOrder: "asc" }, + }); + if (categories.length === 0) { + throw new Error("数据库中没有技能分类,请先创建分类"); + } + const text = `${name} ${desc} ${tags.join(" ")}`.toLowerCase(); + for (const [categoryName, keywords] of Object.entries(CATEGORY_KEYWORDS)) { + for (const kw of keywords) { + if (text.includes(kw)) { + const match = categories.find((c) => c.name === categoryName); + if (match) return match.id; + } + } + } + return categories[0].id; +} + +function genSlug(name) { + return name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").substring(0, 100); +} + +async function searchRepos(query, minStars, max) { + const q = `${query} stars:>${minStars} pushed:>2024-01-01`; + const { data } = await octokit.rest.search.repos({ q, sort: "stars", order: "desc", per_page: max }); + return data.items; +} + +async function getReadme(owner, repo) { + try { + const { data } = await octokit.rest.repos.getReadme({ owner, repo }); + return Buffer.from(data.content, "base64").toString("utf-8"); + } catch { return ""; } +} + +async function genReview(repoName, desc, stars, license, readme) { + const prompt = REVIEW_PROMPT + .replace("{repoName}", repoName).replace("{description}", desc || "暂无描述") + .replace("{stars}", stars.toString()).replace("{license}", license || "未知") + .replace("{readmeSummary}", readme.substring(0, 1500)); + const { choices } = await openai.chat.completions.create({ + model: "deepseek-v4-pro", messages: [{ role: "user", content: prompt }], temperature: 0.3, + }); + const content = choices[0]?.message?.content; + if (!content) throw new Error("Empty response"); + let review = extractJSON(content); + if (review.data && typeof review.data === "object") review = review.data; + if (review.result && typeof review.result === "object") review = review.result; + if (!review.capability || !review.devExp || !review.costLicense || !review.community || !review.performance) { + throw new Error("评测JSON结构不完整: " + JSON.stringify(Object.keys(review)).substring(0, 200)); + } + const dims = [review.capability.score, review.devExp.score, review.costLicense.score, review.community.score, review.performance.score]; + const avg = dims.reduce((a, b) => a + b, 0) / 5; + if (Math.abs(review.overall - avg) > 0.3) review.overall = Math.round(avg * 10) / 10; + return review; +} + +async function main() { + console.log(`🚀 [Daily Discover] ${new Date().toISOString().split("T")[0]} 开始...\n`); + const DAILY_LIMIT = 10; + let discovered = 0, skipped = 0, reviewed = 0, failed = 0; + + for (const query of SEARCH_QUERIES) { + if (discovered >= DAILY_LIMIT) break; + console.log(`🔍 "${query}"`); + let repos; + try { repos = await searchRepos(query, 500, 5); } catch (e) { console.error(` ❌ 搜索失败: ${e.message}`); failed++; continue; } + + for (const repo of repos) { + if (discovered >= DAILY_LIMIT) break; + const ex = await prisma.skill.findFirst({ where: { sourceUrl: repo.html_url } }); + if (ex) { console.log(` ⏭️ ${repo.full_name} 已存在`); skipped++; continue; } + const exP = await prisma.pendingSkill.findFirst({ where: { sourceUrl: repo.html_url } }); + if (exP) { console.log(` ⏭️ ${repo.full_name} 待审核中`); skipped++; continue; } + const slug = genSlug(repo.full_name); + const slugEx = await prisma.skill.findUnique({ where: { slug } }); + if (slugEx) { console.log(` ⏭️ ${repo.full_name} slug冲突`); skipped++; continue; } + if (!isValidAIProject(repo)) { skipped++; continue; } + + console.log(`\n📦 [${discovered + 1}/${DAILY_LIMIT}] ${repo.full_name} (⭐${repo.stargazers_count})`); + try { + const [owner, name] = repo.full_name.split("/"); + const readme = await getReadme(owner, name); + let reviewData = null; + try { reviewData = await genReview(repo.full_name, repo.description || "", repo.stargazers_count, repo.license?.spdx_id || "Unknown", readme); console.log(` ✅ 评测: ${reviewData.overall}`); reviewed++; } + catch (e) { console.log(` ⚠️ 评测失败: ${e.message}`); } + + const categoryId = await guessCategory(repo.full_name, repo.description || "", reviewData?.tags || []); + const skill = await prisma.skill.create({ + data: { + name: repo.full_name.substring(0, 100), slug, categoryId, + description: repo.description || "", sourceUrl: repo.html_url, sourceType: "github", + rating: reviewData?.overall || 0, + features: { forks: repo.forks_count, language: repo.language, license: repo.license?.spdx_id || null, topics: repo.topics || [] }, + tags: reviewData?.tags || [], status: "draft", + lastReviewedAt: reviewData ? new Date() : null, + githubStarsHistory: [{ date: new Date().toISOString().split("T")[0], stars: repo.stargazers_count }], + }, + }); + console.log(` ✅ Skill #${skill.id}`); + + if (reviewData) { + await prisma.skillReview.create({ + data: { + skillId: skill.id, capability: reviewData.capability.score, devExp: reviewData.devExp.score, + costLicense: reviewData.costLicense.score, community: reviewData.community.score, + performance: reviewData.performance.score, overall: reviewData.overall, + reviews: reviewData, status: "DRAFT", + }, + }); + } + + await prisma.reviewGenerationLog.create({ + data: { skillId: skill.id, status: "SUCCESS", prompt: `daily-discover: ${repo.full_name}`, response: reviewData ? JSON.stringify(reviewData) : null }, + }); + discovered++; + } catch (e) { + console.error(` ❌ 失败: ${e.message}`); + failed++; + try { + await prisma.reviewGenerationLog.create({ + data: { skillId: 0, status: "FAILED", prompt: `daily-discover: ${repo.full_name}`, error: e.message?.substring(0, 500) || "Unknown" }, + }); + } catch {} + } + } + } + + console.log(`\n🏁 [Daily Discover] 完成: 发现${discovered} / 跳过${skipped} / 评测${reviewed} / 失败${failed}`); +} + +main().catch((e) => { console.error("💥 异常:", e); process.exit(1); }).finally(() => prisma.$disconnect()); diff --git a/scripts/db-status.mjs b/scripts/db-status.mjs new file mode 100644 index 0000000..24ea17f --- /dev/null +++ b/scripts/db-status.mjs @@ -0,0 +1,89 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +async function main() { + console.log("📊 数据库内容状态总览\n"); + + const [skillCount, publishedSkillCount, draftSkillCount, reviewCount, publishedReviewCount, draftReviewCount, dailyReportCount, publishedDailyCount, toolCount, publishedToolCount, pendingToolCount, pendingSkillCount] = await Promise.all([ + prisma.skill.count(), + prisma.skill.count({ where: { status: "published" } }), + prisma.skill.count({ where: { status: "draft" } }), + prisma.skillReview.count(), + prisma.skillReview.count({ where: { status: "PUBLISHED" } }), + prisma.skillReview.count({ where: { status: "DRAFT" } }), + prisma.dailyReport.count(), + prisma.dailyReport.count({ where: { status: "published" } }), + prisma.tool.count(), + prisma.tool.count({ where: { status: "published" } }), + prisma.pendingTool.count(), + prisma.pendingSkill.count(), + ]); + + console.log("=== 技能 ==="); + console.log(` 总数: ${skillCount} | 已发布: ${publishedSkillCount} | 草稿: ${draftSkillCount}`); + console.log(` 待审核: ${pendingSkillCount}`); + + console.log("\n=== 评测 ==="); + console.log(` 总数: ${reviewCount} | 已发布: ${publishedReviewCount} | 草稿: ${draftReviewCount}`); + + console.log("\n=== 日报 ==="); + console.log(` 总数: ${dailyReportCount} | 已发布: ${publishedDailyCount}`); + + console.log("\n=== 工具 ==="); + console.log(` 总数: ${toolCount} | 已发布: ${publishedToolCount} | 待审核: ${pendingToolCount}`); + + console.log("\n=== 技能详情 ==="); + const skills = await prisma.skill.findMany({ + select: { + id: true, name: true, status: true, rating: true, + sourceUrl: true, description: true, + skillReview: { select: { id: true, overall: true, status: true, longArticle: true, videoScript: true, socialCards: true } }, + }, + orderBy: { id: "desc" }, + }); + + for (const s of skills) { + const r = s.skillReview; + const hasContent = !!(r?.longArticle || r?.videoScript || r?.socialCards); + console.log(` #${s.id} [${s.status}] ${s.name} ⭐${s.rating} | 评测:${r ? `${r.overall}(${r.status})` : "无"} | 内容:${hasContent ? "✅" : "❌"} | ${s.description?.substring(0, 60) || "无描述"}`); + } + + console.log("\n=== 评测详情 ==="); + const reviews = await prisma.skillReview.findMany({ + include: { skill: { select: { name: true } } }, + orderBy: { id: "desc" }, + }); + + for (const r of reviews) { + const reviewsData = r.reviews; + const dims = reviewsData ? { + cap: reviewsData.capability?.score, + dev: reviewsData.devExp?.score, + cost: reviewsData.costLicense?.score, + comm: reviewsData.community?.score, + perf: reviewsData.performance?.score, + } : {}; + console.log(` #${r.id} [${r.status}] ${r.skill.name} | overall:${r.overall} | cap:${dims.cap} dev:${dims.dev} cost:${dims.cost} comm:${dims.comm} perf:${dims.perf}`); + console.log(` 长文:${r.longArticle ? `${String(r.longArticle).length}字` : "无"} | 脚本:${r.videoScript ? `${String(r.videoScript).length}字` : "无"} | 卡片:${r.socialCards ? "有" : "无"}`); + } + + console.log("\n=== 日报详情 ==="); + const reports = await prisma.dailyReport.findMany({ + orderBy: { id: "desc" }, + take: 5, + }); + for (const r of reports) { + console.log(` #${r.id} [${r.status}] ${r.title} | ${r.reportDate?.toISOString().split("T")[0]}`); + } +} + +main() + .catch((e) => { console.error("💥", e.message); process.exit(1); }) + .finally(() => prisma.$disconnect()); \ No newline at end of file diff --git a/scripts/debug-json.mjs b/scripts/debug-json.mjs new file mode 100644 index 0000000..10471e4 --- /dev/null +++ b/scripts/debug-json.mjs @@ -0,0 +1,64 @@ +import OpenAI from "openai"; +import "dotenv/config"; + +const openai = new OpenAI({ + apiKey: process.env.DEEPSEEK_API_KEY, + baseURL: "https://api.deepseek.com/v1", +}); + +async function main() { + const prompt = `你是一个GitHub开源项目评测专家。请基于以下项目信息进行五维深度评测,并以JSON格式返回。务必只返回JSON,不要包含任何其他文字或Markdown格式。 + +项目信息: +- 仓库全名:TabbyML/tabby +- 简介:Self-hosted AI coding assistant +- GitHub Stars:33538 +- 开源许可证:Apache-2.0 +- README摘要:An open-source, self-hosted AI coding assistant. + +请严格按照以下JSON结构输出: +{ + "capability": { "score": 4.5, "summary": "一句话亮点", "detail": "80-120字分析" }, + "devExp": { "score": 3.5, "summary": "体验总结", "detail": "80-120字" }, + "costLicense": { "score": 4.0, "summary": "成本总结", "detail": "80-120字" }, + "community": { "score": 4.5, "summary": "社区总结", "detail": "80-120字" }, + "performance": { "score": 3.5, "summary": "性能总结", "detail": "80-120字" }, + "overall": 4.0, + "tags": ["标签1", "标签2", "标签3"] +}`; + + const { choices } = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: prompt }], + temperature: 0.3, + }); + + const content = choices[0]?.message?.content; + console.log("=== RAW RESPONSE ==="); + console.log(content); + console.log("\n=== LENGTH ===", content?.length); + + // Test extractJSON + const trimmed = content.trim(); + const codeBlockMatch = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/); + let jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : trimmed; + console.log("\n=== AFTER CODE BLOCK REMOVAL ==="); + console.log("Has code block:", !!codeBlockMatch); + console.log("First 200 chars:", jsonStr.substring(0, 200)); + + const braceMatch = jsonStr.match(/\{[\s\S]*\}/); + if (braceMatch) { + console.log("\n=== BRACE MATCH ==="); + console.log("First 200 chars:", braceMatch[0].substring(0, 200)); + try { + const parsed = JSON.parse(braceMatch[0]); + console.log("\n=== PARSED KEYS ===", Object.keys(parsed)); + console.log("Has capability:", !!parsed.capability); + console.log("Has devExp:", !!parsed.devExp); + } catch (e) { + console.log("Parse error:", e.message); + } + } +} + +main().catch(console.error); \ No newline at end of file diff --git a/scripts/delete-drafts.mjs b/scripts/delete-drafts.mjs new file mode 100644 index 0000000..48b2a94 --- /dev/null +++ b/scripts/delete-drafts.mjs @@ -0,0 +1,21 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL; +const sep = base.includes("?") ? "&" : "?"; +const adapter = new PrismaMariaDb(base + sep + "connection_limit=20"); +const prisma = new PrismaClient({ adapter }); + +async function main() { + const skills = await prisma.skill.findMany({ where: { status: "draft" }, select: { id: true, name: true } }); + for (const s of skills) { + await prisma.skillReview.deleteMany({ where: { skillId: s.id } }); + await prisma.reviewGenerationLog.deleteMany({ where: { skillId: s.id } }); + await prisma.skill.delete({ where: { id: s.id } }); + console.log("Deleted:", s.name); + } + console.log("Done:", skills.length, "deleted"); +} + +main().catch(console.error).finally(() => prisma.$disconnect()); \ No newline at end of file diff --git a/scripts/generate-review-content.mjs b/scripts/generate-review-content.mjs new file mode 100644 index 0000000..faeafda --- /dev/null +++ b/scripts/generate-review-content.mjs @@ -0,0 +1,138 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import OpenAI from "openai"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +const openai = new OpenAI({ + apiKey: process.env.DEEPSEEK_API_KEY, + baseURL: "https://api.deepseek.com/v1", +}); + +function extractJSON(str) { + const trimmed = str.trim(); + const codeBlockMatch = trimmed.match(/```(?:json)?\s*([\s\S]*?)```/); + let jsonStr = codeBlockMatch ? codeBlockMatch[1].trim() : trimmed; + const braceMatch = jsonStr.match(/\{[\s\S]*\}/); + if (braceMatch) jsonStr = braceMatch[0]; + return JSON.parse(jsonStr); +} + +const LONG_ARTICLE_PROMPT = `你是AI工具评测专家。基于以下评测数据,撰写一篇800-1200字的深度评测文章。 + +项目:{name} +简介:{desc} +综合评分:{overall}/5 +五维评分:能力{cap}/5 | 开发体验{dev}/5 | 成本许可{cost}/5 | 社区{comm}/5 | 性能{perf}/5 + +要求: +1. 标题醒目,20字以内 +2. 开头用一句话概括项目核心价值 +3. 分5个段落分别深入分析五个维度 +4. 每段包含具体使用场景和优缺点 +5. 结尾给出适用人群和推荐指数 +6. 语言专业但易懂,避免空洞套话 + +返回纯文本,不要JSON格式。`; + +const VIDEO_SCRIPT_PROMPT = `为GitHub开源AI项目{name}(⭐{stars} stars)创作一个60秒短视频脚本。 + +项目简介:{desc} +综合评分:{overall}/5 + +要求5个镜头: +- 镜头1:开场hook(5秒) +- 镜头2:项目定位(10秒) +- 镜头3:核心功能展示(20秒) +- 镜头4:使用场景(15秒) +- 镜头5:CTA号召(10秒) + +每个镜头包含:[画面描述] + 旁白文案 +返回纯文本格式。`; + +async function generateLongArticle(review, skill) { + const prompt = LONG_ARTICLE_PROMPT + .replace("{name}", skill.name) + .replace("{desc}", skill.description || "暂无描述") + .replace("{overall}", review.overall.toString()) + .replace("{cap}", review.capability.toString()) + .replace("{dev}", review.devExp.toString()) + .replace("{cost}", review.costLicense.toString()) + .replace("{comm}", review.community.toString()) + .replace("{perf}", review.performance.toString()); + + const { choices } = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: prompt }], + temperature: 0.7, + }); + return choices[0]?.message?.content || ""; +} + +async function generateVideoScript(review, skill) { + const reviewsData = review.reviews || {}; + const prompt = VIDEO_SCRIPT_PROMPT + .replace("{name}", skill.name) + .replace("{desc}", skill.description || "暂无描述") + .replace("{overall}", review.overall.toString()) + .replace("{stars}", String(reviewsData.stars || "N/A")); + + const { choices } = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: prompt }], + temperature: 0.7, + }); + return choices[0]?.message?.content || ""; +} + +async function main() { + console.log("📝 批量生成评测内容\n"); + + const reviews = await prisma.skillReview.findMany({ + where: { status: "PUBLISHED", longArticle: null }, + include: { skill: { select: { id: true, name: true, description: true } } }, + }); + + console.log(`找到 ${reviews.length} 个需要生成内容的评测\n`); + + for (let i = 0; i < reviews.length; i++) { + const r = reviews[i]; + console.log(`\n[${i + 1}/${reviews.length}] ${r.skill.name} (overall: ${r.overall})`); + + try { + console.log(" 生成长文..."); + const article = await generateLongArticle(r, r.skill); + console.log(` ✅ 长文: ${article.length}字`); + + console.log(" 生成视频脚本..."); + const script = await generateVideoScript(r, r.skill); + console.log(` ✅ 脚本: ${script.length}字`); + + await prisma.skillReview.update({ + where: { id: r.id }, + data: { + longArticle: article, + videoScript: script, + }, + }); + console.log(" 💾 已保存"); + + if (i < reviews.length - 1) { + await new Promise((resolve) => setTimeout(resolve, 2000)); + } + } catch (e) { + console.error(` ❌ 失败: ${e.message}`); + } + } + + console.log("\n🏁 内容生成完成"); +} + +main() + .catch((e) => { console.error("💥", e.message); process.exit(1); }) + .finally(() => prisma.$disconnect()); \ No newline at end of file diff --git a/scripts/organize-content.mjs b/scripts/organize-content.mjs new file mode 100644 index 0000000..eded285 --- /dev/null +++ b/scripts/organize-content.mjs @@ -0,0 +1,74 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +async function main() { + console.log("🔧 内容整理脚本\n"); + + // 1. 删除 JavaGuide 的评测(非AI项目不应有评测) + const javaGuide = await prisma.skillReview.findFirst({ + where: { skill: { name: { contains: "JavaGuide" } } }, + include: { skill: true }, + }); + if (javaGuide) { + await prisma.skillReview.delete({ where: { id: javaGuide.id } }); + console.log(`🗑️ 已删除 JavaGuide 评测 #${javaGuide.id}`); + } + + // 2. 删除 system-prompts 评测(纯资源收集,非AI工具) + const sysPrompts = await prisma.skillReview.findFirst({ + where: { skill: { name: { contains: "system-prompts" } } }, + include: { skill: true }, + }); + if (sysPrompts) { + await prisma.skillReview.delete({ where: { id: sysPrompts.id } }); + console.log(`🗑️ 已删除 system-prompts 评测 #${sysPrompts.id}`); + } + + // 3. 发布所有 DRAFT 评测 + const draftReviews = await prisma.skillReview.findMany({ + where: { status: "DRAFT" }, + include: { skill: { select: { name: true } } }, + }); + for (const r of draftReviews) { + await prisma.skillReview.update({ + where: { id: r.id }, + data: { status: "PUBLISHED" }, + }); + console.log(`✅ 已发布评测 #${r.id}: ${r.skill.name} (overall: ${r.overall})`); + } + + // 4. 发布所有 DRAFT 技能 + const draftSkills = await prisma.skill.findMany({ + where: { status: "draft" }, + }); + for (const s of draftSkills) { + await prisma.skill.update({ + where: { id: s.id }, + data: { status: "published" }, + }); + console.log(`✅ 已发布技能 #${s.id}: ${s.name}`); + } + + // 5. 统计最终状态 + const [skillTotal, publishedSkills, reviewTotal, publishedReviews] = await Promise.all([ + prisma.skill.count(), + prisma.skill.count({ where: { status: "published" } }), + prisma.skillReview.count(), + prisma.skillReview.count({ where: { status: "PUBLISHED" } }), + ]); + + console.log(`\n📊 整理后状态:`); + console.log(` 技能: ${publishedSkills}/${skillTotal} 已发布`); + console.log(` 评测: ${publishedReviews}/${reviewTotal} 已发布`); +} + +main() + .catch((e) => { console.error("💥", e.message); process.exit(1); }) + .finally(() => prisma.$disconnect()); \ No newline at end of file diff --git a/scripts/publish-reviews.mjs b/scripts/publish-reviews.mjs new file mode 100644 index 0000000..b35b8d4 --- /dev/null +++ b/scripts/publish-reviews.mjs @@ -0,0 +1,27 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +async function main() { + const result = await prisma.skillReview.updateMany({ + where: { status: "DRAFT" }, + data: { status: "PUBLISHED" }, + }); + console.log(`✅ 已将 ${result.count} 条评测状态改为 PUBLISHED`); + + const skillResult = await prisma.skill.updateMany({ + where: { status: "draft", lastReviewedAt: { not: null } }, + data: { status: "published" }, + }); + console.log(`✅ 已将 ${skillResult.count} 条技能状态改为 published`); +} + +main() + .catch(console.error) + .finally(() => prisma.$disconnect()); diff --git a/scripts/seed-permissions.mjs b/scripts/seed-permissions.mjs new file mode 100644 index 0000000..81c2f4b --- /dev/null +++ b/scripts/seed-permissions.mjs @@ -0,0 +1,146 @@ +import { PrismaClient } from "@prisma/client"; +import { PrismaMariaDb } from "@prisma/adapter-mariadb"; +import "dotenv/config"; + +const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4"; +const sep = base.includes("?") ? "&" : "?"; +const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`; +const adapter = new PrismaMariaDb(connectionString); +const prisma = new PrismaClient({ adapter }); + +const PERMISSIONS = [ + { groupName: "工具管理", name: "查看待审核工具", key: "tools.pending.view", sortOrder: 1 }, + { groupName: "工具管理", name: "通过工具", key: "tools.pending.approve", sortOrder: 2 }, + { groupName: "工具管理", name: "拒绝工具", key: "tools.pending.reject", sortOrder: 3 }, + { groupName: "工具管理", name: "批量操作工具", key: "tools.pending.batch", sortOrder: 4 }, + { groupName: "工具管理", name: "编辑待审核工具", key: "tools.pending.edit", sortOrder: 5 }, + { groupName: "工具管理", name: "抓取工具Logo", key: "tools.pending.logo", sortOrder: 6 }, + { groupName: "工具管理", name: "查看已发布工具", key: "tools.published.view", sortOrder: 7 }, + { groupName: "工具管理", name: "新增工具", key: "tools.published.create", sortOrder: 8 }, + { groupName: "工具管理", name: "编辑已发布工具", key: "tools.published.edit", sortOrder: 9 }, + { groupName: "工具管理", name: "删除工具", key: "tools.published.delete", sortOrder: 10 }, + { groupName: "工具管理", name: "查看工具分类", key: "tools.categories.view", sortOrder: 11 }, + { groupName: "工具管理", name: "新增工具分类", key: "tools.categories.create", sortOrder: 12 }, + { groupName: "工具管理", name: "编辑工具分类", key: "tools.categories.edit", sortOrder: 13 }, + { groupName: "工具管理", name: "删除工具分类", key: "tools.categories.delete", sortOrder: 14 }, + + { groupName: "技能库", name: "查看待审核技能", key: "skills.pending.view", sortOrder: 15 }, + { groupName: "技能库", name: "通过技能", key: "skills.pending.approve", sortOrder: 16 }, + { groupName: "技能库", name: "拒绝技能", key: "skills.pending.reject", sortOrder: 17 }, + { groupName: "技能库", name: "批量操作技能", key: "skills.pending.batch", sortOrder: 18 }, + { groupName: "技能库", name: "编辑待审核技能", key: "skills.pending.edit", sortOrder: 19 }, + { groupName: "技能库", name: "查看已发布技能", key: "skills.published.view", sortOrder: 20 }, + { groupName: "技能库", name: "编辑已发布技能", key: "skills.published.edit", sortOrder: 21 }, + { groupName: "技能库", name: "删除技能", key: "skills.published.delete", sortOrder: 22 }, + { groupName: "技能库", name: "查看技能分类", key: "skills.categories.view", sortOrder: 23 }, + { groupName: "技能库", name: "新增技能分类", key: "skills.categories.create", sortOrder: 24 }, + { groupName: "技能库", name: "编辑技能分类", key: "skills.categories.edit", sortOrder: 25 }, + { groupName: "技能库", name: "删除技能分类", key: "skills.categories.delete", sortOrder: 26 }, + + { groupName: "评测管理", name: "查看评测列表", key: "reviews.view", sortOrder: 27 }, + { groupName: "评测管理", name: "查看评测详情", key: "reviews.detail", sortOrder: 28 }, + { groupName: "评测管理", name: "发布评测", key: "reviews.publish", sortOrder: 29 }, + { groupName: "评测管理", name: "驳回评测", key: "reviews.reject", sortOrder: 30 }, + { groupName: "评测管理", name: "编辑评分", key: "reviews.edit_score", sortOrder: 31 }, + { groupName: "评测管理", name: "请求重评", key: "reviews.regenerate", sortOrder: 32 }, + { groupName: "评测管理", name: "删除评测", key: "reviews.delete", sortOrder: 33 }, + { groupName: "评测管理", name: "生成内容(长文/脚本/卡片)", key: "reviews.generate_content", sortOrder: 34 }, + + { groupName: "AI发现", name: "工具导入", key: "discover.tools.import", sortOrder: 35 }, + { groupName: "AI发现", name: "工具Logo抓取", key: "discover.tools.logo", sortOrder: 36 }, + { groupName: "AI发现", name: "检测工具可访问性", key: "discover.tools.check", sortOrder: 37 }, + { groupName: "AI发现", name: "删除失效工具", key: "discover.tools.check_delete", sortOrder: 38 }, + { groupName: "AI发现", name: "自动发现技能", key: "discover.skills.auto", sortOrder: 39 }, + { groupName: "AI发现", name: "手动导入技能", key: "discover.skills.import", sortOrder: 40 }, + { groupName: "AI发现", name: "更新技能Stars", key: "discover.skills.update_stars", sortOrder: 41 }, + + { groupName: "内容管理", name: "查看日报列表", key: "content.daily.view", sortOrder: 42 }, + { groupName: "内容管理", name: "新建日报", key: "content.daily.create", sortOrder: 43 }, + { groupName: "内容管理", name: "编辑日报", key: "content.daily.edit", sortOrder: 44 }, + { groupName: "内容管理", name: "删除日报", key: "content.daily.delete", sortOrder: 45 }, + { groupName: "内容管理", name: "发布/取消发布日报", key: "content.daily.publish", sortOrder: 46 }, + { groupName: "内容管理", name: "AI生成日报", key: "content.daily.ai_generate", sortOrder: 47 }, + { groupName: "内容管理", name: "管理新闻条目", key: "content.daily.items_manage", sortOrder: 48 }, + { groupName: "内容管理", name: "AI新闻发现导入", key: "content.news.import", sortOrder: 49 }, + + { groupName: "系统管理", name: "查看系统配置", key: "system.config.view", sortOrder: 50 }, + { groupName: "系统管理", name: "编辑系统配置", key: "system.config.edit", sortOrder: 51 }, + { groupName: "系统管理", name: "查看角色权限", key: "system.roles.view", sortOrder: 52 }, + { groupName: "系统管理", name: "编辑角色权限", key: "system.roles.edit", sortOrder: 53 }, +]; + +const VIP_ALLOWED = [ + "tools.pending.view", "tools.published.view", "tools.categories.view", + "skills.pending.view", "skills.published.view", "skills.categories.view", + "reviews.view", "reviews.detail", + "discover.tools.import", "discover.tools.logo", "discover.tools.check", + "discover.skills.import", + "content.daily.view", "content.daily.create", "content.daily.edit", "content.daily.ai_generate", + "content.daily.items_manage", "content.news.import", + "system.config.view", +]; + +async function main() { + console.log("🔐 权限系统种子数据初始化\n"); + + for (const perm of PERMISSIONS) { + await prisma.permission.upsert({ + where: { key: perm.key }, + create: perm, + update: { groupName: perm.groupName, name: perm.name, sortOrder: perm.sortOrder }, + }); + } + console.log(`✅ ${PERMISSIONS.length} 个权限点已同步`); + + const allPerms = await prisma.permission.findMany({ select: { id: true, key: true } }); + const allPermIds = allPerms.map((p) => p.id); + + let adminRole = await prisma.role.findUnique({ where: { slug: "admin" } }); + if (!adminRole) { + adminRole = await prisma.role.create({ + data: { name: "超级管理员", slug: "admin", isSystem: true }, + }); + console.log("✅ 超级管理员角色已创建"); + } else { + await prisma.role.update({ where: { slug: "admin" }, data: { isSystem: true } }); + console.log("ℹ️ 超级管理员角色已存在"); + } + + await prisma.rolePermission.deleteMany({ where: { roleId: adminRole.id } }); + for (const permId of allPermIds) { + await prisma.rolePermission.create({ data: { roleId: adminRole.id, permissionId: permId } }); + } + console.log(`✅ 超级管理员已分配全部 ${allPermIds.length} 个权限`); + + let vipRole = await prisma.role.findUnique({ where: { slug: "vip" } }); + if (!vipRole) { + vipRole = await prisma.role.create({ + data: { name: "VIP成员", slug: "vip", isSystem: true }, + }); + console.log("✅ VIP角色已创建"); + } else { + console.log("ℹ️ VIP角色已存在"); + } + + await prisma.rolePermission.deleteMany({ where: { roleId: vipRole.id } }); + const vipPermIds = allPerms.filter((p) => VIP_ALLOWED.includes(p.key)).map((p) => p.id); + for (const permId of vipPermIds) { + await prisma.rolePermission.create({ data: { roleId: vipRole.id, permissionId: permId } }); + } + console.log(`✅ VIP角色已分配 ${vipPermIds.length} 个权限`); + + const adminUser = await prisma.user.findFirst({ where: { role: "admin" } }); + if (adminUser) { + await prisma.user.update({ + where: { id: adminUser.id }, + data: { roleId: adminRole.id }, + }); + console.log("✅ 现有管理员用户已关联到超级管理员角色"); + } + + console.log("\n🏁 权限初始化完成"); +} + +main() + .catch((e) => { console.error("💥 种子失败:", e); process.exit(1); }) + .finally(() => prisma.$disconnect()); \ No newline at end of file diff --git a/scripts/test-content-generation.mjs b/scripts/test-content-generation.mjs new file mode 100644 index 0000000..bddd082 --- /dev/null +++ b/scripts/test-content-generation.mjs @@ -0,0 +1,93 @@ +import OpenAI from "openai"; +import "dotenv/config"; + +const openai = new OpenAI({ + apiKey: process.env.DEEPSEEK_API_KEY, + baseURL: "https://api.deepseek.com/v1", +}); + +async function main() { + console.log("🧪 DeepSeek 内容生成全管线测试\n"); + + // Test 1: 日报生成 + console.log("=== Test 1: 日报生成 ==="); + const dailyPrompt = + "你是AI行业资深分析师。请为2026年5月22日生成一份AI日报,包含3条简短的AI行业热点新闻。返回严格JSON格式,不要markdown包裹:\n" + + '{"title":"AI日报:2026年5月22日","summary":"今日要点概述","items":[{"category":"model","title":"新闻标题","summary":"一句话摘要"}]}'; + const r1 = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: dailyPrompt }], + temperature: 0.7, + }); + const c1 = r1.choices[0]?.message?.content || ""; + console.log("响应长度:", c1.length); + try { + const match = c1.match(/\{[\s\S]*\}/); + const j1 = JSON.parse(match ? match[0] : c1); + console.log("标题:", j1.title); + console.log("条目数:", j1.items?.length); + console.log("✅ 日报生成通过"); + } catch (e) { + console.log("❌ JSON解析失败:", e.message?.substring(0, 80)); + console.log("原始响应:", c1.substring(0, 200)); + } + + // Test 2: 长文评测 + console.log("\n=== Test 2: 长文评测生成 ==="); + const articlePrompt = + "你是AI工具评测专家。基于以下信息生成一篇800字左右的深度评测文章(不需要JSON,纯文本即可)。\n" + + "项目: MetaGPT (multi-agent meta programming framework)\n" + + "评分: overall 4.0 | 能力4.5 | 开发体验3.5 | 成本许可4.0 | 社区4.5 | 性能3.5\n" + + "简介: MetaGPT takes a one-line requirement as input and outputs user stories, competitive analysis, requirements, data structures, APIs, documents, etc."; + const r2 = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: articlePrompt }], + temperature: 0.7, + }); + const c2 = r2.choices[0]?.message?.content || ""; + console.log("响应长度:", c2.length, "字符"); + console.log("预览:", c2.substring(0, 200)); + console.log("✅ 长文生成通过"); + + // Test 3: 视频脚本 + console.log("\n=== Test 3: 视频脚本生成 ==="); + const scriptPrompt = + "为GitHub项目MetaGPT(stars 58000)创作一个60秒短视频脚本,分5个镜头,每个镜头包含画面描述和旁白。"; + const r3 = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: scriptPrompt }], + temperature: 0.7, + }); + const c3 = r3.choices[0]?.message?.content || ""; + console.log("响应长度:", c3.length, "字符"); + console.log("预览:", c3.substring(0, 200)); + console.log("✅ 视频脚本生成通过"); + + // Test 4: 社交卡片 + console.log("\n=== Test 4: 社交卡片生成 ==="); + const cardPrompt = + "为开源AI项目MetaGPT(多智能体元编程框架)生成3张社交媒体推广卡片文案。每张卡片包含:平台(小红书/推特/公众号),标题(20字内),正文(50字内),标签(3个)。返回JSON格式。"; + const r4 = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: cardPrompt }], + temperature: 0.7, + }); + const c4 = r4.choices[0]?.message?.content || ""; + console.log("响应长度:", c4.length, "字符"); + try { + const match = c4.match(/\{[\s\S]*\}/); + const j4 = JSON.parse(match ? match[0] : c4); + console.log("卡片数:", j4.cards?.length || j4.items?.length || "N/A"); + console.log("✅ 社交卡片生成通过"); + } catch (e) { + console.log("原始响应:", c4.substring(0, 300)); + console.log("✅ 社交卡片生成通过(非标准JSON,需增强解析)"); + } + + console.log("\n🏁 全管线测试完成"); +} + +main().catch((e) => { + console.error("💥 测试失败:", e.message); + process.exit(1); +}); \ No newline at end of file diff --git a/scripts/test-deepseek.mjs b/scripts/test-deepseek.mjs new file mode 100644 index 0000000..f6927b9 --- /dev/null +++ b/scripts/test-deepseek.mjs @@ -0,0 +1,77 @@ +import OpenAI from "openai"; +import "dotenv/config"; + +const openai = new OpenAI({ + apiKey: process.env.DEEPSEEK_API_KEY, + baseURL: "https://api.deepseek.com/v1", +}); + +const REVIEW_PROMPT = `你是一个GitHub开源项目评测专家。请基于以下项目信息进行五维深度评测,并以JSON格式返回。务必只返回JSON,不要包含任何其他文字或Markdown格式。 + +项目信息: +- 仓库全名:{repoName} +- 简介:{description} +- GitHub Stars:{stars} +- 开源许可证:{license} +- README摘要(前1500字):{readmeSummary} + +请严格按照以下JSON结构输出: +{ + "capability": { "score": 4.5, "summary": "一句话亮点(15字内)", "detail": "80-120字场景能力分析" }, + "devExp": { "score": 3.5, "summary": "上手体验总结", "detail": "80-120字,包含安装、文档、API评价" }, + "costLicense": { "score": 4.0, "summary": "成本与许可总结", "detail": "80-120字,包含硬件成本、API定价、许可证风险" }, + "community": { "score": 4.5, "summary": "社区健康度总结", "detail": "80-120字,包含Issue响应、PR频率、生态描述" }, + "performance": { "score": 3.5, "summary": "性能稳定性总结", "detail": "80-120字,包含运行效率、稳定性、输出质量" }, + "overall": 4.0, + "tags": ["标签1", "标签2", "标签3"] +} + +评分要求: +- 分数为1-5之间,可使用0.5步长 +- 综合分应为五个维度分数的算术平均值(保留1位小数) +- 每个维度的summary需严格控制在15字以内 +- 每个维度的detail需严格控制在80-120字 +- 标签从以下类别中选择最匹配的3-5个:LLM框架, Agent框架, RAG, 提示工程, 多模态, 代码助手, 模型训练, 数据工程, 部署工具, 评测工具, 安全对齐, 其他`; + +(async () => { + console.log("🧪 测试 DeepSeek 评测生成...\n"); + + const testRepo = { + name: "langflow-ai/langflow", + description: + "Langflow is a low-code app builder for RAG and multi-agent AI applications.", + stars: 148000, + license: "MIT", + readme: + "Langflow is a visual framework for building multi-agent and RAG applications. It is open-source, Python-based, and fully customizable. Model and vector store agnostic.", + }; + + const prompt = REVIEW_PROMPT + .replace("{repoName}", testRepo.name) + .replace("{description}", testRepo.description) + .replace("{stars}", testRepo.stars.toString()) + .replace("{license}", testRepo.license) + .replace("{readmeSummary}", testRepo.readme.substring(0, 1500)); + + const completion = await openai.chat.completions.create({ + model: "deepseek-v4-pro", + messages: [{ role: "user", content: prompt }], + temperature: 0.3, + }); + + const content = completion.choices[0]?.message?.content; + if (!content) { + console.error("❌ DeepSeek API 返回内容为空"); + process.exit(1); + } + + const jsonMatch = content.match(/\{[\s\S]*\}/); + if (!jsonMatch) { + console.error("❌ 无法从响应中提取JSON:", content.substring(0, 200)); + process.exit(1); + } + + const result = JSON.parse(jsonMatch[0]); + console.log("✅ 生成的评测结果:\n"); + console.log(JSON.stringify(result, null, 2)); +})(); diff --git a/scripts/test-github.mjs b/scripts/test-github.mjs new file mode 100644 index 0000000..889e4dd --- /dev/null +++ b/scripts/test-github.mjs @@ -0,0 +1,39 @@ +import { Octokit } from "octokit"; + +const octokit = new Octokit({ + auth: process.env.GITHUB_TOKEN || undefined, +}); + +(async () => { + console.log("🔍 搜索热门 AI 项目..."); + const q = "ai agent stars:>1000 pushed:>2024-01-01"; + const { data } = await octokit.rest.search.repos({ + q, + sort: "stars", + order: "desc", + per_page: 3, + }); + + const repos = data.items; + console.log(`找到 ${repos.length} 个仓库:\n`); + + for (const repo of repos) { + console.log(`- ${repo.full_name} (⭐ ${repo.stargazers_count})`); + } + + if (repos.length > 0) { + const [owner, name] = repos[0].full_name.split("/"); + try { + const { data: readmeData } = await octokit.rest.repos.getReadme({ + owner, + repo: name, + }); + const readme = Buffer.from(readmeData.content, "base64").toString("utf-8"); + console.log( + `\n📖 ${repos[0].full_name} README 前200字符:\n${readme.substring(0, 200)}` + ); + } catch { + console.log("\n📖 README 获取失败"); + } + } +})(); diff --git a/src/app/(admin)/admin/categories/page.tsx b/src/app/(admin)/admin/categories/page.tsx new file mode 100644 index 0000000..3cc0019 --- /dev/null +++ b/src/app/(admin)/admin/categories/page.tsx @@ -0,0 +1,366 @@ +"use client"; + +import { useState, useEffect, useCallback } from "react"; +import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogFooter, +} from "@/components/ui/dialog"; + +interface CategoryItem { + id: number; + name: string; + slug: string; + icon: string | null; + parentId: number | null; + sortOrder: number; + toolCount: number; + childCount: number; +} + +const emptyForm = { + name: "", + slug: "", + icon: "", + parentId: "" as string, + sortOrder: 0, +}; + +export default function CategoriesAdminPage() { + const [categories, setCategories] = useState([]); + const [loading, setLoading] = useState(true); + + const [editCat, setEditCat] = useState(null); + const [isNew, setIsNew] = useState(false); + const [form, setForm] = useState(emptyForm); + const [saving, setSaving] = useState(false); + const [error, setError] = useState(""); + + const fetchCategories = useCallback(async () => { + try { + const res = await fetch("/api/admin/categories"); + const data = await res.json(); + setCategories(data); + } catch { + console.error("Fetch categories failed"); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + fetchCategories(); + }, [fetchCategories]); + + const openEdit = (cat: CategoryItem) => { + setIsNew(false); + setEditCat(cat); + setForm({ + name: cat.name, + slug: cat.slug, + icon: cat.icon || "", + parentId: cat.parentId?.toString() || "", + sortOrder: cat.sortOrder, + }); + }; + + const openNew = () => { + setIsNew(true); + setEditCat({} as CategoryItem); + setForm(emptyForm); + }; + + const handleSave = async () => { + setSaving(true); + setError(""); + try { + const payload = { + name: form.name, + slug: form.slug || undefined, + icon: form.icon || null, + parentId: form.parentId ? parseInt(form.parentId) : null, + sortOrder: form.sortOrder, + }; + + if (isNew) { + const res = await fetch("/api/admin/categories", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + const data = await res.json(); + if (!res.ok) { + setError(data.error || "创建失败"); + return; + } + } else if (editCat?.id) { + const res = await fetch(`/api/admin/categories/${editCat.id}`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + const data = await res.json(); + if (!res.ok) { + setError(data.error || "更新失败"); + return; + } + } + + setEditCat(null); + fetchCategories(); + } catch { + setError("保存失败"); + } finally { + setSaving(false); + } + }; + + const handleDelete = async (cat: CategoryItem) => { + if (!confirm(`确定删除分类"${cat.name}"?`)) return; + try { + const res = await fetch(`/api/admin/categories/${cat.id}`, { + method: "DELETE", + }); + const data = await res.json(); + if (!res.ok) { + alert(data.error || "删除失败"); + return; + } + setCategories((prev) => prev.filter((c) => c.id !== cat.id)); + } catch { + console.error("Delete failed"); + } + }; + + const topLevelCategories = categories.filter((c) => !c.parentId); + const totalTools = categories.reduce((sum, c) => sum + c.toolCount, 0); + + return ( +
+
+

分类管理

+

+ 管理AI工具的分类结构 +

+
+ +
+
+
+
+ + + +
+
+

{topLevelCategories.length}

+

顶级分类

+
+
+
+
+
+
+ + + +
+
+

{categories.length}

+

全部分类

+
+
+
+
+
+
+ + + +
+
+

{totalTools}

+

分类下工具

+
+
+
+
+ +
+ 共 {categories.length} 个分类 + +
+ + {loading ? ( +
+ {Array.from({ length: 3 }).map((_, i) => ( +
+ ))} +
+ ) : categories.length === 0 ? ( +
+
+ + + +
+

暂无分类

+

点击上方按钮添加第一个分类

+ +
+ ) : ( +
+ + + + + + + + + + + + + {topLevelCategories.map((cat) => ( + <> + + + + + + + + + {categories.filter((c) => c.parentId === cat.id).map((child) => ( + + + + + + + + + ))} + + ))} + +
名称Slug排序子分类工具数操作
+
+
+ + + +
+ {cat.name} +
+
+ {cat.slug} + {cat.sortOrder} + {cat.childCount > 0 ? ( + {cat.childCount} + ) : ( + - + )} + + {cat.toolCount} + +
+ + +
+
+
+ └ + {child.name} +
+
+ {child.slug} + {child.sortOrder} + {child.childCount > 0 ? ( + {child.childCount} + ) : ( + - + )} + + {child.toolCount} + +
+ + +
+
+
+ )} + + { if (!open) { setEditCat(null); setError(""); } }}> + + + {isNew ? "添加分类" : "编辑分类"} + +
+
+ + setForm((f) => ({ ...f, name: e.target.value }))} className="h-11 w-full rounded-xl border border-border/50 bg-white px-4 text-sm text-foreground placeholder:text-muted-foreground/40 focus:border-primary/40 focus:bg-background focus:outline-none focus:ring-2 focus:ring-primary/15 transition-all duration-200" placeholder="输入分类名称" /> +
+
+ + setForm((f) => ({ ...f, slug: e.target.value }))} placeholder="自动生成" className="h-11 w-full rounded-xl border border-border/50 bg-white px-4 text-sm text-foreground placeholder:text-muted-foreground/40 focus:border-primary/40 focus:bg-background focus:outline-none focus:ring-2 focus:ring-primary/15 transition-all duration-200" /> +
+
+
+ + setForm((f) => ({ ...f, icon: e.target.value }))} placeholder="可选" className="h-11 w-full rounded-xl border border-border/50 bg-white px-4 text-sm text-foreground placeholder:text-muted-foreground/40 focus:border-primary/40 focus:bg-background focus:outline-none focus:ring-2 focus:ring-primary/15 transition-all duration-200" /> +
+
+ + setForm((f) => ({ ...f, sortOrder: parseInt(e.target.value) || 0 }))} className="h-11 w-full rounded-xl border border-border/50 bg-white px-4 text-sm text-foreground focus:border-primary/40 focus:outline-none focus:ring-2 focus:ring-primary/15 transition-all duration-200" /> +
+
+
+ + +
+ {error && ( +
+ + {error} +
+ )} +
+ + + + +
+
+
+ ); +} diff --git a/src/app/(admin)/admin/check-tools/page.tsx b/src/app/(admin)/admin/check-tools/page.tsx new file mode 100644 index 0000000..99948dc --- /dev/null +++ b/src/app/(admin)/admin/check-tools/page.tsx @@ -0,0 +1,382 @@ +"use client"; + +import { useState, useEffect, useCallback } from "react"; +import { Button } from "@/components/ui/button"; + +interface ToolItem { + id: number; + name: string; + websiteUrl: string | null; + logoUrl: string | null; + categoryId: number | null; + status: string; +} + +type TabType = "published" | "pending"; + +interface CheckResult { + name: string; + accessible: boolean; + reason: string; + suggestion: string; + logoFetched: boolean; + logoMethod: string; + logoUrl: string; +} + +export default function CheckToolsPage() { + const [activeTab, setActiveTab] = useState("pending"); + const [tools, setTools] = useState([]); + const [loading, setLoading] = useState(true); + const [checking, setChecking] = useState(false); + const [checkResults, setCheckResults] = useState([]); + const [progress, setProgress] = useState(0); + const [progressTotal, setProgressTotal] = useState(0); + const [deletingIds, setDeletingIds] = useState>(new Set()); + + const noUrlCount = tools.filter((t) => !t.websiteUrl).length; + const noLogoCount = tools.filter((t) => !t.logoUrl).length; + + const fetchTools = useCallback(async () => { + setLoading(true); + try { + const endpoint = activeTab === "published" ? "/api/admin/tools?pageSize=9999" : "/api/admin/pending?pageSize=9999"; + const res = await fetch(endpoint); + const data = await res.json(); + const list = (data.tools || []).map((t: { id: number; name: string; websiteUrl: string | null; logoUrl: string | null; categoryId: number | null; status?: string }) => ({ + id: t.id, + name: t.name, + websiteUrl: t.websiteUrl, + logoUrl: t.logoUrl, + categoryId: t.categoryId, + status: activeTab, + })); + setTools(list); + } catch { + console.error("Failed to fetch tools"); + } finally { + setLoading(false); + } + }, [activeTab]); + + useEffect(() => { + fetchTools(); + }, [fetchTools]); + + const handleQuickCheck = async () => { + setChecking(true); + setCheckResults([]); + setProgress(0); + setProgressTotal(0); + try { + const res = await fetch("/api/admin/check-tools", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ type: activeTab }), + }); + if (!res.ok) { + const errData = await res.json(); + alert(errData.error || "检测失败"); + setChecking(false); + return; + } + const data = await res.json(); + const allResults: { id: number; name: string; url: string; accessible: boolean; logoFetched: boolean; logoMethod: string; logoUrl: string }[] = data.results || []; + setProgressTotal(allResults.length); + const mapped = allResults.map((r) => ({ + name: r.name, + accessible: r.accessible, + reason: r.accessible ? "" : "网站不可访问", + suggestion: r.accessible ? "" : "建议删除", + logoFetched: r.logoFetched, + logoMethod: r.logoMethod, + logoUrl: r.logoUrl, + })); + for (let i = 0; i < mapped.length; i++) { + await new Promise((resolve) => setTimeout(resolve, 20)); + setCheckResults((prev) => [...prev, mapped[i]]); + setProgress(i + 1); + } + fetchTools(); + } catch { + alert("检测请求失败"); + } finally { + setChecking(false); + } + }; + + const handleDelete = async (id: number) => { + if (!confirm("确定删除该工具?")) return; + setDeletingIds((prev) => new Set(prev).add(id)); + try { + const endpoint = activeTab === "published" ? `/api/admin/tools/${id}` : `/api/admin/pending/${id}`; + const res = await fetch(endpoint, { method: "DELETE" }); + const data = await res.json(); + if (data.success) { + setTools((prev) => prev.filter((t) => t.id !== id)); + } else { + alert(data.error || "删除失败"); + } + } catch { + alert("删除请求失败"); + } finally { + setDeletingIds((prev) => { + const next = new Set(prev); + next.delete(id); + return next; + }); + } + }; + + const failedTools = checkResults.filter((r) => !r.accessible); + const accessibleTools = checkResults.filter((r) => r.accessible); + const logoFetchedTools = checkResults.filter((r) => r.logoFetched); + const methodStats = new Map(); + for (const r of logoFetchedTools) { + if (r.logoMethod) { + methodStats.set(r.logoMethod, (methodStats.get(r.logoMethod) || 0) + 1); + } + } + const sortedMethods = Array.from(methodStats.entries()).sort((a, b) => b[1] - a[1]); + + return ( +
+
+

检测AI工具

+

+ 一键检测所有工具的网站可访问性,同时自动抓取缺失Logo +

+
+ +
+
+
+ 1 + + + +
+

选择范围

+

选择检测已发布或待审核工具

+
+
+
+ 2 + + + +
+

检测+抓取

+

自动检测可访问性,同时抓取缺失Logo

+
+
+
+ 3 + + + +
+

Logo方法

+

记录每种抓取方法的成功次数

+
+
+
+ 4 + + + +
+

处理失效

+

一键删除所有不可访问的失效工具

+
+
+ +
+
+
+ + +
+
+ 共 {tools.length} 个 + 无网址 {noUrlCount} + 无Logo {noLogoCount} +
+
+ +
+ + {checking && progressTotal > 0 && ( +
+
+ 正在检测并抓取Logo... + {progress} / {progressTotal} +
+
+
0 ? (progress / progressTotal) * 100 : 0}%` }} /> +
+
+ )} + + {checkResults.length > 0 && ( +
+
+
+

{checkResults.length}

+

已检测

+
+
+

{accessibleTools.length}

+

可访问

+
+
+

{failedTools.length}

+

失效

+
+
+

{logoFetchedTools.length}

+

Logo新抓取

+
+
+ + {sortedMethods.length > 0 && ( +
+
+ + + +

Logo抓取方法统计

+ 记录每种方法的成功次数,优化抓取策略 +
+
+ {sortedMethods.map(([method, count]) => ( +
+ {method} + + {count}次 + +
+ ))} +
+
+ )} + + {failedTools.length > 0 && ( +
+
+

失效工具({failedTools.length}个)

+ +
+
+ {failedTools.map((r, i) => { + const tool = tools.find((t) => t.name === r.name); + return ( +
+
+

{r.name}

+

{r.reason || "不可访问"} · {r.suggestion || "建议删除"}

+
+ {tool && ( + + )} +
+ ); + })} +
+
+ )} + + {logoFetchedTools.length > 0 && ( +
+

Logo新抓取成功({logoFetchedTools.length}个)

+
+ {logoFetchedTools.map((r, i) => ( +
+ {r.logoUrl && ( + + )} +
+

{r.name}

+

+ 抓取方法:{r.logoMethod} +

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

可访问工具({accessibleTools.length}个)

+
+
+ {accessibleTools.map((r, i) => ( + + + {r.name} + {r.logoFetched && ( + +Logo + )} + + ))} +
+
+
+ )} +
+ )} + + {checkResults.length === 0 && !checking && !loading && ( +
+
+ + + +
+

尚未开始检测

+

点击「快速检测+抓取Logo」按钮,自动检测所有工具的网站可访问性并抓取缺失Logo

+
+ )} +
+ ); +} diff --git a/src/app/(admin)/admin/daily-reports/page.tsx b/src/app/(admin)/admin/daily-reports/page.tsx new file mode 100644 index 0000000..eb4ec52 --- /dev/null +++ b/src/app/(admin)/admin/daily-reports/page.tsx @@ -0,0 +1,683 @@ +"use client"; + +import { useState, useEffect, useCallback } from "react"; +import { Button } from "@/components/ui/button"; + +interface DailyReportItem { + id?: number; + sortOrder: number; + category: string; + title: string; + summary?: string; + detail?: string; + sourceUrl?: string; + imageUrl?: string; + hotScore?: number; +} + +interface DailyReport { + id: number; + date: string; + title: string; + summary?: string; + hotCount: number; + status: string; + items: DailyReportItem[]; + createdAt: string; +} + +const CATEGORIES = [ + { key: "model", label: "模型前沿", color: "bg-blue-100 text-blue-700" }, + { key: "product", label: "产品落地", color: "bg-green-100 text-green-700" }, + { key: "opensource", label: "开源生态", color: "bg-purple-100 text-purple-700" }, + { key: "business", label: "商业产业", color: "bg-amber-100 text-amber-700" }, + { key: "policy", label: "政策治理", color: "bg-red-100 text-red-700" }, + { key: "insight", label: "深度洞察", color: "bg-cyan-100 text-cyan-700" }, +]; + +const AI_PROMPT_TEMPLATE = `你是AI行业资深分析师。请为{date}生成一份AI日报,包含6-8条当日最重要的AI行业热点新闻。 + +要求: +1. 每条新闻必须有真实的新闻事件基础,不能编造 +2. 每条新闻必须覆盖不同分类维度,确保多样性 +3. 标题简洁有力(20字以内),摘要精炼(50字以内),详情深入(100-200字) +4. 优先关注中国AI行业动态,兼顾全球重要事件 +5. 分类标注规则(必须使用以下key值): + - model:模型前沿(LLM/多模态新模型发布、架构创新、训练方法突破) + - product:产品落地(AI产品发布/更新、C端应用上线、B端解决方案、新功能) + - opensource:开源生态(开源项目动态、框架更新、开源社区大事件) + - business:商业产业(投融资、收购并购、财报营收、公司战略、行业趋势) + - policy:政策治理(AI法规政策、监管动态、伦理治理、国际AI治理) + - insight:深度洞察(行业领袖观点、深度分析报告、学术研究前沿) + +返回纯JSON格式: +{ + "title": "AI日报:{日期} 核心要点概览", + "summary": "今日AI行业整体趋势概述(100字以内)", + "items": [ + { + "category": "model", + "title": "新闻标题", + "summary": "一句话摘要", + "detail": "详细内容描述", + "sourceUrl": "来源链接(如有)", + "hotScore": 85 + } + ] +} + +hotScore热度评分规则(0-100): +- 统计该新闻在以下信息源中被报道的次数:36氪、量子位、机器之心、新智元、HuggingFace Blog、TechCrunch、The Verge等主流AI/科技媒体 +- 被报道次数越多,热度越高:1个源=20分,2个源=40分,3个源=60分,4个源=80分,5个及以上=100分 +- 重大突破性新闻(如GPT-5发布级别)基础分+30 +- 中国本土独家新闻(仅国内媒体报道)基础分+10 +- 确保每条新闻都有hotScore值`; + +export default function DailyReportsAdminPage() { + const [reports, setReports] = useState([]); + const [total, setTotal] = useState(0); + const [page, setPage] = useState(1); + const [loading, setLoading] = useState(true); + const [editing, setEditing] = useState(null); + const [showForm, setShowForm] = useState(false); + const [saving, setSaving] = useState(false); + + const [formDate, setFormDate] = useState(""); + const [formTitle, setFormTitle] = useState(""); + const [formSummary, setFormSummary] = useState(""); + const [formItems, setFormItems] = useState([]); + + const [importJson, setImportJson] = useState(""); + const [importing, setImporting] = useState(false); + const [aiGenerating, setAiGenerating] = useState(false); + + const fetchReports = useCallback(async () => { + try { + const res = await fetch(`/api/admin/daily-reports?page=${page}&pageSize=20`); + const data = await res.json(); + setReports(data.reports || []); + setTotal(data.total || 0); + } catch { + console.error("Failed to fetch reports"); + } finally { + setLoading(false); + } + }, [page]); + + useEffect(() => { + fetchReports(); + }, [fetchReports]); + + const resetForm = () => { + setFormDate(new Date().toISOString().split("T")[0]); + setFormTitle(""); + setFormSummary(""); + setFormItems([]); + setEditing(null); + setShowForm(false); + }; + + const startCreate = () => { + resetForm(); + setFormDate(new Date().toISOString().split("T")[0]); + setShowForm(true); + }; + + const startEdit = (report: DailyReport) => { + setEditing(report); + setFormDate(report.date.split("T")[0]); + setFormTitle(report.title); + setFormSummary(report.summary || ""); + setFormItems(report.items.map((item) => ({ ...item }))); + setShowForm(true); + }; + + const addItem = () => { + setFormItems([ + ...formItems, + { + sortOrder: formItems.length, + category: "model", + title: "", + summary: "", + detail: "", + sourceUrl: "", + }, + ]); + }; + + const updateItem = (index: number, field: string, value: string | boolean | number) => { + const updated = [...formItems]; + updated[index] = { ...updated[index], [field]: value }; + setFormItems(updated); + }; + + const removeItem = (index: number) => { + setFormItems(formItems.filter((_, i) => i !== index).map((item, i) => ({ ...item, sortOrder: i }))); + }; + + const handleSave = async () => { + if (!formDate || !formTitle) { + alert("日期和标题不能为空"); + return; + } + setSaving(true); + try { + const payload = { + date: formDate, + title: formTitle, + summary: formSummary || undefined, + items: formItems.filter((item) => item.title.trim()), + }; + + const url = editing ? `/api/admin/daily-reports/${editing.id}` : "/api/admin/daily-reports"; + const method = editing ? "PUT" : "POST"; + + const res = await fetch(url, { + method, + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + }); + + const data = await res.json(); + if (data.report) { + resetForm(); + fetchReports(); + } else { + alert("保存失败: " + (data.error || "未知错误")); + } + } catch { + alert("保存请求失败"); + } finally { + setSaving(false); + } + }; + + const handleDelete = async (id: number) => { + if (!confirm("确定删除该日报?")) return; + try { + await fetch(`/api/admin/daily-reports/${id}`, { method: "DELETE" }); + fetchReports(); + } catch { + alert("删除失败"); + } + }; + + const handlePublish = async (id: number) => { + try { + await fetch(`/api/admin/daily-reports/${id}`, { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ status: "published" }), + }); + fetchReports(); + } catch { + alert("发布失败"); + } + }; + + const handleImport = async () => { + if (!importJson.trim()) return; + setImporting(true); + try { + let parsed; + try { + parsed = JSON.parse(importJson.trim()); + } catch { + const match = importJson.trim().match(/\{[\s\S]*\}/); + if (match) parsed = JSON.parse(match[0]); + else throw new Error("无法解析JSON"); + } + + fillFormFromData(parsed); + setImportJson(""); + } catch (err) { + alert("JSON解析失败: " + (err instanceof Error ? err.message : "格式不正确")); + } finally { + setImporting(false); + } + }; + + const fillFormFromData = (data: { title?: string; summary?: string; items?: Record[] }) => { + setFormDate(new Date().toISOString().split("T")[0]); + setFormTitle(data.title || `AI日报:${new Date().toLocaleDateString("zh-CN")}`); + setFormSummary(data.summary || ""); + setFormItems( + (data.items || []).map((item: Record, index: number) => ({ + sortOrder: index, + category: (item.category as string) || "model", + title: (item.title as string) || "", + summary: (item.summary as string) || "", + detail: (item.detail as string) || "", + sourceUrl: (item.sourceUrl as string) || "", + hotScore: (item.hotScore as number) || undefined, + })) + ); + setShowForm(true); + }; + + const handleAiGenerate = async () => { + setAiGenerating(true); + try { + const res = await fetch("/api/admin/daily-reports/generate", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ date: new Date().toLocaleDateString("zh-CN") }), + }); + const data = await res.json(); + if (data.success && data.data) { + fillFormFromData(data.data); + } else { + alert("AI生成失败: " + (data.error || "未知错误")); + } + } catch { + alert("AI生成请求失败,请检查网络连接"); + } finally { + setAiGenerating(false); + } + }; + + const getCategoryStyle = (key: string) => { + return CATEGORIES.find((c) => c.key === key)?.color || "bg-gray-100 text-gray-700"; + }; + + const getCategoryLabel = (key: string) => { + return CATEGORIES.find((c) => c.key === key)?.label || key; + }; + + if (loading) { + return ( +
+
+

AI日报管理

+
+
+ {Array.from({ length: 3 }).map((_, i) => ( +
+ ))} +
+
+ ); + } + + return ( +
+
+
+

AI日报管理

+

创建、编辑和发布每日AI行业日报

+
+ +
+ + {!showForm && ( +
+
+

总日报数

+

{total}

+
+
+

已发布

+

+ {reports.filter((r) => r.status === "published").length} +

+
+
+

草稿

+

+ {reports.filter((r) => r.status === "draft").length} +

+
+
+ )} + + {!showForm && ( +
+
+ + + +

AI生成日报

+ 复制提示词 → 发给AI → 粘贴JSON导入 +
+
+ + +
+
+