diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 7ec21f40..359e378a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,21 +32,20 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 # 如果未启用 lastUpdated,则不需要 - # - uses: pnpm/action-setup@v3 # 如果使用 pnpm,请取消此区域注释 - # with: - # version: 9 - # - uses: oven-sh/setup-bun@v1 # 如果使用 Bun,请取消注释 - name: Setup Node uses: actions/setup-node@v4 with: node-version: 22 - cache: npm # 或 pnpm / yarn + cache: npm + cache-dependency-path: docs/package-lock.json - name: Setup Pages uses: actions/configure-pages@v4 - name: Install dependencies - run: npm ci # 或 pnpm install / yarn install / bun install + run: npm ci + working-directory: docs - name: Build with VitePress - run: npm run docs:build # 或 pnpm docs:build / yarn docs:build / bun run docs:build + run: npm run build + working-directory: docs - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: diff --git a/AGENTS.md b/AGENTS.md index 9c6059bc..8942d44c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -46,4 +46,4 @@ docker compose exec api uv run python test/your_script.py # 放在 test 文件 **其他**: - 如果需要新建说明文档(仅开发者可见,非必要不创建),则保存在 `docs/vibe` 文件夹下面 -- 代码更新后要检查文档部分是否有需要更新的地方,文档的目录定义在 `docs/.vitepress/config.mts` 中。文档应该更新最新版(`docs/latest`) +- 代码更新后要检查文档部分是否有需要更新的地方,文档的目录定义在 `docs/.vitepress/config.mts` 中 diff --git a/CLAUDE.md b/CLAUDE.md index f112a4cd..68ef9780 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,4 +48,4 @@ docker compose exec api uv run python test/your_script.py # 放在 test 文件 - 使用 YUXI_SUPER_ADMIN_NAME / YUXI_SUPER_ADMIN_PASSWORD 调试接口 - 如果需要新建说明文档(仅开发者可见,非必要不创建),则保存在 `docs/vibe` 文件夹下面 -- 代码更新后要检查文档部分是否有需要更新的地方,文档的目录定义在 `docs/.vitepress/config.mts` 中。文档应该更新最新版(`docs/latest`) +- 代码更新后要检查文档部分是否有需要更新的地方,文档的目录定义在 `docs/.vitepress/config.mts` 中 diff --git a/LICENSE b/LICENSE index ba26789d..d77b8ae1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2025 The Project Contributors +Copyright (c) 2025 Yuxi Project Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile index 4e90863e..8b743474 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ -.PHONY: up down logs lint format format_diff router-tests +.PHONY: up down logs lint format PYTEST_ARGS ?= @@ -33,6 +33,3 @@ format: cd backend && uv run ruff check package --fix cd backend && uv run ruff check --select I package --fix docker compose exec -T web pnpm run format - -router-tests: - docker compose exec -T api uv run --group test pytest test/api $(PYTEST_ARGS) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index b4a4a2b0..3001ef10 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -8,7 +8,6 @@ export default defineConfig({ title: "Yuxi", description: "语析", base: '/Yuxi-Know/', - srcDir: './', ignoreDeadLinks: [ /localhost/ ], @@ -21,95 +20,63 @@ export default defineConfig({ // https://vitepress.dev/reference/default-theme-config logo: "/favicon.svg", nav: [ + { text: '快速开始', link: '/intro/quick-start' }, + { text: '智能体开发', link: '/agents/agents-config' } + ], + + sidebar: [ { - text: 'Version', + text: '简介', items: [ - { text: 'Latest (开发版)', link: '/latest/intro/quick-start' }, - { text: 'v0.4.0 (稳定版)', link: '/v0.4.0/intro/quick-start' } + { text: '什么是 Yuxi?', link: '/intro/project-overview' }, + { text: '快速开始', link: '/intro/quick-start' }, + { text: '模型配置', link: '/intro/model-config' }, + { text: '知识库与知识图谱', link: '/intro/knowledge-base' }, + { text: '知识库评估', link: '/intro/evaluation' } + ] + }, + { + text: '智能体开发', + items: [ + { text: '智能体配置', link: '/agents/agents-config' }, + { text: '上下文配置', link: '/agents/context-config' }, + { text: '工具系统', link: '/agents/tools-system' }, + { text: '中间件', link: '/agents/middleware' }, + { text: 'MCP 集成', link: '/agents/mcp-integration' }, + { text: 'Skills 管理', link: '/agents/skills-management' }, + { text: 'SubAgents 管理', link: '/agents/subagents-management' } + ] + }, + { + text: '高级配置', + items: [ + { text: '配置系统详解', link: '/advanced/configuration' }, + { text: '文档解析', link: '/advanced/document-processing' }, + { text: '品牌自定义', link: '/advanced/branding' }, + { text: '其他配置', link: '/advanced/misc' }, + { text: '生产部署', link: '/advanced/deployment' } + ] + }, + { + text: '更新日志', + items: [ + { text: '路线图', link: '/changelog/roadmap' }, + { text: '参与贡献', link: '/changelog/contributing' }, + { text: '常见问题', link: '/changelog/faq' }, + { text: '迁移至 v0.5', link: '/changelog/migrate_to_v0-5' } ] } ], - sidebar: { - '/latest/': [ - { - text: '简介', - items: [ - { text: '什么是 Yuxi?', link: '/latest/intro/project-overview' }, - { text: '快速开始', link: '/latest/intro/quick-start' }, - { text: '模型配置', link: '/latest/intro/model-config' }, - { text: '知识库与知识图谱', link: '/latest/intro/knowledge-base' }, - { text: '知识库评估', link: '/latest/intro/evaluation' } - ] - }, - { - text: '智能体开发', - items: [ - { text: '智能体配置', link: '/latest/agents/agents-config' }, - { text: '上下文配置', link: '/latest/agents/context-config' }, - { text: '工具系统', link: '/latest/agents/tools-system' }, - { text: '中间件', link: '/latest/agents/middleware' }, - { text: 'MCP 集成', link: '/latest/agents/mcp-integration' }, - { text: 'Skills 管理', link: '/latest/agents/skills-management' }, - { text: 'SubAgents 管理', link: '/latest/agents/subagents-management' } - ] - }, - { - text: '高级配置', - items: [ - { text: '配置系统详解', link: '/latest/advanced/configuration' }, - { text: '文档解析', link: '/latest/advanced/document-processing' }, - { text: '品牌自定义', link: '/latest/advanced/branding' }, - { text: '其他配置', link: '/latest/advanced/misc' }, - { text: '生产部署', link: '/latest/advanced/deployment' } - ] - }, - { - text: '更新日志', - items: [ - { text: '路线图', link: '/latest/changelog/roadmap' }, - { text: '参与贡献', link: '/latest/changelog/contributing' }, - { text: '常见问题', link: '/latest/changelog/faq' }, - { text: '迁移至 v0.5', link: '/latest/changelog/migrate_to_v0-5' } - ] - } - ], - '/v0.4.0/': [ - { - text: '简介', - items: [ - { text: '什么是 Yuxi?', link: '/v0.4.0/intro/project-overview' }, - { text: '快速开始', link: '/v0.4.0/intro/quick-start' }, - { text: '模型配置', link: '/v0.4.0/intro/model-config' }, - { text: '知识库与知识图谱', link: '/v0.4.0/intro/knowledge-base' }, - { text: '知识库评估', link: '/v0.4.0/intro/evaluation' } - ] - }, - { - text: '高级配置', - items: [ - { text: '配置系统详解', link: '/v0.4.0/advanced/configuration' }, - { text: '文档解析', link: '/v0.4.0/advanced/document-processing' }, - { text: '智能体', link: '/v0.4.0/advanced/agents-config' }, - { text: '品牌自定义', link: '/v0.4.0/advanced/branding' }, - { text: '其他配置', link: '/v0.4.0/advanced/misc' }, - { text: '生产部署', link: '/v0.4.0/advanced/deployment' } - ] - } - ], - }, - socialLinks: [ { icon: 'github', link: 'https://github.com/xerrors/Yuxi-Know' } ], - footer: { message: '本项目基于 MIT License 开源,欢迎使用和贡献。', copyright: 'Copyright © 2025-present Yuxi' }, - editLink: { pattern: 'https://github.com/xerrors/Yuxi-Know/edit/main/docs/:path', text: '在 GitHub 上编辑此页' @@ -127,7 +94,6 @@ export default defineConfig({ provider: 'local' }, - docFooter: { prev: '上一页', next: '下一页' diff --git a/docs/latest/advanced/branding.md b/docs/advanced/branding.md similarity index 100% rename from docs/latest/advanced/branding.md rename to docs/advanced/branding.md diff --git a/docs/latest/advanced/configuration.md b/docs/advanced/configuration.md similarity index 100% rename from docs/latest/advanced/configuration.md rename to docs/advanced/configuration.md diff --git a/docs/latest/advanced/deployment.md b/docs/advanced/deployment.md similarity index 100% rename from docs/latest/advanced/deployment.md rename to docs/advanced/deployment.md diff --git a/docs/latest/advanced/document-processing.md b/docs/advanced/document-processing.md similarity index 100% rename from docs/latest/advanced/document-processing.md rename to docs/advanced/document-processing.md diff --git a/docs/latest/advanced/misc.md b/docs/advanced/misc.md similarity index 100% rename from docs/latest/advanced/misc.md rename to docs/advanced/misc.md diff --git a/docs/latest/agents/agents-config.md b/docs/agents/agents-config.md similarity index 100% rename from docs/latest/agents/agents-config.md rename to docs/agents/agents-config.md diff --git a/docs/latest/agents/context-config.md b/docs/agents/context-config.md similarity index 100% rename from docs/latest/agents/context-config.md rename to docs/agents/context-config.md diff --git a/docs/latest/agents/mcp-integration.md b/docs/agents/mcp-integration.md similarity index 100% rename from docs/latest/agents/mcp-integration.md rename to docs/agents/mcp-integration.md diff --git a/docs/latest/agents/middleware.md b/docs/agents/middleware.md similarity index 100% rename from docs/latest/agents/middleware.md rename to docs/agents/middleware.md diff --git a/docs/latest/agents/skills-management.md b/docs/agents/skills-management.md similarity index 100% rename from docs/latest/agents/skills-management.md rename to docs/agents/skills-management.md diff --git a/docs/latest/agents/subagents-management.md b/docs/agents/subagents-management.md similarity index 100% rename from docs/latest/agents/subagents-management.md rename to docs/agents/subagents-management.md diff --git a/docs/latest/agents/tools-system.md b/docs/agents/tools-system.md similarity index 100% rename from docs/latest/agents/tools-system.md rename to docs/agents/tools-system.md diff --git a/docs/latest/changelog/contributing.md b/docs/changelog/contributing.md similarity index 100% rename from docs/latest/changelog/contributing.md rename to docs/changelog/contributing.md diff --git a/docs/latest/changelog/faq.md b/docs/changelog/faq.md similarity index 95% rename from docs/latest/changelog/faq.md rename to docs/changelog/faq.md index 0931b63e..88dd37db 100644 --- a/docs/latest/changelog/faq.md +++ b/docs/changelog/faq.md @@ -10,10 +10,10 @@ ```bash # Linux/macOS -bash docker/pull_image.sh +bash scripts/pull_image.sh # Windows PowerShell -powershell -ExecutionPolicy Bypass -File docker/pull_image.ps1 +powershell -ExecutionPolicy Bypass -File scripts/pull_image.ps1 ``` **构建失败问题**: diff --git a/docs/latest/changelog/migrate_to_v0-5.md b/docs/changelog/migrate_to_v0-5.md similarity index 100% rename from docs/latest/changelog/migrate_to_v0-5.md rename to docs/changelog/migrate_to_v0-5.md diff --git a/docs/latest/changelog/roadmap.md b/docs/changelog/roadmap.md similarity index 93% rename from docs/latest/changelog/roadmap.md rename to docs/changelog/roadmap.md index 0b08dd9e..82c9c952 100644 --- a/docs/latest/changelog/roadmap.md +++ b/docs/changelog/roadmap.md @@ -57,8 +57,8 @@ ## v0.4 ### 新增 -- 新增对于上传附件的智能体中间件,详见[文档](https://xerrors.github.io/Yuxi-Know/latest/advanced/agents-config.html#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%AD%E9%97%B4%E4%BB%B6) -- 新增多模态模型支持(当前仅支持图片),详见[文档](https://xerrors.github.io/Yuxi-Know/latest/advanced/agents-config.html#%E5%A4%9A%E6%A8%A1%E6%80%81%E5%9B%BE%E7%89%87%E6%94%AF%E6%8C%81) +- 新增对于上传附件的智能体中间件,详见[文档](https://xerrors.github.io/Yuxi-Know/advanced/agents-config.html#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E4%B8%AD%E9%97%B4%E4%BB%B6) +- 新增多模态模型支持(当前仅支持图片),详见[文档](https://xerrors.github.io/Yuxi-Know/advanced/agents-config.html#%E5%A4%9A%E6%A8%A1%E6%80%81%E5%9B%BE%E7%89%87%E6%94%AF%E6%8C%81) - 新建 DeepAgents 智能体(深度分析智能体),支持 todo,files 等渲染,支持文件的下载。 - 新增基于知识库文件生成思维导图功能([#335](https://github.com/xerrors/Yuxi-Know/pull/335#issuecomment-3530976425)) - 新增基于知识库文件生成示例问题功能([#335](https://github.com/xerrors/Yuxi-Know/pull/335#issuecomment-3530976425)) @@ -66,10 +66,10 @@ - 新增自定义模型支持、新增 dashscope rerank/embeddings 模型的支持 - 新增文档解析的图片支持,已支持 MinerU Officical、Docs、Markdown Zip格式 - 新增暗色模式支持并调整整体 UI([#343](https://github.com/xerrors/Yuxi-Know/pull/343)) -- 新增知识库评估功能,支持导入评估基准或者自动构建评估基准(目前仅支持Milvus类型知识库)详见[文档](https://xerrors.github.io/Yuxi-Know/latest/intro/evaluation.html) +- 新增知识库评估功能,支持导入评估基准或者自动构建评估基准(目前仅支持Milvus类型知识库)详见[文档](https://xerrors.github.io/Yuxi-Know/intro/evaluation.html) - 新增同名文件处理逻辑:遇到同名文件则在上传区域提示,是否删除旧文件 - 新增生产环境部署脚本,固定 python 依赖版本,提升部署稳定性 -- 优化图谱可视化方式,统一图谱数据结构,统一使用基于 G6 的可视化方式,同时支持上传带属性的图谱文件,详见[文档](https://xerrors.github.io/Yuxi-Know/latest/intro/knowledge-base.html#_1-%E4%BB%A5%E4%B8%89%E5%85%83%E7%BB%84%E5%BD%A2%E5%BC%8F%E5%AF%BC%E5%85%A5) +- 优化图谱可视化方式,统一图谱数据结构,统一使用基于 G6 的可视化方式,同时支持上传带属性的图谱文件,详见[文档](https://xerrors.github.io/Yuxi-Know/intro/knowledge-base.html#_1-%E4%BB%A5%E4%B8%89%E5%85%83%E7%BB%84%E5%BD%A2%E5%BC%8F%E5%AF%BC%E5%85%A5) - 优化 DBManager / ConversationManager,支持异步操作 - 优化 知识库详情页面,更加简洁清晰,增强文件下载功能 diff --git a/docs/latest/changelog/run-architecture-migration-v4.md b/docs/changelog/run-architecture-migration-v4.md similarity index 100% rename from docs/latest/changelog/run-architecture-migration-v4.md rename to docs/changelog/run-architecture-migration-v4.md diff --git a/docs/index.md b/docs/index.md index fdacedb2..49d90dd8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,11 +11,8 @@ hero: alt: VitePress actions: - theme: brand - text: Latest 文档 - link: /latest/intro/quick-start - - theme: alt - text: v0.4.0 文档 - link: /v0.4.0/intro/quick-start + text: 快速开始 + link: /intro/quick-start features: - title: 🤖 智能体与模型 diff --git a/docs/latest/intro/evaluation.md b/docs/intro/evaluation.md similarity index 100% rename from docs/latest/intro/evaluation.md rename to docs/intro/evaluation.md diff --git a/docs/latest/intro/knowledge-base.md b/docs/intro/knowledge-base.md similarity index 100% rename from docs/latest/intro/knowledge-base.md rename to docs/intro/knowledge-base.md diff --git a/docs/latest/intro/model-config.md b/docs/intro/model-config.md similarity index 100% rename from docs/latest/intro/model-config.md rename to docs/intro/model-config.md diff --git a/docs/latest/intro/project-overview.md b/docs/intro/project-overview.md similarity index 100% rename from docs/latest/intro/project-overview.md rename to docs/intro/project-overview.md diff --git a/docs/latest/intro/quick-start.md b/docs/intro/quick-start.md similarity index 96% rename from docs/latest/intro/quick-start.md rename to docs/intro/quick-start.md index cf3b1da4..4e10a059 100644 --- a/docs/latest/intro/quick-start.md +++ b/docs/intro/quick-start.md @@ -119,13 +119,13 @@ docker logs web-dev -f ```bash # 手动拉取基础镜像 -bash docker/pull_image.sh python:3.12-slim +bash scripts/pull_image.sh python:3.12-slim ``` **离线环境部署方案**: ```bash -# 在有网络的环境导出镜像 +# 在有网络的环境导出镜像,注意检查镜像列表,不一定是最新的。 bash docker/save_docker_images.sh # 传输到目标机器 diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 00000000..302c9a90 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,11 @@ +{ + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "dependencies": { + "markdown-it-task-checkbox": "^1.0.6", + "vitepress": "^1.6.4" + } +} diff --git a/docs/v0.4.0/advanced/agents-config.md b/docs/v0.4.0/advanced/agents-config.md deleted file mode 100644 index 400240c4..00000000 --- a/docs/v0.4.0/advanced/agents-config.md +++ /dev/null @@ -1,272 +0,0 @@ -# 智能体 - -## 智能体开发 - -系统基于 [LangGraph](https://github.com/langchain-ai/langgraph) 并通过统一的 `AgentManager` 管理所有智能体。`backend/package/yuxi/agents/__init__.py` 会在启动时遍历 `backend/package/yuxi/agents` 目录,对每个包含 `__init__.py` 的子包执行自动发现:所有继承 `BaseAgent` 的类都会被注册并立即初始化,因此只要代码落位正确,就不需要再手动登记或修改管理器。 - -仓库预置了若干可直接运行的智能体:`chatbot` 聚焦对话与动态工具调度,`reporter` 演示报告类链路。这些目录展示了上下文类、Graph 构造方式、子智能体引用以及中间件组合的范例,新增功能时可以直接复用。 - -### 智能体元数据配置 - -每个智能体可以通过在智能体目录下创建 `metadata.toml` 文件来配置元数据信息。这个文件使用 TOML 格式,包含以下字段: - -- `name`: 智能体显示名称 -- `description`: 智能体功能描述 -- `examples`: 示例问题列表(数组格式) - -例如,`backend/package/yuxi/agents/chatbot/metadata.toml`: - -<<< @/../backend/package/yuxi/agents/chatbot/metadata.toml - -**注意**:`metadata.toml` 文件是可选的,如果没有提供,系统将使用智能体类的基本属性。 - -### 创建新的智能体 - -在 `backend/package/yuxi/agents` 下新建一个包,保持与现有目录一致的结构:放置 Graph 构造逻辑(通常命名为 `graph.py`),并在包内的 `__init__.py` 中暴露主类。 - -智能体类必须继承 `yuxi.agents.common.BaseAgent`,同时实现异步的 `get_graph` 方法来返回编译后的 LangGraph 实例,并配置好 `checkpointer`,否则无法从历史对话中恢复。 - -需要额外上下文字段时,可继承 `BaseContext` 构建自己的配置表单,再把类绑定到 `context_schema`,平台会在 `saves/agents/` 下生成默认配置。 - -案例 基于MySQL工具,以及自定义 MCP Server 的数据库报表助手。 - -<<< @/../backend/package/yuxi/agents/reporter/graph.py - - - -智能体实例的生命周期交给管理器处理,会在自动发现时完成初始化并缓存单例,以便快速响应请求。在容器内热重载时,只要保存文件即可触发重新导入;需要强制刷新可调用 `agent_manager.get_agent(, reload=True)`。 - -更多动态工具选择与 MCP 注册的例子,见 `backend/package/yuxi/agents/chatbot/graph.py` 中的中间件组合。 - -### 拓展现有智能体 - -智能体保持为 LangGraph 的标准节点组合,因此可以在原有 `graph.py` 中添加节点、条件与消息转换器。复用现成上下文时,只需扩展当前 `context_schema` 的字段;若功能差异较大,可以创建新的上下文类并替换 `context_schema`。 - -对工具、模型或提示语的调整建议封装到中间件或独立函数里,既方便多智能体共用,又能保持 `BaseAgent` 的基础接口稳定。变更提交后无需手动刷新注册表,只要确保包结构未改变,智能体会在热重载中自动更新。 - -### 子智能体与中间件 - -子智能体集中放在 `backend/package/yuxi/agents/common/subagents` 目录,典型例子是 `calc_agent`,它通过 LangChain 的 `create_agent` 构建计算器能力并以工具暴露给主图。新增子智能体时沿用这一结构:在目录内编写封装函数与 `@tool` 装饰器,导出后即可被任意智能体调用。 - -中间件位于 `backend/package/yuxi/agents/common/middlewares`,包含上下文感知提示词、模型选择、动态工具加载以及附件注入等实现。如果需要编写新的中间件,请遵循 LangChain 官方文档中对 `AgentMiddleware`、`ModelRequest`、`ModelResponse` 等接口的定义,完成后在该目录的 `__init__.py` 暴露入口,主智能体即可在 `middleware` 列表中引用。 - -#### 文件上传中间件 - -文件上传功能通过 `inject_attachment_context` 中间件实现(位于 `backend/package/yuxi/agents/common/middlewares/attachment_middleware.py`)。该中间件基于 LangChain 1.0 的 `AgentMiddleware` 标准实现,具有以下特点: - -1. **状态扩展**:定义 `AttachmentState` 扩展 `AgentState`,添加可选的 `attachments` 字段 -2. **自动注入**:在模型调用前,从 `request.state` 中读取附件并转换为 `SystemMessage` -3. **向后兼容**:不使用文件上传的智能体不受影响 - -##### 为智能体启用文件上传 - -只需两步: - -**步骤 1:声明能力**(让前端显示上传按钮) - -```python -class MyAgent(BaseAgent): - capabilities = ["file_upload"] -``` - -**步骤 2:添加中间件**(让智能体能够处理附件内容) - -```python -from yuxi.agents.common.middlewares import inject_attachment_context - -async def get_graph(self): - graph = create_agent( - model=load_chat_model("..."), - tools=get_tools(), - middleware=[ - inject_attachment_context, # 添加附件中间件 - context_aware_prompt, # 其他中间件... - # ... - ], - checkpointer=await self._get_checkpointer(), - ) - return graph -``` - -##### 工作流程 - -1. **前端上传**:用户在聊天界面上传文档(txt、md、docx、html) -2. **API 解析**:后端将文档转换为 Markdown 格式并存储到数据库(超过 32k 会被截断) -3. **自动加载**:API 层在调用 agent 前从数据库加载附件数据 -4. **中间件注入**:`inject_attachment_context` 自动将附件内容注入为系统消息 -5. **模型处理**:LLM 接收到附件内容和用户问题,进行综合回答 - -这种设计确保了附件功能的可选性和可扩展性,任何智能体都可以通过添加中间件快速启用文件上传能力。 - -## 内置工具与 MCP 集成 - -系统会根据配置自动组装工具集合,涵盖知识图谱查询、向量检索生成的动态工具、MySQL 只读查询能力、Tavily 搜索以及所有注册的 MCP 工具。 - -工具的启用状态和描述由配置文件或环境变量决定,当依赖缺失时会被中间件自动忽略,从而避免在图中加载不可用能力。MCP Server 的接入方式保持不变,只需在 `backend/package/yuxi/agents/common/mcp.py` 的 `MCP_SERVERS` 中填入服务地址与 `transport` 类型,如需更多范式可参阅 LangChain 官方文档。 - -### MCP 服务器配置方式 - -系统支持四种 MCP 服务器配置方式,可根据具体场景选择: - -#### 1. 远程 HTTP 服务器 - -```python -MCP_SERVERS = { - "sequentialthinking": { - "url": "https://remote.mcpservers.org/sequentialthinking/mcp", - "transport": "streamable_http", - } -} -``` - -**特点**: -- 通过 HTTP 远程访问,无需本地安装,适合公开可用的 MCP 服务 -- 启动速度快,无需本地依赖 - -#### 2. 使用 npx 运行 Node.js 包 - -```python -MCP_SERVERS = { - "mcp-server-chart": { - "command": "npx", - "args": ["-y", "@antv/mcp-server-chart"], - "transport": "stdio" - }, -} -``` - -**特点**: -- 使用 npx 直接运行 Node.js 包,`-y` 参数自动下载并运行指定包 -- 适合 Node.js 生态的 MCP 服务,需要确保 npx 可以使用 - -#### 3. 使用 uvx 运行 Python 包 - -```python -MCP_SERVERS = { - "mysql-mcp-server": { - "command": "uvx", - "args": ["mysql_mcp_server"], - "env": { - "MYSQL_DATABASE": "your_database", - "MYSQL_HOST": "localhost", - "MYSQL_PASSWORD": "your_password", - "MYSQL_PORT": "3306", - "MYSQL_USER": "your_username" - }, - "transport": "stdio" - } -} -``` - -**特点**: -- 使用 uvx 运行已发布的 Python 包,自动管理虚拟环境和依赖 -- 适合 PyPI 上已发布的 MCP 服务 - -#### 4. 使用 uv 运行本地仓库 - -```python -MCP_SERVERS = { - "arxiv-mcp-server": { - "command": "uv", - "args": [ - "tool", - "run", - "arxiv-mcp-server", - "--storage-path", "backend/package/yuxi/agents/mcp_repos/arxiv-mcp-server" - ], - "transport": "stdio" - } -} -``` - -**特点**: -- 直接运行本地 git 仓库中的 MCP 服务 -- 加载速度快,支持热重载,适合开发调试和自定义 MCP 服务 -- 需要先 git clone 对应仓库到指定路径 - -### 配置参数说明 - -- `url`: 远程 HTTP 服务器的 URL(仅 streamable_http 传输) -- `command`: 启动 MCP 服务的命令 -- `args`: 启动参数列表 -- `env`: 环境变量配置,用于数据库连接等敏感信息 -- `transport`: 传输协议,支持 `stdio`(本地)和 `streamable_http`(远程) - -### 动态工具加载 - -系统支持动态加载 MCP 工具: - -```python -from yuxi.agents.common.mcp import get_mcp_tools, add_mcp_server - -# 获取特定服务器的工具 -tools = await get_mcp_tools("sequentialthinking") - -# 动态添加新的 MCP 服务器 -add_mcp_server("custom-server", { - "url": "https://your-mcp-server.com/mcp", - "transport": "streamable_http" -}) - -# 获取所有 MCP 工具 -all_tools = await get_all_mcp_tools() -``` -### MySQL 数据库 - -在 数据库报表助手(SqlReporterAgent) 中,可以通过配置下面环境变量,让 Agent 能够连接到 MySQL 数据库。并通过执行 SQL 查询,获取数据库中的数据。 - -设置数据库连接时,在 `.env` 中提供以下字段: - -```env -MYSQL_HOST=192.168.1.100 -MYSQL_USER=username -MYSQL_PASSWORD=your_secure_password -MYSQL_DATABASE=database_name -MYSQL_DATABASE_DESCRIPTION=业务主库(可选提示) -MYSQL_PORT=3306 -MYSQL_CHARSET=utf8mb4 -``` - -所有查询限定在只读范围(SELECT、SHOW、DESCRIBE、EXPLAIN),请求会经过表名校验与超时控制,默认限制 60 秒与 100 行输出,并可通过配置调整上限。连接信息会反馈给 LangGraph,智能体可以自动陈述数据库用途并选择更准确的检索策略。详见代码部分 `backend/package/yuxi/agents/common/toolkits/mysql/` - -### 多模态图片支持 - -系统支持接收图片作为输入,与文本结合形成多模态查询。图片支持的核心特性如下: - -#### 1. 图片上传与处理 -- 通过 `/chat/image/upload` 接口上传图片 -- 自动处理图片格式转换和压缩 -- 返回 base64 编码的图片数据 -- 图片大小限制为 10MB -- 支持的图片格式:JPEG、PNG、WebP、GIF、BMP -- 自动压缩超过 5MB 的图片 - -当发送包含图片的请求时,消息格式为: -```json -{ - "query": "这张图片里有什么?", - "image_content": "", - "config": {}, - "meta": {} -} -``` - -智能体会自动识别多模态消息并将其传递给支持图片的模型。如果模型不支持图片,会自动忽略图片内容,只处理文本部分。系统会将图片转换为符合模型要求的格式(通常是 base64 编码的 JPEG 或 PNG),确保与主流多模态模型兼容。 - -目前仅支持上传单个图片,图片以 base64 编码形式存储在数据库。系统会自动处理图片的格式转换和压缩,并生成缩略图以优化性能。 - -### 图片上传响应格式 - -```json -{ - "success": true, - "image_content": "", - "thumbnail_content": "", - "width": 1024, - "height": 768, - "format": "JPEG", - "mime_type": "image/jpeg" -} -``` - -系统会将图片信息与用户查询一同传递给支持多模态的模型,并自动适配模型要求的格式。 diff --git a/docs/v0.4.0/advanced/branding.md b/docs/v0.4.0/advanced/branding.md deleted file mode 100644 index 514e927f..00000000 --- a/docs/v0.4.0/advanced/branding.md +++ /dev/null @@ -1,60 +0,0 @@ -# 品牌自定义 - -系统支持完整的品牌信息自定义,包括 Logo、组织名称、版权信息等。 - -## 配置方法 - -### 1. 复制模板文件 - -```bash -cp backend/package/yuxi/config/static/info.template.yaml backend/package/yuxi/config/static/info.local.yaml -``` - -### 2. 编辑品牌信息 - -在 `backend/package/yuxi/config/static/info.local.yaml` 中配置: - -<<< @/../backend/package/yuxi/config/static/info.template.yaml - -上述中提到的 ICON 预设了下面这些,如果需要更多的 ICONS,可以手动从 `lucide-vue-next` 中引入。 - -<<< @/../web/src/views/HomeView.vue#icon_mapping{js} - -### 3. 环境变量配置 - -在 `.env` 文件中指定配置文件路径: - -```bash -YUXI_BRAND_FILE_PATH=backend/package/yuxi/config/static/info.local.yaml -``` - -::: tip 配置优先级 -`info.local.yaml` > `info.template.yaml`(默认) -::: - - -## 样式定制 - -系统配色主要保存在 `web/src/assets/css/base.css` 中: - -- 替换 `--main-*` 相关变量即可改变配色 -- 支持主题色、辅助色等完整定制 -- 实时预览,无需重启服务 - -**主要变量**: - -```css -:root { - --main-color: #1890ff; /* 主色调 */ - --main-1000: #f0f2f5; /* 色板 */ - --main-900: #e6f7ff; /* 色板 */ - /* ... 其他色板 */ -} - -``` - -**此外**,`web/src/stores/theme.js` 中也包含了主题相关的配置(需要修改 `colorPrimary`),可根据需要修改。 - -## 修改首页 - -首页提供了一个插槽组件 `web/src/components/ProjectOverview.vue`,可以在该组件中自定义项目介绍,当前为空文件。(借助 AI 编程可以设计出更好看的首页的) diff --git a/docs/v0.4.0/advanced/configuration.md b/docs/v0.4.0/advanced/configuration.md deleted file mode 100644 index 6f8866ca..00000000 --- a/docs/v0.4.0/advanced/configuration.md +++ /dev/null @@ -1,185 +0,0 @@ -# 配置系统详解 - -## 概述 - -Yuxi-Know 从 v0.3.x 版本开始采用了全新的配置系统,基于 Pydantic BaseModel 和 TOML 格式,提供了类型安全、智能提示和选择性持久化等现代化特性。 - -## 架构设计 - -### 配置层次结构 - -``` -配置系统架构 -├── 默认配置 (代码定义) -│ ├── backend/package/yuxi/config/static/models.py (模型配置) -│ └── backend/package/yuxi/config/app.py (应用配置) -├── 用户配置 (TOML 文件) -│ └── saves/config/base.toml (仅保存用户修改) -└── 环境变量 (运行时覆盖) - └── .env 文件 -``` - -### 核心组件 - -#### 1. Config 类 (`backend/package/yuxi/config/app.py`) - -主配置类,继承自 Pydantic BaseModel,提供: - -- **类型验证**: 自动检查配置项类型 -- **默认值管理**: 内置合理的默认配置 -- **选择性持久化**: 仅保存用户修改的配置项 -- **向后兼容**: 支持旧的字典式访问方式 - -```python -class Config(BaseModel): - # 功能开关 - enable_reranker: bool = Field(default=False, description="是否开启重排序") - enable_content_guard: bool = Field(default=False, description="是否启用内容审查") - - # 模型配置 - default_model: str = Field(default="siliconflow/deepseek-ai/DeepSeek-V3.2") - embed_model: str = Field(default="siliconflow/BAAI/bge-m3") - - # 运行时状态 (不持久化) - model_provider_status: dict[str, bool] = Field(exclude=True) -``` - -#### 2. 模型配置类 (`backend/package/yuxi/config/static/models.py`) - -定义了三种类型的模型配置: - -- **ChatModelProvider**: 聊天模型提供商 -- **EmbedModelInfo**: 嵌入模型信息 -- **RerankerInfo**: 重排序模型信息 - -```python -class ChatModelProvider(BaseModel): - name: str = Field(..., description="提供商显示名称") - url: str = Field(..., description="提供商文档或模型列表 URL") - base_url: str = Field(..., description="API 基础 URL") - default: str = Field(..., description="默认模型名称") - env: str = Field(..., description="API Key 环境变量名") - models: list[str] = Field(default_factory=list, description="支持的模型列表") -``` - -添加配置: - - -```python -# 1. 在 DEFAULT_CHAT_MODEL_PROVIDERS 中添加 -"new-provider": ChatModelProvider( - name="新提供商", - url="https://provider.com/docs", - base_url="https://api.provider.com/v1", - default="default-model", - env="NEW_PROVIDER_API_KEY", - models=["model1", "model2"], -), - -# 2. 在 .env 中配置 API Key -# NEW_PROVIDER_API_KEY=your_api_key - -# 3. 重启服务或重新加载配置 -``` - -## 配置管理特性 - -系统只会保存用户修改过的配置项: - -```python -# 用户只修改了 enable_reranker -config.enable_reranker = True -config.save() # 只保存 enable_reranker 到 TOML 文件 - -# TOML 文件内容 -# enable_reranker = true -``` - -### 默认模型配置 (`backend/package/yuxi/config/static/models.py`) - -包含所有支持的模型提供商的默认配置,开发者可以直接修改此文件添加新的模型: - -```python -DEFAULT_CHAT_MODEL_PROVIDERS: dict[str, ChatModelProvider] = { - "siliconflow": ChatModelProvider( - name="SiliconFlow", - url="https://cloud.siliconflow.cn/models", - base_url="https://api.siliconflow.cn/v1", - default="deepseek-ai/DeepSeek-V3.2", - env="SILICONFLOW_API_KEY", - models=[ - "deepseek-ai/DeepSeek-V3.2", - "Qwen/Qwen3-235B-A22B-Instruct-2507", - # ... - ], - ), - # 更多提供商... -} -``` - -### 用户配置 (`saves/config/base.toml`) - -只包含用户修改过的配置项,使用 TOML 格式: - -```toml -# 用户只修改了这些配置项 -enable_reranker = true -default_agent_id = "MyCustomAgent" -enable_content_guard = true - -# 模型配置修改 -[model_names.siliconflow] -models = [ - "deepseek-ai/DeepSeek-V3.2", - "custom-model-name", -] -``` - -## 高级配置 - -### 动态配置更新 - -```python -from yuxi.config import config - -# 更新配置 -config.enable_reranker = True -config.default_agent_id = "CustomAgent" - -# 更新模型列表 -config.model_names["siliconflow"].models.append("new-model") - -# 保存配置 -config.save() - -# 或者只保存特定提供商的模型配置 -config._save_models_to_file("siliconflow") -``` - -### 配置验证 - -```python -# 验证配置 -from yuxi.config import config - -# 检查模型提供商可用性 -for provider, status in config.model_provider_status.items(): - print(f"{provider}: {'✅' if status else '❌'}") - -# 获取可用模型列表 -available_models = config.get_model_choices() -available_embed_models = config.get_embed_model_choices() -available_rerankers = config.get_reranker_choices() -``` - -### 配置导出 - -```python -# 导出完整配置(包含运行时状态) -full_config = config.dump_config() - -# 导出用户配置(仅保存到文件的部分) -user_config = { - field: getattr(config, field) - for field in config._user_modified_fields -} diff --git a/docs/v0.4.0/advanced/deployment.md b/docs/v0.4.0/advanced/deployment.md deleted file mode 100644 index c3868d4b..00000000 --- a/docs/v0.4.0/advanced/deployment.md +++ /dev/null @@ -1,69 +0,0 @@ -# 生产部署指南 - -本指南介绍了如何在生产环境中部署 Yuxi-Know。 - -## 前置要求 - -- **Docker Engine** (v24.0+) -- **Docker Compose** (v2.20+) -- **NVIDIA Container Toolkit** (如果在生产环境使用 GPU 服务) - -注意事项: - -1. 生产环境和开发环境最好是两台独立的机器,不然会存在端口和资源的冲突问题。 -2. 虽然名为“生产环境”,但实际上只是做了一些基本的配置而已,真要上线业务,需要根据实际情况进行调整。 - -## 部署步骤 - -### 1. 配置环境变量 - -为了避免与开发环境的冲突,建议在生产环境中使用 `.env.prod` 文件。请确保你已经从模板创建了该文件并填写了必要的密钥。 - -```bash -cp .env.template .env.prod -``` - -编辑 `.env.prod` 文件,设置强密码并配置必要的 API 密钥: - -- `NEO4J_PASSWORD`: 修改默认密码 -- `MINIO_ACCESS_KEY` / `MINIO_SECRET_KEY`: 修改默认密钥 -- `SILICONFLOW_API_KEY` 等模型密钥 - -### 2. 启动服务 - -使用 `docker-compose.prod.yml` 文件启动生产环境: - -```bash -# 仅启动核心服务 (CPU 模式) -docker compose -f docker-compose.prod.yml up -d --build - -# 启动所有服务 (包含 GPU OCR 服务) -docker compose -f docker-compose.prod.yml --profile all up -d --build -``` - -### 3. 验证部署 - -- **Web 访问**: `http://localhost` (直接通过 80 端口访问,无需 :5173) -- **API 健康检查**: `curl http://localhost/api/system/health` - -## 维护与更新 - -### 更新代码并重新部署 - -```bash -# 拉取最新代码 -git pull - -# 重新构建并启动 -docker compose -f docker-compose.prod.yml up -d --build -``` - -### 查看日志 - -```bash -# 查看 API 日志 -docker logs -f api-prod - -# 查看 Nginx 访问日志 -docker logs -f web-prod -``` diff --git a/docs/v0.4.0/advanced/document-processing.md b/docs/v0.4.0/advanced/document-processing.md deleted file mode 100644 index 3fb3e7df..00000000 --- a/docs/v0.4.0/advanced/document-processing.md +++ /dev/null @@ -1,120 +0,0 @@ -# 文档处理与 OCR - -系统提供 4 种文档处理选项: - -- **RapidOCR**: CPU 友好,无需 GPU,适合基础文字识别 -- **MinerU**: 本地化高精度 VLM 解析,适合复杂 PDF 和表格文档 -- **MinerU Official**: 官方云服务 API,无需本地部署,开箱即用 -- **PaddleX**: 结构化解析,适合表格、票据等特殊格式 - -## 支持的文件类型 - -### 常规文档格式 -- **文本文档**: `.txt`, `.md`, `.html`, `.htm` -- **Word 文档**: `.docx` -- **PDF 文档**: `.pdf` -- **电子表格**: `.csv`, `.xls`, `.xlsx` -- **JSON 数据**: `.json` - -### 图像格式(需要 OCR) -- **常见图片**: `.jpg`, `.jpeg`, `.png`, `.bmp`, `.tiff`, `.tif`, `.gif`, `.webp` - -### ZIP 压缩包 -- **ZIP 文档**: `.zip` - 支持包含 Markdown 文件和图片的压缩包 - - 自动提取和处理 ZIP 包中的 `.md` 文件 - - 自动处理 ZIP 包中的图片文件并上传到对象存储(MINIO) - - 图片链接会自动替换为可访问的 URL - - 优先处理名为 `full.md` 的文件,否则使用第一个 `.md` 文件 - - 支持图片目录的智能识别(`images/`、`../images/` 等) - -::: tip 图片显示 -文档中的图片会自动上传到对象存储并替换为可访问的 URL。但是如果想要在外部正常显示图片,需要配置 `HOST_IP` 环境变量,将其设置为您的服务器 IP 地址。 -::: - -## 快速配置 - -### 1. 基础 OCR (RapidOCR) - -```bash -# 下载模型 -hf download SWHL/RapidOCR --local-dir ./models/SWHL/RapidOCR - -# 启动服务 -docker compose up -d api -``` - -需要确保 `MODEL_DIR` 环境变量指向 RapidOCR 上层目录,例如 `./models`。 - -### 2. 高精度 OCR (MinerU) - -需要在 `.env` 文件中配置: - -```bash -MINERU_VL_SERVER=http://localhost:30000 # 对应 docker compose 中的 mineru-vllm-server 服务 -MINERU_API_URI=http://localhost:30001 # 对应 docker compose 中的 mineru-api 服务 -``` - -然后启动相关服务 - -```bash -# 需要 GPU,启动 MinerU 服务 -docker compose up mineru-vllm-server mineru-api -d - -# 启动主服务 -docker compose up api -d -``` - -::: tip 处理超时 -文档解析超时时间默认 600 秒,可通过 `MINERU_TIMEOUT` 环境变量调整。 -::: - - -### 3. 官方云服务 (MinerU Official) - -API 密钥可以从 [MinerU 官网](https://mineru.net) 申请。 - -然后在 `.env` 文件中添加 - -```bash -# 设置 API 密钥环境变量 -MINERU_API_KEY="your-api-key-here" -``` - -然后使用 `docker compose up api -d` 重启后端服务。 - -### 4. 结构化解析 (PaddleX) - -```bash -# 需要 GPU,启动 PaddleX 服务 -docker compose up -d paddlex - -# 启动主服务 -docker compose up -d api -``` - -## 处理器选择 - -| 处理器 | 适用场景 | 硬件要求 | 特点 | -|--------|----------|------------|------| -| **RapidOCR** | 基础文字识别 | CPU | 速度快,资源占用低 | -| **MinerU** | 复杂 PDF、表格、公式 | GPU | 精度高,版面分析好 | -| **MinerU Official** | 复杂文档解析(云服务) | 无特殊要求 | 官方云服务,开箱即用,有 API 配额 | -| **PaddleX** | 表格、票据、结构化文档 | GPU | 专业版面解析 | - -## 参数说明 - -### enable_ocr 选项 - -对应网页中的 `使用 OCR` 选项 - -- `disable`: 不启用 OCR(PDF 按文本提取,图片**必须选择 OCR 方式**) -- `onnx_rapid_ocr`: RapidOCR 处理 -- `mineru_ocr`: MinerU HTTP API 处理 -- `mineru_official`: MinerU 官方云服务 API 处理 -- `paddlex_ocr`: PaddleX 处理 - -### 注意事项 -- **图片文件必须启用 OCR**,否则无法提取内容 -- MinerU 和 PaddleX 需要 GPU 支持 -- MinerU Official 需要设置 `MINERU_API_KEY` 环境变量 -- RapidOCR 适合 CPU 环境和基础识别需求 diff --git a/docs/v0.4.0/advanced/misc.md b/docs/v0.4.0/advanced/misc.md deleted file mode 100644 index 422f16ac..00000000 --- a/docs/v0.4.0/advanced/misc.md +++ /dev/null @@ -1,53 +0,0 @@ -# 其他配置 - -## 内容安全 - -系统内置内容审查机制(默认是关闭状态),保障服务内容的合规性。目前配置了关键词过滤以及 LLM 对内容进行审查。管理员可在 `设置` → `基本设置` 页面中进行配置并选择安全模型。 - -检测流程为,接收到用户输入之后,就对用户的输入进行检测是否合规,同时在流式传输的过程中进行实时检测(仅关键词)。当流式输出结束之后,则开始检测整个内容。 -**注意**,使用 LLM 检测虽然可以大大缓解提示词注入带来的问题,但也会在用户交互上带来延迟影响,需要考虑是否启用。 - -对于关键词检测,敏感词词库位于 `backend/package/yuxi/config/static/bad_keywords.txt` 文件,每行一个关键词,实时生效,无需重启服务。 - -对于 LLM 检测,Prompt 可以看到 `backend/package/yuxi/plugins/guard.py`: - -<<< @/../backend/package/yuxi/plugins/guard.py#guard_prompt - -## 网页搜索 - -系统内置了基于 Tavily 的联网搜索能力,配置完成后,大模型会自动在需要时调用对应的工具,为回答提供实时网页信息。 - - -1. 前往 [Tavily 官网](https://app.tavily.com/) 注册并在控制台创建 API Key。 -2. 在项目根目录的 `.env`(或 `docker-compose.yml` 中的对应环境变量段)写入: - ```env - TAVILY_API_KEY=sk-xxxxxxxxxxxxxxxx - ``` -3. 重新加载服务使密钥生效,推荐执行: - ```bash - docker compose up -d api-dev web-dev - ``` - 若服务已运行,则使用 `docker compose restart api-dev` 即可。 - -完成以上步骤后,在智能体的工具配置区域即可看到这个工具,展示 Tavily 返回的实时结果。若需要关闭该能力,删除或清空 `TAVILY_API_KEY` 后再次重启服务即可。 - -## 服务端口 - -系统使用多个端口提供不同服务,以下是完整的端口映射: - -| 端口 | 服务 | 容器名称 | 说明 | -|------|------|----------|------| -| **5173** | Web 前端 | web-dev | 用户界面 | -| **5050** | API 后端 | api-dev | 核心服务 | -| **7474/7687** | Neo4j | graph | 图数据库 | -| **9000/9001** | MinIO | milvus-minio | 对象存储 | -| **19530/9091** | Milvus | milvus | 向量数据库 | -| **30000** | MinerU | mineru | PDF 解析(可选)| -| **8080** | PaddleX | paddlex-ocr | OCR 服务(可选)| -| **8081** | vLLM | - | 本地推理(可选)| - -::: tip 端口访问 -- Web 界面: `http://localhost:5173` -- API 文档: `http://localhost:5050/docs` -- Neo4j 管理: `http://localhost:7474` -::: diff --git a/docs/v0.4.0/intro/evaluation.md b/docs/v0.4.0/intro/evaluation.md deleted file mode 100644 index fa7e3850..00000000 --- a/docs/v0.4.0/intro/evaluation.md +++ /dev/null @@ -1,57 +0,0 @@ -# 知识库评估使用与开发指南 - -知识库评估功能用于测试 RAG 系统的检索和生成质量。通过预设的测试问题和标准答案(或自动生成评估),量化评估系统在不同场景下的表现。 - -**适用场景**:验证知识库上线前的效果、对比不同配置下的检索效果、定期监控知识库质量变化、调优检索参数。 - -**注意**:当前版本支持 Milvus 类型的知识库。 - -## 如何创建评估基准 - -### 1. 上传评估文件 - -准备 JSONL 格式的文件,每行一个测试样本: - -```json -{"query": "什么是人工智能?", "gold_chunk_ids": ["chunk_001", "chunk_002"], "gold_answer": "人工智能是计算机科学的一个分支"} -{"query": "机器学习的主要类型有哪些?", "gold_chunk_ids": ["chunk_005"], "gold_answer": "主要包括监督学习、无监督学习和强化学习"} -{"query": "深度学习的应用领域", "gold_chunk_ids": ["chunk_010", "chunk_011"]} -``` - -**字段说明**: -- `query`(必需):测试问题,用于触发 RAG 系统的检索 -- `gold_chunk_ids`(可选):相关文档块的 ID 列表,用于验证检索效果 -- `gold_answer`(可选):标准答案,用于验证生成效果 - -::: tip 数据集构建 -可以使用 [EasyDataset](https://github.com/ConardLi/easy-dataset) 从文档批量生成问答对、可视化编辑、导出多种格式和数据质量检查。挺好用的,推荐。注意导出的时候的字段需要修改为 `query`、`gold_answer`。 -::: - - -### 2. 自动生成评估基准 - -Yuxi 也实现了一个简易的、可以基于现有知识库自动生成测试数据。流程是:随机采样一个 chunk → 用嵌入模型找相似 chunk → 用 LLM 生成问题和答案。 - -**推荐参数设置**: -- 问题数量:10-50 个 -- 相似文档数:每个问题 2-5 个 - -## 运行评估任务 - -1. 选择评估基准后在知识库页面点击"评估"标签 - -2. 配置参数: - - **答案生成模型(可选)**:如果选择了,则会基于检索的 chunk 生成答案,然后用评判模型评估答案的准确性 - - **评判模型(可选)**:如果选择了,则会用评判模型评估答案的准确性,判断是否与标准答案一致,因此选择评判模型时,必须选择答案生成模型。 - -3. 点击"开始评估": -系统会逐个处理测试问题,执行检索和生成,计算各项指标。评估在后台运行,可以继续其他操作。 - -**主要指标**: - -| 指标 | 含义 | 如何看待 | -|------|------|----------| -| Recall@1 | 第一个结果包含正确文档的比例 | 最重要的指标,反映用户第一眼看到的准确率 | -| Recall@5 | 前5个结果包含正确文档的比例 | 综合检索效果,应该大于 0.8 | -| F1@K | 精确率和召回率的调和平均 | 平衡指标,用于对比不同配置 | -| 答案准确性 | 生成答案是否与标准答案一致 | 检查 LLM 理解和表达能力 | diff --git a/docs/v0.4.0/intro/knowledge-base.md b/docs/v0.4.0/intro/knowledge-base.md deleted file mode 100644 index b9bb10b7..00000000 --- a/docs/v0.4.0/intro/knowledge-base.md +++ /dev/null @@ -1,117 +0,0 @@ -# 知识库与知识图谱 - -项目中的知识库与知识图谱,即是知识管理组织的方式,同时会被封装为工具供 AgenticRAG 系统调用。 - -## 创建知识库 - -系统支持多种知识库存储形式,满足不同场景需求: - -| 存储类型 | 特点 | 适用场景 | -|----------|------|----------| -| **Chroma** | 轻量级向量数据库 | 已弃用,建议使用 Milvus | -| **Milvus** | 高性能向量数据库 | 大规模生产环境、高性能查询 | -| **LightRAG** | 图增强检索 | 复杂知识关系,构建成本较高 | - -访问 Web 界面:`http://localhost:5173`,进入"知识库管理"页面,点击"新建知识库",填写知识库信息。 - -这里需要**注意**的是,这里的知识库的标题和描述都会作为智能体选择工具的依据,因此尽量详尽的描述该知识库。 - - -### LightRAG 知识库说明 - -在本项目中,系统支持基于 [LightRAG](https://github.com/HKUDS/LightRAG) 的知识图谱自动构建,能够从文档中自动提取实体和关系,构建结构化知识图谱。 - -**LightRAG 图谱 vs 全局知识图谱的区别:** - -- **LightRAG 图谱**(知识库专属):针对单个知识库由 LightRAG 自动抽取实体/关系,用于该库内的图增强检索与可视化。通过特殊的 label(知识库ID)与全局图谱区分,不会混入全局数据。 - -- **全局知识图谱**(系统级):通过三元组文件上传的图谱数据,提供系统级的知识图谱查询和可视化能力,会作为工具供 LLM 使用。 - -两者共享同一个 Neo4j 实例,但完全隔离,互不影响。 - -LightRAG 知识库可在知识库详情、知识图谱中可视化。由于免费版的 neo4j 只能创建一个图数据库,因此实际上 LightRAG 的节点和边依然是和知识图谱本身构建在了同一个 Neo4j 数据库中,但是使用了特殊的 label `{知识库ID}` 做区分。 - -同时项目支持原 LightRAG 的所有环境变量,只需要在项目的 `.env` 文件中配置即可。比如当本地计算资源有限时,可以配置 `EMBEDDING_TIMEOUT=60`, `LLM_TIMEOUT=180` 增加超时时间。 - -## 文档管理 - -本系统的“上传 → 解析入库 → 检索/可视化”流程既可通过 Web 界面完成,也可使用 API/脚本批量处理。详见[文档解析](../advanced/document-processing.md) - -接口查询:`GET /api/knowledge/files/supported-types` - -**上传与入库** - -1) 上传文件(返回服务端保存路径) -- `POST /api/knowledge/files/upload?db_id=<可选>` -- 成功返回:`file_path`(后续入库使用)、`content_hash`(内容去重) - -2) 解析并入库(异步任务) -- `POST /api/knowledge/databases/{db_id}/documents` -- 返回:`status=queued` 与 `task_id`,可在任务中心查看进度 - -去重策略:系统按“内容哈希”判断是否已存在相同文件,避免重复入库。 - -## 知识图谱 - -本项目存在两类“图谱相关”能力: - -- 上传的知识图谱(Neo4j):提供三元组检索和系统级可视化。会作为工具供 LLM 使用。 -- LightRAG 知识库内图谱:针对某个知识库由 LightRAG 自动抽取实体/关系,用于该库内的图增强检索与可视化;与上传的图谱共享同一 Neo4j 实例,但通过特殊 label 区分,不作为全局图谱使用。 - - -### 1. 以三元组形式导入 - -系统支持通过网页导入 `jsonl` 格式的知识图谱数据,支持**简单三元组**和**带属性三元组**两种格式。 - -**简单格式(兼容旧版)**: - -```jsonl -{"h": "北京", "t": "中国", "r": "首都"} -{"h": "上海", "t": "中国", "r": "直辖市"} -``` - -**扩展格式(支持属性)**: - -支持 `h`(头节点)、`t`(尾节点)和 `r`(关系)为对象结构,其中: -- 节点对象必须包含 `name` 字段。 -- 关系对象必须包含 `type` 字段。 -- 其他字段将作为**属性**存储在 Neo4j 中。 - -```jsonl -{"h": {"name": "孙悟空", "title": "齐天大圣", "weapon": "如意金箍棒"}, "t": {"name": "唐僧", "species": "人"}, "r": {"type": "徒弟", "order": 1}} -{"h": "猪八戒", "t": {"name": "唐僧"}, "r": {"type": "徒弟", "order": 2}} -``` - -**格式说明**: -- 每行一个数据项。 -- 系统自动验证数据格式,并自动导入到 Neo4j 数据库。 -- 自动添加 `Upload`、`Entity` 标签(节点)和 `RELATION` 类型(关系)。 -- 自动处理重复实体和关系,并合并属性。 - -Neo4j 访问信息可以参考 `docker-compose.yml` 中配置对应的环境变量来覆盖。 - -- **默认账户**: `neo4j` -- **默认密码**: `0123456789` -- **管理界面**: `http://localhost:7474` -- **连接地址**: bolt://localhost:7687 - -::: tip 测试数据 -可以使用以下文件进行测试导入: -- 简单格式:`test/data/A_Dream_of_Red_Mansions_tiny.jsonl` -- 扩展属性格式:`test/data/complex_graph_test.jsonl` -::: - -### 2. 接入已有 Neo4j 实例 - -如需接入已有的 Neo4j 实例,可修改 `.env` 中的配置: - -<<< @/../.env.template#neo4j{bash} - -同时记得注释掉下面的 neo4j 服务: - -<<< @/../docker-compose.yml#neo4j - - -::: warning 注意事项 -确保每个节点都有 `Entity` 标签,每个关系都有 `RELATION` 类型,否则会影响图的检索与构建功能。 -::: diff --git a/docs/v0.4.0/intro/model-config.md b/docs/v0.4.0/intro/model-config.md deleted file mode 100644 index 867ebd7b..00000000 --- a/docs/v0.4.0/intro/model-config.md +++ /dev/null @@ -1,227 +0,0 @@ -# 模型配置 - -## 对话模型 - -系统支持多种大语言模型服务商,通过配置对应的 API 密钥即可使用: - -| 服务商 | 环境变量 | 特点 | -| ------------------------------------------------ | ----------------------- | --------------------- | -| [硅基流动](https://cloud.siliconflow.cn/i/Eo5yTHGJ) | `SILICONFLOW_API_KEY` | 🆓 免费额度,默认推荐 | -| OpenAI | `OPENAI_API_KEY` | GPT 系列模型 | -| DeepSeek | `DEEPSEEK_API_KEY` | 国产大模型 | -| OpenRouter | `OPENROUTER_API_KEY` | 多模型聚合平台 | -| 智谱清言 | `ZHIPUAI_API_KEY` | GLM 系列模型 | -| 阿里云百炼 | `DASHSCOPE_API_KEY` | 通义千问系列 | - -其余还支持火山豆包、Together、vLLM、Ollama 等。 - -### 配置方法 - -在 `.env` 文件中添加对应的环境变量: - - - -::: tip 免费获取 API Key -[硅基流动](https://cloud.siliconflow.cn/i/Eo5yTHGJ) 注册即送 14 元额度,支持多种开源模型。 -::: - -<<< @/../.env.template#model_provider{bash 5} - -### 默认对话模型格式 - -系统的默认对话模型可以在设置页面配置,也可以通过配置项 `default_model` 指定,格式统一为 `模型提供商/模型名称`,例如: - -```yaml -default_model: siliconflow/deepseek-ai/DeepSeek-V3.2 -``` - -## 自定义模型供应商 - -::: tip 配置系统升级 (v0.3.x) -从 `v0.3.x` 版本开始,模型配置系统已升级为基于 Pydantic BaseModel 的类型安全配置,支持 TOML 格式的用户配置文件。 - -- **默认配置**: `backend/package/yuxi/config/static/models.py` (Python 代码) -- **用户配置**: `saves/config/base.toml` (TOML 格式,仅保存用户修改) -- **自定义供应商**: `saves/config/custom_providers.toml` (独立配置文件) - ::: - -系统提供了完整的自定义供应商管理功能,支持通过 Web 界面直接添加、编辑、测试和删除自定义模型供应商。 - -### 使用方法 - -系统支持任何 OpenAI 兼容的云服务提供商 - -#### 1. Web 界面操作(推荐) - -访问 **系统设置 > 模型配置**,在"自定义供应商"部分点击 **添加自定义供应商**。这里的密钥可以直接填写也可以填写对应的环境变量名称。 - -#### 2. 配置文件操作 - -如需通过配置文件管理,编辑 `saves/config/custom_providers.toml`: - -```toml -[model_names.local-vllm] -name = "本地 vLLM 服务" -url = "https://docs.vllm.ai" -base_url = "http://localhost:8000/v1" -default = "Qwen/Qwen2.5-7B-Instruct" -env = "LOCAL_VLLM_API_KEY" -models = [ - "Qwen/Qwen2.5-7B-Instruct", - "Qwen/Qwen2.5-14B-Instruct", -] -custom = true - -[model_names.local-ollama] -name = "本地 Ollama" -url = "https://ollama.com" -base_url = "http://localhost:11434/v1" -default = "llama3.2" -env = "NO_API_KEY" -models = ["llama3.2", "qwen2.5"] -custom = true -``` - -然后在 `.env` 文件中添加对应的环境变量: - -```env -LOCAL_VLLM_API_KEY=your_api_key_here -``` - -### API 端点 - -系统提供以下 API 端点管理自定义供应商: - -- `GET /api/system/custom-providers` - 获取所有自定义供应商 -- `POST /api/system/custom-providers` - 添加自定义供应商 -- `PUT /api/system/custom-providers/{provider_id}` - 更新自定义供应商 -- `DELETE /api/system/custom-providers/{provider_id}` - 删除自定义供应商 -- `POST /api/system/custom-providers/{provider_id}/test` - 测试供应商连接 - -### 常见配置示例 - -#### vLLM 本地服务 - -```toml -[model_names.vllm-local] -name = "vLLM 本地服务" -base_url = "http://localhost:8000/v1" -default = "Qwen/Qwen2.5-7B-Instruct" -env = "NO_API_KEY" -models = [ - "Qwen/Qwen2.5-7B-Instruct", - "Qwen/Qwen2.5-14B-Instruct", - "meta-llama/Llama-3.1-8B-Instruct" -] -``` - -#### Ollama 本地服务 - -```toml -[model_names.ollama-local] -name = "Ollama 本地服务" -base_url = "http://localhost:11434/v1" -default = "llama3.2" -env = "NO_API_KEY" -models = [ - "llama3.2:latest", - "qwen2.5:latest", - "codellama:latest" -] -``` - -#### 第三方 API 中转服务 - -```toml -[model_names.api-proxy] -name = "API 中转服务" -base_url = "https://api-proxy.example.com/v1" -default = "gpt-3.5-turbo" -env = "API_PROXY_KEY" -models = [ - "gpt-3.5-turbo", - "gpt-4", - "claude-3-sonnet" -] -``` - -### 故障排除 - -1. **测试连接失败**: 检查 API 地址格式和 API 密钥配置 -2. **模型不可用**: 确认模型名称拼写和服务端是否支持该模型 -3. **权限错误**: 确保用户具有管理员权限 -4. **配置未生效**: 检查环境变量配置和服务重启状态 - -## 嵌入模型和重排序模型 - -#### 1. 配置模型信息 - -在 `backend/package/yuxi/config/static/models.py` 中的默认配置部分添加: - -```python -# 默认嵌入模型配置 -DEFAULT_EMBED_MODELS: dict[str, EmbedModelInfo] = { - # ... 现有配置 ... - - "vllm/Qwen/Qwen3-Embedding-0.6B": EmbedModelInfo( - name="Qwen/Qwen3-Embedding-0.6B", - dimension=1024, - base_url="http://localhost:8000/v1/embeddings", - api_key="no_api_key", - ), -} - -# 默认重排序模型配置 -DEFAULT_RERANKERS: dict[str, RerankerInfo] = { - # ... 现有配置 ... - - "vllm/BAAI/bge-reranker-v2-m3": RerankerInfo( - name="BAAI/bge-reranker-v2-m3", - base_url="http://localhost:8000/v1/rerank", - api_key="no_api_key", - ), -} -``` - -#### 2. 动态配置(可选) - -你也可以通过代码动态添加本地模型: - -```python -from yuxi.config import config -from yuxi.config.static.models import EmbedModelInfo, RerankerInfo - -# 添加本地嵌入模型 -config.embed_model_names["local/embed-model"] = EmbedModelInfo( - name="local-embed-model", - dimension=1024, - base_url="http://localhost:8000/v1/embeddings", - api_key="no_api_key", -) - -# 添加本地重排序模型 -config.reranker_names["local/reranker-model"] = RerankerInfo( - name="local-reranker-model", - base_url="http://localhost:8000/v1/rerank", - api_key="no_api_key", -) - -# 保存配置 -config.save() -``` - -#### 3. 启动模型服务 - -```bash -# 启动嵌入模型 -vllm serve Qwen/Qwen3-Embedding-0.6B \ - --task embed \ - --dtype auto \ - --port 8000 - -# 启动重排序模型 -vllm serve BAAI/bge-reranker-v2-m3 \ - --task score \ - --dtype fp16 \ - --port 8000 -``` diff --git a/docs/v0.4.0/intro/project-overview.md b/docs/v0.4.0/intro/project-overview.md deleted file mode 100644 index 494c3b17..00000000 --- a/docs/v0.4.0/intro/project-overview.md +++ /dev/null @@ -1,24 +0,0 @@ -# 项目简介 - -Yuxi-Know(语析)是一个基于知识图谱和向量数据库的智能知识库系统,融合了 RAG(检索增强生成)技术与知识图谱技术,为用户提供智能问答和知识管理服务。 - -**特点**:技术栈简单,易于上手,使用 MIT 开源协议,非常适合二次开发使用。 - -### 技术栈选择 - -- **后端服务**: [FastAPI](https://github.com/tiangolo/fastapi) + Python 3.12+ -- **前端界面**: [Vue.js 3](https://github.com/vuejs/vue) + [Ant Design Vue](https://github.com/vueComponent/ant-design-vue) -- **数据库存储**: [SQLite](https://github.com/sqlite/sqlite) + [MinIO](https://github.com/minio/minio) -- **知识存储**: [Milvus](https://github.com/milvus-io/milvus)、[Chroma](https://github.com/chroma-core/chroma)(向量数据库)+ [Neo4j](https://github.com/neo4j/neo4j)(图数据库) -- **智能体框架**: [LangGraph](https://github.com/langchain-ai/langgraph) -- **文档解析**: [LightRAG](https://github.com/HKUDS/LightRAG) + [MinerU](https://github.com/HKUDS/MinerU) + [PP-Structure-V3](https://github.com/PaddlePaddle/PaddleOCR) -- **容器编排**: [Docker Compose](https://github.com/docker/compose) - -### 核心功能 - -- **智能问答**: 支持多种大语言模型,提供智能对话和问答服务 -- **知识库管理**: 支持多种存储形式(Chroma、Milvus、LightRAG) -- **知识图谱**: 自动构建和可视化知识图谱,支持图查询 -- **文档解析**: 支持 PDF、Word、图片等多种格式的智能解析 -- **权限管理**: 三级权限体系(超级管理员、管理员、普通用户) -- **内容安全**: 内置内容审查机制,保障服务合规性 diff --git a/docs/v0.4.0/intro/quick-start.md b/docs/v0.4.0/intro/quick-start.md deleted file mode 100644 index 326ad268..00000000 --- a/docs/v0.4.0/intro/quick-start.md +++ /dev/null @@ -1,178 +0,0 @@ -# 快速开始指南 - -::: tip 提示 -除了此文档网站外,用户还可以在 [Zread](https://zread.ai/xerrors/Yuxi-Know) 或 [DeepWiki](https://deepwiki.com/xerrors/Yuxi-Know) 平台查看自动生成的详细项目文档。 -::: - - -## 快速开始 - - -### 安装步骤 - -项目采用微服务架构,核心服务无需 GPU 支持。GPU 仅用于可选的 OCR 服务和本地模型推理,可通过环境变量配置外部服务。 - -#### 1. 获取项目代码 - -```bash -# 克隆稳定版本 -git clone --branch v0.4.0 --depth 1 https://github.com/xerrors/Yuxi-Know.git -cd Yuxi-Know -``` - -::: warning 版本说明 -- `v0.4.0`: 稳定版本 -- `main`: 最新开发版本(不稳定,新特性可能会导致新 bug) -::: - -#### 2. 项目启动 - -**方法 1**:使用 init 脚本(推荐) - -我们提供了自动化的初始化脚本,可以帮您完成环境配置和 Docker 镜像拉取: - -```bash -# Linux/macOS -./scripts/init.sh - -# Windows PowerShell -.\scripts\init.ps1 -``` - -脚本会: -- 检查并创建 `.env` 文件 -- 提示您输入 `SILICONFLOW_API_KEY`(必需) -- 提示您输入 `TAVILY_API_KEY`(可选,用于搜索服务) -- 自动拉取所有必需的 Docker 镜像 - -::: tip API Key 获取 -- [硅基流动](https://cloud.siliconflow.cn/i/Eo5yTHGJ) 注册即送 14 元额度 -- [Tavily](https://app.tavily.com/) 获取搜索服务 API Key(可选) -::: - -**方法 2**:手动配置环境变量 - -复制环境变量模板并编辑: - -```bash -cp .env.template .env -``` - -编辑 `.env` 文件,配置必需的 API 密钥,这里强烈建议先使用硅基流动的 API 和模型(DeepSeek)验证平台的功能无误后,再尝试切换到自己的模型: - - -<<< @/../.env.template#model_provider{bash 5} - - -::: tip 免费获取 API Key -[硅基流动](https://cloud.siliconflow.cn/i/Eo5yTHGJ) 注册即送 14 元额度,支持多种开源模型。 -::: - -#### 3. 启动服务 - -```bash -# 构建并启动所有服务 -docker compose up --build - -# 后台运行(推荐) -docker compose up --build -d -``` - -#### 4. 访问系统 - -服务启动完成后,访问以下地址: - -- **Web 界面**: `http://localhost:5173` -- **API 文档**: `http://localhost:5050/docs` - -#### 5. 停止服务 - -```bash -docker compose down -``` - -## 对话 - -项目第一次启动后,会要求填写超级管理员账号和密码,请确保填写正确。 - -然后在智能体页面可以进行对话,在右侧可以配置提示词、模型、工具等参数。 - -![agent.png](/images/agent.png) - - - -## 故障排除 - -#### 查看服务状态 - -```bash -# 查看所有容器状态 -docker ps - -# 查看后端服务日志 -docker logs api-dev -f - -# 查看前端服务日志 -docker logs web-dev -f -``` - -#### 常见问题 - -
-Docker 镜像拉取失败 - -如果拉取镜像失败,可以尝试手动拉取: - -```bash -# Linux/macOS -bash docker/pull_image.sh python:3.12-slim - -# Windows PowerShell -powershell -ExecutionPolicy Bypass -File docker/pull_image.ps1 python:3.12-slim -``` - -**离线镜像拉取方案**: - -```bash -# 在有网络的环境保存镜像(镜像名称需要确认是否和实际一致) -bash docker/save_docker_images.sh # Linux/macOS -powershell -ExecutionPolicy Bypass -File docker/save_docker_images.ps1 # Windows - -# 传输到目标设备 -scp docker_images_xxx.tar @: - -# 在目标设备加载镜像 -docker load -i docker_images_xxx.tar -``` - -
- -
-构建失败 - -如果构建失败,通常是网络问题,可以配置代理: - -```bash -# Linux / macOS -export HTTP_PROXY=http://IP:PORT -export HTTPS_PROXY=http://IP:PORT - -# Windows PowerShell -$env:HTTP_PROXY="http://IP:PORT" -$env:HTTPS_PROXY="http://IP:PORT" -``` - -如果已配置代理但构建失败,尝试移除代理后重试。 - -
- -
-Milvus 启动失败 - -```bash -# 重启 Milvus 服务 -docker compose up milvus -d -docker restart api-dev -``` - -
diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4536b291..00000000 --- a/package-lock.json +++ /dev/null @@ -1,2344 +0,0 @@ -{ - "name": "Yuxi", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "markdown-it-task-checkbox": "^1.0.6", - "vitepress": "^1.6.4" - } - }, - "node_modules/@algolia/abtesting": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.6.0.tgz", - "integrity": "sha512-c4M/Z/KWkEG+RHpZsWKDTTlApXu3fe4vlABNcpankWBhdMe4oPZ/r4JxEr2zKUP6K+BT66tnp8UbHmgOd/vvqQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/autocomplete-core": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", - "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", - "@algolia/autocomplete-shared": "1.17.7" - } - }, - "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", - "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "search-insights": ">= 1 < 3" - } - }, - "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", - "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-shared": "1.17.7" - }, - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/autocomplete-shared": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", - "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", - "license": "MIT", - "peerDependencies": { - "@algolia/client-search": ">= 4.9.1 < 6", - "algoliasearch": ">= 4.9.1 < 6" - } - }, - "node_modules/@algolia/client-abtesting": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.40.0.tgz", - "integrity": "sha512-qegVlgHtmiS8m9nEsuKUVhlw1FHsIshtt5nhNnA6EYz3g+tm9+xkVZZMzkrMLPP7kpoheHJZAwz2MYnHtwFa9A==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-analytics": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.40.0.tgz", - "integrity": "sha512-Dw2c+6KGkw7mucnnxPyyMsIGEY8+hqv6oB+viYB612OMM3l8aNaWToBZMnNvXsyP+fArwq7XGR+k3boPZyV53A==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-common": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.40.0.tgz", - "integrity": "sha512-dbE4+MJIDsTghG3hUYWBq7THhaAmqNqvW9g2vzwPf5edU4IRmuYpKtY3MMotes8/wdTasWG07XoaVhplJBlvdg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-insights": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.40.0.tgz", - "integrity": "sha512-SH6zlROyGUCDDWg71DlCnbbZ/zEHYPZC8k901EAaBVhvY43Ju8Wa6LAcMPC4tahcDBgkG2poBy8nJZXvwEWAlQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-personalization": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.40.0.tgz", - "integrity": "sha512-EgHjJEEf7CbUL9gJHI1ULmAtAFeym2cFNSAi1uwHelWgLPcnLjYW2opruPxigOV7NcetkGu+t2pcWOWmZFuvKQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-query-suggestions": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.40.0.tgz", - "integrity": "sha512-HvE1jtCag95DR41tDh7cGwrMk4X0aQXPOBIhZRmsBPolMeqRJz0kvfVw8VCKvA1uuoAkjFfTG0X0IZED+rKXoA==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/client-search": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.40.0.tgz", - "integrity": "sha512-nlr/MMgoLNUHcfWC5Ns2ENrzKx9x51orPc6wJ8Ignv1DsrUmKm0LUih+Tj3J+kxYofzqQIQRU495d4xn3ozMbg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/ingestion": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.40.0.tgz", - "integrity": "sha512-OfHnhE+P0f+p3i90Kmshf9Epgesw5oPV1IEUOY4Mq1HV7cQk16gvklVN1EaY/T9sVavl+Vc3g4ojlfpIwZFA4g==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/monitoring": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.40.0.tgz", - "integrity": "sha512-SWANV32PTKhBYvwKozeWP9HOnVabOixAuPdFFGoqtysTkkwutrtGI/rrh80tvG+BnQAmZX0vUmD/RqFZVfr/Yg==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/recommend": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.40.0.tgz", - "integrity": "sha512-1Qxy9I5bSb3mrhPk809DllMa561zl5hLsMR6YhIqNkqQ0OyXXQokvJ2zApSxvd39veRZZnhN+oGe+XNoNwLgkw==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-browser-xhr": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.40.0.tgz", - "integrity": "sha512-MGt94rdHfkrVjfN/KwUfWcnaeohYbWGINrPs96f5J7ZyRYpVLF+VtPQ2FmcddFvK4gnKXSu8BAi81hiIhUpm3w==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-fetch": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.40.0.tgz", - "integrity": "sha512-wXQ05JZZ10Dr642QVAkAZ4ZZlU+lh5r6dIBGmm9WElz+1EaQ6BNYtEOTV6pkXuFYsZpeJA89JpDOiwBOP9j24w==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@algolia/requester-node-http": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.40.0.tgz", - "integrity": "sha512-5qCRoySnzpbQVg2IPLGFCm4LF75pToxI5tdjOYgUMNL/um91aJ4dH3SVdBEuFlVsalxl8mh3bWPgkUmv6NpJiQ==", - "license": "MIT", - "dependencies": { - "@algolia/client-common": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.4" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@docsearch/css": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", - "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", - "license": "MIT" - }, - "node_modules/@docsearch/js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", - "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", - "license": "MIT", - "dependencies": { - "@docsearch/react": "3.8.2", - "preact": "^10.0.0" - } - }, - "node_modules/@docsearch/react": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", - "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", - "license": "MIT", - "dependencies": { - "@algolia/autocomplete-core": "1.17.7", - "@algolia/autocomplete-preset-algolia": "1.17.7", - "@docsearch/css": "3.8.2", - "algoliasearch": "^5.14.2" - }, - "peerDependencies": { - "@types/react": ">= 16.8.0 < 19.0.0", - "react": ">= 16.8.0 < 19.0.0", - "react-dom": ">= 16.8.0 < 19.0.0", - "search-insights": ">= 1 < 3" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "search-insights": { - "optional": true - } - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@iconify-json/simple-icons": { - "version": "1.2.54", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.54.tgz", - "integrity": "sha512-OQQYl8yC5j3QklZOYnK31QYe5h47IhyCoxSLd53f0e0nA4dgi8VOZS30SgSAbsecQ+S0xlGJMjXIHTIqZ+ML3w==", - "license": "CC0-1.0", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", - "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", - "license": "MIT", - "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" - } - }, - "node_modules/@shikijs/engine-javascript": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", - "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" - } - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/@shikijs/langs": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", - "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/@shikijs/themes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", - "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", - "license": "MIT", - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/@shikijs/transformers": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", - "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/types": "2.5.0" - } - }, - "node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", - "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.4", - "@vue/shared": "3.5.22", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", - "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.22", - "@vue/shared": "3.5.22" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", - "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.4", - "@vue/compiler-core": "3.5.22", - "@vue/compiler-dom": "3.5.22", - "@vue/compiler-ssr": "3.5.22", - "@vue/shared": "3.5.22", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.19", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", - "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.22", - "@vue/shared": "3.5.22" - } - }, - "node_modules/@vue/devtools-api": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", - "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", - "license": "MIT", - "dependencies": { - "@vue/devtools-kit": "^7.7.7" - } - }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", - "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", - "license": "MIT", - "dependencies": { - "@vue/devtools-shared": "^7.7.7", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", - "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", - "license": "MIT", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", - "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.22" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", - "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.22", - "@vue/shared": "3.5.22" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", - "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.22", - "@vue/runtime-core": "3.5.22", - "@vue/shared": "3.5.22", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", - "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.22", - "@vue/shared": "3.5.22" - }, - "peerDependencies": { - "vue": "3.5.22" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", - "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", - "license": "MIT" - }, - "node_modules/@vueuse/core": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", - "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", - "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", - "license": "MIT", - "dependencies": { - "@vueuse/core": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" - }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", - "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", - "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", - "license": "MIT", - "dependencies": { - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/algoliasearch": { - "version": "5.40.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.40.0.tgz", - "integrity": "sha512-a9aIL2E3Z7uYUPMCmjMFFd5MWhn+ccTubEvnMy7rOTZCB62dXBJtz0R5BZ/TPuX3R9ocBsgWuAbGWQ+Ph4Fmlg==", - "license": "MIT", - "dependencies": { - "@algolia/abtesting": "1.6.0", - "@algolia/client-abtesting": "5.40.0", - "@algolia/client-analytics": "5.40.0", - "@algolia/client-common": "5.40.0", - "@algolia/client-insights": "5.40.0", - "@algolia/client-personalization": "5.40.0", - "@algolia/client-query-suggestions": "5.40.0", - "@algolia/client-search": "5.40.0", - "@algolia/ingestion": "1.40.0", - "@algolia/monitoring": "1.40.0", - "@algolia/recommend": "5.40.0", - "@algolia/requester-browser-xhr": "5.40.0", - "@algolia/requester-fetch": "5.40.0", - "@algolia/requester-node-http": "5.40.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/birpc": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", - "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "license": "MIT", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/emoji-regex-xs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "license": "MIT" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/focus-trap": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", - "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", - "license": "MIT", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "license": "MIT" - }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/magic-string": { - "version": "0.30.19", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", - "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/mark.js": { - "version": "8.11.1", - "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", - "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "license": "MIT" - }, - "node_modules/markdown-it-task-checkbox": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/markdown-it-task-checkbox/-/markdown-it-task-checkbox-1.0.6.tgz", - "integrity": "sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw==", - "license": "ISC" - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "license": "MIT" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/oniguruma-to-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", - "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", - "license": "MIT", - "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/preact": { - "version": "10.28.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", - "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", - "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "license": "MIT", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", - "license": "MIT" - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "license": "MIT" - }, - "node_modules/rollup": { - "version": "4.59.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.59.0", - "@rollup/rollup-android-arm64": "4.59.0", - "@rollup/rollup-darwin-arm64": "4.59.0", - "@rollup/rollup-darwin-x64": "4.59.0", - "@rollup/rollup-freebsd-arm64": "4.59.0", - "@rollup/rollup-freebsd-x64": "4.59.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", - "@rollup/rollup-linux-arm-musleabihf": "4.59.0", - "@rollup/rollup-linux-arm64-gnu": "4.59.0", - "@rollup/rollup-linux-arm64-musl": "4.59.0", - "@rollup/rollup-linux-loong64-gnu": "4.59.0", - "@rollup/rollup-linux-loong64-musl": "4.59.0", - "@rollup/rollup-linux-ppc64-gnu": "4.59.0", - "@rollup/rollup-linux-ppc64-musl": "4.59.0", - "@rollup/rollup-linux-riscv64-gnu": "4.59.0", - "@rollup/rollup-linux-riscv64-musl": "4.59.0", - "@rollup/rollup-linux-s390x-gnu": "4.59.0", - "@rollup/rollup-linux-x64-gnu": "4.59.0", - "@rollup/rollup-linux-x64-musl": "4.59.0", - "@rollup/rollup-openbsd-x64": "4.59.0", - "@rollup/rollup-openharmony-arm64": "4.59.0", - "@rollup/rollup-win32-arm64-msvc": "4.59.0", - "@rollup/rollup-win32-ia32-msvc": "4.59.0", - "@rollup/rollup-win32-x64-gnu": "4.59.0", - "@rollup/rollup-win32-x64-msvc": "4.59.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", - "license": "MIT", - "peer": true - }, - "node_modules/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", - "license": "MIT", - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/langs": "2.5.0", - "@shikijs/themes": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/superjson": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", - "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", - "license": "MIT", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.20", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz", - "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vitepress": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", - "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", - "license": "MIT", - "dependencies": { - "@docsearch/css": "3.8.2", - "@docsearch/js": "3.8.2", - "@iconify-json/simple-icons": "^1.2.21", - "@shikijs/core": "^2.1.0", - "@shikijs/transformers": "^2.1.0", - "@shikijs/types": "^2.1.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vue/devtools-api": "^7.7.0", - "@vue/shared": "^3.5.13", - "@vueuse/core": "^12.4.0", - "@vueuse/integrations": "^12.4.0", - "focus-trap": "^7.6.4", - "mark.js": "8.11.1", - "minisearch": "^7.1.1", - "shiki": "^2.1.0", - "vite": "^5.4.14", - "vue": "^3.5.13" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.5.22", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", - "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.22", - "@vue/compiler-sfc": "3.5.22", - "@vue/runtime-dom": "3.5.22", - "@vue/server-renderer": "3.5.22", - "@vue/shared": "3.5.22" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 728b593e..00000000 --- a/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "scripts": { - "docs:dev": "vitepress dev docs", - "docs:build": "vitepress build docs", - "docs:preview": "vitepress preview docs", - "docs:host": "vitepress dev docs --host" - }, - "dependencies": { - "markdown-it-task-checkbox": "^1.0.6", - "vitepress": "^1.6.4" - } -} diff --git a/scripts/init.ps1 b/scripts/init.ps1 index c3d79fb5..a9060e2f 100644 --- a/scripts/init.ps1 +++ b/scripts/init.ps1 @@ -68,13 +68,14 @@ $images = @( "nginx:alpine", "quay.io/coreos/etcd:v3.5.5", "postgres:16" + "redis:7-alpine" ) # Pull each image foreach ($image in $images) { Write-Host "🔄 Pulling ${image}..." -ForegroundColor Yellow try { - & docker/pull_image.ps1 $image + & scripts/pull_image.ps1 $image if ($LASTEXITCODE -eq 0) { Write-Host "✅ Successfully pulled ${image}" -ForegroundColor Green } else { diff --git a/docker/pull_image.ps1 b/scripts/pull_image.ps1 similarity index 100% rename from docker/pull_image.ps1 rename to scripts/pull_image.ps1 diff --git a/docker/pull_image.sh b/scripts/pull_image.sh similarity index 100% rename from docker/pull_image.sh rename to scripts/pull_image.sh