commit e5bf3bb195ec9d0e66db153d9b8691ec52a8cdb1 Author: xiaoxue Date: Mon May 25 00:32:15 2026 +0800 同步完整源码 - 2026-05-25 diff --git a/.claude/agents/typescript-any-fixer.md b/.claude/agents/typescript-any-fixer.md new file mode 100644 index 0000000..3c4b215 --- /dev/null +++ b/.claude/agents/typescript-any-fixer.md @@ -0,0 +1,41 @@ +--- +name: typescript-any-fixer +description: Use this agent when you need to identify and fix TypeScript 'any' type usage in your codebase. Examples: Context: User has written some TypeScript code with any types that need to be properly typed. user: "I just wrote this function but it uses 'any' types everywhere" assistant: "Let me use the typescript-any-fixer agent to analyze and fix the any type issues" Since the user has TypeScript code with any type issues, use the typescript-any-fixer agent to identify and provide proper type definitions. Context: User is reviewing code and wants to eliminate any types for better type safety. user: "Can you help me remove all the 'any' types from this code?" assistant: "I'll use the typescript-any-fixer agent to help eliminate the any types and provide proper TypeScript typing" The user specifically wants to fix any types, so use the typescript-any-fixer agent to provide type-safe alternatives. +tools: Bash, Glob, Grep, LS, Read, Edit, MultiEdit, Write, NotebookEdit, WebFetch, TodoWrite, WebSearch, BashOutput, KillBash +model: sonnet +color: green +--- + +You are a TypeScript type safety expert specializing in identifying and fixing 'any' type usage. Your mission is to help developers eliminate 'any' types and implement proper TypeScript typing for better code quality and type safety. + +When analyzing code, you will: + +1. **Identify any type usage**: Scan the provided code for explicit 'any' types, implicit any types, and type assertions that bypass type checking + +2. **Analyze context and intent**: Understand what the code is trying to accomplish to provide appropriate type definitions + +3. **Provide specific type solutions**: Offer concrete, well-typed alternatives including: + - Proper interface definitions + - Union types where appropriate + - Generic type parameters + - Utility types (Partial, Pick, Omit, etc.) + - Type guards for runtime type checking + +4. **Follow project conventions**: Consider the existing codebase patterns, especially from CLAUDE.md instructions: + - Use TypeScript's type system for type safety + - Leverage shared types from packages/shared/src/types.mts + - Utilize Zod schemas for validation when appropriate + - Maintain consistency with existing type definitions + +5. **Provide migration strategies**: When fixing complex any usage, offer step-by-step approaches for safe refactoring + +6. **Explain the benefits**: Clearly communicate why the proposed typing is better than using 'any' + +Your responses should include: +- Clear identification of problematic any usage +- Specific type definitions or interfaces +- Refactored code examples +- Explanation of type safety improvements +- Suggestions for preventing future any usage + +Always prioritize type safety while maintaining code readability and maintainability. When uncertain about the exact type, provide union types or generic constraints rather than falling back to 'any'. diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..6d63437 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,42 @@ +{ + "permissions": { + "allow": [ + "Bash(grep:*)", + "Bash(npx tsc:*)", + "Bash(find:*)", + "Bash(mkdir:*)", + "Bash(rm:*)", + "Bash(for:*)", + "Bash(do echo \"=== $file ===\")", + "Bash(done)", + "Bash(rg:*)", + "Bash(npm run type-check:*)", + "Bash(mv:*)", + "Bash(cat:*)", + "Bash(ls:*)", + "Bash(npm install:*)", + "Bash(npm run build:*)", + "Bash(sed:*)", + "Bash(npx jest:*)", + "Bash(npm run test:*)", + "Bash(npm test)", + "Bash(node:*)", + "Bash(npm run check:*)", + "Bash(npm run typecheck:*)", + "Bash(npm run:*)", + "Bash(git add:*)", + "Bash(kill:*)", + "Bash(ss:*)", + "Bash(ps:*)", + "mcp__ide__getDiagnostics", + "Bash(timeout:*)", + "Bash(cp:*)", + "Bash(tsx:*)", + "Bash(npm uninstall:*)", + "Bash(npm view:*)", + "Bash(npx --workspace=@dadigua/hyperchat tsc --noEmit)", + "Bash(npx tsx:*)" + ], + "deny": [] + } +} \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..3ab2e31 --- /dev/null +++ b/.env.example @@ -0,0 +1,51 @@ +# HyperChat Environment Configuration +# Copy this file to .env and modify as needed +# +# Priority order (low to high): +# 1. Default values (lowest) +# 2. System environment variables +# 3. Global ~/.hyperchat/.env +# 4. Workspace ./.hyperchat/.env (highest) + +# ================================ +# Environment Settings +# ================================ +NODE_ENV=development +HyperChat_MY_ENV=dev + +# ================================ +# Path Configuration +# ================================ +# Custom global application data directory (optional) +# If not set, defaults to ~/Documents/HyperChat +# HyperChat_AppDataDir=/custom/path/to/hyperchat + +# ================================ +# Service Configuration +# ================================ +HyperChat_HTTP_PORT=16100 +HyperChat_Web_Password=123456 + +# ================================ +# Interface Configuration +# ================================ +# HyperChat_Language=zh + +# ================================ +# AI API Configuration (Optional) +# ================================ +# These can be managed via workspace configuration or app settings +# Environment variables have highest priority and will override app settings +# +# Required for direct AI usage without app configuration: +# HyperChat_API_KEY=your_api_key_here +# HyperChat_API_URL=https://api.openai.com/v1 +# +# Optional (will use defaults if not specified): +# HyperChat_AI_Provider=openai +# HyperChat_AI_Model=gpt-4 + +# ================================ +# Development Settings +# ================================ +LOG_LEVEL=info \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..2816d5e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,47 @@ +name: 🐛Bug Report (English) +description: Create a report to help us improve +title: '[Bug]: ' +labels: ['bug'] +body: + - type: markdown + attributes: + value: | + Regarding the bug of the dialogue, click Settings, turn on the development mode, ![Download configuration](https://github.com/user-attachments/assets/7537941a-1e2d-41a8-abb6-2569fe040067), download the dialogue configuration and send it to me + + - type: dropdown + id: platform + attributes: + label: Platform + description: Which platform are you using? + options: + - Windows + - macOS + - Linux + - Node.js + - Docker + validations: + required: true + + - type: input + id: version + attributes: + label: Version + description: What version are you running? + placeholder: e.g., v1.5.0 + validations: + required: true + + - type: textarea + id: description + attributes: + label: Bug Description + description: Please describe the issue in as much detail as possible. If possible, provide screenshots or screen recordings to help us better understand the problem. + placeholder: Tell us what happened... (Remember to attach screenshots/recordings if applicable) + validations: + required: true + + - type: textarea + id: additional + attributes: + label: Additional Information + description: Anything that can give us more insight into the issue you are experiencing \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.zh.yml b/.github/ISSUE_TEMPLATE/bug_report.zh.yml new file mode 100644 index 0000000..3b1a3fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.zh.yml @@ -0,0 +1,48 @@ +name: 🐛错误报告 (中文) +description: 创建一个报告以帮助我们改进 +title: '[错误]: ' +labels: ['bug'] +body: + - type: markdown + attributes: + value: | + 关于对话的Bug,点击设置,开启开发模式,![下载配置](https://github.com/user-attachments/assets/7537941a-1e2d-41a8-abb6-2569fe040067),下载对话配置发给我 + + + - type: dropdown + id: platform + attributes: + label: 平台 + description: 您正在使用哪个平台? + options: + - Windows + - macOS + - Linux + - Node.js + - Docker + validations: + required: true + + - type: input + id: version + attributes: + label: 版本 + description: 您正在运行的版本是什么? + placeholder: 例如 v1.5.0 + validations: + required: true + + - type: textarea + id: description + attributes: + label: 错误描述 + description: 描述问题时请尽可能详细。请尽可能提供截图或屏幕录制,以帮助我们更好地理解问题。 + placeholder: 告诉我们发生了什么...(记得附上截图/录屏,如果适用) + validations: + required: true + + - type: textarea + id: additional + attributes: + label: 附加信息 + description: 任何能让我们对你所遇到的问题有更多了解的东西 diff --git a/.github/actions/setup-node-deps/action.yml b/.github/actions/setup-node-deps/action.yml new file mode 100644 index 0000000..5c2eec4 --- /dev/null +++ b/.github/actions/setup-node-deps/action.yml @@ -0,0 +1,109 @@ +name: 'Setup Node.js and Dependencies' +description: '安装 Node.js 和项目依赖,支持缓存优化' +inputs: + node-version: + description: 'Node.js 版本' + required: false + default: '20' + registry-url: + description: 'NPM registry URL' + required: false + default: 'https://registry.npmjs.org/' + install-global: + description: '要安装的全局依赖包 (如: "cross-env zx" 或 "cross-env zx tsx")' + required: false + default: 'cross-env zx tsx' + install-python-setuptools: + description: '是否在 macOS 上安装 python-setuptools' + required: false + default: 'false' + install-scripts: + description: '是否安装 scripts 目录下的依赖' + required: false + default: 'false' + +runs: + using: 'composite' + steps: + - name: Install Node.js + uses: actions/setup-node@v4.0.0 + with: + node-version: ${{ inputs.node-version }} + registry-url: ${{ inputs.registry-url }} + + - name: Install global dependencies + if: inputs.install-global != '' + shell: bash + run: npm install -g ${{ inputs.install-global }} + + # Windows 特定设置:避免长路径问题 + - name: Configure Windows npm settings + if: runner.os == 'Windows' + shell: bash + run: | + npm config set fund false + npm config set audit false + + - name: Install python-setuptools (macOS) + if: inputs.install-python-setuptools == 'true' && runner.os == 'macOS' + shell: bash + run: brew install python-setuptools + + # 缓存所有依赖(统一策略) + - name: Cache workspace dependencies + uses: actions/cache@v4 + id: cache-workspace-deps + with: + path: | + node_modules + scripts/node_modules + packages/shared/node_modules + packages/core/node_modules + packages/web/node_modules + packages/electron/node_modules + ~/.cache/electron + ~/.cache/electron-builder + ~/Library/Caches/electron + ~/Library/Caches/electron-builder + ~/AppData/Local/electron/Cache + ~/AppData/Local/electron-builder/Cache + key: ${{ runner.os }}-node-workspace-${{ hashFiles('package-lock.json', 'scripts/package-lock.json', 'packages/*/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-workspace- + + # 安装所有依赖 + - name: Install workspace dependencies + if: steps.cache-workspace-deps.outputs.cache-hit != 'true' + shell: bash + run: | + # 使用统一的安装参数 + INSTALL_FLAGS="--no-audit --no-fund" + + # Windows特殊处理:使用legacy-peer-deps避免依赖冲突 + if [ "${{ runner.os }}" = "Windows" ]; then + INSTALL_FLAGS="$INSTALL_FLAGS --legacy-peer-deps" + fi + + # 根目录安装时排除problematic native packages + if [ "${{ runner.os }}" = "Windows" ]; then + # Windows上先安装基础依赖,排除node-pty等原生包 + npm install $INSTALL_FLAGS --ignore-scripts + else + npm install $INSTALL_FLAGS + fi + if [ "${{ inputs.install-scripts }}" = "true" ]; then + (cd scripts && npm install $INSTALL_FLAGS) + fi + (cd packages/shared && npm install --include=optional $INSTALL_FLAGS) + (cd packages/web && npm install --include=optional $INSTALL_FLAGS && npm install favicons $INSTALL_FLAGS) + + # 根据平台处理包含原生依赖的包 + if [ "${{ runner.os }}" = "Windows" ]; then + # Windows上单独安装原生依赖包,避免工作区冲突 + (cd packages/core && npm install --include=optional $INSTALL_FLAGS --no-workspaces) + (cd packages/electron && npm install --include=optional $INSTALL_FLAGS --no-workspaces) + else + # 其他平台正常安装 + (cd packages/core && npm install --include=optional $INSTALL_FLAGS) + (cd packages/electron && npm install --include=optional $INSTALL_FLAGS) + fi \ No newline at end of file diff --git a/.github/instructions/ts.instructions.md b/.github/instructions/ts.instructions.md new file mode 100644 index 0000000..704a04d --- /dev/null +++ b/.github/instructions/ts.instructions.md @@ -0,0 +1,88 @@ +--- +applyTo: '**' +--- + +# 请回复中文 + +## typescript使用指南 +* import .mts 文件时,使用 import { xxx } from './xxx.mjs' 的方式导入。 + +## 项目概述 + +HyperChat 是一个多平台的 AI 聊天应用,该项目拥有完善的 MCP(模型上下文协议) 支持,并集成了包括 OpenAI、Claude、Gemini、Qwen、Deepseek 等在内的多种大语言模型 API。 + +* 核心是nodejs +* 支持web前端,通过浏览器访问,支持h5。 +* 支持electron,相当于自带了浏览器。 +* 支持命令行前端,类似Claude Code。只能聊天,配置通过web前端完成。 +* 支持vscode插件,通过webview访问构建。 + +packages/core 专注于 Node.js 相关的功能 +packages/core/src/shared 主要包含共享的代码和逻辑 +packages/electron 专门处理 Electron 桌面应用的需求。 +packages/web 专注于 Web 前端的实现 +packages/cli 专注于命令行前端的实现 + + +## 前后端通信 + +* 前后端通信默认通过 packages/core/src/command.mts 实现,前端通过调用 call 的方法来实现与后端的交互。 +* electron提供更多electron接口 packages/electron/src/command.mts, 前端通过调用 callElectron 的方法来实现与electron的交互。 + + +## 记忆 + +[x] 我现在要改造这个hyperchat项目,以前都用在web浏览器前端发出llm请求通过OpenAI的库。现在我想改成在code目录下(nodejs环境)中通过ai库发请求,代码在packages/core/src/shared/ai.mts 。前后端共用 +[ ] 正在添加工作区概念,支持在不同工作区之间隔离数据和配置如下,支持显示当前工具区文件夹(树状),agent等配置作为文件保存在.hyperchat目录下。 + +2.0 版本的 HyperChat 项目结构如下: + +``` +# 工作区如下 + +/projects/ + project1/ + .hyperchat/ + ├── mcp.json // (MCP) 配置文件 + ├── ai_models.json // AI 模型配置文件,包含所有可用的 AI 模型信息 + ├── agents/ + │ ├── agent1-key/ + │ │ ├── memory.md # Agent记忆 + │ │ ├── sub_agents/ # 子代理文件夹(类似 agents 文件夹) + │ │ ├── config.json # Agent配置 + │ │ └── chatlogs/ # 聊天记录文件夹 + │ │ ├── chat1.json + │ │ ├── chat2.json + │ │ └── ... + │ ├── agent2-key/ + │ │ ├── config.json + │ │ └── chatlogs/ + │ │ └── ... + │ └── ... + └── ... + + +# 全局 HyperChat 配置和数据存储在 ~/Documents/HyperChat/ 目录下,结构如下: + +~/Documents/HyperChat/ + + .hyperchat/ + ├── mcp.json // 全局主控程序 (MCP) 配置文件 + ├── ai_models.json // AI 模型配置文件,包含所有可用的 AI 模型信息 + ├── agents/ + │ ├── agent1-key/ + │ │ ├── memory.md # Agent记忆 + │ │ ├── sub_agents/ # 子代理文件夹(类似 agents 文件夹) + │ │ ├── config.json # Agent配置 + │ │ └── chatlogs/ # 聊天记录文件夹 + │ │ ├── chat1.json + │ │ ├── chat2.json + │ │ └── ... + │ ├── agent2-key/ + │ │ ├── config.json + │ │ └── chatlogs/ + │ │ └── ... + │ └── ... + └── ... + +``` \ No newline at end of file diff --git a/.github/prompts/check.prompt.md b/.github/prompts/check.prompt.md new file mode 100644 index 0000000..acf474b --- /dev/null +++ b/.github/prompts/check.prompt.md @@ -0,0 +1,5 @@ +--- +mode: agent +--- + +在core 项目中,减少any使用,多使用这个文件定义的类型 packages/core/src/shared/types.mts,如果要声明类型,类型也是添加到这个文件。 \ No newline at end of file diff --git a/.github/workflows/auto-comment-issue.yml b/.github/workflows/auto-comment-issue.yml new file mode 100644 index 0000000..57999b4 --- /dev/null +++ b/.github/workflows/auto-comment-issue.yml @@ -0,0 +1,60 @@ +name: Claude Auto Comment Issue + +on: + issues: + types: [opened] + +jobs: + claude-auto-comment: + runs-on: ubuntu-latest + permissions: + contents: read + issues: write + pull-requests: read + id-token: write + actions: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Run Claude Code Analysis + id: claude + uses: anthropics/claude-code-action@beta + with: + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + + # 强制触发 Claude,跳过默认的触发条件检查 + trigger_phrase: "" + assignee_trigger: "" + + # 使用 direct_prompt 直接执行任务 + direct_prompt: | + ## 自动回复 Issue 任务 + 你是 HyperChat 项目的自动回复机器人。请分析这个新创建的 issue,然后回复一条有用的评论。 + + ### 项目背景 + - HyperChat 是一个多平台 AI 聊天应用,包含 Web、CLI、Electron 版本 + - 使用 TypeScript 开发,基于 Ant Design 组件库 + - 支持多种 AI 模型(OpenAI、Claude、Gemini、Qwen、Deepseek 等) + - 采用工作区概念,支持 MCP(模型上下文协议) + + ### 回复要求 + 1. 用中文回复 + 2. 态度友好、专业 + 3. 根据 issue 内容分析问题类型(Bug、功能请求、问题咨询等) + 4. 提供具体的帮助建议或下一步指导 + 5. 如果是技术问题,可以基于代码库给出初步分析 + 6. 提醒这是 Claude Code 的自动回复 + + ### 回复格式 + 🤖 **Claude Code 自动回复** + + 你好!我是 Claude Code,HyperChat 项目的 AI 助手。我已经分析了你的 issue。 + + [基于issue内容的具体分析和建议] + + + 请现在分析当前的 issue 并回复。 \ No newline at end of file diff --git a/.github/workflows/auto-comment-issue2.yml b/.github/workflows/auto-comment-issue2.yml new file mode 100644 index 0000000..42ea988 --- /dev/null +++ b/.github/workflows/auto-comment-issue2.yml @@ -0,0 +1,176 @@ +name: HyperChat Auto Comment Issue 2.0 + +on: + issues: + types: [opened] + +jobs: + hyperchat-auto-comment: + runs-on: ubuntu-latest + permissions: + contents: read + issues: write + pull-requests: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install GitHub CLI + run: | + # 安装 GitHub CLI + curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null + sudo apt update + sudo apt install gh -y + + - name: Authenticate GitHub CLI + run: | + echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token + + - name: Get Issue Information + id: issue_info + run: | + # 获取Issue详细信息 + ISSUE_INFO=$(gh issue view ${{ github.event.issue.number }} --json title,body,author,labels,url --repo ${{ github.repository }}) + echo "ISSUE_DATA<> $GITHUB_OUTPUT + echo "$ISSUE_INFO" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + - name: Run HyperChat Analysis and Comment + run: | + # 创建分析提示 + ANALYSIS_PROMPT="你是 HyperChat 项目的专业 Issue 分析助手。请先仔细阅读项目的 CLAUDE.md 文件,学习项目的详细信息,然后使用 gh 命令分析并回复下面的 GitHub Issue。 + + ## 第一步:学习项目信息 + 请先使用以下命令读取项目文档: + \`cat CLAUDE.md\` + + 仔细学习文档中的: + - 项目概述和架构 + - 开发逻辑和最佳实践 + - 包结构和构建命令 + - 已完成功能和待办事项 + - 常见问题解决方案 + + ## 第二步:分析Issue信息 + - **Repository**: ${{ github.repository }} + - **Issue Number**: ${{ github.event.issue.number }} + - **Issue Title**: ${{ github.event.issue.title }} + - **Issue Author**: ${{ github.event.issue.user.login }} + - **Issue URL**: ${{ github.event.issue.html_url }} + + **Issue 内容**: + ${{ github.event.issue.body }} + + ## 第三步:深度分析任务 + 基于 CLAUDE.md 中学到的项目知识,完成以下分析: + 1. **问题分类**:确定Issue类型(Bug报告/功能请求/使用问题/文档问题/开发指导等) + 2. **影响评估**:评估问题的严重程度和影响范围(参考项目架构) + 3. **技术分析**:基于项目的技术栈和架构提供专业判断 + 4. **解决建议**:参考项目的开发最佳实践和已有功能提供具体建议 + 5. **资源指引**:指向相关的文档、代码文件或构建命令 + + ## 第四步:执行回复和标签 + 使用以下命令完成任务: + - 首先回复Issue:\`gh issue comment ${{ github.event.issue.number }} --repo ${{ github.repository }} --body \"你的专业回复内容\"\` + - 然后添加相关标签:\`gh issue edit ${{ github.event.issue.number }} --repo ${{ github.repository }} --add-label \"标签1,标签2,标签3\"\` + + ## 增强回复格式模板 + 🤖 **HyperChat AI 助手自动回复** + + 感谢你提交这个 Issue!我已经基于项目文档深入分析了你的问题: + + **📋 问题分析** + - **类型**:[具体类型] + - **影响范围**:[基于项目架构的具体范围] + - **严重程度**:[评估等级] + + **🔍 技术分析** + [基于CLAUDE.md中的技术栈、架构和开发逻辑的深度分析] + + **💡 解决建议** + [参考项目最佳实践和已有功能的具体建议] + + **📚 相关资源** + - 🛠️ [开发指南](https://github.com/${{ github.repository }}/blob/dev2/CLAUDE.md) + - 📖 [项目文档](https://github.com/${{ github.repository }}/blob/dev2/README.md) + - [其他相关文件或命令,基于分析结果] + + **🚀 下一步行动** + [基于项目当前状态和开发流程的具体指导] + + 如需进一步帮助,请提供更多技术细节! + + --- + *此回复基于项目文档智能生成,由 HyperChat AI 助手提供* + + ## 可用标签参考 + **问题类型标签**: + - bug:Bug报告 + - enhancement:功能请求 + - question:使用问题 + - documentation:文档问题 + - help wanted:需要帮助 + - good first issue:适合新手 + + **影响范围标签**: + - frontend:前端相关 + - backend:后端相关 + - cli:CLI工具相关 + - electron:桌面应用相关 + - web:Web应用相关 + - shared:共享代码相关 + + **严重程度标签**: + - priority:low:低优先级 + - priority:medium:中优先级 + - priority:high:高优先级 + - priority:critical:紧急 + + **其他标签**: + - duplicate:重复问题 + - wontfix:不会修复 + - invalid:无效问题 + - auto-analyzed:自动分析 + + ## 执行要求 + **重要**:请严格按照以下步骤执行: + 1. **第一步**:先执行 \`cat CLAUDE.md\` 学习项目详细信息 + 2. **第二步**:基于学到的知识分析Issue + 3. **第三步**:执行 \`gh issue comment\` 命令发布专业回复 + 4. **第四步**:执行 \`gh issue edit --add-label\` 命令添加2-4个最相关标签 + 5. **必须**:确保所有命令都能成功执行,回复内容要体现对项目的深度理解" + + # 使用 HyperChat 进行分析和回复 + npx @dadigua/hyperchat@latest "$ANALYSIS_PROMPT" + env: + # GitHub Token for gh CLI (already authenticated above) + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + # HyperChat 配置 + HyperChat_API_URL: ${{ secrets.HyperChat_API_URL }} + HyperChat_API_KEY: ${{ secrets.HyperChat_API_KEY }} + HyperChat_AI_Provider: ${{ secrets.HyperChat_AI_Provider }} + HyperChat_AI_Model: ${{ secrets.HyperChat_AI_Model }} + + + - name: Fallback Comment on Failure + if: failure() + run: | + gh issue comment ${{ github.event.issue.number }} --repo ${{ github.repository }} --body "🤖 **HyperChat AI 助手** + + 抱歉,自动分析系统遇到了问题,无法生成智能回复。 + + 请耐心等待项目维护者的人工回复,或者在 [讨论区](https://github.com/${{ github.repository }}/discussions) 寻求帮助。 + + --- + *此消息由自动化系统生成*" \ No newline at end of file diff --git a/.github/workflows/build-mac-x64.yml b/.github/workflows/build-mac-x64.yml new file mode 100644 index 0000000..5e25a89 --- /dev/null +++ b/.github/workflows/build-mac-x64.yml @@ -0,0 +1,143 @@ +name: HyperChat-Mac-x64 + +on: + workflow_call: + secrets: + APPLE_ID: + required: true + APPLE_APP_SPECIFIC_PASSWORD: + required: true + CSC_LINK: + required: true + CSC_KEY_PASSWORD: + required: true + APPLE_TEAM_ID: + required: true + GH_TOKEN: + required: true + workflow_dispatch: {} + +jobs: + # check: + # uses: ./.github/workflows/check-version.yml + + release: + # needs: check + # if: ${{ needs.check.outputs.should_release == 'true' }} + name: build and release electron app + strategy: + fail-fast: false + matrix: + os: [macos-13] + + runs-on: ${{ matrix.os }} + + steps: + - name: Check out git repository + uses: actions/checkout@v3.0.0 + + - name: Install Node.js + uses: actions/setup-node@v4.0.0 + with: + node-version: "20.19.1" + + - name: Install -g + run: npm install -g cross-env zx + + - name: Install python-setuptools + if: matrix.os == 'macos-latest' + run: + brew install python-setuptools + + # 根目录的依赖缓存 + - name: Cache root dependencies + uses: actions/cache@v3 + id: cache-root + with: + path: node_modules + key: ${{ matrix.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ matrix.os}}-node- + + # 安装根目录依赖(如果缓存未命中) + - name: Install root dependencies + if: steps.cache-root.outputs.cache-hit != 'true' + run: npm install + + # web 目录的依赖缓存 + - name: Cache web dependencies + uses: actions/cache@v3 + id: cache-web + with: + path: web/node_modules + key: ${{ matrix.os }}-node-web-${{ hashFiles('web/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node-web- + + # 安装 web 目录依赖(如果缓存未命中) + - name: Install web dependencies + if: steps.cache-web.outputs.cache-hit != 'true' + run: npm install + working-directory: ./web + + # electron 目录的依赖缓存 + - name: Cache electron dependencies + uses: actions/cache@v3 + id: cache-electron + with: + path: | + electron/node_modules + ${{ github.workspace }}/node_modules/electron + ${{ github.workspace }}/electron/node_modules/electron + ~/.cache/electron + ~/.cache/electron-builder + ~/Library/Caches/electron + ~/Library/Caches/electron-builder + ~/AppData/Local/electron/Cache + ~/AppData/Local/electron-builder/Cache + key: ${{ matrix.os }}-node-electron-${{ hashFiles('electron/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node-electron- + + # 安装 electron 目录依赖(如果缓存未命中) + - name: Install electron dependencies + if: steps.cache-electron.outputs.cache-hit != 'true' + run: npm install + working-directory: ./electron + + - run: npm run updateVersion + + - name: Build Electron App (macOS only) + if: matrix.os == 'macos-latest' || matrix.os == 'macos-13' + run: npm run prod + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} + CSC_LINK: ${{ secrets.CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + USE_HARD_LINKS: false + MYRUNENV: github + + - name: Build Electron App (widnows+linux) + if: matrix.os == 'windows-latest' || matrix.os == 'ubuntu-latest' + run: npm run prod + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + MYRUNENV: github + + # - name: upload artifacts + # uses: actions/upload-artifact@v4 + # with: + # name: ${{ matrix.os }} + # path: dist + + # - name: Publish Release + # uses: softprops/action-gh-release@v2 + # if: startsWith(github.ref, 'refs/tags/') + # with: + # files: | + # dist/* + # env: + # GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/check-version.yml b/.github/workflows/check-version.yml new file mode 100644 index 0000000..32445f9 --- /dev/null +++ b/.github/workflows/check-version.yml @@ -0,0 +1,66 @@ +name: 检查版本 + +on: + workflow_call: + outputs: + should_release: + description: "是否需要发布新版本" + value: ${{ jobs.check.outputs.should_release }} + package_version: + description: "package.json 的版本" + value: ${{ jobs.check.outputs.package_version }} + +jobs: + check: + runs-on: ubuntu-latest + outputs: + should_release: ${{ steps.compare-versions.outputs.should_release }} + package_version: ${{ steps.package-version.outputs.package_version }} + steps: + - uses: actions/checkout@v3 + + - name: 获取package.json版本 + id: package-version + run: | + PACKAGE_VERSION=$(node -p "require('./package.json').version") + echo "package_version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT + + - name: 获取最新release版本 + id: latest-release + run: | + LATEST_RELEASE=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.tag_name' | sed 's/^v//') + echo "latest_release=${LATEST_RELEASE:-''}" >> $GITHUB_OUTPUT + continue-on-error: true + + - name: 获取npm上的最新版本 + id: npm-version + run: | + PACKAGE_NAME=$(node -p "require('./package.json').name") + NPM_VERSION=$(npm view $PACKAGE_NAME version 2>/dev/null || echo "") + echo "npm_version=${NPM_VERSION:-''}" >> $GITHUB_OUTPUT + continue-on-error: true + + - name: 比较版本 + id: compare-versions + run: | + PACKAGE_VERSION="${{ steps.package-version.outputs.package_version }}" + LATEST_RELEASE="${{ steps.latest-release.outputs.latest_release }}" + NPM_VERSION="${{ steps.npm-version.outputs.npm_version }}" + + echo "Package version from package.json: $PACKAGE_VERSION" + echo "Latest GitHub release version: $LATEST_RELEASE" + echo "Latest NPM registry version: $NPM_VERSION" + + # Check if we need to release based on version comparisons + if [ -z "$LATEST_RELEASE" ] || [ "$LATEST_RELEASE" = "null" ] || [ "$PACKAGE_VERSION" != "$LATEST_RELEASE" ]; then + if [ -z "$NPM_VERSION" ] || [ "$NPM_VERSION" = "null" ] || [ "$PACKAGE_VERSION" != "$NPM_VERSION" ]; then + echo "New version detected, should release" + echo "should_release=true" >> $GITHUB_OUTPUT + else + echo "Package version already on NPM, skipping release" + echo "should_release=false" >> $GITHUB_OUTPUT + fi + else + echo "Package version matches an existing release, skipping" + echo "should_release=false" >> $GITHUB_OUTPUT + fi \ No newline at end of file diff --git a/.github/workflows/ci-build-and-test.yml b/.github/workflows/ci-build-and-test.yml new file mode 100644 index 0000000..37c6613 --- /dev/null +++ b/.github/workflows/ci-build-and-test.yml @@ -0,0 +1,133 @@ +name: ci-build-and-test + +# on: [push, pull_request] +on: + workflow_dispatch: {} + push: + branches-ignore: + - doc + - alpha + - stable + - dev2 + +jobs: + install: + name: install-dependencies + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 获取完整的 git 历史 + + - name: Get event details + id: details + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + echo "type=推送" >> $GITHUB_OUTPUT + echo "message=$(git log -1 --pretty=format:%s)" >> $GITHUB_OUTPUT + echo "author=$(git log -1 --pretty=format:%an)" >> $GITHUB_OUTPUT + echo "sha=$(git log -1 --pretty=format:%h)" >> $GITHUB_OUTPUT + echo "url=${{ github.event.head_commit.url }}" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "pull_request" ]; then + echo "type=拉取请求" >> $GITHUB_OUTPUT + echo "message=${{ github.event.pull_request.title }}" >> $GITHUB_OUTPUT + echo "author=${{ github.event.pull_request.user.login }}" >> $GITHUB_OUTPUT + echo "url=${{ github.event.pull_request.html_url }}" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "issues" ]; then + echo "type=议题${{ github.event.action }}" >> $GITHUB_OUTPUT + echo "message=${{ github.event.issue.title }}" >> $GITHUB_OUTPUT + echo "author=${{ github.event.issue.user.login }}" >> $GITHUB_OUTPUT + echo "url=${{ github.event.issue.html_url }}" >> $GITHUB_OUTPUT + fi + + - name: Get changed files + id: files + if: github.event_name == 'push' || github.event_name == 'pull_request' + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + echo "changed=$(git diff --name-only HEAD^1 HEAD | tr '\n' ', ')" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "pull_request" ]; then + echo "changed=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} | tr '\n' ', ')" >> $GITHUB_OUTPUT + fi + + - name: Setup Node.js and Dependencies + uses: ./.github/actions/setup-node-deps + with: + node-version: "20.19.1" + install-global: "cross-env zx tsx" + install-scripts: "true" + install-python-setuptools: "true" + + # 检查 shared 目录ts 类型 + - name: check shared types + run: | + npx tsc --noEmit + npm run build + working-directory: ./packages/shared + + # 检查 web 目录ts 类型 + - name: check web types + run: npx tsc --noEmit + working-directory: ./packages/web + + # 检查 core 目录ts 类型 + - name: check core types + run: npx tsc --noEmit + working-directory: ./packages/core + + # 检查 electron 目录ts 类型 + - name: check electron types + run: npx tsc --noEmit + working-directory: ./packages/electron + + - name: Send Telegram Message + if: matrix.os == 'ubuntu-latest' + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + format: html + message: | + 🔔 CI构建测试 ${{ steps.details.outputs.type }}通知 + + 📂 仓库: ${{ github.repository }} + 👤 作者: ${{ steps.details.outputs.author }} + 🔍 提交: ${{ steps.details.outputs.sha }} + + 📝 标题: ${{ steps.details.outputs.message }} + 📄 修改的文件: + ${{ steps.files.outputs.changed }} + + ✅ 状态: TypeScript类型检查通过 + 🔗 详情链接: ${{ steps.details.outputs.url }} + ⏰ 时间: ${{ github.event.head_commit.timestamp || github.event.pull_request.updated_at || github.event.issue.updated_at }} + + #GitHub #CI #TypeScript + + - name: Send Error Notification + if: failure() && matrix.os == 'ubuntu-latest' + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + format: html + message: | + ❌ CI构建测试失败 + + 📂 仓库: ${{ github.repository }} + 👤 作者: ${{ steps.details.outputs.author }} + 🔍 工作流: ${{ github.workflow }} + + 💥 失败原因: TypeScript类型检查或依赖安装失败 + 🔗 详情链接: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + + 请检查 GitHub Actions 日志以获取更多详情。 diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml new file mode 100644 index 0000000..5bf8ce5 --- /dev/null +++ b/.github/workflows/claude-code-review.yml @@ -0,0 +1,78 @@ +name: Claude Code Review + +on: + pull_request: + types: [opened, synchronize] + # Optional: Only run on specific file changes + # paths: + # - "src/**/*.ts" + # - "src/**/*.tsx" + # - "src/**/*.js" + # - "src/**/*.jsx" + +jobs: + claude-review: + # Optional: Filter by PR author + # if: | + # github.event.pull_request.user.login == 'external-contributor' || + # github.event.pull_request.user.login == 'new-developer' || + # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' + + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + issues: read + id-token: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Run Claude Code Review + id: claude-review + uses: anthropics/claude-code-action@beta + with: + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + + # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) + # model: "claude-opus-4-20250514" + + # Direct prompt for automated review (no @claude mention needed) + direct_prompt: | + Please review this pull request and provide feedback on: + - Code quality and best practices + - Potential bugs or issues + - Performance considerations + - Security concerns + - Test coverage + + Be constructive and helpful in your feedback. + + # Optional: Use sticky comments to make Claude reuse the same comment on subsequent pushes to the same PR + # use_sticky_comment: true + + # Optional: Customize review based on file types + # direct_prompt: | + # Review this PR focusing on: + # - For TypeScript files: Type safety and proper interface usage + # - For API endpoints: Security, input validation, and error handling + # - For React components: Performance, accessibility, and best practices + # - For tests: Coverage, edge cases, and test quality + + # Optional: Different prompts for different authors + # direct_prompt: | + # ${{ github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR' && + # 'Welcome! Please review this PR from a first-time contributor. Be encouraging and provide detailed explanations for any suggestions.' || + # 'Please provide a thorough code review focusing on our coding standards and best practices.' }} + + # Optional: Add specific tools for running tests or linting + # allowed_tools: "Bash(npm run test),Bash(npm run lint),Bash(npm run typecheck)" + + # Optional: Skip review for certain conditions + # if: | + # !contains(github.event.pull_request.title, '[skip-review]') && + # !contains(github.event.pull_request.title, '[WIP]') + diff --git a/.github/workflows/claude.yml b/.github/workflows/claude.yml new file mode 100644 index 0000000..4945c7d --- /dev/null +++ b/.github/workflows/claude.yml @@ -0,0 +1,71 @@ +name: Claude Code + +on: + issue_comment: + types: [created] + pull_request_review_comment: + types: [created] + issues: + types: [opened, assigned] + pull_request_review: + types: [submitted] + +jobs: + claude: + if: | + (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) || + (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) || + (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude'))) + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: read + issues: read + id-token: write + actions: read # Required for Claude to read CI results on PRs + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 1 + + - name: Run Claude Code + id: claude + uses: anthropics/claude-code-action@beta + with: + claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }} + + # This is an optional setting that allows Claude to read CI results on PRs + additional_permissions: | + actions: read + + # Optional: Specify model (defaults to Claude Sonnet 4, uncomment for Claude Opus 4) + # model: "claude-opus-4-20250514" + + # Optional: Customize the trigger phrase (default: @claude) + # trigger_phrase: "/claude" + + # Optional: Trigger when specific user is assigned to an issue + # assignee_trigger: "claude-bot" + + # Optional: Allow Claude to run specific commands + # allowed_tools: "Bash(npm install),Bash(npm run build),Bash(npm run test:*),Bash(npm run lint:*)" + + # HyperChat 项目特定指令 + custom_instructions: | + ## HyperChat 开发指南 + - 这是一个多平台 AI 聊天应用,包含 Web、CLI、Electron 版本 + - 严格遵循 TypeScript 类型安全,避免使用 any 类型 + - 包构建顺序:shared -> web -> core -> electron + - 使用 Zod Schema 进行数据验证,所有 schema 在 packages/shared/src/zodSchemas + - 遵循现有的中文注释和开发规范 + - 优先使用 Ant Design 组件库 + - 所有新功能需要集成到工作区系统 (workspace.mts) + - 使用 Schema2Form 组件系统生成表单界面 + - 请用中文回复用户 + + # Optional: Custom environment variables for Claude + # claude_env: | + # NODE_ENV: test + diff --git a/.github/workflows/doc-translate.yml b/.github/workflows/doc-translate.yml new file mode 100644 index 0000000..31ce583 --- /dev/null +++ b/.github/workflows/doc-translate.yml @@ -0,0 +1,66 @@ +name: doc-translate + +# on: [push, pull_request] +on: + workflow_dispatch: {} + push: + branches: + - doc + + +permissions: + contents: write + +jobs: + doc-translate: + runs-on: ubuntu-latest + steps: + - name: Check out git repository + uses: actions/checkout@v4 + + # - name: Check if commit message is "action-generated" + # id: check_commit_message + # run: | + # COMMIT_MESSAGE=$(git log -1 --pretty=format:%s) + # echo "Commit message: $COMMIT_MESSAGE" + # if [[ "$COMMIT_MESSAGE" == "action-generated" ]]; then + # echo "Skipping workflow for action-generated commit" + # echo "is_generated=true" >> $GITHUB_OUTPUT + # else + # echo "is_generated=false" >> $GITHUB_OUTPUT + # fi + + # - name: Exit workflow if action-generated commit + # if: steps.check_commit_message.outputs.is_generated == 'true' + # run: exit 78 + + - name: Install Node.js + uses: actions/setup-node@v3.0.0 + with: + node-version: "20.19.1" + registry-url: https://registry.npmjs.org/ + + - uses: pnpm/action-setup@v4 + with: + version: 9 + + - name: Install -g + run: npm install -g cross-env zx + + - name: Install Dependencies + run: npm install + + + - run: npx tsx ./translate.mts --test + env: + apiKey: ${{secrets.apiKey}} + baseURL: ${{secrets.baseURL}} + + - run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "action-generated" + git push + env: + GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml new file mode 100644 index 0000000..6a88ca8 --- /dev/null +++ b/.github/workflows/docker-release.yml @@ -0,0 +1,155 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Release-Publish Docker image + +on: + workflow_dispatch: {} + # release: + # types: [published] + push: + # tags: + # - "v*" + branches: + - stable +jobs: + push_to_registry: + name: Push Docker image to Docker Hub + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4.0.0 + with: + node-version: "20.19.1" + registry-url: https://registry.npmjs.org/ + + - name: Install -g + run: npm install -g cross-env zx + + # 根目录的依赖缓存 + - name: Cache root dependencies + uses: actions/cache@v3 + id: cache-root + with: + path: node_modules + key: ${{ matrix.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node- + + # 安装根目录依赖(如果缓存未命中) + - name: Install root dependencies + if: steps.cache-root.outputs.cache-hit != 'true' + run: npm install + + # web 目录的依赖缓存 + - name: Cache web dependencies + uses: actions/cache@v3 + id: cache-web + with: + path: web/node_modules + key: ${{ matrix.os }}-node-web-${{ hashFiles('web/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node-web- + + # 安装 web 目录依赖(如果缓存未命中) + - name: Install web dependencies + if: steps.cache-web.outputs.cache-hit != 'true' + run: npm install + working-directory: ./web + + # electron 目录的依赖缓存 + - name: Cache electron dependencies + uses: actions/cache@v3 + id: cache-electron + with: + path: electron/node_modules + key: ${{ matrix.os }}-node-electron-${{ hashFiles('electron/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node-electron- + + # 安装 electron 目录依赖(如果缓存未命中) + - name: Install electron dependencies + if: steps.cache-electron.outputs.cache-hit != 'true' + run: npm install + working-directory: ./electron + + - run: npm run updateVersion + - run: npm run prod_node + + # - run: cd web && npm run build + # - run: cd electron && npm run build:node + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: dadigua/hyperchat-mini + + - name: Determine npm publish tag + id: publish-tag + run: | + if [[ $GITHUB_REF == *"alpha"* ]]; then + echo "tag=alpha" >> $GITHUB_OUTPUT + else + echo "tag=latest" >> $GITHUB_OUTPUT + fi + + - name: 获取npm上的最新版本 + if: steps.publish-tag.outputs.tag != 'latest' + id: npm-version + run: | + NPM_VERSION=$(npm view @dadigua/hyper-chat version 2>/dev/null || echo "") + echo $NPM_VERSION + + - name: Build and push Docker image + + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + file: "${{ steps.publish-tag.outputs.tag == 'alpha' && './docker/no_electron/Dockerfile-Alpha' || './docker/no_electron/Dockerfile' }}" + platforms: linux/amd64,linux/arm64 + push: true + tags: dadigua/hyperchat-mini:latest + labels: ${{ steps.meta.outputs.labels }}` + + + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v2 + with: + subject-name: index.docker.io/dadigua/hyperchat-mini + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 0000000..472950c --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,153 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish Docker image + +on: + workflow_dispatch: {} + # release: + # types: [published] + push: + branches: + - alpha +jobs: + push_to_registry: + name: Push Docker image to Docker Hub + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4.0.0 + with: + node-version: "20.19.1" + registry-url: https://registry.npmjs.org/ + + - name: Install -g + run: npm install -g cross-env zx + + # 根目录的依赖缓存 + - name: Cache root dependencies + uses: actions/cache@v3 + id: cache-root + with: + path: node_modules + key: ${{ matrix.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node- + + # 安装根目录依赖(如果缓存未命中) + - name: Install root dependencies + if: steps.cache-root.outputs.cache-hit != 'true' + run: npm install + + # web 目录的依赖缓存 + - name: Cache web dependencies + uses: actions/cache@v3 + id: cache-web + with: + path: web/node_modules + key: ${{ matrix.os }}-node-web-${{ hashFiles('web/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node-web- + + # 安装 web 目录依赖(如果缓存未命中) + - name: Install web dependencies + if: steps.cache-web.outputs.cache-hit != 'true' + run: npm install + working-directory: ./web + + # electron 目录的依赖缓存 + - name: Cache electron dependencies + uses: actions/cache@v3 + id: cache-electron + with: + path: electron/node_modules + key: ${{ matrix.os }}-node-electron-${{ hashFiles('electron/package-lock.json') }} + restore-keys: | + ${{ matrix.os }}-node-electron- + + # 安装 electron 目录依赖(如果缓存未命中) + - name: Install electron dependencies + if: steps.cache-electron.outputs.cache-hit != 'true' + run: npm install + working-directory: ./electron + + - run: npm run updateVersion + - run: npm run prod_node + + # - run: cd web && npm run build + # - run: cd electron && npm run build:node + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: dadigua/hyperchat-mini + + - name: Determine npm publish tag + id: publish-tag + run: | + if [[ $GITHUB_REF == *"alpha"* ]]; then + echo "tag=alpha" >> $GITHUB_OUTPUT + else + echo "tag=latest" >> $GITHUB_OUTPUT + fi + + - name: 获取npm上的最新版本 + if: steps.publish-tag.outputs.tag != 'latest' + id: npm-version + run: | + NPM_VERSION=$(npm view @dadigua/hyper-chat version 2>/dev/null || echo "") + echo $NPM_VERSION + + - name: Build and push Docker image + + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: . + file: "${{ steps.publish-tag.outputs.tag == 'alpha' && './docker/no_electron/Dockerfile-Alpha' || './docker/no_electron/Dockerfile' }}" + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + + + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v2 + with: + subject-name: index.docker.io/dadigua/hyperchat-mini + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/electron-app.yml b/.github/workflows/electron-app.yml new file mode 100644 index 0000000..cc05905 --- /dev/null +++ b/.github/workflows/electron-app.yml @@ -0,0 +1,208 @@ +name: HyperChat electron app + +on: + workflow_dispatch: {} + workflow_call: + inputs: + publish_tag: + description: 'NPM publish tag (alpha/latest)' + required: true + type: string + branch_name: + description: 'Branch name that triggered the npm publish' + required: true + type: string + secrets: + APPLE_ID: + description: 'Apple ID for notarization' + required: true + APPLE_APP_SPECIFIC_PASSWORD: + description: 'Apple app-specific password' + required: true + CSC_LINK: + description: 'Code signing certificate' + required: true + CSC_KEY_PASSWORD: + description: 'Code signing certificate password' + required: true + APPLE_TEAM_ID: + description: 'Apple Team ID' + required: true + GH_TOKEN: + description: 'GitHub token for releases' + required: true + TELEGRAM_CHAT_ID: + description: 'Telegram chat ID for notifications' + required: true + TELEGRAM_BOT_TOKEN: + description: 'Telegram bot token' + required: true + + +permissions: + contents: write + discussions: write + +jobs: + release: + name: electron app + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 # 获取完整的 git 历史 + + - name: Get event details + id: details + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + echo "type=推送" >> $GITHUB_OUTPUT + echo "message=$(git log -1 --pretty=format:%s)" >> $GITHUB_OUTPUT + echo "author=$(git log -1 --pretty=format:%an)" >> $GITHUB_OUTPUT + echo "sha=$(git log -1 --pretty=format:%h)" >> $GITHUB_OUTPUT + echo "url=${{ github.event.head_commit.url }}" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "pull_request" ]; then + echo "type=拉取请求" >> $GITHUB_OUTPUT + echo "message=${{ github.event.pull_request.title }}" >> $GITHUB_OUTPUT + echo "author=${{ github.event.pull_request.user.login }}" >> $GITHUB_OUTPUT + echo "url=${{ github.event.pull_request.html_url }}" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "issues" ]; then + echo "type=议题${{ github.event.action }}" >> $GITHUB_OUTPUT + echo "message=${{ github.event.issue.title }}" >> $GITHUB_OUTPUT + echo "author=${{ github.event.issue.user.login }}" >> $GITHUB_OUTPUT + echo "url=${{ github.event.issue.html_url }}" >> $GITHUB_OUTPUT + fi + + - name: Get changed files + id: files + if: github.event_name == 'push' || github.event_name == 'pull_request' + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + echo "changed=$(git diff --name-only HEAD^1 HEAD | tr '\n' ', ')" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "pull_request" ]; then + echo "changed=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} | tr '\n' ', ')" >> $GITHUB_OUTPUT + fi + + - name: Setup Node.js and Dependencies + uses: ./.github/actions/setup-node-deps + with: + node-version: '20.19.1' + install-python-setuptools: 'true' + + + # 构建Sync Version脚本 + - name: Build Sync Version Script + run: npm run version:sync + + # 构建共享库 + - name: Build shared package + run: cd packages/shared && npm run build + + # 构建核心包 + - name: Build core package + run: cd packages/core && npm run build + + # 构建Web包 + - name: Build web package + run: cd packages/web && npm run build + + # 缓存构建产物 + - name: Cache build outputs + uses: actions/cache@v3 + with: + path: | + packages/shared/dist + packages/core/dist + packages/web/build + key: ${{ matrix.os }}-build-${{ github.sha }} + restore-keys: | + ${{ matrix.os }}-build- + + # 根据分支设置发布类型 + - name: Set release type for stable + if: github.ref == 'refs/heads/stable' || (github.event_name == 'workflow_call' && inputs.branch_name == 'stable') + run: | + cd packages/electron + sed -i 's/"releaseType": "prerelease"/"releaseType": "release"/' package.json + + # 发布应用 + - name: Publish App (macOS) + if: | + ( + (github.ref == 'refs/heads/dev2' || github.ref == 'refs/heads/stable') || + (github.event_name == 'workflow_call' && (inputs.branch_name == 'dev2' || inputs.branch_name == 'stable')) + ) && matrix.os == 'macos-latest' + run: cd packages/electron && npm run publish + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} + CSC_LINK: ${{ secrets.CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + USE_HARD_LINKS: false + + - name: Publish App (Windows/Linux) + if: | + ( + (github.ref == 'refs/heads/dev2' || github.ref == 'refs/heads/stable') || + (github.event_name == 'workflow_call' && (inputs.branch_name == 'dev2' || inputs.branch_name == 'stable')) + ) && (matrix.os == 'windows-latest' || matrix.os == 'ubuntu-latest') + run: cd packages/electron && npm run publish + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + + # Pull Request 时只构建不发布 + - name: Build only (Pull Request) + if: github.event_name == 'pull_request' + run: cd packages/electron && npm run build:electron + env: + GH_TOKEN: ${{ secrets.GH_TOKEN }} + + - name: Send Telegram Message + if: matrix.os == 'ubuntu-latest' + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + format: html + message: | + 🔔 Electron App ${{ steps.details.outputs.type }}通知 + + 📂 仓库: ${{ github.repository }} + 🌿 分支: ${{ github.ref_name }} + 👤 作者: ${{ steps.details.outputs.author }} + 🔍 提交: ${{ steps.details.outputs.sha }} + + 📝 标题: ${{ steps.details.outputs.message }} + 📄 修改的文件: + ${{ steps.files.outputs.changed }} + + 🔗 详情链接: ${{ steps.details.outputs.url }} + ⏰ 时间: ${{ github.event.head_commit.timestamp || github.event.pull_request.updated_at || github.event.issue.updated_at }} + + #GitHub #${{ steps.details.outputs.type }} + + - name: Send Error Notification + if: failure() && matrix.os == 'ubuntu-latest' + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + format: html + message: | + ❌ GitHub Action 失败 + + 📂 仓库: ${{ github.repository }} + 🔍 工作流: ${{ github.workflow }} + + 请检查 GitHub Actions 日志以获取更多详情。 diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml new file mode 100644 index 0000000..d574ad3 --- /dev/null +++ b/.github/workflows/npm-publish.yml @@ -0,0 +1,243 @@ +# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created +# For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages + +name: Node.js Package + +on: + workflow_dispatch: {} + push: + branches: + - dev2 + - stable + paths-ignore: + - 'package.json' + - 'packages/*/package.json' + - '**/*.md' + +permissions: + contents: write + discussions: write + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + + runs-on: ${{ matrix.os }} + outputs: + should_publish: ${{ steps.release-type.outputs.should_publish }} + should_skip: ${{ steps.check-npm-version.outputs.should_skip }} + publish_tag: ${{ steps.release-type.outputs.publish_tag }} + steps: + - name: Check out git repository + uses: actions/checkout@v3.0.0 + with: + fetch-depth: 0 # 获取完整的 git 历史 + + - name: Get event details + id: details + shell: bash + run: | + if [ "${{ github.event_name }}" = "push" ]; then + echo "type=推送" >> $GITHUB_OUTPUT + echo "message=$(git log -1 --pretty=format:%s)" >> $GITHUB_OUTPUT + echo "author=$(git log -1 --pretty=format:%an)" >> $GITHUB_OUTPUT + echo "sha=$(git log -1 --pretty=format:%h)" >> $GITHUB_OUTPUT + echo "url=${{ github.event.head_commit.url }}" >> $GITHUB_OUTPUT + elif [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "type=手动触发" >> $GITHUB_OUTPUT + echo "message=$(git log -1 --pretty=format:%s)" >> $GITHUB_OUTPUT + echo "author=${{ github.actor }}" >> $GITHUB_OUTPUT + echo "sha=$(git log -1 --pretty=format:%h)" >> $GITHUB_OUTPUT + echo "url=${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" >> $GITHUB_OUTPUT + fi + + - name: Get changed files + id: files + if: github.event_name == 'push' + shell: bash + run: | + echo "changed=$(git diff --name-only HEAD^1 HEAD | tr '\n' ', ')" >> $GITHUB_OUTPUT + + - name: Setup Node.js and Dependencies + uses: ./.github/actions/setup-node-deps + with: + node-version: '20.19.1' + install-global: 'cross-env zx tsx' + install-scripts: 'true' + install-python-setuptools: 'true' + + # 判断当前分支和版本类型 + - name: Determine release type + id: release-type + run: | + BRANCH_NAME=${GITHUB_REF#refs/heads/} + PACKAGE_VERSION=$(node -p "require('./package.json').version") + + echo "branch=$BRANCH_NAME" >> $GITHUB_OUTPUT + echo "version=$PACKAGE_VERSION" >> $GITHUB_OUTPUT + + if [[ $BRANCH_NAME == "dev2" ]]; then + if [[ $PACKAGE_VERSION == *"-alpha"* ]]; then + echo "should_publish=true" >> $GITHUB_OUTPUT + echo "publish_tag=alpha" >> $GITHUB_OUTPUT + echo "is_alpha=true" >> $GITHUB_OUTPUT + echo "Dev2 branch with alpha version - will publish with alpha tag" + else + echo "should_publish=false" >> $GITHUB_OUTPUT + echo "is_alpha=false" >> $GITHUB_OUTPUT + echo "Dev2 branch but not alpha version - skipping publish" + fi + elif [[ $BRANCH_NAME == "stable" ]]; then + echo "should_publish=true" >> $GITHUB_OUTPUT + echo "publish_tag=latest" >> $GITHUB_OUTPUT + echo "is_alpha=false" >> $GITHUB_OUTPUT + echo "Stable branch - will publish with latest tag" + else + echo "should_publish=false" >> $GITHUB_OUTPUT + echo "is_alpha=false" >> $GITHUB_OUTPUT + echo "Unknown branch - skipping publish" + fi + + # 同步版本号 + - name: Sync Version + if: steps.release-type.outputs.should_publish == 'true' + run: npm run version:sync + + # 检查 npm 上是否已存在当前版本 + - name: Check if version exists on npm + if: steps.release-type.outputs.should_publish == 'true' + id: check-npm-version + run: | + PACKAGE_VERSION=$(node -p "require('./package.json').version") + + echo "Checking package version: $PACKAGE_VERSION" + + # 检查包是否已存在 + if npm view @dadigua/hyperchat@$PACKAGE_VERSION version >/dev/null 2>&1; then + echo "package_exists=true" >> $GITHUB_OUTPUT + echo "❌ @dadigua/hyperchat@$PACKAGE_VERSION already exists on npm" + echo "should_skip=true" >> $GITHUB_OUTPUT + echo "🚫 Skipping publish - package already exists on npm" + else + echo "package_exists=false" >> $GITHUB_OUTPUT + echo "✅ @dadigua/hyperchat@$PACKAGE_VERSION does not exist on npm" + echo "should_skip=false" >> $GITHUB_OUTPUT + echo "🚀 Package is ready for publishing" + fi + + # 显示跳过发布的消息 + - name: Skip publish message + if: steps.release-type.outputs.should_publish == 'true' && steps.check-npm-version.outputs.should_skip == 'true' + run: | + echo "🚫 发布已跳过:当前版本已存在于 npm 上" + echo "如需强制发布,请先更新版本号" + + # 发布包到 npm + - name: Publish package to npm + if: steps.release-type.outputs.should_publish == 'true' && steps.check-npm-version.outputs.should_skip == 'false' + run: npm run publish:core + env: + NODE_AUTH_TOKEN: ${{secrets.npm_token}} + NPM_PUBLISH_TAG: ${{ steps.release-type.outputs.publish_tag }} + + + + # 发送成功通知 + - name: Send Success Notification + if: steps.release-type.outputs.should_publish == 'true' && steps.check-npm-version.outputs.should_skip == 'false' + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + format: html + message: | + 🚀 NPM包发布成功 + + 📂 仓库: ${{ github.repository }} + 🌿 分支: ${{ github.ref_name }} + 👤 作者: ${{ steps.details.outputs.author }} + 🔍 提交: ${{ steps.details.outputs.sha }} + + 📝 标题: ${{ steps.details.outputs.message }} + 📦 发布标签: ${{ steps.release-type.outputs.publish_tag }} + 📦 版本: ${{ steps.release-type.outputs.version }} + 📄 修改的文件: + ${{ steps.files.outputs.changed }} + + ✅ 状态: @dadigua/hyperchat 已成功发布到 npm + 🔗 详情链接: ${{ steps.details.outputs.url }} + ⏰ 时间: ${{ github.event.head_commit.timestamp || github.event.workflow_run.updated_at }} + + #GitHub #NPM #发布 #Husky + + # 发送跳过通知 + - name: Send Skip Notification + if: steps.release-type.outputs.should_publish == 'true' && steps.check-npm-version.outputs.should_skip == 'true' + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + format: html + message: | + ⏭️ NPM包发布已跳过 + + 📂 仓库: ${{ github.repository }} + 🌿 分支: ${{ github.ref_name }} + 👤 作者: ${{ steps.details.outputs.author }} + 🔍 提交: ${{ steps.details.outputs.sha }} + + 📝 标题: ${{ steps.details.outputs.message }} + 📦 预期标签: ${{ steps.release-type.outputs.publish_tag }} + 📄 修改的文件: + ${{ steps.files.outputs.changed }} + + 🚫 原因: 当前版本已存在于 npm 上 + 💡 解决方案: 请更新版本号后重试 + 🔗 详情链接: ${{ steps.details.outputs.url }} + ⏰ 时间: ${{ github.event.head_commit.timestamp || github.event.workflow_run.updated_at }} + + #GitHub #NPM #跳过 + + # 发送失败通知 + - name: Send Error Notification + if: failure() + uses: appleboy/telegram-action@master + with: + to: ${{ secrets.TELEGRAM_CHAT_ID }} + token: ${{ secrets.TELEGRAM_BOT_TOKEN }} + format: html + message: | + ❌ NPM包发布失败 + + 📂 仓库: ${{ github.repository }} + 🌿 分支: ${{ github.ref_name }} + 👤 作者: ${{ steps.details.outputs.author }} + 🔍 工作流: ${{ github.workflow }} + + 💥 失败阶段: NPM包发布或版本管理 + 🔗 详情链接: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} + + 请检查 GitHub Actions 日志以获取更多详情。 + + #GitHub #NPM #失败 + + # NPM 发布成功后触发 Electron 构建 + trigger-electron-build: + needs: build + if: needs.build.outputs.should_publish == 'true' && needs.build.outputs.should_skip == 'false' + uses: ./.github/workflows/electron-app.yml + with: + publish_tag: ${{ needs.build.outputs.publish_tag }} + branch_name: ${{ github.ref_name }} + secrets: + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} + CSC_LINK: ${{ secrets.CSC_LINK }} + CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + GH_TOKEN: ${{ secrets.GH_TOKEN }} + TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} + TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e8218f3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +tmp/ +inputs/ +outputs/ +__pycache__/ +dist/ +.env +*.log +.continuerules +.continue/ +chatlogs/ +dist-node/ +*.backup +*.json.backup-* +learns/ +temp/ \ No newline at end of file diff --git a/.husky/_/husky.sh b/.husky/_/husky.sh new file mode 100644 index 0000000..f9d0637 --- /dev/null +++ b/.husky/_/husky.sh @@ -0,0 +1,9 @@ +echo "husky - DEPRECATED + +Please remove the following two lines from $0: + +#!/usr/bin/env sh +. \"\$(dirname -- \"\$0\")/_/husky.sh\" + +They WILL FAIL in v10.0.0 +" \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..69f21b5 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,26 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +echo "🔍 Running pre-commit checks..." + +# 运行类型检查 +echo "📝 Running TypeScript type check..." +# npm run typecheck + +# # 如果类型检查失败,退出 +# if [ $? -ne 0 ]; then +# echo "❌ TypeScript type check failed!" +# exit 1 +# fi + +# # 运行 lint 检查(如果存在) +# echo "🧹 Running lint check..." +# npm run lint + +# # 如果 lint 失败,退出 +# if [ $? -ne 0 ]; then +# echo "❌ Lint check failed!" +# exit 1 +# fi + +echo "✅ Pre-commit checks passed!" \ No newline at end of file diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 0000000..ce68b43 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,9 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +echo "🔍 Running pre-push checks..." + +# 运行类型检查 +# npm run typecheck + +echo "✅ Pre-push checks passed!" \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..67f054e --- /dev/null +++ b/.npmrc @@ -0,0 +1,18 @@ +# NPM 配置文件 - 解决跨平台构建问题 + +# 基础配置 +audit=false +fund=false +save-exact=true + +# 缓存和锁定配置 +cache-lock-stale=60000 +cache-lock-wait=10000 + +# 减少警告和提高构建稳定性 +loglevel=warn +progress=false + +# 网络和超时配置 +timeout=300000 +registry=https://registry.npmjs.org/ \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..94c2fe5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,28 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach", + "port": 19999, + "request": "attach", + "skipFiles": [ + "/**" + ], + "type": "node" + }, + { + "name": "Debug Main Process", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}/electron", + "runtimeExecutable": "${workspaceFolder}/electron/node_modules/.bin/electron", + "windows": { + "runtimeExecutable": "${workspaceFolder}/electron/node_modules/.bin/electron.cmd" + }, + "args": [ + "." + ], + "outputCapture": "std" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..28d6c9f --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,107 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "🚀 Release Version", + "type": "shell", + "command": "node", + "args": ["scripts/release.mjs"], + "group": { + "kind": "build", + "isDefault": false + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + }, + "problemMatcher": [], + "detail": "发布新的 alpha 版本" + }, + { + "label": "📝 TypeCheck", + "type": "shell", + "command": "npm", + "args": ["run", "typecheck"], + "group": { + "kind": "test", + "isDefault": false + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": false + }, + "problemMatcher": ["$tsc"], + "detail": "运行 TypeScript 类型检查" + }, + { + "label": "🌐 Dev Web", + "type": "shell", + "command": "npm", + "args": ["run", "dev:web"], + "group": { + "kind": "build", + "isDefault": false + }, + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + }, + "problemMatcher": [], + "detail": "启动 Web 开发服务器" + }, + { + "label": "⚡ Dev Core", + "type": "shell", + "command": "npm", + "args": ["run", "dev:core"], + "group": { + "kind": "build", + "isDefault": false + }, + "isBackground": true, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "new", + "showReuseMessage": true, + "clear": false + }, + "problemMatcher": [], + "detail": "启动 Core 开发模式" + }, + { + "label": "🧹 Clean", + "type": "shell", + "command": "npm", + "args": ["run", "clean"], + "group": { + "kind": "build", + "isDefault": false + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": false + }, + "problemMatcher": [], + "detail": "清理所有构建产物" + } + ] +} diff --git a/AGENT_CENTRIC_PLAN.md b/AGENT_CENTRIC_PLAN.md new file mode 100644 index 0000000..15f597c --- /dev/null +++ b/AGENT_CENTRIC_PLAN.md @@ -0,0 +1,228 @@ +# Agent中心架构改造计划 + +## 📋 项目概述 + +将HyperChat从"工作区中心"架构调整为"Agent中心"架构,让每个Agent成为完全自包含的AI应用,为未来的Agent Creator项目奠定基础。 + +## 🎯 核心目标 + +- **简化概念**:用户只需理解Agent,工作区仅作为Agent发现路径 +- **完全自包含**:每个Agent拥有自己的MCP工具和任务配置 +- **零破坏性改动**:保持现有用户体验,无需数据迁移 +- **向前兼容**:为Agent Creator和Agent分发功能打基础 + +## 🏗️ 架构调整 + +### 当前架构 +``` +.hyperchat/ +├── mcp.json # 工作区级MCP配置 +├── tasks/ # 工作区级任务 +│ ├── task1.yaml +│ └── task2.yaml +└── agents/ # Agent集合 + ├── agent1/ + │ ├── agent.yaml + │ ├── memory.md + │ └── chatlogs/ + └── agent2/ + └── ... +``` + +### 目标架构 +``` +.hyperchat/ +└── agents/ # 工作区 = Agent发现路径 + ├── agent1/ + │ ├── agent.yaml # Agent配置 + │ ├── memory.md # Agent记忆 + │ ├── chatlogs/ # 聊天记录 + │ ├── mcp.json # Agent专属MCP配置 (新增) + │ └── tasks/ # Agent专属任务 (新增) + │ ├── task1.yaml + │ └── task2.yaml + └── agent2/ + └── ... +``` + +## 📋 实施计划 + +### ✅ Phase 1: 扩展Agent内部资源管理 (已完成) + +#### ✅ 1.1 扩展AgentInstance类 +- **文件**: `packages/core/src/workspace/agentManager.mts` +- **完成内容**: + - ✅ 新增Agent专属MCP配置管理方法 (getMCPConfig, updateMCPConfig, deleteMCPConfig等) + - ✅ 新增Agent专属任务管理方法 (getTasks, addTask, updateTask, deleteTask等) + - ✅ 支持Agent内部资源文件读写操作 + - ✅ 更新Agent摘要信息,包含MCP和任务统计 + +#### ✅ 1.2 更新Agent目录结构 +- **完成内容**: + - ✅ 支持Agent目录下的`mcp.json`文件存储Agent专属MCP配置 + - ✅ 支持Agent目录下的`tasks/`目录存储Agent专属任务 + - ✅ 实现懒加载和按需创建目录结构 + - ✅ 更新createDirectories方法自动创建tasks目录 + +#### ✅ 1.3 Agent专属资源管理API +- **完成内容**: + - ✅ MCP管理: `getMCPConfigPath()`, `hasMCPConfig()`, `getMCPConfig()`, `updateMCPConfig()`, `deleteMCPConfig()` + - ✅ 任务管理: `getTasksPath()`, `getTasks()`, `getTask()`, `addTask()`, `updateTask()`, `deleteTask()`, `clearTasks()`, `getTasksCount()` + - ✅ 完整的错误处理和文件操作安全性 + - ✅ 与现有Agent配置系统的完美集成 + +#### ✅ 1.4 测试验证 +- **测试结果**: 所有功能测试通过 + - ✅ Agent MCP管理功能: 创建、读取、更新、删除 + - ✅ Agent任务管理功能: 添加、获取、更新、删除、清空 + - ✅ Agent摘要信息: 包含MCP和任务统计 + - ✅ 类型检查通过,无编译错误 + +### Phase 2: 调整工作区管理逻辑 (1周) + +#### 2.1 简化WorkspaceManager +- 文件: `packages/core/src/workspace/workspace.mts` +- 移除工作区级MCP和任务管理 +- 保留Agent发现和统一管理功能 + +#### 2.2 更新初始化逻辑 +- 工作区初始化时不再创建全局MCP和任务配置 +- Agent创建时自动创建专属资源目录 + +### Phase 3: 前端界面适配 (1周) + +#### 3.1 Agent管理界面调整 +- 文件: `packages/web/src/components/AgentManagement/` +- 在Agent详情中显示专属MCP和任务配置 +- 支持Agent级别的资源管理 + +#### 3.2 工作区界面简化 +- 移除工作区级MCP和任务管理界面 +- 保留Agent列表和统计信息 + +### Phase 4: CLI命令适配 (几天) + +#### 4.1 更新Agent相关命令 +- 文件: `packages/core/src/cli/commands/agent.mts` +- 支持Agent级MCP和任务管理 +- 新增Agent资源配置命令 + +#### 4.2 简化工作区命令 +- 移除工作区级资源管理命令 +- 保留Agent发现和列表功能 + +### Phase 5: 测试和文档更新 (1周) + +#### 5.1 功能测试 +- 验证Agent创建和资源管理 +- 验证现有Agent的兼容性 +- 性能测试 + +#### 5.2 文档更新 +- 更新CLAUDE.md中的架构说明 +- 更新用户使用文档 +- 添加新功能的使用示例 + +## 🔧 核心实现细节 + +### 新的AgentConfig结构 +```typescript +interface AgentConfig { + // 现有字段保持不变 + name: string; + description?: string; + tags: string[]; + subAgents: string[]; + version: number; + + // 继承现有AI配置 + prompt: string; + temperature?: number; + maxTokens: number; + modelKey?: string; + // ... 其他AI配置 + + // 资源配置将存储在独立文件中,不在这里定义 + // mcp.json - Agent专属MCP配置 + // tasks/ - Agent专属任务目录 +} +``` + +### Agent资源管理API +```typescript +class AgentInstance { + // 现有方法保持不变 + + // 新增MCP管理 + async getMCPConfig(): Promise; + async updateMCPConfig(config: MCPConfig): Promise; + async hasMCPConfig(): Promise; + + // 新增任务管理 + async getTasks(): Promise; + async addTask(task: Task): Promise; + async updateTask(taskId: string, task: Task): Promise; + async deleteTask(taskId: string): Promise; + + // 资源路径方法 + getMCPConfigPath(): string; + getTasksPath(): string; +} +``` + +### 工作区管理简化 +```typescript +class Workspace { + // 保留现有核心功能 + async initialize(): Promise; + async start(): Promise; + + // 简化资源管理 - 只负责Agent发现 + getAgents(): Map; + async createAgent(name: string, config: AgentConfig): Promise; + + // 移除工作区级资源管理方法 + // getMCPManager() - 删除 + // getTaskManager() - 删除 +} +``` + +## ✅ 成功标准 + +1. **功能完整性**:所有现有功能正常工作 +2. **零破坏性**:现有用户无需任何操作即可使用 +3. **Agent独立性**:每个Agent可以独立配置MCP和任务 +4. **代码简洁性**:移除工作区级资源管理代码 +5. **向前兼容**:支持未来的Agent Creator集成 + +## 🚀 预期收益 + +1. **概念简化**:用户只需理解Agent概念 +2. **Agent完全自包含**:便于分享、备份、迁移 +3. **为Agent Creator铺路**:Agent即应用的理念 +4. **代码简化**:减少工作区级别的复杂性 +5. **更好的隔离性**:Agent之间完全独立 + +## 📝 注意事项 + +1. **兼容性保证**:现有Agent必须能无缝升级 +2. **性能考虑**:Agent数量增多时的资源管理 +3. **文件组织**:保持清晰的目录结构 +4. **错误处理**:资源文件缺失或损坏的处理 +5. **测试覆盖**:确保所有场景都有测试覆盖 + +## 🔄 回滚计划 + +如果改造过程中遇到问题,可以通过以下方式回滚: + +1. **代码回滚**:回到`dev2`分支 +2. **配置保持**:Agent内部资源配置可以保留 +3. **功能降级**:临时禁用Agent级资源管理功能 +4. **数据安全**:所有改动都是增量的,不会丢失现有数据 + +--- + +**开始时间**: 2024-07-24 +**预期完成**: 2024-08-15 +**负责人**: 开发团队 +**分支**: `feature/agent-centric-architecture` \ No newline at end of file diff --git a/AGENT_PAGE_SUMMARY.md b/AGENT_PAGE_SUMMARY.md new file mode 100644 index 0000000..b06e75d --- /dev/null +++ b/AGENT_PAGE_SUMMARY.md @@ -0,0 +1,200 @@ +# Agent中心架构前端页面实现总结 + +## 🎯 项目目标 + +基于用户需求"现在没有工作区的概念了,改成agent first",我们成功创建了完整的Agent中心架构前端页面系统,从workspace中心转换为Agent中心。 + +## 📁 文件结构 + +``` +packages/web/src/pages/agent/ +├── agent.tsx # 主页面组件(与后端API集成版本) +├── agent-demo.tsx # 演示页面组件(使用模拟数据) +├── index.ts # 模块导出 +├── types.ts # TypeScript类型定义 +└── components/ + ├── index.ts # 组件导出索引 + ├── AgentLeftPanel.tsx # 左侧文件树面板 + ├── AgentMiddlePanel.tsx # 中间聊天面板 + ├── AgentRightPanel.tsx # 右侧管理面板 + ├── AgentChatInterface.tsx # 聊天界面组件 + ├── AgentWelcomeTab.tsx # 欢迎页面组件 + ├── AgentFileViewer.tsx # 文件查看器组件 + ├── AgentInfoPanel.tsx # Agent信息面板 + ├── AgentMCPPanel.tsx # MCP管理面板 + └── AgentTaskPanel.tsx # 任务管理面板 +``` + +## 🚀 架构特点 + +### 1. **Agent中心设计理念** +- 每个Agent完全自包含,拥有独立的配置、MCP客户端和任务 +- 工作区仅作为Agent发现路径,不再管理共享资源 +- 统一的WebAgentManager管理多Agent并发运行 + +### 2. **三栏布局界面** +- **左侧面板**: Agent目录文件树浏览,支持隐藏文件切换 +- **中间面板**: 多标签页聊天和文件查看界面,支持欢迎页、聊天、文件查看 +- **右侧面板**: Agent管理、MCP配置、任务管理的三个标签页 + +### 3. **完整功能覆盖** +- ✅ Agent生命周期管理(启动/停止/重启/配置编辑) +- ✅ 实时聊天界面(多轮对话、消息历史、token统计) +- ✅ Agent专属MCP客户端管理(添加/编辑/删除/启停) +- ✅ Agent专属定时任务管理(Cron表达式、启用/禁用) +- ✅ 文件系统浏览和Monaco代码编辑器查看 +- ✅ 配置编辑和持久化 + +### 4. **用户体验优化** +- 响应式设计和自适应三栏布局 +- 实时状态显示和加载提示 +- 丰富的交互反馈和错误处理 +- 键盘快捷键支持(Enter发送消息等) + +## 🔧 技术实现 + +### 类型安全 +- 完整的TypeScript类型定义,基于现有的`@dadigua/hyperchat-shared` +- 与现有AgentConfig、IMCPClient、Task等类型兼容 +- 新增Agent特定的类型定义(AgentInstanceInfo、AgentChatTab等) + +### 组件架构 +- React Hooks最佳实践,使用useCallback、useMemo优化性能 +- forwardRef支持父组件调用子组件方法 +- Ant Design组件库,保持与现有界面风格一致 +- Monaco代码编辑器集成,支持多种编程语言语法高亮 + +### 状态管理 +- 组件间数据流清晰,通过props传递数据和回调 +- 实时刷新机制,支持Agent状态、MCP连接、任务执行状态更新 +- 本地状态管理(标签页、面板大小、显示选项等) + +## 📊 组件功能说明 + +### 核心组件 + +1. **AgentDemoPage** - 主页面组件 + - 三栏布局管理 + - 标签页状态管理 + - Agent详情数据加载 + +2. **AgentLeftPanel** - 文件树面板 + - Agent目录文件浏览 + - 隐藏文件显示切换 + - 文件选择和打开 + +3. **AgentMiddlePanel** - 中间聊天面板 + - 多标签页管理(欢迎、聊天、文件) + - 新建聊天和聊天历史 + - 底部状态栏显示 + +4. **AgentRightPanel** - 右侧管理面板 + - Agent、MCP、任务三个管理标签 + - 快速操作按钮 + - 底部路径和操作栏 + +### 功能组件 + +5. **AgentChatInterface** - 聊天界面 + - 实时消息发送和接收 + - 消息历史加载 + - Token使用统计 + +6. **AgentWelcomeTab** - 欢迎页 + - Agent概览信息 + - 快速操作入口 + - 统计信息显示 + +7. **AgentFileViewer** - 文件查看器 + - Monaco编辑器集成 + - 多语言语法高亮 + - 文件下载和复制 + +8. **AgentInfoPanel** - Agent信息管理 + - Agent启停控制 + - 配置编辑模态框 + - 状态信息显示 + +9. **AgentMCPPanel** - MCP客户端管理 + - MCP客户端CRUD操作 + - 连接状态显示 + - 环境变量配置 + +10. **AgentTaskPanel** - 任务管理 + - 定时任务CRUD操作 + - Cron表达式模板 + - 任务触发和状态管理 + +## 🎨 设计亮点 + +### UI/UX设计 +- **图标系统**: 统一使用Ant Design图标,语义化明确 +- **状态指示**: 颜色编码状态(绿色运行/红色停止/黄色警告) +- **信息密度**: 合理的信息层次,重要信息突出显示 +- **操作反馈**: 加载状态、成功提示、错误信息完整 + +### 交互设计 +- **渐进式披露**: 从概览到详情的信息展示层次 +- **快捷操作**: 常用操作易于访问(新建聊天、刷新、复制等) +- **键盘友好**: Enter发送消息、Shift+Enter换行等 +- **响应式**: 面板大小可调节,适配不同屏幕尺寸 + +## 🔄 与现有系统集成 + +### API集成点 +- 通过`call()`函数调用后端命令系统 +- 兼容现有的Command架构(agentCommands、mcpCommands、taskCommands) +- 支持WebSocket实时消息推送 + +### 类型兼容性 +- 复用`packages/shared`中的类型定义 +- 与AgentConfig、IMCPClient、Task等类型完全兼容 +- 扩展新的Agent特定类型定义 + +### 路由集成 +- 支持路径参数(/agent/:agentName) +- URL参数传递Agent路径和名称 +- 可集成到现有的React Router系统 + +## 🚧 已解决的技术问题 + +1. **TypeScript类型错误** - 修复了IMCPClient属性访问问题 +2. **API调用兼容性** - 适配现有的call()函数和Command系统 +3. **组件props传递** - 建立清晰的数据流和回调机制 +4. **Ant Design版本兼容** - 修复Tag组件size属性等版本问题 + +## 🎯 使用方式 + +### 开发环境 +```typescript +// 导入演示版本(推荐用于开发和展示) +import { AgentDemoPage } from '@/pages/agent'; + +// 路由配置 + +``` + +### 生产环境 +```typescript +// 导入完整版本(需要后端API支持) +import { AgentPage } from '@/pages/agent'; + +// 路由配置 + +``` + +## 📈 价值体现 + +### 架构优势 +- **概念简化**: 用户只需理解Agent概念,无需关心工作区 +- **完全自包含**: Agent可独立移动、备份、分享 +- **零破坏性**: 不破坏现有功能,可平滑迁移 +- **扩展性强**: 为Agent Creator和Agent分发打基础 + +### 开发效率 +- **组件复用**: 高度模块化的组件设计 +- **类型安全**: 完整的TypeScript支持 +- **一致性**: 与现有系统风格和架构一致 +- **可维护性**: 清晰的分层和职责划分 + +这个Agent中心架构完全实现了"现在没有工作区的概念了,改成agent first"的需求,为HyperChat的Agent中心化发展奠定了坚实的前端基础。 \ No newline at end of file diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..3820055 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,475 @@ +# 请回复中文 + +## typescript使用指南 +* import .mts 文件时,使用 import { xxx } from './xxx.mjs' 的方式导入。 +* xx.ts.bak , .bak 文件是老逻辑代码,不用阅读,也不用修改和删除。 + +## 项目概述 + +HyperChat 是一个多平台的 AI 聊天应用,该项目拥有完善的 MCP(模型上下文协议) 支持,并集成了包括 OpenAI、Claude、Gemini、Qwen、Deepseek 等在内的多种大语言模型 API。 + +### 多平台支持 +* **核心**: nodejs +* **Web前端**: 通过浏览器访问,支持h5 +* **Electron**: 桌面应用,自带浏览器 +* **命令行前端**: 类似Claude Code,已集成到core包中,配置通过web前端完成 +* **VSCode插件**: 通过webview访问构建 + +### 包结构 +* `packages/shared` - @dadigua/hyperchat-shared,共享代码和类型定义+zodSchemas,前后端通用 +* `packages/core` - Node.js 后端服务 + CLI命令行工具 +* `packages/web` - Web 前端的实现 +* `packages/electron` - Electron 桌面应用 + +## 开发逻辑 + +### 类型安全 +* 尽量使用 TypeScript 的类型系统来确保代码的类型安全。尽量少使用any类型。 +* packages/shared/src/types.mts 定义了常用的类型,包括前端和后端交互的类型,确保前后端的数据结构一致。 +* packages/shared/src/zodSchemas文件夹 定义了 Zod schema,用于数据验证和前端表单生成。所有的 schema 都是基于 TypeScript 类型定义的,确保类型一致性。 +* packages/core/src/data/managers 文件夹 包含了各种数据管理器类对应packages/shared/src/zodSchemas,这些类使用typescript类型 和 zodSchemas来确保数据的类型安全。 +* 使用 Zod schema 进行数据验证,通过 zod-to-json-schema 转换为 JSON Schema 用于前端表单生成。 +* 不允许 await import()。这样逻辑更加清晰,避免了动态导入带来的复杂性。 + +### 环境变量系统 +* 实现了5层优先级的环境变量系统(默认值 < process.env < ~/.hyperchat/.env < 工作区.env < CLI参数) + +### 前后端通信 +* 前端发送消息给后端,默认通过 packages/core/src/command.mts 实现,前端通过调用 call 的方法来实现与后端的交互。 +* electron提供更多electron接口 packages/electron/src/command.mts, 前端通过调用 callElectron 的方法来实现与electron的交互。 +* 后端发送消息给前端是通过websocket实现的 packages/core/src/message_service.mts,前端通过监听 websocket 的消息来接收后端发送的消息。 + +### 组件设计原则 +* 优先使用现有的 Ant Design 组件库 +* 遵循 React Hooks 最佳实践,使用 useCallback、useMemo 等优化性能 +* 表单使用 Ant Design Form 组件,支持 Form.List 处理动态数组 +* 错误处理和用户体验优先,提供清晰的错误提示和加载状态 + +## i18n 国际化 +* i18n 相关的代码在 packages/shared/src/i18n 中。 软件默认使用英文,然后通过转成 JSON 的方式来支持国际化。t`english`, 里面不应该有${xxx}。 +* packages/shared/src/i18n/i18n.json 不用修改。后续我会提供一个脚本来自动生成 i18n.json 文件。 + +## ✅ 双层架构设计 (2.0版本 - 已完成实现) + +### 核心理念:互补的双模式架构 +**重要**:CLI 和 Web 是**互补而非并发**的使用模式 +- 🌐 **Web模式**:开发阶段、项目配置、团队协作时使用 +- 💻 **CLI模式**:生产环境、CI/CD、自动化脚本、无界面环境使用 +- 🔄 **协同工作**:Web配置 → CLI执行,避免数据同步复杂性 + +**目标**:根据不同使用场景优化用户体验,Web端注重项目协作,CLI端注重Agent交互 + +### 双层架构设计 +``` +🌐 Web前端:工作区中心架构 +├── 工作区级别的资源管理 +│ ├── 工作区MCP客户端管理 (mcp.json) +│ └── 工作区Agent集合管理 (agents/) +└── 适用场景:项目开发、团队协作、Web界面管理 + +💻 CLI前端:Agent优先架构 +├── Agent级别的直接交互 +│ ├── Agent内置MCP工具使用 +│ └── Agent独立聊天会话 +└── 适用场景:快速对话、自动化脚本、命令行工作流 +``` + +### 配置层次结构 +``` +启动流程(双模式): + +🌐 Web模式:工作区配置合并 +1️⃣ 加载全局配置 (~/.hyperchat/) +2️⃣ 检测当前工作区 (./.hyperchat/) +3️⃣ 合并为工作区统一环境 + ├── 工作区MCP客户端列表 (统一管理) + └── 工作区Agent集合 (全局+本地) + +💻 CLI模式:Agent直接访问 +1️⃣ 发现可用Agent (全局+工作区) +2️⃣ 直接选择目标Agent +3️⃣ 使用Agent内置资源 + ├── Agent专属MCP工具 + ├── Agent记忆和上下文 + └── Agent聊天历史 +``` + + + + + + + +## ✅ 已完成的架构重构 + +### Workspace配置合并架构重构 (完成) 🆕 +**核心文件**: `packages/core/src/workspace/workspace.mts` + + +#### 三种工作模式 +1. **非工作区目录**: 自动回退到全局配置 +2. **工作区目录**: 全局配置 + 工作区配置合并 +3. **全局工作区**: 直接使用全局配置 + + + + +## 当前构建命令 🚀 + +### 可用的构建脚本 (更新) +```bash +# 构建 +npm run build # 构建所有包(按依赖顺序) +npm run build:shared # 构建 shared 包 +npm run build:web # 构建 Web 前端 +npm run build:core # 构建 Core 后端 + CLI +npm run build:electron # 构建 Electron 应用 + +# 开发模式 +npm run dev:shared # shared 包开发模式(watch) +npm run dev:web # Web 开发服务器 +npm run dev:core # Core + CLI 开发模式 +npm run dev:electron # Electron 开发模式 + +# 工具 +npm run clean # 清理所有构建产物 +npm run typecheck # 所有包类型检查 +``` + +### 构建顺序 (更新) +1. **shared** - 必须最先构建,其他包依赖它 +2. **web** - React 前端构建 +3. **core** - Node.js 后端 + CLI 构建 +4. **electron** - 桌面应用(依赖 web 构建产物) + +### CLI使用方式 (更新) +```bash +# 直接运行 +node packages/core/dist/cli/index.mjs --help + +# 安装后使用 (如果全局安装core包) +hyperchat --help +hc workspace current + +# 常用命令 +hyperchat chat # 直接AI对话 +hyperchat "你好" # 直接AI对话 +hyperchat serve # 启动Web服务器 (包含 Web 界面) +hyperchat agent list # 列出AI代理 +hyperchat agent [agent_name] "你好" # 使用某个agent直接AI对话 +hyperchat agent [agent_name] chat # 使用某个agent进行对话 +``` + +## 🗂️ 项目结构 (更新) + +### 当前包结构 +``` +HyperChat/ +├── packages/ +│ ├── shared/ # 共享类型和工具库 +│ ├── web/ # React Web前端 +│ ├── core/ # Node.js后端 + CLI (合并后) +│ │ ├── src/cli/ # ✨ CLI命令行工具 +│ │ │ ├── index.mts # CLI主入口 +│ │ │ ├── commands/ # 命令实现 +│ │ │ │ ├── agent.mts # 代理管理 +│ │ │ │ ├── chat.mts # AI聊天 +│ │ │ │ ├── config.mts # 配置管理 +│ │ │ │ ├── server.mts # 服务器控制 +│ │ │ │ └── workspace.mts # 工作区管理 +│ │ │ └── utils/ # CLI工具函数 +│ │ ├── src/workspace/ # 工作区管理 +│ │ ├── src/command.mts # API命令层 +│ │ └── src/mcp/ # MCP协议实现 +│ └── electron/ # Electron桌面应用 +``` + +## 🗂️ .hyperchat结构 + +### 全局配置目录 +``` +~/.hyperchat/ + ├── mcp.json // 全局主控程序 (MCP) 配置文件 + ├── .env // 全局环境变量配置 + ├── agents/ + │ ├── agent1-key/ + │ │ ├── memory.md # Agent记忆 + │ │ ├── sub_agents/ # 子代理文件夹(类似 agents 文件夹) + │ │ ├── agent.yaml # Agent配置 + │ │ └── chatlogs/ # 聊天记录文件夹 + │ │ ├── chat1.yaml + │ │ ├── chat2.yaml + │ │ └── ... + │ └── ... + └── ... +``` + +### 项目工作区结构 +``` +/projects/ + project1/ + .hyperchat/ + ├── mcp.json // 全局主控程序 (MCP) 配置文件 + ├── ai_models.json // AI 模型配置文件,包含所有可用的 AI 模型信息 + ├── agents/ + │ ├── agent1-name/ + │ │ ├── memory.md # Agent记忆 + │ │ ├── sub_agents/ # 子代理文件夹(类似 agents 文件夹) + │ │ ├── agent.yaml # Agent配置 + │ │ └── chatlogs/ # 聊天记录文件夹 + │ │ ├── chat1.yaml + │ │ ├── chat2.yaml + │ │ └── ... + │ └── ... + └── ... +``` + +## 📝 项目记忆 + +### 已完成功能 +- [x] AI请求改造:从web浏览器前端改为在nodejs环境中通过ai库发请求,代码在packages/shared/src/ai.mts,前后端共用 +- [x] 工作区概念实现:支持在不同工作区之间隔离数据和配置,支持显示当前工作区文件夹(树状),agent等配置作为文件保存在.hyperchat目录下 +- [x] 核心工作区管理类实现:workspace.mts, workspaceManager.mts +- [x] Schema2Form组件系统:支持JSON Schema转Ant Design表单,包括双模式编辑(表单/JSON)和Monaco编辑器集成 +- [x] AI配置管理系统:支持多提供商管理、模型配置、API Key管理,集成到应用设置中 +- [x] 应用设置系统:采用Schema驱动的UI生成,支持复杂对象、数组、条件schema等 +- [x] CLI架构重构:从HTTP API改为直接导入core模块,并集成到core包中 +- [x] Workspace配置合并逻辑:在workspace.mts中实现了智能工作区检测和配置合并 +- [x] CLI集成到Core包:简化架构,提升性能,统一构建流程 +- [x] CLI bug修复和简化 (2025-07-12):修复agent显示undefined问题,简化命令结构,提升代码质量 +- [x] Agent名称更新映射修复 (2025-08-01):修复`updateAgentMapping`方法中缺失的`availableAgents`映射更新 +- [x] MCP架构统一重构 (2025-08-01):统一使用工作区级别的MCP管理,修复所有相关的查找和调用逻辑 + +### 架构优势 +- **分离关注点**: JSON Schema 与业务逻辑分离,shared 包独立维护 +- **统一管理**: 所有 Schema 集中在 `packages/shared/src/jsonSchemas` 目录 +- **数据管理**: 所有管理器类集中在 `data` 目录 +- **类型安全**: 保持完整的 TypeScript 类型支持,跨包类型共享 +- **前端集成**: Schema2Form 自动生成 UI 界面 +- **构建效率**: npm workspaces 避免依赖重复,统一的构建管理 +- **架构简化**: CLI集成到core包,减少包管理复杂性 + +### 🎯 最新更新日志 + + + +#### 2025-07-13 工作区初始化两阶段优化 🚀 +**核心问题**: +- 原有 `workspace.init()` 方法集成了太多操作,导致启动时间过长 +- 无法快速获取工作区基本信息,用户体验不佳 +- 服务启动失败时难以定位是配置问题还是服务问题 + +**优化方案**: +- ✅ **两阶段初始化架构**: `initialize()` + `start()` 替代单一的 `init()` +- ✅ **第一阶段 - 快速配置加载**: 目录创建、设置管理器、Agent 管理器、基本配置 +- ✅ **第二阶段 - 重量级服务启动**: MCP 客户端(网络连接) +- ✅ **状态管理系统**: `WorkspaceState` 枚举跟踪初始化进度 +- ✅ **向后兼容**: 保留 `init()` 方法,内部调用两阶段方法 +- ✅ **API 简化**: 移除冗余的 `isReady()` 方法,`isStarted()` 已足够 +- ✅ **WorkspaceManager 同步优化**: 添加 `autoStart` 参数,支持两阶段 + 完整状态查询 + +**两层架构设计**: +- `WorkspaceManager.initialize(path, autoStart=false)` → `Workspace.initialize()` +- `WorkspaceManager.start()` → `Workspace.start()` +- `WorkspaceManager.init(path)` → 完整初始化(向后兼容) + +**状态管理**: +- `UNINITIALIZED` → `INITIALIZED` → `STARTED` → `STOPPING` → `STOPPED` +- 提供 `isInitialized()`, `isStarted()` 等状态查询方法 +- 防止重复初始化和状态错误 + +**使用场景分类**: +```typescript +// 🚀 场景 1: 快速查询(只需配置) +await workspaceManager.initialize(); // agent list +const agents = workspace.getAgents(); + +// 🔥 场景 2: 完整服务(需要网络连接) +await workspaceManager.initialize(); // hyperchat serve +await workspaceManager.start(); // MCP 调用 + +// 🔧 场景 3: 向后兼容(一步完成) +await workspaceManager.init(); // 现有代码迁移 +``` + +**用户体验提升**: +- 🚀 配置加载速度提升 70-90%(避免 MCP 网络连接,Agent 扫描已优化到第一阶段) +- 📊 渐进式信息展示:第一阶段即可显示 Agent 信息,第二阶段完成 MCP 连接 +- 🔧 更好的错误定位:分阶段错误提示,区分配置错误和网络连接错误 +- ⚡ `hyperchat chat` 命令展示两阶段启动过程 +- 🎯 智能场景适配:查询命令快速响应,服务命令完整启动 + +#### 2025-07-12 CLI修复和简化 +**问题修复**: +- ✅ 修复agent列表显示"undefined (undefined)"的bug +- ✅ 修复ES模块导入问题,避免使用CommonJS require +- ✅ 修复TypeScript类型错误,添加正确的类型断言 + +**功能简化**: +- ✅ 简化server命令:只保留`start`,移除`stop`和`status` +- ✅ 简化workspace命令:只保留`create`,移除`list/info/current/switch` +- ✅ 遵循项目TypeScript编码规范:避免动态导入和别名导入 + +**用户体验提升**: +- ✅ 增强agent列表显示:显示模型信息和聊天记录数量 +- ✅ 添加工作区资源统计:在chat命令中显示agent和MCP工具数量 +- ✅ 优化帮助文档:更新命令说明,移除废弃功能 + +这次更新进一步简化了CLI架构,符合"每个目录CLI会话独立"的设计理念,提升了用户体验和代码质量。 + +#### 2025-08-01 Agent 映射和 MCP 双层架构重构 🔧 +**关键修复**: +- ✅ **Agent 名称更新映射修复**: 修复 `AgentManager.updateAgentMapping()` 方法中遗漏的 `availableAgents` 映射更新 + - 问题:Agent 名称变更后,`getAllAgentsSummary()` 遍历 `availableAgents` 时找不到更新后的 Agent + - 解决:同时更新 `nameToPath` 和 `availableAgents` 两个映射表 +- ✅ **MCP 双层架构重构**: 明确区分 Web 端和 CLI 端的 MCP 使用模式 + - **Web端**: 统一使用工作区级别的 MCP 管理 (`workspace.getMcpManager()`) + - **CLI端**: 保持 Agent 优先的 MCP 访问 (`agent.getMCPClient()`) + - 修复核心方法:`manageWorkspaceMcpClient`、`startWorkspaceMcpClient` + - 修复调用方法:`mcpCallTool`、`mcpCallResource`、`mcpCallPrompt` + +**双层架构设计**: +- 🌐 **Web端优化**: 工作区级别的统一MCP管理,适合项目开发和团队协作 +- 💻 **CLI端优化**: Agent专属的MCP工具集,适合个人对话和快速交互 +- 🔧 **架构清晰**: 根据使用场景选择最适合的MCP管理方式 +- 🚀 **错误修复**: 解决 "MCP客户端 'telegram-send' 不存在" 等运行时错误 + +**技术实现**: +```typescript +// 🌐 Web端:工作区级别MCP管理 +const mcpManager = workspace.getMcpManager(); +const client = mcpManager.getClient(clientName); + +// 💻 CLI端:Agent优先MCP访问 +const agentInstance = workspace.getAgentInstance(agentName); +const client = agentInstance.getMCPClient(clientName); +``` + +这次重构建立了清晰的双层架构,Web端专注工作区协作,CLI端专注Agent交互,为不同使用场景提供了最优化的体验。 + +## 🚀 HyperChat 开发最佳实践流程 + +### 📋 标准化功能开发流程 (推荐采用) + +基于项目的成功实践,我们总结出以下高效的开发流程: + +#### 1️⃣ **Schema 定义阶段** +```typescript +// packages/shared/src/zodSchemas/featureSchema.mts +export const FeatureSchema = z.object({ + // 定义数据结构 + // 包含验证规则、默认值、类型导出 +}); +``` +- ✅ 使用 Zod 定义完整的数据 schema +- ✅ 包含验证函数、默认值、类型导出 +- ✅ 确保前后端类型一致性 + +#### 2️⃣ **Data Manager 实现阶段** +```typescript +// packages/core/src/data/managers/featureManager.mts +export class FeatureManager { + // 实现完整的 CRUD 操作 + // 基于 schema 的类型安全 +} +``` +- ✅ 创建专门的管理器类 +- ✅ 实现完整的业务逻辑和数据持久化 +- ✅ 基于 Zod schema 进行数据验证 + +#### 3️⃣ **后端逻辑集成阶段** +```typescript +// packages/core/src/workspace/workspace.mts +// packages/core/src/commands/featureCommands.mts +``` +- ✅ 集成到工作区系统 (workspace.mts) +- ✅ 创建对应的命令模块 (featureCommands.mts) +- ✅ 更新统一的 Command 系统 + +#### 4️⃣ **Web 前端界面阶段** +```typescript +// packages/web/src/components/FeatureManagement.tsx +// packages/web/src/pages/workspace/types.ts +``` +- ✅ 创建管理组件,支持完整的 UI 操作 +- ✅ 集成到工作区面板系统 +- ✅ 实现前后端数据同步 + +#### 5️⃣ **CLI 前端命令阶段** +```typescript +// packages/core/src/cli/commands/feature.mts +// packages/core/src/cli/index.mts +``` +- ✅ 实现丰富的命令行接口 +- ✅ 集成到 CLI 主系统 +- ✅ 提供完整的参数解析和错误处理 + +### 🎯 流程优势 +- **类型安全**: 从 schema 到前后端的完整类型覆盖 +- **代码复用**: schema 和 manager 逻辑在前后端共享 +- **一致性**: 统一的开发模式和架构设计 +- **可维护性**: 清晰的分层和职责划分 +- **扩展性**: 易于添加新功能模块 + +## ✅ MCP 双层架构重构 (2025-08-01 已完成) + +### 核心问题 +之前存在 Agent 级别和工作区级别 MCP 管理的混乱,没有明确区分使用场景: +- Web 前端调用工作区级别的 MCP 方法时出错 +- CLI 和 Web 端使用相同的查找逻辑,不符合各自的使用场景 +- MCP 客户端管理逻辑不一致,难以维护 + +### 双层架构设计 +**设计原则**: 根据前端类型选择最适合的 MCP 管理方式 + +``` +🌐 Web前端 → 工作区MCP管理 +├── 使用 workspace.getMcpManager() +├── 统一的工作区级别MCP客户端池 +├── 适合项目级别的工具集成 +└── 团队共享的MCP配置 + +💻 CLI前端 → Agent优先MCP访问 +├── 优先使用 agent.getMCPClient() +├── Agent专属的MCP工具集 +├── 适合个人化的对话体验 +└── 回退到工作区共享MCP +``` + +### 修复内容 +- ✅ **Web端MCP统一**: 全面重构 `mcpCommands.mts`,Web调用统一使用工作区级别的 MCP 管理器 +- ✅ **修复核心方法**: + - `manageWorkspaceMcpClient`: 使用工作区 `MCPManager` 的正确方法 + - `startWorkspaceMcpClient`: 移除 Agent 级别的查找逻辑 + - `mcpCallTool/Resource/Prompt`: 直接从工作区 MCP 管理器获取客户端 +- ✅ **保留CLI Agent优先**: CLI命令保持Agent级别的MCP访问逻辑 +- ✅ **修复 AgentManager 映射**: `updateAgentMapping` 方法同时更新 `nameToPath` 和 `availableAgents` 映射 + +### 技术实现 +```typescript +// 🌐 Web端:工作区级别MCP管理 +const workspace = workspaceManager.getCurrentWorkspace(); +const mcpManager = workspace.getMcpManager(); +const client = mcpManager.getClient(clientName); + +// 💻 CLI端:Agent优先MCP访问 (保持现有逻辑) +const agentInstance = workspace.getAgentInstance(agentName); +const client = agentInstance.getMCPClient(clientName); +``` + +### 用户体验提升 +- 🌐 **Web端体验**: 工作区统一的MCP工具管理,适合项目开发 +- 💻 **CLI端体验**: Agent专属的MCP工具,适合个人对话 +- 🔧 **错误修复**: 解决 "MCP客户端 'telegram-send' 不存在" 等错误 +- 🚀 **架构清晰**: 明确的双层架构,便于维护和扩展 + +## 开发小技巧 + +### 构建优化 +* 开发阶段推荐使用 `npm run typecheck` 进行类型检查,比完整构建更快 +* 生产部署时使用 `npm run build` 完整构建所有包 + + + 1. 前端先调用 POST /api/chat/stream 获取 sessionId + 2. 前端用 sessionId 建立 SSE 连接 GET /api/chat/stream/:sessionId + 3. 前端再次调用 POST /api/chat/stream 开始聊天 \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100644 index 0000000..6d7352d --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,4 @@ +[中文](ChangeLog.zh.md) | [English](ChangeLog.md) + + +# 2.0 in development \ No newline at end of file diff --git a/ChangeLog.zh.md b/ChangeLog.zh.md new file mode 100644 index 0000000..061235e --- /dev/null +++ b/ChangeLog.zh.md @@ -0,0 +1 @@ +# 2.0开发中 \ No newline at end of file diff --git a/GEMINI.md b/GEMINI.md new file mode 100644 index 0000000..8d46a12 --- /dev/null +++ b/GEMINI.md @@ -0,0 +1,427 @@ +# 请回复中文 + +## typescript使用指南 +* import .mts 文件时,使用 import { xxx } from './xxx.mjs' 的方式导入。 +* xx.ts.bak , .bak 文件是老逻辑代码,不用阅读,也不用修改和删除。 + +## 项目概述 + +HyperChat 是一个多平台的 AI 聊天应用,该项目拥有完善的 MCP(模型上下文协议) 支持,并集成了包括 OpenAI、Claude、Gemini、Qwen、Deepseek 等在内的多种大语言模型 API。 + +### 多平台支持 +* **核心**: nodejs +* **Web前端**: 通过浏览器访问,支持h5 +* **Electron**: 桌面应用,自带浏览器 +* **命令行前端**: 类似Claude Code,已集成到core包中,配置通过web前端完成 +* **VSCode插件**: 通过webview访问构建 + +### 包结构 +* `packages/shared` - @dadigua/hyperchat-shared,共享代码和类型定义+zodSchemas,前后端通用 +* `packages/core` - Node.js 后端服务 + CLI命令行工具 +* `packages/web` - Web 前端的实现 +* `packages/electron` - Electron 桌面应用 + +## 开发逻辑 + +### 类型安全 +* 尽量使用 TypeScript 的类型系统来确保代码的类型安全。尽量少使用any类型。 +* packages/shared/src/types.mts 定义了常用的类型,包括前端和后端交互的类型,确保前后端的数据结构一致。 +* packages/shared/src/zodSchemas文件夹 定义了 Zod schema,用于数据验证和前端表单生成。所有的 schema 都是基于 TypeScript 类型定义的,确保类型一致性。 +* packages/core/src/data/managers 文件夹 包含了各种数据管理器类对应packages/shared/src/zodSchemas,这些类使用typescript类型 和 zodSchemas来确保数据的类型安全。 +* 使用 Zod schema 进行数据验证,通过 zod-to-json-schema 转换为 JSON Schema 用于前端表单生成。 +* 不允许 await import()。这样逻辑更加清晰,避免了动态导入带来的复杂性。 + +### 环境变量系统 +* 实现了5层优先级的环境变量系统(默认值 < process.env < 全局.env < 工作区.env < CLI参数) + +### web前后端通信 +* 前端发送消息给后端,默认通过 packages/core/src/command.mts 实现,前端通过调用 call 的方法来实现与后端的交互。 +* electron提供更多electron接口 packages/electron/src/command.mts, 前端通过调用 callElectron 的方法来实现与electron的交互。 +* 后端发送消息给前端是通过websocket实现的 packages/core/src/message_service.mts,前端通过监听 websocket 的消息来接收后端发送的消息。 + +### 组件设计原则 +* 优先使用现有的 Ant Design 组件库 +* 遵循 React Hooks 最佳实践,使用 useCallback、useMemo 等优化性能 +* 表单使用 Ant Design Form 组件,支持 Form.List 处理动态数组 +* 错误处理和用户体验优先,提供清晰的错误提示和加载状态 + +## i18n 国际化 +* i18n 相关的代码在 packages/shared/src/i18n 中。 软件默认使用英文,然后通过转成 JSON 的方式来支持国际化。t`english`, 里面不应该有${xxx}。 +* packages/shared/src/i18n/i18n.json 不用修改。后续我会提供一个脚本来自动生成 i18n.json 文件。 + +## ✅ 新架构决策 (2.0版本 - 已完成实现) + +### 核心理念:进程/会话 = 全局配置 + 工作区配置(覆盖模式) +**目标**:统一CLI和Web端的架构,实现更简单、一致的用户体验 + +### 配置层次结构 +``` +一个CLI进程/Web会话 = 全局配置基础 + 当前工作区配置覆盖 + +启动流程: +1️⃣ 加载全局配置 (~/.hyperchat/) + ├── 全局AI模型配置 + ├── 全局MCP工具配置 + ├── 全局Agent配置 + └── 全局系统设置 + +2️⃣ 检测/选择当前工作区 (./.hyperchat/ 或项目根目录) + ├── 工作区AI模型配置 (覆盖全局) + ├── 工作区MCP工具配置 (补充/覆盖全局) + ├── 工作区Agent配置 (补充全局) + └── 工作区项目设置 + +3️⃣ 合并配置启动服务 + ├── 最终AI模型列表 + ├── 最终MCP客户端列表 + ├── 最终Agent列表 + └── 统一运行环境 +``` + + + + + + + +## ✅ 已完成的架构重构 + +### Workspace配置合并架构重构 (完成) 🆕 +**核心文件**: `packages/core/src/workspace/workspace.mts` + + +#### 三种工作模式 +1. **非工作区目录**: 自动回退到全局配置 +2. **工作区目录**: 全局配置 + 工作区配置合并 +3. **全局工作区**: 直接使用全局配置 + + + + +## 当前构建命令 🚀 + +### 可用的构建脚本 (更新) +```bash +# 构建 +npm run build # 构建所有包(按依赖顺序) +npm run build:shared # 构建 shared 包 +npm run build:web # 构建 Web 前端 +npm run build:core # 构建 Core 后端 + CLI +npm run build:electron # 构建 Electron 应用 + +# 开发模式 +npm run dev:shared # shared 包开发模式(watch) +npm run dev:web # Web 开发服务器 +npm run dev:core # Core + CLI 开发模式 +npm run dev:electron # Electron 开发模式 + +# 工具 +npm run clean # 清理所有构建产物 +npm run typecheck # 所有包类型检查 +``` + +### 构建顺序 (更新) +1. **shared** - 必须最先构建,其他包依赖它 +2. **web** - React 前端构建 +3. **core** - Node.js 后端 + CLI 构建 +4. **electron** - 桌面应用(依赖 web 构建产物) + +### CLI使用方式 (更新) +```bash +# 直接运行 +node packages/core/dist/cli/index.mjs --help + +# 安装后使用 (如果全局安装core包) +hyperchat --help +hc workspace current + +# 常用命令 +hyperchat chat # 直接AI对话 +hyperchat "你好" # 直接AI对话 +hyperchat serve # 启动Web服务器 (包含 Web 界面) +hyperchat run # 启动核心服务 (不包含 Web 界面,适合后台运行) +hyperchat agent list # 列出AI代理 +hyperchat agent [agent_name] "你好" # 使用某个agent直接AI对话 +hyperchat agent [agent_name] chat # 使用某个agent进行对话 +``` + +## 🗂️ 项目结构 (更新) + +### 当前包结构 +``` +HyperChat/ +├── packages/ +│ ├── shared/ # 共享类型和工具库 +│ ├── web/ # React Web前端 +│ ├── core/ # Node.js后端 + CLI (合并后) +│ │ ├── src/cli/ # ✨ CLI命令行工具 +│ │ │ ├── index.mts # CLI主入口 +│ │ │ ├── commands/ # 命令实现 +│ │ │ │ ├── agent.mts # 代理管理 +│ │ │ │ ├── chat.mts # AI聊天 +│ │ │ │ ├── config.mts # 配置管理 +│ │ │ │ ├── server.mts # 服务器控制 +│ │ │ │ └── workspace.mts # 工作区管理 +│ │ │ └── utils/ # CLI工具函数 +│ │ ├── src/workspace/ # 工作区管理 +│ │ ├── src/command.mts # API命令层 +│ │ └── src/mcp/ # MCP协议实现 +│ └── electron/ # Electron桌面应用 +``` + +### 全局配置目录 +``` +~/Documents/HyperChat/ + .hyperchat/ + ├── mcp.json // 全局主控程序 (MCP) 配置文件 + ├── agents/ + │ ├── agent1-key/ + │ │ ├── memory.md # Agent记忆 + │ │ ├── sub_agents/ # 子代理文件夹(类似 agents 文件夹) + │ │ ├── agent.yaml # Agent配置 + │ │ └── chatlogs/ # 聊天记录文件夹 + │ │ ├── chat1.yaml + │ │ ├── chat2.yaml + │ │ └── ... + │ └── ... + ├── tasks/ // 任务文件夹 + │ ├── task1.yaml # 单个任务的定义文件 + │ ├── task2.yaml + │ └── ... + └── ... +``` + +### 项目工作区结构 +``` +/projects/ + project1/ + .hyperchat/ + ├── mcp.json // 全局主控程序 (MCP) 配置文件 + ├── ai_models.json // AI 模型配置文件,包含所有可用的 AI 模型信息 + ├── agents/ + │ ├── agent1-name/ + │ │ ├── memory.md # Agent记忆 + │ │ ├── sub_agents/ # 子代理文件夹(类似 agents 文件夹) + │ │ ├── agent.yaml # Agent配置 + │ │ └── chatlogs/ # 聊天记录文件夹 + │ │ ├── chat1.yaml + │ │ ├── chat2.yaml + │ │ └── ... + │ └── ... + ├── tasks/ // 任务文件夹 + │ ├── task1.yaml # 单个任务的定义文件 + │ ├── task2.yaml + │ └── ... + └── ... +``` + +## 📝 项目记忆 + +### 已完成功能 +- [x] AI请求改造:从web浏览器前端改为在nodejs环境中通过ai库发请求,代码在packages/shared/src/ai.mts,前后端共用 +- [x] 工作区概念实现:支持在不同工作区之间隔离数据和配置,支持显示当前工作区文件夹(树状),agent等配置作为文件保存在.hyperchat目录下 +- [x] 核心工作区管理类实现:workspace.mts, workspaceManager.mts +- [x] Schema2Form组件系统:支持JSON Schema转Ant Design表单,包括双模式编辑(表单/JSON)和Monaco编辑器集成 +- [x] AI配置管理系统:支持多提供商管理、模型配置、API Key管理,集成到应用设置中 +- [x] 应用设置系统:采用Schema驱动的UI生成,支持复杂对象、数组、条件schema等 +- [x] CLI架构重构:从HTTP API改为直接导入core模块,并集成到core包中 +- [x] Workspace配置合并逻辑:在workspace.mts中实现了智能工作区检测和配置合并 +- [x] CLI集成到Core包:简化架构,提升性能,统一构建流程 +- [x] CLI bug修复和简化 (2024-07-12):修复agent显示undefined问题,简化命令结构,提升代码质量 + +### 架构优势 +- **分离关注点**: JSON Schema 与业务逻辑分离,shared 包独立维护 +- **统一管理**: 所有 Schema 集中在 `packages/shared/src/jsonSchemas` 目录 +- **数据管理**: 所有管理器类集中在 `data` 目录 +- **类型安全**: 保持完整的 TypeScript 类型支持,跨包类型共享 +- **前端集成**: Schema2Form 自动生成 UI 界面 +- **构建效率**: npm workspaces 避免依赖重复,统一的构建管理 +- **架构简化**: CLI集成到core包,减少包管理复杂性 + +### 🎯 最新更新日志 + +#### 2024-07-13 工作区任务管理系统完整实现 (已完成) +**核心功能**: +- ✅ 完整的任务管理系统:支持创建、编辑、启用/禁用、删除、克隆、手动触发 +- ✅ TaskManager 类:基于YAML文件存储,支持完整的 CRUD 操作和统计 +- ✅ 工作区集成:任务管理器集成到 workspace.mts,自动创建 tasks 目录 +- ✅ 前端管理界面:TaskManagement.tsx 组件,支持可视化管理和 Cron 模板选择 +- ✅ CLI 命令支持:丰富的命令行接口(list/create/show/enable/disable/delete/edit/trigger/scheduler/stats) +- ✅ 后台任务调度:基于 node-cron 的自动定时执行,支持中国时区 +- ✅ Agent 集成:任务执行通过指定的 Agent,并记录到聊天历史 + +**架构设计**: +- ✅ 基于 taskSchema.mts 的完整类型安全,包含 Task/CreateTaskRequest/UpdateTaskRequest 类型 +- ✅ 统一的 Command 系统集成(taskCommands.mts) +- ✅ 前后端数据同步和状态管理 +- ✅ 工作区级别的任务隔离和统计 +- ✅ 智能调度器管理:任务启用/禁用时自动更新调度状态 +- ✅ TypeScript 完整类型安全:修复所有编译错误,确保类型一致性 + +#### 2024-07-13 新增 `hyperchat run` 核心服务命令 +**新增功能**: +- ✅ `hyperchat run` 命令:启动核心服务但不启动 HTTP 服务器 +- ✅ 适用场景:后台运行、定时任务执行、服务器环境中不需要 Web 界面的场景 +- ✅ 完整的资源管理:自动初始化工作区、启动 MCP 客户端、启动任务调度器 +- ✅ 优雅退出处理:支持 SIGINT/SIGTERM/SIGQUIT 信号,自动清理资源 +- ✅ 运行状态显示:启动时显示工作区统计信息和调度状态 +- ✅ 进程保持:通过事件循环保持前台运行,直到收到退出信号 + +**技术实现**: +- ✅ 新增 `packages/core/src/cli/commands/run.mts` 实现核心逻辑 +- ✅ 集成到 CLI 主入口和帮助系统 +- ✅ 支持 `--workspace` 参数指定工作区路径 +- ✅ 支持 `--verbose` 和 `--quiet` 日志控制 +- ✅ 异常处理和未捕获异常监听 + +#### 2024-07-13 工作区初始化两阶段优化 🚀 +**核心问题**: +- 原有 `workspace.init()` 方法集成了太多操作,导致启动时间过长 +- 无法快速获取工作区基本信息,用户体验不佳 +- 服务启动失败时难以定位是配置问题还是服务问题 + +**优化方案**: +- ✅ **两阶段初始化架构**: `initialize()` + `start()` 替代单一的 `init()` +- ✅ **第一阶段 - 快速配置加载**: 目录创建、设置管理器、任务管理器、Agent 管理器、基本配置 +- ✅ **第二阶段 - 重量级服务启动**: MCP 客户端(网络连接)、任务调度器 +- ✅ **状态管理系统**: `WorkspaceState` 枚举跟踪初始化进度 +- ✅ **向后兼容**: 保留 `init()` 方法,内部调用两阶段方法 +- ✅ **API 简化**: 移除冗余的 `isReady()` 方法,`isStarted()` 已足够 +- ✅ **WorkspaceManager 同步优化**: 添加 `autoStart` 参数,支持两阶段 + 完整状态查询 + +**两层架构设计**: +- `WorkspaceManager.initialize(path, autoStart=false)` → `Workspace.initialize()` +- `WorkspaceManager.start()` → `Workspace.start()` +- `WorkspaceManager.init(path)` → 完整初始化(向后兼容) + +**状态管理**: +- `UNINITIALIZED` → `INITIALIZED` → `STARTED` → `STOPPING` → `STOPPED` +- 提供 `isInitialized()`, `isStarted()` 等状态查询方法 +- 防止重复初始化和状态错误 + +**使用场景分类**: +```typescript +// 🚀 场景 1: 快速查询(只需配置) +await workspaceManager.initialize(); // agent list, task list +const agents = workspace.getAgents(); + +// 🔥 场景 2: 完整服务(需要网络连接) +await workspaceManager.initialize(); // hyperchat run +await workspaceManager.start(); // task trigger, MCP 调用 + +// 🔧 场景 3: 向后兼容(一步完成) +await workspaceManager.init(); // 现有代码迁移 +``` + +**用户体验提升**: +- 🚀 配置加载速度提升 70-90%(避免 MCP 网络连接,Agent 扫描已优化到第一阶段) +- 📊 渐进式信息展示:第一阶段即可显示 Agent 信息,第二阶段完成 MCP 连接 +- 🔧 更好的错误定位:分阶段错误提示,区分配置错误和网络连接错误 +- ⚡ `hyperchat run` 命令展示两阶段启动过程 +- 🎯 智能场景适配:查询命令快速响应,服务命令完整启动 + +#### 2024-07-12 CLI修复和简化 +**问题修复**: +- ✅ 修复agent列表显示"undefined (undefined)"的bug +- ✅ 修复ES模块导入问题,避免使用CommonJS require +- ✅ 修复TypeScript类型错误,添加正确的类型断言 + +**功能简化**: +- ✅ 简化server命令:只保留`start`,移除`stop`和`status` +- ✅ 简化workspace命令:只保留`create`,移除`list/info/current/switch` +- ✅ 遵循项目TypeScript编码规范:避免动态导入和别名导入 + +**用户体验提升**: +- ✅ 增强agent列表显示:显示模型信息和聊天记录数量 +- ✅ 添加工作区资源统计:在chat命令中显示agent和MCP工具数量 +- ✅ 优化帮助文档:更新命令说明,移除废弃功能 + +这次更新进一步简化了CLI架构,符合"每个目录CLI会话独立"的设计理念,提升了用户体验和代码质量。 + +## 🚀 HyperChat 开发最佳实践流程 + +### 📋 标准化功能开发流程 (推荐采用) + +基于工作区任务管理系统的成功实现,我们总结出以下高效的开发流程: + +#### 1️⃣ **Schema 定义阶段** +```typescript +// packages/shared/src/zodSchemas/featureSchema.mts +export const FeatureSchema = z.object({ + // 定义数据结构 + // 包含验证规则、默认值、类型导出 +}); +``` +- ✅ 使用 Zod 定义完整的数据 schema +- ✅ 包含验证函数、默认值、类型导出 +- ✅ 确保前后端类型一致性 + +#### 2️⃣ **Data Manager 实现阶段** +```typescript +// packages/core/src/data/managers/featureManager.mts +export class FeatureManager { + // 实现完整的 CRUD 操作 + // 基于 schema 的类型安全 +} +``` +- ✅ 创建专门的管理器类 +- ✅ 实现完整的业务逻辑和数据持久化 +- ✅ 基于 Zod schema 进行数据验证 + +#### 3️⃣ **后端逻辑集成阶段** +```typescript +// packages/core/src/workspace/workspace.mts +// packages/core/src/commands/featureCommands.mts +``` +- ✅ 集成到工作区系统 (workspace.mts) +- ✅ 创建对应的命令模块 (featureCommands.mts) +- ✅ 更新统一的 Command 系统 + +#### 4️⃣ **Web 前端界面阶段** +```typescript +// packages/web/src/components/FeatureManagement.tsx +// packages/web/src/pages/workspace/types.ts +``` +- ✅ 创建管理组件,支持完整的 UI 操作 +- ✅ 集成到工作区面板系统 +- ✅ 实现前后端数据同步 + +#### 5️⃣ **CLI 前端命令阶段** +```typescript +// packages/core/src/cli/commands/feature.mts +// packages/core/src/cli/index.mts +``` +- ✅ 实现丰富的命令行接口 +- ✅ 集成到 CLI 主系统 +- ✅ 提供完整的参数解析和错误处理 + +### 🎯 流程优势 +- **类型安全**: 从 schema 到前后端的完整类型覆盖 +- **代码复用**: schema 和 manager 逻辑在前后端共享 +- **一致性**: 统一的开发模式和架构设计 +- **可维护性**: 清晰的分层和职责划分 +- **扩展性**: 易于添加新功能模块 + +### 待办事项 +- [x] **工作区初始化优化** (2024-07-13 完成):实现两阶段初始化,提升启动速度和用户体验 +- [ ] 基于此流程实现其他功能模块 +- [ ] 减少any使用,多使用packages/shared/src/types.mts定义的类型 +- [ ] 完善 Schema2Form 组件的单元测试 +- [ ] 优化 AI 配置管理的性能,考虑大量模型时的加载优化 +- [ ] 为 WorkspaceSettings 添加前端配置界面 +- [ ] 考虑在其他管理器中应用两阶段初始化模式(AgentManager、TaskManager 等) +- [ ] 添加工作区状态的前端显示和监控 +- [ ] 考虑在 Electron 中集成 CLI 功能 +- [ ] 优化 MCP 工具性能和错误处理 +- [ ] 添加 CLI 命令的单元测试和集成测试 +- [ ] 优化 workspace create 功能,确保在各种环境下正常工作 + +## 开发小技巧 + +### 构建优化 +* 以后不用build构建,运行typecheck就好了,不然太久了 + + + 1. 前端先调用 POST /api/chat/stream 获取 sessionId + 2. 前端用 sessionId 建立 SSE 连接 GET /api/chat/stream/:sessionId + 3. 前端再次调用 POST /api/chat/stream 开始聊天 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0de7ef1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,38 @@ +# Open Source License + +© 2024 Liao Donghuo. + +HyperChat is licensed under the Apache License 2.0, with the following additional conditions: + +1. HyperChat may be utilized commercially, including as a backend service for other applications or as an application development platform for enterprises. Should the conditions below be met, a commercial license must be obtained from the producer: + +a. Multi-user service: Unless explicitly authorized by HyperChat in writing, you may not use the HyperChat source code to operate a multi-user environment. + - User Definition: Login and register + +b. LOGO and copyright information: In the process of using HyperChat's frontend, you may not remove or modify the LOGO or copyright information in the HyperChat console or applications. This restriction is inapplicable to uses of HyperChat that do not involve its frontend. + - Frontend Definition: For the purposes of this license, the "frontend" of HyperChat includes all components located in the `web/` directory when running HyperChat from the raw source code, or the "web" image when running HyperChat with Docker. + +Please contact 0laopo0@gmail.com by email to inquire about licensing matters. + +2. As a contributor, you should agree that: + +a. The producer can adjust the open-source agreement to be more strict or relaxed as deemed necessary. +b. Your contributed code may be used for commercial purposes, including but not limited to its cloud business operations. + +Apart from the specific conditions mentioned above, all other rights and restrictions follow the Apache License 2.0. Detailed information about the Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0. + +The interactive design of this product is protected by appearance patent. + +---------- + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2d2ece8 --- /dev/null +++ b/README.md @@ -0,0 +1,493 @@ +# HyperChat 中文文档 + +# HyperChat + +> 🌟 **本地 AI Agent 平台** - 首创 AI as Code 理念,让每个项目都有专属的 AI 大脑 + +HyperChat 是一个革命性的**本地 AI Agent 平台**,通过**配置文件驱动**的方式,让 AI 能力完全本地化、可迁移、可版本控制。告别云端依赖,拥有真正属于自己的项目级 AI 专家。 + +### 🎯 核心特色 +- 🏠 **完全本地化**:数据不出本地,隐私安全可控 +- 🧠 **Agent记忆**:AI Agent 理解并记住你的项目上下文 +- 📁 **配置即代码**:所有 AI 能力通过文件配置,支持 Git 管理 +- 🔧 **深度工具集成**:MCP 协议支持,可直接操作本地文件系统 +- 📦 **一键迁移**:完整的 `.hyperchat/` 配置目录,随项目迁移 +- 📂 **多@文件路径**:智能识别多个文件引用,支持复杂文件操作 ✨**新功能** +- 🎯 **Agent自定义命令**:Markdown模板驱动的快捷命令系统 ✨**新功能** + +[![Build](https://github.com/BigSweetPotatoStudio/HyperChat/actions/workflows/build.yml/badge.svg)](https://github.com/BigSweetPotatoStudio/HyperChat/actions/workflows/build.yml) +[![@dadigua/hyperchat](https://img.shields.io/npm/v/%40dadigua%2Fhyperchat)](https://www.npmjs.com/package/@dadigua/hyperchat) +[![npm downloads](https://img.shields.io/npm/dm/@dadigua/hyperchat)](https://npm-stat.com/charts.html?package=@dadigua/hyperchat) + +## 🎯 项目愿景 + +**[HyperChat 1.0](./archive/README.1.md)** 是一个完全手工编写的项目,正在迁移到2.0。 + +**HyperChat 2.0** 大家一起 **Vibe Coding**,欢迎使用 Claude Code 和 GitHub Copilot 等 AI 工具一起开发。 + +## 🎯 双层架构设计 + +> **创新的双模式架构** - 根据不同使用场景优化用户体验 + +### 🌐 Web 前端:多工作区协作中心 +**设计理念**:项目级协作,统一资源管理 + +- **🗂️ 多工作区标签页管理**:同时打开多个项目工作区,一键切换 +- **👥 团队协作优化**:工作区级别的 Agent 集合、MCP 服务池 +- **📊 可视化管理界面**:图形化配置、实时监控、数据统计 +- **💼 适用场景**:项目开发、团队协作、工作区管理、可视化操作 + +### 💻 CLI 前端:Agent 优先快速交互 +**设计理念**:Agent 中心化,极速启动单个智能体 + +- **⚡ 快速启动**:直接选择 Agent,从工作区按需加载 MCP 工具 +- **🎯 专注对话**:Agent 专属记忆、上下文、聊天历史 +- **🔧 灵活工具链**:Agent 内置 MCP 工具,回退到工作区共享资源 +- **🚀 适用场景**:快速对话、自动化脚本、命令行工作流、CI/CD 集成 + +### 📋 架构对比 + +| 功能特性 | 🌐 Web 多工作区模式 | 💻 CLI Agent 优先模式 | +|---------|---------------------|----------------------| +| **核心理念** | +| 设计中心 | 🗂️ 工作区协作中心 | 🤖 Agent 直接交互 | +| 资源管理 | 工作区统一 MCP 池 | Agent按需启动MCP | +| 使用方式 | 多标签页并发管理 | 单 Agent 快速启动 | +| **界面体验** | +| 界面风格 | 🖥️ 现代 Web 界面 | 📟 命令行 + 🎨 TUI | +| 交互模式 | 鼠标点击 + 表单操作 | 键盘输入 + 命令参数 | +| 实时更新 | ✅ SSE 流式推送 | ✅ 终端流式输出 | +| **适用场景** | +| 主要用途 | 项目开发、团队协作 | 快速对话、脚本集成 | +| 使用环境 | 桌面浏览器、开发 IDE | 终端、服务器、CI/CD | +| 工作流程 | 长期项目管理 | 临时对话处理 | + +## 🚀 快速体验 + +### ⌨️ 命令行快速启动 +```bash +# 全局安装 +npm install -g @dadigua/hyperchat + +# 或直接运行 +npx -y @dadigua/hyperchat +``` + +**快速配置环境变量**: +```bash +# 基础配置 - 设置默认 AI 模型 +export HyperChat_API_KEY=your-api-key # API 密钥 +export HyperChat_API_URL=your-api-url # API 端点 URL +export HyperChat_AI_Provider=openai # AI 提供商 (openai/claude/gemini/kimi/qwen等) +export HyperChat_AI_Model=gpt-4o # 默认模型名称 + +# 然后直接使用 +hyperchat "你好,世界!" # 使用配置的默认模型 +``` + +### 🌐 Web 多工作区模式使用示例 +```bash +# 启动多工作区 Web 界面 +hyperchat serve # 访问: http://localhost:16100 + +# Web 界面功能特色: +# ✅ 多工作区标签页管理 +# ✅ 每个标签页独立的 Agent 集合、MCP 服务、聊天记录 +# ✅ 可视化配置和实时监控 +# ✅ 团队协作和项目管理 +``` + +### 💻 CLI Agent 优先模式使用示例 +```bash +# 🚀 Agent 优先快速启动 - 核心特色 +hyperchat agent list # 发现可用 Agent(全局 + 工作区) +hyperchat agent mybot "你好" # 🎯 直接启动 Agent,按需加载 MCP +hyperchat agent mybot chat # 🎯 Agent 专属对话会话 + +# 快速 AI 聊天(使用默认 Agent) +hyperchat "你好,今天怎么样?" # 直接与默认模型聊天 +hyperchat chat "写一个 Python 脚本" # 聊天命令 +hyperchat chat # 交互式聊天模式 + +# 📁 智能文件处理 - 多@符号支持 ✨新功能 +hyperchat "分析 @./src/index.ts 的代码质量" +hyperchat "对比 @./package.json 和 @./yarn.lock" +hyperchat "请比较 @./src/components/ 和 @./docs/ 的结构" + +# 🎯 Agent自定义命令 - 快捷输入专业提示词 ✨新功能 +hyperchat agent coder "/bug-fix @./src/login.ts 登录功能异常" +hyperchat agent coder "/review @./src/api/user.js" +hyperchat agent coder "/optimize 这段代码性能不好" + +# Agent 管理(在当前工作区或全局) +hyperchat agent create mybot # 创建新 Agent +hyperchat agent delete mybot # 删除 Agent + +# 工作区管理 +hyperchat workspace create # 在当前目录创建工作区 + + +# 全局选项和工作区指定 +hyperchat chat --workspace /path/to/project # 使用特定工作区 +hyperchat --verbose chat "你好" # 详细日志 +hyperchat --help # 显示帮助 + +# CLI 模式优势: +# ⚡ Agent 直接启动,无需切换界面 +# 🔧 按需从工作区加载 MCP 工具 +# 💾 Agent 专属记忆和聊天历史 +# 🚀 适合脚本集成和自动化 +``` + +### 🔄 双模式协同工作 +```bash +# 场景1:开发时 Web +hyperchat serve # 启动 Web 界面管理项目 + +# 场景2:CI/CD 自动化使用 CLI +hyperchat agent test-runner "运行所有测试并生成报告" + +# 场景3:团队协作使用 Web +# 在 Web 界面中管理多个项目工作区,配置共享的 Agent 和 MCP 服务 +``` + + +### 🔧 环境变量配置 + +HyperChat 2.0 实现了强大的**5层优先级环境变量系统**,让配置管理更加灵活: + +**优先级顺序**(从低到高): +1. **默认值** - 代码中的内置默认配置 +2. **process.env** - 系统环境变量 +3. **全局 .env** - `~/Documents/HyperChat/.env` +4. **工作区 .env** - 项目目录下的 `.env` 文件 +5. **CLI 参数** - 命令行传入的参数(最高优先级) + +**支持的核心环境变量**: +```bash +# 快速配置 - 默认 AI 模型 +HyperChat_API_KEY=your-api-key # 默认 API 密钥 +HyperChat_API_URL=your-api-url # 默认 API 端点 +HyperChat_AI_Provider=openai # 默认 AI 提供商 +HyperChat_AI_Model=gpt-4o # 默认模型名称 + + +# 服务配置 +HYPERCHAT_WEB_PASSWORD=your-web-password # Web 界面访问密码 +HYPERCHAT_PORT=16100 # Web 服务端口 +HYPERCHAT_HOST=localhost # 服务绑定地址 + +# 界面配置 +HYPERCHAT_LANGUAGE=zh # 界面语言 (zh/en) +HYPERCHAT_LOG_LEVEL=info # 日志级别 + +# 自定义 API 端点 +HYPERCHAT_OPENAI_BASE_URL=https://api.openai.com/v1 +HYPERCHAT_CLAUDE_BASE_URL=https://api.anthropic.com +``` + +**使用示例**: +```bash +# 方式1:快速配置默认模型 +export HyperChat_API_KEY=sk-1234567890 +export HyperChat_AI_Provider=openai +export HyperChat_AI_Model=gpt-4o +hyperchat "你好" # 直接使用默认配置 + +# 方式2:Web 服务配置 +export HYPERCHAT_WEB_PASSWORD=mypassword +hyperchat serve + +# 方式3:项目 .env 文件 +echo "HyperChat_API_KEY=your-key" > .env +echo "HyperChat_AI_Provider=claude" >> .env +hyperchat chat + +# 方式4:CLI 参数(最高优先级) +hyperchat serve --password=clipass + +# 方式5:全局配置文件 +echo "HyperChat_API_KEY=global-key" > ~/Documents/HyperChat/.env +echo "HyperChat_AI_Provider=gemini" >> ~/Documents/HyperChat/.env +``` + + + +## 🛠️ 技术架构 + +### 🎯 双层架构技术实现 + +HyperChat 2.0 采用**双层架构设计**,根据不同使用场景提供最优化的体验: + +#### 🌐 Web 层:工作区中心架构 +```typescript +// Web 前端:工作区统一 MCP 管理 +const workspace = workspaceManager.get(workspacePath); +const mcpManager = workspace.getMcpManager(); +const client = mcpManager.getClient(clientName); +``` + +**技术特点**: +- 🗂️ **多工作区并发管理**:`WorkspaceManager-enhanced` 支持多个工作区实例缓存 +- 🔌 **工作区级 MCP 服务池**:统一的 MCP 客户端管理 +- 📊 **实时数据同步**:SSE 流式推送,多标签页独立状态管理 +- 🔄**配置合并机制**:全局配置 + 工作区配置的智能合并 + +#### 💻 CLI 层:Agent 优先架构 +```typescript +// CLI 前端:Agent 专属 MCP 访问 +const agentInstance = workspace.getAgentInstance(agentName); +const client = agentInstance.getMCPClient(clientName); +// 回退到工作区共享 MCP(如果需要) +``` + +**技术特点**: +- ⚡ **Agent 直接启动**:省略工作区初始化,直接访问 Agent 实例 +- 🔧 **工具链按需加载**:从 Agent 内置工具到工作区共享资源的渐进式加载 +- 💾 **专属上下文**:Agent 独立记忆、聊天历史、配置管理 +- 🚀 **极速响应**:无 UI 渲染开销,适合脚本和自动化 + + +``` +HyperChat 双层架构/ +├── packages/ +│ ├── shared/ # 共享代码和类型定义 +│ ├── core/ # Node.js 核心服务 + CLI Agent 优先层 +│ │ ├── src/cli/ # 💻 CLI Agent 直接交互层 +│ │ ├── src/workspace/ # 双层工作区管理系统 +│ │ │ ├── workspaceManager-enhanced.mts # 🌐 多工作区并发管理 +│ │ ├── src/mcp/ # MCP 协议实现 +│ │ └── src/commands/ # Web API 命令系统 +│ ├── web/ # 🌐 React Web 多工作区层 +│ │ ├── src/pages/workspace/ # 多工作区管理组件 +│ │ │ ├── WorkspaceManage.tsx # 多标签页管理器 +│ │ │ └── workspace.tsx # 单工作区实例组件 +│ │ └── src/hooks/useChatStream.ts # workspacePath 参数化 +│ └── electron/ # Electron 应用封装 +└── docs/ # 双层架构文档 +``` + +### 💼 双层架构配置管理 + +``` +🌐 Web 多工作区模式配置: +项目目录/ +├── .hyperchat/ # 工作区统一配置目录 +│ ├── mcp.json # 🔌 工作区级 MCP 服务池 +│ ├── ai_models.json # 🤖 工作区 AI 模型配置 +│ ├── .env # 工作区环境变量 +│ └── agents/ # 🗂️ 工作区 Agent 集合 +│ ├── project-assistant/ # 项目专用 Agent +│ │ ├── agent.yaml # Agent 配置 +│ │ ├── memory.md # 项目上下文记忆 +│ │ └── chatlogs/ # 团队对话历史 +│ └── code-reviewer/ # 代码审查 Agent +├── .git/ # 版本控制 +└── package.json # 项目配置 + +💻 CLI Agent 优先模式访问: +全局配置/ +~/Documents/HyperChat/ + .hyperchat/ + ├── mcp.json # 🌍 全局 MCP 服务池 + ├── .env # 全局环境变量 + └── agents/ # 🚀 全局 Agent 库 + ├── personal-assistant/ # 个人助手 Agent + │ ├── agent.yaml # Agent 配置 + │ ├── memory.md # 个人上下文记忆 + │ └── chatlogs/ # 个人对话历史 + └── code-expert/ # 专业代码 Agent +``` + +**双层配置的核心优势**: +- 🌐 **Web 模式**:工作区中心化,适合项目级管理和团队协作 +- 💻 **CLI 模式**:Agent 中心化,支持跨项目的个人工具使用 +- 🔄 **智能合并**:全局配置 + 工作区配置的 5 层优先级管理 +- 💾 **数据隔离**:项目级和个人级数据完全分离,互不干扰 + +``` + +## 🌟 AI as Code 的革命性优势 + +### 🔄 双层架构下的智能管理 + +#### 🌐 Web 模式:团队协作版本控制 +```bash +# 📁 项目级 AI 配置版本管理 +git add .hyperchat/agents/project-assistant/ +git commit -m "添加项目专用 AI 助手" +git push origin feature/project-ai + +# 👥 团队 AI 最佳实践分享 +git clone https://github.com/team/ai-workspace-templates.git +cp -r ai-workspace-templates/react-fullstack/.hyperchat ./ + +# 🔄 项目 AI 配置回滚 +git checkout HEAD~1 -- .hyperchat/ +``` + +#### 💻 CLI 模式:个人工具管理 +```bash +# 🚀 快速部署个人 Agent +hyperchat agent create personal-coder --template ~/ai-templates/ + +# 🌍 跨项目使用个人 Agent +cd /project-a && hyperchat agent personal-coder "分析这个项目" +cd /project-b && hyperchat agent personal-coder "分析这个项目" + +# 💾 Agent 记忆和上下文自动切换 +# personal-coder 会记住不同项目的特点和上下文 +``` + + + +### Agent 配置与自定义命令 ✨**新功能** + +#### Agent 基础配置 +```yaml +# .hyperchat/agents/project-assistant/agent.yaml +name: "项目助手" +description: "专门为本项目设计的 React + Node.js 全栈助手" +modelKey: "claude-3-5-sonnet" +isConfirmCallTool: false +# 🔌 使用工作区级 MCP 服务池 +allowMCPs: ["filesystem", "git", "npm", "database"] +prompt: | + 你是本项目的专属 AI 助手,熟悉: + - 项目架构:React + TypeScript + Node.js + - 业务领域:电商平台开发 + - 团队规范:ESLint + Prettier + Jest + + 请基于项目上下文提供专业建议。 +tags: ["project", "fullstack", "ecommerce"] +``` + +#### Agent 自定义命令目录结构 ✨**新功能** +``` +.hyperchat/agents/project-assistant/ +├── agent.yaml # Agent 配置 +├── memory.md # Agent 记忆 +├── commands/ # 🎯 自定义命令目录 +│ ├── bug-fix.md # 修复bug命令 +│ ├── review.md # 代码审查命令 +│ ├── explain.md # 代码解释命令 +│ ├── test.md # 测试用例命令 +│ ├── optimize.md # 代码优化命令 +│ └── document.md # 文档生成命令 +└── chatlogs/ # 聊天记录 +``` + +#### 命令模板示例(纯Markdown) +```markdown +# commands/bug-fix.md +请帮我修复以下代码中的bug: + +$ARG + +要求: +1. 仔细分析问题的根本原因 +2. 提供详细的修复方案 +3. 给出修复后的完整代码 +4. 解释修复的原理和最佳实践 +5. 提供预防类似问题的建议 +``` + +```markdown +# commands/review.md +请对以下代码进行全面的code review: + +$ARG + +Review要点: +1. **代码质量**:可读性、维护性、命名规范 +2. **性能问题**:算法效率、内存使用、潜在瓶颈 +3. **安全隐患**:输入验证、权限控制、数据泄露风险 +4. **最佳实践**:设计模式、架构原则、团队规范 +5. **改进建议**:具体的优化方案和替代实现 + +请提供具体的修改建议和代码示例。 +``` + +#### 使用示例 +```bash +# 使用自定义命令进行bug修复 +hyperchat agent project-assistant "/bug-fix @./src/login.ts 用户登录后跳转异常" + +# 实际发送给AI的内容: +# 请帮我修复以下代码中的bug: +# @./src/login.ts 用户登录后跳转异常 +# 要求: +# 1. 仔细分析问题的根本原因 +# 2. 提供详细的修复方案 +# 3. 给出修复后的完整代码 +# 4. 解释修复的原理和最佳实践 +# 5. 提供预防类似问题的建议 + +# 使用代码审查命令 +hyperchat agent project-assistant "/review @./src/components/UserProfile.tsx" + +# 在交互式聊天中使用 +hyperchat agent project-assistant chat +> /bug-fix 这个函数有内存泄漏问题 +> /optimize @./src/utils/dataProcessor.js +``` + +```yaml +# ~/Documents/HyperChat/.hyperchat/agents/personal-coder/agent.yaml +name: "个人编程助手" +description: "跨项目的通用编程助手,支持多种技术栈" +modelKey: "gpt-4o" +isConfirmCallTool: true +# ⚡ Agent 专属 MCP 工具 + 回退到工作区 +allowMCPs: ["terminal", "browser", "calculator"] +prompt: | + 你是我的个人编程助手,擅长: + - 多语言开发:Python, JavaScript, Go, Rust + - 架构设计和代码审查 + - 快速原型开发和问题解决 + + 根据不同项目的上下文调整回答风格。 +tags: ["personal", "general", "cross-project"] +``` + + + +### 🤖 AI 模型推荐 +| 模型提供商 | 推荐程度 | 特色功能 | +|------------|----------|----------| +| Claude | ⭐⭐⭐⭐⭐⭐ | 最强 | +| Kimi k2 | ⭐⭐⭐⭐⭐ | 很不错 | + + +## 🔧 开发指南 + +### 💻 本地开发 +```bash +# 克隆项目 +git clone https://github.com/BigSweetPotatoStudio/HyperChat.git +cd HyperChat + +# 安装依赖 +npm install +cd packages/electron && npm install +cd packages/web && npm install +cd ../.. + +# 启动开发服务器 +npm run dev + + + +## 🤝 社区交流 + +- [Telegram](https://t.me/dadigua001) +- [QQ 群](https://qm.qq.com/cgi-bin/qm/qr?k=KrNWdu5sp7H3ves3ZPSd7ppKjQiPrAvZ&jump_from=webapi&authKey=xnW+Lcgk5KLh5NPh3lU0ddz9CFDbXgvjEy35wsYipUrCsqXFcqlvM5Yorh6jkGim) + +## 📄 免责声明 + +本项目仅供学习交流使用。使用本项目进行的任何操作(如爬虫行为等)与项目开发者无关。 + +## 📜 许可证 + +本项目采用开源许可证,详情请查看 [LICENSE](LICENSE) 文件。 + diff --git a/archive/ChangeLog.1.md b/archive/ChangeLog.1.md new file mode 100644 index 0000000..f2f1301 --- /dev/null +++ b/archive/ChangeLog.1.md @@ -0,0 +1,252 @@ +[中文](ChangeLog.zh.md) | [English](ChangeLog.md) + + +``` +# 1.7.2 + +* Added terminal display, manual command input + AI model via `hyper_terminal` MCP tool +* Fixed bugs + +![image](https://github.com/user-attachments/assets/70da7e2b-5555-4611-863c-f71ded3432b2) +![7ec10af4a0474fbb3ed39e13a383bc3a](https://github.com/user-attachments/assets/0ba16d29-136c-4788-91d8-8c8dbc754716) +![b6042f845409bddbcd6ad3f712f27216](https://github.com/user-attachments/assets/62549b1c-4e27-40fb-b877-b9a4be157778) + + +# 1.7.0 + +* Improved tool compatibility for Gemini +* Fixed the tool selection count error for some MCP tools +* HyperTool, fetch tool will automatically scroll (some data is lazy-loaded and requires scrolling to trigger it), search tool speed enhancement +* Modified variable prefix naming, changing scope to namespace +* Electron version, added settings for startup window size +* Node.js version, added network settings to allow direct connection via local browser +* Fixed bugs + +![image](https://github.com/user-attachments/assets/5c51c083-4ed8-4961-af62-ec34eba3e08e) +![image](https://github.com/user-attachments/assets/943e454e-8506-4a87-a486-d5f465b470f1) +![image](https://github.com/user-attachments/assets/b958bf63-add2-434a-a8e1-405ee1c773d9) + + +# 1.6.5 + +* Fixed tool invocation issues for models like Qwen3, added compatibility mode for tool invocation similar to cline, using regex to match +* View repair task results interface, display abnormal issues +* Fixed bugs + +# 1.6.3 +* Brand new input editor, optimized display, added variable system, supports built-in MCP setting variables, supports JS code variables +* Large model list, supports filtering, optimized display +* Fixed issues with inputting prompts compatible with MCP +* Agent list supports hover descriptions +* WebDAV synchronization optimization +* See MCP supports adding headers +* Chat history performance optimization, using virtual list + display optimization + + +![image](https://github.com/user-attachments/assets/b2c9d59f-650f-49b8-a0ea-f0634644b27e) +![image](https://github.com/user-attachments/assets/3452890a-864b-4ea7-84d4-505bd1821fdc) +![image](https://github.com/user-attachments/assets/6b91d593-51ef-4e51-8d1b-324bc071e9a7) + +# 1.5.4 +* Fixed issues with web access, added large model test failure problems. + +# 1.5.3 + +* Supports Claude official API +* Optimized built-in terminal, allowing user input +* Supports Agent task invocation failure, using alternative large model +* Added built-in Agent, `MCP helper`, to assist in MCP installation +* Fixed Markdown rendering bug +* Fixed bug for multi-model comparison in chat + +![image](https://github.com/user-attachments/assets/c450aea2-c3f2-4527-ae06-8bcaa928416c) +![image](https://github.com/user-attachments/assets/7094cef7-e6f2-452e-9a1d-59871d146364) +![image](https://github.com/user-attachments/assets/5ebf05c7-007e-4eee-9b98-df5662b54f62) + +# 1.5.0 +* Supports chat renaming +* Supports MCP configuration synchronization +* Supports grok3 thinking chain +* Supports AI-generated cron expressions +* Supports message fork cloning +* Supports development mode, quick export of conversation configurations for debugging +* Added enable/disable switch for Claude's MCP +* Added global control enable/disable switch for Task execution +* Optimized tool invocation cancellation, notifying large model users of operation cancellation + +![支持聊天重命名](https://github.com/user-attachments/assets/9e178d72-2446-4d63-a1ac-ac0299a3d0a4) +![支持mcp配置同步](https://github.com/user-attachments/assets/ecc4945d-3170-476f-b653-badecf972957) +![支持grok3的思维链](https://github.com/user-attachments/assets/6123221e-2646-4553-b8d4-16b49428c69a) +![支持ai生成cron表达式](https://github.com/user-attachments/assets/5855ed6e-d502-4913-a712-7a1d65b7722f) +![支持消息分叉克隆](https://github.com/user-attachments/assets/498d4e03-0555-4b9b-9838-ec46602fb501) +![支持开发模式,快速导出对话配置,用于调试](https://github.com/user-attachments/assets/124a6e1a-6436-4308-8475-9fb32b5e3f09) +![支持Task运行全局控制启用,禁用](https://github.com/user-attachments/assets/7537941a-1e2d-41a8-abb6-2569fe040067) +![支持开发模式,快速导出对话配置,用于调试](https://github.com/user-attachments/assets/9bfdf789-378e-43d7-bcdf-8a91c593fe16) +![工具调用取消优化,告诉大模型用户取消了操作](https://github.com/user-attachments/assets/8b1186b3-929f-4c86-95ce-50dbf2216f01) + + + +# 1.4.17 +* Fixed issue of unable to copy in MacOS, and other shortcut keys not working + +# 1.4.16 + +* Supports displaying MCP Server version number and name +* Added detailed error display when model errors occur +* Added detailed error display when MCP errors occur +* Optimized chat history storage, separating conversation messages to reduce loading and synchronization time +* Modified WebDAV synchronization +* Supports MCP in Claude Desktop configuration +* Supports direct viewing of configuration files on the web +* Supports shortcut keys: MACOS `Alt+Cmd+I`, Windows `Ctrl+Shift+I` to open developer tools +* Chat history list supports displaying Agent icons +* Fixed numerous bugs + +![image](https://github.com/user-attachments/assets/e00bb252-83a6-40ca-928a-3162859b0c27) +![image](https://github.com/user-attachments/assets/5378bba1-91f5-4d77-accf-544d9a09e909) +![image](https://github.com/user-attachments/assets/2b236af6-a0bc-453a-b08e-8f3627a5d392) +![image](https://github.com/user-attachments/assets/ca3cc911-bc6a-4560-aede-f34969190e91) +![image](https://github.com/user-attachments/assets/c69addb1-6a07-4fb8-8858-8851cfd31be6) +![image](https://github.com/user-attachments/assets/23717164-7177-4622-a4bd-bd2d13be1edf) + + +# 1.4.3 +* Rewrote markdown rendering, optimized `Artifacts`, supports opening from the browser, downloading, added support for `Mermaid` pre-release +* Modified tool invocation display +* Supports chat selection of multiple models for comparison + +![image](https://github.com/user-attachments/assets/b4b88d6c-da7f-4822-8ca7-a79c3d02b6a5) +![image](https://github.com/user-attachments/assets/d1b54fb3-e0d6-4999-9c89-879c8c095ab6) +![71afe79bd956c2b9f83d73e7c038be70](https://github.com/user-attachments/assets/13e81223-d00f-4100-8128-19adc262ce83) +![a1520e5ed245419b28c68a58184e1a56](https://github.com/user-attachments/assets/940a971e-cdb1-4824-8391-292217e9c1af) + + + + +# 1.4.4 + +* Fixed the default conversation setting MCP invalid issue from the last version +* Fixed that the Agent cannot modify system prompts if there has been no chat +* Fixed the error prompt of no LLM when opening for the first time + + +# 1.4.1 + +* Fixed the bug of Gemini tool invocation not supporting multiple tools +* Supports selecting some tools of MCP to save tokens +* Supports quick input with @ + calling Agent +* Fixed bugs +![image](https://github.com/user-attachments/assets/63ae6853-5df4-4b29-8bc9-c33d99239833) +![image](https://github.com/user-attachments/assets/6010494f-1218-4714-bbfe-8e61969a6826) + + +# 1.4.0 + +* Added built-in MCP tool command line +* Supports changing network access password +* Tool invocation collapsible display + +![8af53675c625ca34cfc4753a106e9462](https://github.com/user-attachments/assets/ef030a65-ba9e-4cd5-9ca8-669677b483be) +![image](https://github.com/user-attachments/assets/af1598b6-d912-4f04-8919-a3d3e1ed93bc) + +# 1.3.3 + +* Can confirm and modify large model invocation parameters when invoking tools +* Can click on tools to invoke them for testing +* The knowledge base is planned for redevelopment; currently, it is not recommended for use. You can use OpenAI's embedding model instead, without doing local embedding models +![886a04f531ca15ef1f6e93ea8403c0b7](https://github.com/user-attachments/assets/7c6eb1d4-7ba1-430b-8fca-18023f7dadd3) +![image](https://github.com/user-attachments/assets/fc87b507-8427-4157-a0f9-78d141299151) + + +# 1.2.15 + +* MCP loading progress display, added shortcut button +* Optimized mobile H5 display +* Fixed bugs +![image](https://github.com/user-attachments/assets/1c60e98f-f57b-4a38-9464-c7548c09cc3c) +![image](https://github.com/user-attachments/assets/d8ba028d-d091-40f3-82bb-40e6f6ba10de) +![image](https://github.com/user-attachments/assets/f53652cd-07f4-4f98-89d5-865213dc3fb5) + + +# 1.2.12 + +* Supports asking when invoking tools![image](https://github.com/user-attachments/assets/11c03c92-399e-457e-8000-ff00c3c1e059) +* Chat supports displaying time![image](https://github.com/user-attachments/assets/dba7bf09-99a1-46bd-9c94-052d18469b96) +* Hypetool optimization, settings![image](https://github.com/user-attachments/assets/cfc2c8e5-f7e7-4078-aaff-240b567f47c5) +* Add historyFilterType hover tip by @xtyuns in https://github.com/BigSweetPotatoStudio/HyperChat/pull/52 + + + +# 1.2.2 + +* Mac, Linux automatically gets PATH, no need to enter PATH +* Added Linux deb package +* Fixed WebDAV first synchronization error +* Fixed bugs + + +# 1.0.2 + +* Added temperature setting +* Fixed bugs +* Supports pasting in input box, uploading images + +# 0.2.0 + +* Added knowledge base + + +# 0.1.1 + +* Fixed MacOS image upload +* Added quick copy button, supports buttons for copying messages and code +* WebDAV sync function optimization, only saving 10 versions locally +* Markdown code rendering added highlighting +* HTML Artifacts added error capture, supports opening Chrome's console + + + +# 0.1.0 + +## HyperChat + +* Supports two installation methods: plugin market + MCP native installation, quick installation and configuration from the plugin market, welcome to submit plugins, [Github](https://github.com/BigSweetPotatoStudio/HyperChatMCP) +* WebDAV synchronization logic optimized, local backup before synchronization, synchronized every 5 minutes +* LLM added test function, testing whether it supports image input + tool invocation (using a bit of token) +* Chat supports inputting images +* Chat supports displaying images returned by Tool Call from MCP resources +* Fixed bugs + + + + +# 0.0.13 + +## HyperChat + +* Optimized the startup speed of MCP Server +* WebDAV synchronization, temporarily does not support MCP configuration synchronization, inconsistent operating systems may cause issues +* Supports setting request method, Stream | Complete +* Supports KaTeX for displaying mathematical formulas + +## HyperTools + +* Optimized the Tool for opening webpages + + + +# 0.0.11 + +## HyperChat + +* Bot display optimization, supports search and drag-and-drop sorting +* Conversation history supports filtering + searching +* For APIs that do not support counting token consumption for large models, such as Qianwen, support fuzzy statistics by word count +* Input box supports drag-and-drop file quick input +* My LLM Models list supports drag-and-drop sorting +* Supports quickly configuring Ollama and Qwen API models + +## HyperTools + +* Optimized the Tool for opening webpages, better information extraction. For example, answer this question `https://store.epicgames.com/zh-CN/ 哪个游戏是限时免费的?` +``` \ No newline at end of file diff --git a/archive/ChangeLog.1.zh.md b/archive/ChangeLog.1.zh.md new file mode 100644 index 0000000..df2b7ef --- /dev/null +++ b/archive/ChangeLog.1.zh.md @@ -0,0 +1,247 @@ +# 1.7.2 + +* 添加终端显示,手动输入命令 + AI模型 通过`hyper_terminal`MCP工具 输入命令 +* 修复bug + +![image](https://github.com/user-attachments/assets/70da7e2b-5555-4611-863c-f71ded3432b2) +![7ec10af4a0474fbb3ed39e13a383bc3a](https://github.com/user-attachments/assets/0ba16d29-136c-4788-91d8-8c8dbc754716) +![b6042f845409bddbcd6ad3f712f27216](https://github.com/user-attachments/assets/62549b1c-4e27-40fb-b877-b9a4be157778) + + +# 1.7.0 + +* 提升工具的兼容性,对于gemini的 +* 修复选择mcp的部分工具,显示已选择工具的计数错误。 +* HyperTool,fetch工具会自动滚动(有些数据是懒加载的,需要滚动触发),search工具提升速度。 +* 变量的前缀命名修改,scope改成namespace。 +* electron版本,添加启动窗口大小的设置。 +* nodejs版本,添加网络设置,允许通过本地浏览器直连。 +* fixbug + +![image](https://github.com/user-attachments/assets/5c51c083-4ed8-4961-af62-ec34eba3e08e) +![image](https://github.com/user-attachments/assets/943e454e-8506-4a87-a486-d5f465b470f1) +![image](https://github.com/user-attachments/assets/b958bf63-add2-434a-a8e1-405ee1c773d9) + + +# 1.6.5 + +* 修复qwen3等模型的工具调用,添加工具调用兼容模式,类似cline,通过正则匹配, +* 查看修复任务结果界面,显示异常的问题。 +* fixbug + +# 1.6.3 +* 全新的输入编辑器,优化显示,添加变量系统,支持内置mcp设置变量,支持js代码变量 +* 大模型列表,支持过滤,优化显示 +* 修复支持mcp的提示词输入失败的问题 +* Agent列表支持hover显示描述。 +* webdav同步优化。 +* see MCP支持添加headers +* 聊天记录性能优化,使用虚拟列表+显示优化 + + +![image](https://github.com/user-attachments/assets/b2c9d59f-650f-49b8-a0ea-f0634644b27e) +![image](https://github.com/user-attachments/assets/3452890a-864b-4ea7-84d4-505bd1821fdc) +![image](https://github.com/user-attachments/assets/6b91d593-51ef-4e51-8d1b-324bc071e9a7) + +# 1.5.4 +* 修复web访问的,添加大模型测试失败的问题。 + +# 1.5.3 + +* 支持Claude 官方API. +* 优化了内置终端,允许用户输入 +* 支持Agent任务调用失败,使用备用大模型. +* 添加内置Agent,`MCP helper`,帮助安装MCP +* 修复Markdown渲染Bug +* 修复聊天多模型对比的Bug + +![image](https://github.com/user-attachments/assets/c450aea2-c3f2-4527-ae06-8bcaa928416c) +![image](https://github.com/user-attachments/assets/7094cef7-e6f2-452e-9a1d-59871d146364) +![image](https://github.com/user-attachments/assets/5ebf05c7-007e-4eee-9b98-df5662b54f62) + +# 1.5.0 +* 支持聊天重命名 +* 支持mcp配置同步 +* 支持grok3的思维链 +* 支持ai生成cron表达式 +* 支持消息分叉克隆 +* 支持开发模式,快速导出对话配置,用于调试 +* 添加启用,禁用claude的mcp的开关 +* 添加Task运行全局控制启用,禁用开关 +* 工具调用取消优化,告诉大模型用户取消了操作 + +![支持聊天重命名](https://github.com/user-attachments/assets/9e178d72-2446-4d63-a1ac-ac0299a3d0a4) +![支持mcp配置同步](https://github.com/user-attachments/assets/ecc4945d-3170-476f-b653-badecf972957) +![支持grok3的思维链](https://github.com/user-attachments/assets/6123221e-2646-4553-b8d4-16b49428c69a) +![支持ai生成cron表达式](https://github.com/user-attachments/assets/5855ed6e-d502-4913-a712-7a1d65b7722f) +![支持消息分叉克隆](https://github.com/user-attachments/assets/498d4e03-0555-4b9b-9838-ec46602fb501) +![支持开发模式,快速导出对话配置,用于调试](https://github.com/user-attachments/assets/124a6e1a-6436-4308-8475-9fb32b5e3f09) +![支持Task运行全局控制启用,禁用](https://github.com/user-attachments/assets/7537941a-1e2d-41a8-abb6-2569fe040067) +![支持开发模式,快速导出对话配置,用于调试](https://github.com/user-attachments/assets/9bfdf789-378e-43d7-bcdf-8a91c593fe16) +![工具调用取消优化,告诉大模型用户取消了操作](https://github.com/user-attachments/assets/8b1186b3-929f-4c86-95ce-50dbf2216f01) + + + +# 1.4.17 +* 修复MacOS不能复制,等快捷键失效的问题 + +# 1.4.16 + +* 支持显示MCP Server版本号和名称。 +* 添加模型报错时,显示详细错误。 +* 添加MCP报错时,显示详细错误。 +* 优化聊天记录存储,把对话消息分开存储,减少加载和同步时间。 +* 修改WebDav同步。 +* 支持Claude Desktop 配置里的MCP。 +* 支持Web端直接查看配置文件 +* 支持快捷键MACOS`Alt+Cmd+I` Windows`Ctrl+Shift+I`打开 开发者工具 +* 聊天记录列表支持显示Agent图标 +* 修复大量bug + +![image](https://github.com/user-attachments/assets/e00bb252-83a6-40ca-928a-3162859b0c27) +![image](https://github.com/user-attachments/assets/5378bba1-91f5-4d77-accf-544d9a09e909) +![image](https://github.com/user-attachments/assets/2b236af6-a0bc-453a-b08e-8f3627a5d392) +![image](https://github.com/user-attachments/assets/ca3cc911-bc6a-4560-aede-f34969190e91) +![image](https://github.com/user-attachments/assets/c69addb1-6a07-4fb8-8858-8851cfd31be6) +![image](https://github.com/user-attachments/assets/23717164-7177-4622-a4bd-bd2d13be1edf) + + +# 1.4.3 +* 重写markdown渲染,优化`Artifacts`,支持从浏览器打开,下载,增加对`Mermaid`预发的支持, +* 修改调用工具的显示 +* 支持聊天选择多个模型对比 + +![image](https://github.com/user-attachments/assets/b4b88d6c-da7f-4822-8ca7-a79c3d02b6a5) +![image](https://github.com/user-attachments/assets/d1b54fb3-e0d6-4999-9c89-879c8c095ab6) +![71afe79bd956c2b9f83d73e7c038be70](https://github.com/user-attachments/assets/13e81223-d00f-4100-8128-19adc262ce83) +![a1520e5ed245419b28c68a58184e1a56](https://github.com/user-attachments/assets/940a971e-cdb1-4824-8391-292217e9c1af) + + + + +# 1.4.4 + +* 修复上个版本,默认对话,设置mcp失效的问题。 +* 修复Agent未聊天不能修改系统提示词。 +* 修复第一次打开的时,无LLM的错误提示 + + +# 1.4.1 + +* 修复Gemini工具调用,不支持多工具的的bug +* 支持选择MCP的部分Tool,更加省Token +* 支持 @ 快速输入 + 调用Agent +* fixbug +![image](https://github.com/user-attachments/assets/63ae6853-5df4-4b29-8bc9-c33d99239833) +![image](https://github.com/user-attachments/assets/6010494f-1218-4714-bbfe-8e61969a6826) + + +# 1.4.0 + +* 添加内置mcp工具 命令行 +* 支持修改网络访问密码 +* 工具调用折叠显示 + +![8af53675c625ca34cfc4753a106e9462](https://github.com/user-attachments/assets/ef030a65-ba9e-4cd5-9ca8-669677b483be) +![image](https://github.com/user-attachments/assets/af1598b6-d912-4f04-8919-a3d3e1ed93bc) + +# 1.3.3 + +* 可以在调用工具的时候,是否确认,并且修改大模型调用的参数 +* 可以点击工具,调用工具做测试。 +* 知识库打算重新开发,目前不建议使用,可以使用openai的embedding模型,不搞本地embedding模型了 +![886a04f531ca15ef1f6e93ea8403c0b7](https://github.com/user-attachments/assets/7c6eb1d4-7ba1-430b-8fca-18023f7dadd3) +![image](https://github.com/user-attachments/assets/fc87b507-8427-4157-a0f9-78d141299151) + + +# 1.2.15 + +* mcp加载进度显示,添加快捷按钮 +* 优化手机h5显示 +* fixbug +![image](https://github.com/user-attachments/assets/1c60e98f-f57b-4a38-9464-c7548c09cc3c) +![image](https://github.com/user-attachments/assets/d8ba028d-d091-40f3-82bb-40e6f6ba10de) +![image](https://github.com/user-attachments/assets/f53652cd-07f4-4f98-89d5-865213dc3fb5) + + +# 1.2.12 + +* 支持调用工具时询问![image](https://github.com/user-attachments/assets/11c03c92-399e-457e-8000-ff00c3c1e059) +* 聊天支持显示时间![image](https://github.com/user-attachments/assets/dba7bf09-99a1-46bd-9c94-052d18469b96) +* hypetool优化,设置![image](https://github.com/user-attachments/assets/cfc2c8e5-f7e7-4078-aaff-240b567f47c5) +* Add historyFilterType hover tip by @xtyuns in https://github.com/BigSweetPotatoStudio/HyperChat/pull/52 + + + +# 1.2.2 + +* mac ,linux 自动获取PATH,不用输入PATH了。 +* 添加 linux deb包 +* fix WebDav 第一次同步报错 +* fixbug + + +# 1.0.2 + +* 增加设定temperature +* 修复bug +* 支持输入框粘贴,上传图片 + +# 0.2.0 + +* 添加知识库 + + +# 0.1.1 + +* fix MacOS 图片上传 +* 添加快速复制的按钮,支持复制消息和代码的按钮 +* WebDav同步功能优化,本地只保存10个版本 +* markdown 代码Code渲染增加高亮 +* HTML Artifacts 增加错误捕获,支持打开Chrome的控制台 + + + +# 0.1.0 + +## HyperChat + +* 支持插件市场+MCP原生安装两种,插件市场快速安装和配置,欢迎提交插件,[Github](https://github.com/BigSweetPotatoStudio/HyperChatMCP) +* WebDav 同步逻辑优化,本地会先备份再同步,5min同步一次 +* LLM 添加测试功能,测试是否支持图片输入 + 工具调用(消耗一点点token) +* Chat支持输入图片 +* Chat支持显示Tool Call 返回的图片MCP资源 +* fix bugs + + + + +# 0.0.13 + +## HyperChat + +* 优化了,MCP Server的启动速度。 +* WebDav 同步, 暂时不支持MCP配置同步,操作系统不一致,可能会出现问题。 +* 支持设置请求方式,Stream | Complete +* 支持KaTeX,显示数学公式 + +## HyperTools + +* 优化了,打开网页的Tool + + + +# 0.0.11 + +## HyperChat + +* Bot显示优化,支持搜索,拖拽排序 +* 对话记录支持过滤+搜索 +* 对于不支持统计大模型的消耗token的API,如千问,支持用字数模糊统计 +* 输入框支持 拖拽文件快速输入文件路径 +* My LLM Models列表支持拖拽排序 +* 支持快速配置Ollama, Qwen的API模型 + +## HyperTools + +* 优化了,打开网页的Tool, 更完善的提取信息。如回答这个问题 `https://store.epicgames.com/zh-CN/ 哪个游戏是限时免费的?` diff --git a/archive/README.1.md b/archive/README.1.md new file mode 100644 index 0000000..47e39a7 --- /dev/null +++ b/archive/README.1.md @@ -0,0 +1,168 @@ +[中文](README.1.zh.md) | [English](README.1.md) + + +## Introduction + +HyperChat is an open-source chat client that supports MCP and can use various LLM APIs to achieve the best chat experience, as well as implement productivity tools. + +[![Build](https://github.com/BigSweetPotatoStudio/HyperChat/actions/workflows/build.yml/badge.svg)](https://github.com/BigSweetPotatoStudio/HyperChat/actions/workflows/build.yml) +[![@dadigua/hyper-chat](https://img.shields.io/npm/v/%40dadigua%2Fhyper-chat)](https://www.npmjs.com/package/@dadigua/hyper-chat) +[![npm downloads](https://img.shields.io/npm/dm/@dadigua/hyper-chat)](https://npm-stat.com/charts.html?package=@dadigua/hyper-chat) + +* Supports OpenAI-style LLMs, `OpenAI`, `Claude`, `Claude(OpenAI)`, `Qwen`, `Deepseek`, `GLM`, `Ollama`, `xAI`, `Gemini`. +* Fully supports MCP. + +## DEMO + +* [HyperChat](https://hyperchat.dadigua.men/123456/) on Nodejs +* [Docker](https://htmivlknrjln.ap-northeast-1.clawcloudrun.com/123456/#/Chat) on ClawCloud + +## Features: + +- [x] **🪟Windows** + **🍏MacOS** + **Linux** +- [x] Command-line run, `npx -y @dadigua/hyper-chat`, default port 16100, password 123456, Web access http://localhost:16100/123456/ +- [x] Docker + * Command-line version `docker pull dadigua/hyperchat-mini:latest` + * Ubuntu desktop + Chrome + BrowserUse version (**coming soon**) +- [x] `WebDAV` supports incremental synchronization, fastest synchronization through hash. +- [x] `HyperPrompt` prompt syntax supports variables (text + js code variables), basic syntax checking + Hover real-time preview. +- [x] `MCP` extensions +- [x] Supports dark mode🌙 +- [x] Resources, Prompts, Tools support +- [x] Supports English and Chinese +- [x] Supports `Artifacts`, `SVG`, `HTML`, `Mermaid` rendering +- [x] Supports defining Agents, allowing preset prompts and selecting permitted MCP +- [x] Supports scheduled tasks, specifying Agents to complete tasks on schedule, and viewing task completion status. +- [x] Supports `KaTeX`, displays mathematical formulas, code rendering increases highlight and quick copy +- [x] Added `RAG`, based on MCP knowledge base +- [x] Introduced the ChatSpace concept, supports simultaneous chats across multiple dialogues +- [x] Supports chat model selection comparison + +### TODO: + +- Implement multi-Agent interactive system. + +### LLM + +| LLM | Usability | Remarks | +| -------- | ------ | ---------------------------- | +| claude | ⭐⭐⭐⭐⭐⭐ | No explanation | +| openai | ⭐⭐⭐⭐⭐ | Also perfectly supports multi-step function calls (gpt-4o-mini can also) | +| gemini flash 2.5 | ⭐⭐⭐⭐⭐ | Very easy to use | +| qwen | ⭐⭐⭐⭐ | Quite useful | +| doubao | ⭐⭐⭐ | Feels okay to use | +| deepseek | ⭐⭐⭐⭐ | Recently improved | + +## Usage + +* 1. Configure APIKEY, ensure your LLM service is compatible with OpenAI style. +* 2. Ensure you have `uv + nodejs` etc. installed in your system. + +### [uvx & uv](https://github.com/astral-sh/uv) + +Install using the command line, or check the official GitHub tutorial [uv](https://github.com/astral-sh/uv) + +``` +# MacOS +brew install uv +# Windows +winget install --id=astral-sh.uv -e +``` +### [npx & nodejs](https://nodejs.org/en) + +Install using the command line, or go to the official website to download, official site [nodejs](https://nodejs.org/en) +``` +# MacOS +brew install node +# Windows +winget install OpenJS.NodeJS.LTS +``` + +## Development + +``` +cd electron && npm install +cd web && npm install +npm install +npm run dev +``` + +## HyperChat User Communication + +* [Telegram](https://t.me/dadigua001) +* [QQ Group](https://qm.qq.com/cgi-bin/qm/qr?k=KrNWdu5sp7H3ves3ZPSd7ppKjQiPrAvZ&jump_from=webapi&authKey=xnW+Lcgk5KLh5NPh3lU0ddz9CFDbXgvjEy35wsYipUrCsqXFcqlvM5Yorh6jkGim) + +#### Super input, supports variables (text + js code variables), basic syntax checking + Hover real-time preview +![动画](https://github.com/user-attachments/assets/b1ec72d9-be05-4f9a-bed1-16f4ed72de61) + +#### Chat supports model selection comparison +![image_2025-04-07_21-26-19](https://github.com/user-attachments/assets/e8691cd7-0518-4da8-90f2-7dfd8b864a09) +![image](https://github.com/user-attachments/assets/c9cd15c8-9bce-4df9-b2b2-5fc4e9224ea6) + +#### Supports clicking tool names for direct debugging +![image](https://github.com/user-attachments/assets/a9b22e98-d7b7-497a-93aa-c1501763fb8a) + +#### MCP calling Tool prompts + dynamically modifying LLM calling Tool parameters +![image](https://github.com/user-attachments/assets/080320e3-37d2-4f5a-ae3d-3517b3d692ad) + +#### Supports @ quick input + calling Agent +![image](https://github.com/user-attachments/assets/405ab516-fb8d-4f5b-b0f4-f3470354059e) + +#### Supports rendering `Artifacts`, `SVG`, `HTML`, `Mermaid` +![image](https://github.com/user-attachments/assets/d823c671-e989-4f40-aadb-0bc0f3b35175) +![image](https://github.com/user-attachments/assets/869b03fe-f025-4d6d-945c-8dac13d37ee0) + +#### Supports MCP selection + selecting partial Tool +![image](https://github.com/user-attachments/assets/9a297608-90be-4960-a4f1-ae627965486b) + +#### You can access from anywhere and any device via the web, and set a password +![image](https://github.com/user-attachments/assets/a9825e5b-da6d-4e0a-852f-177a3f6df992) + +#### Calls terminal MCP to automatically analyze asar files + helps me unzip +![image](https://github.com/user-attachments/assets/f9cc12cd-0c7e-4f2d-9649-4bb31240f4a6) + +#### Calls terminal, compiles and upgrades nginx +![image](https://github.com/user-attachments/assets/29a659cc-c844-4ca9-abe0-ff4372882f6b) + +#### Gaode Map MCP +![image](https://github.com/user-attachments/assets/549e8fee-085d-4e8a-86a8-184ebe1053e6) + +#### One-click webpage creation, and publish to (cloudflare) +![image](https://github.com/user-attachments/assets/b558cf5c-8b07-4621-a95b-fa1c33181414) + +#### Calls Google search, asks what the TGA Game of the Year is +![image](https://github.com/user-attachments/assets/36500a06-2260-4727-bfd2-5fedc72e6d58) + +#### What are the limited-time free games? Please visit the website to call the tool +![image](https://github.com/user-attachments/assets/8961ef09-1498-4730-b25d-75b1dedbc7e5) + +#### Opens a webpage for you, analyzes the results, and writes to a file +![image](https://github.com/user-attachments/assets/a036dcf8-ffb4-4070-ac4f-a3b0533f66c2) + +#### Through web tools + command line tools, opens GitHub README to learn + GIT clone + set up development environment +![image](https://github.com/user-attachments/assets/fd0d737e-0eaa-4410-85e0-27fd45f0e5a5) + +#### Multi-chat Workspace + Night Mode +![image](https://github.com/user-attachments/assets/ca9d77d7-d023-431f-8359-6023ab3e338a) + +#### Scheduled task list + schedules messages to be sent to Agent to complete tasks +![image](https://github.com/user-attachments/assets/302a767c-bd00-48e4-ac41-5443d98a4708) + +#### Install MCP from third parties (supports any MCP) +![image](https://github.com/user-attachments/assets/8580f194-139c-4d1c-b423-68627663232c) + +#### H5 interface +![image](https://github.com/user-attachments/assets/e8349fb5-c98e-4fef-a93d-778079a27237) +![image](https://github.com/user-attachments/assets/8a381114-6b26-4af2-90f2-270c0e85e819) +![image](https://github.com/user-attachments/assets/b1487b6b-2cbc-46d8-ab1e-a335417c23ce) +![image](https://github.com/user-attachments/assets/3a51dab9-375b-479b-8c6b-74a1be0dd037) + +#### Testing model capabilities +![image.png](./images/image48.png) + +#### Knowledge base +![image.png](./images/image50.png) + +## Disclaimer + +* This project is for learning and communication purposes only. If you use this project for any operations, such as crawling behavior, it has nothing to do with the developers of this project. \ No newline at end of file diff --git a/archive/README.1.zh.md b/archive/README.1.zh.md new file mode 100644 index 0000000..8e08d21 --- /dev/null +++ b/archive/README.1.zh.md @@ -0,0 +1,176 @@ +## 简介 + +HyperChat 是一个开源的Chat客户端,支持MCP,可以使用各家LLM的API,实现最好的Chat体验。以及实现生产力工具。 + +[![Build](https://github.com/BigSweetPotatoStudio/HyperChat/actions/workflows/build.yml/badge.svg)](https://github.com/BigSweetPotatoStudio/HyperChat/actions/workflows/build.yml) +[![@dadigua/hyper-chat](https://img.shields.io/npm/v/%40dadigua%2Fhyper-chat)](https://www.npmjs.com/package/@dadigua/hyper-chat) +[![npm downloads](https://img.shields.io/npm/dm/@dadigua/hyper-chat)](https://npm-stat.com/charts.html?package=@dadigua/hyper-chat) + + +* 支持 OpenAI风格的LLM,`OpenAI` ,`Claude`, `Claude(OpenAI)`, `Qwen`, `Deepseek`, `GLM`, `Ollama`,`xAI`, `Gemini` 。 +* 完全支持MCP。 + +## DEMO + +* [HyperChat](https://hyperchat.dadigua.men/123456/) on Nodejs +* [Docker](https://htmivlknrjln.ap-northeast-1.clawcloudrun.com/123456/#/Chat) on ClawCloud + +## 功能: + +- [x] **🪟Windows** + **🍏MacOS** + **Linux** +- [x] 命令行运行,`npx -y @dadigua/hyper-chat`,默认端口 16100, 密码 123456, Web访问 http://localhost:16100/123456/ +- [x] Docker + * 命令行的版本 `docker pull dadigua/hyperchat-mini:latest` + * Ubuntu桌面 + Chrome + BrowserUse 版本(**coming soon**) +- [x] `WebDAV` 支持增量同步,通过hash最快速同步。 +- [x] `HyperPrompt` 提示词语法,支持变量(文本+js代码变量),基础语法检测+Hover实时预览。 +- [x] `MCP`扩展 +- [x] 支持暗黑模式🌙 +- [x] Resources,Prompts,Tools 支持 +- [x] 支持英文和中文 +- [x] 支持 `Artifacts`, `SVG`,`HTML`,`Mermaid`渲染 +- [x] 支持定义Agent,可以预设提示词,选择允许的MCP +- [x] 支持定时任务,指定Agent定时完成任务,以及查看任务完成情况。 +- [x] 支持 `KaTeX`,显示数学公式,代码Code渲染增加高亮和快速复制 +- [x] 添加`RAG`,基于mcp知识库 +- [x] 添加ChatSpace概念,支持多对话同时聊天 +- [x] 支持聊天支持选择模型对比 + +### TODO: + +- 实现多Agent交互系统。 + +### LLM + +| LLM | 好用度 | 备注 | +| -------- | ------ | -------------------------- | +| claude | ⭐⭐⭐⭐⭐⭐ | 不解释 | +| openai | ⭐⭐⭐⭐⭐ | 也可以完美支持多步function call(gpt-4o-mini也可以) | +| gemini flash 2.5 | ⭐⭐⭐⭐⭐ | 很好用 | +| qwen | ⭐⭐⭐⭐ | 很好用 | +| doubao | ⭐⭐⭐ | 使用起来感觉还行 | +| deepseek | ⭐⭐⭐⭐ | 最近提升了 | + +## 使用 + +* 1.配置APIKEY,确保你的LLM服务兼容OpenAI风格。 +* 2.确保您的系统中已安装 `uv + nodejs` 等。 + +### [uvx & uv](https://github.com/astral-sh/uv) + +使用命令行安装,或者去看官方Github教程 [uv](https://github.com/astral-sh/uv) + +``` +# MacOS +brew install uv +# windows +winget install --id=astral-sh.uv -e +``` +### [npx & nodejs](https://nodejs.org/en) + +使用命令行安装,或者去官网下载安装,官网 [nodejs](https://nodejs.org/en) +``` +# MacOS +brew install node +# windows +winget install OpenJS.NodeJS.LTS +``` + +## 开发 + +``` +cd electron && npm install +cd web && npm install +npm install +npm run dev +``` + +## HyperChat用户交流 + +* [Telegram](https://t.me/dadigua001) +* [QQ群](https://qm.qq.com/cgi-bin/qm/qr?k=KrNWdu5sp7H3ves3ZPSd7ppKjQiPrAvZ&jump_from=webapi&authKey=xnW+Lcgk5KLh5NPh3lU0ddz9CFDbXgvjEy35wsYipUrCsqXFcqlvM5Yorh6jkGim) + +#### 超级输入,支持变量(文本+js代码变量),基础语法检测+Hover实时预览 +![动画](https://github.com/user-attachments/assets/b1ec72d9-be05-4f9a-bed1-16f4ed72de61) + +#### 聊天支持选择模型对比 +![image_2025-04-07_21-26-19](https://github.com/user-attachments/assets/e8691cd7-0518-4da8-90f2-7dfd8b864a09) +![image](https://github.com/user-attachments/assets/c9cd15c8-9bce-4df9-b2b2-5fc4e9224ea6) + +#### 支持点击tool名称,直接调用调试 +![image](https://github.com/user-attachments/assets/a9b22e98-d7b7-497a-93aa-c1501763fb8a) + +#### mcp调用Tool提示 + 动态修改LLM调用Tool的参数 +![image](https://github.com/user-attachments/assets/080320e3-37d2-4f5a-ae3d-3517b3d692ad) + +#### 支持 @ 快速输入 + 调用Agent +![image](https://github.com/user-attachments/assets/405ab516-fb8d-4f5b-b0f4-f3470354059e) + + +#### 支持 `Artifacts`, `SVG`,`HTML`,`Mermaid` 渲染, +![image](https://github.com/user-attachments/assets/d823c671-e989-4f40-aadb-0bc0f3b35175) +![image](https://github.com/user-attachments/assets/869b03fe-f025-4d6d-945c-8dac13d37ee0) + +#### 支持选择MCP + 选择部分Tool +![image](https://github.com/user-attachments/assets/9a297608-90be-4960-a4f1-ae627965486b) + +#### 你可以通过Web在任何地方+任何设备访问,并且可以设置密码 +![image](https://github.com/user-attachments/assets/a9825e5b-da6d-4e0a-852f-177a3f6df992) + +#### 调用terminal mcp 自动帮我分析asar文件 + 帮我解压 +![image](https://github.com/user-attachments/assets/f9cc12cd-0c7e-4f2d-9649-4bb31240f4a6) + +#### 调用terminal,编译并升级nginx +![image](https://github.com/user-attachments/assets/29a659cc-c844-4ca9-abe0-ff4372882f6b) + + +#### 高德地图MCP +![image](https://github.com/user-attachments/assets/549e8fee-085d-4e8a-86a8-184ebe1053e6) + +#### 一键写网页,并发布到(cloudflare) +![image](https://github.com/user-attachments/assets/b558cf5c-8b07-4621-a95b-fa1c33181414) + + +#### 调用谷歌搜索,问他TGA年度游戏是什么 +![image](https://github.com/user-attachments/assets/36500a06-2260-4727-bfd2-5fedc72e6d58) + +#### 有什么限时免费游戏,请访问网址,调用工具 +![image](https://github.com/user-attachments/assets/8961ef09-1498-4730-b25d-75b1dedbc7e5) + +#### 帮你打开网页,分析结果,并写入文件 +![image](https://github.com/user-attachments/assets/a036dcf8-ffb4-4070-ac4f-a3b0533f66c2) + + +#### 通过网页工具+命令行工具,打开Github README学习 + GIT克隆 + 搭建开发黄金 +![image](https://github.com/user-attachments/assets/fd0d737e-0eaa-4410-85e0-27fd45f0e5a5) + + +#### 多聊天Workspace + 夜间模式 +![image](https://github.com/user-attachments/assets/ca9d77d7-d023-431f-8359-6023ab3e338a) + +#### 定时任务列表 + 定时发送消息给Agent 完成任务 +![image](https://github.com/user-attachments/assets/302a767c-bd00-48e4-ac41-5443d98a4708) + +#### 从第三方安装mcp(支持任意mcp) +![image](https://github.com/user-attachments/assets/8580f194-139c-4d1c-b423-68627663232c) + + + + + +#### h5界面 +![image](https://github.com/user-attachments/assets/e8349fb5-c98e-4fef-a93d-778079a27237) +![image](https://github.com/user-attachments/assets/8a381114-6b26-4af2-90f2-270c0e85e819) +![image](https://github.com/user-attachments/assets/b1487b6b-2cbc-46d8-ab1e-a335417c23ce) +![image](https://github.com/user-attachments/assets/3a51dab9-375b-479b-8c6b-74a1be0dd037) + + +#### 测试模型能力 +![image.png](./images/image48.png) + +#### 知识库 +![image.png](./images/image50.png) + +## 免责声明 + +* 本项目仅供学习交流使用,如果您使用本项目进行任何操作,如爬虫行为等,与本项目开发者无关。 diff --git a/dependencies/.gitignore b/dependencies/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/dependencies/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/docker/electron/Dockerfile b/docker/electron/Dockerfile new file mode 100644 index 0000000..324244f --- /dev/null +++ b/docker/electron/Dockerfile @@ -0,0 +1,21 @@ +FROM consol/debian-xfce-vnc + +ARG RELEASE=1.1.1 +ARG ARCH=linux-x64 + +ENV RELEASE=${RELEASE} +ENV ARCH=${ARCH} + +RUN wget https://github.com/BigSweetPotatoStudio/HyperChat/releases/download/v${RELEASE}/HyperChat-${RELEASE}-${ARCH}.tar.gz +RUN tar -zxvf HyperChat-${RELEASE}-${ARCH}.tar.gz +RUN rm HyperChat-${RELEASE}-${ARCH}.tar.gz +RUN mv HyperChat-${RELEASE}-${ARCH} ./HyperChat +RUN chmod +x ./HyperChat/hyper-chat + + +RUN echo "\n" >> wm_startup.sh +RUN echo "nohup ./HyperChat/hyper-chat &" >> wm_startup.sh +# RUN echo "nohup chromium --remote-debugging-port=9222 &" >> wm_startup.sh +RUN echo "nohup firefox -marionette -start-debugger-server 2828 &" >> wm_startup.sh + +CMD ["tail", "-f", "/dev/null"] diff --git a/docker/electron/build.sh b/docker/electron/build.sh new file mode 100644 index 0000000..e5bc78c --- /dev/null +++ b/docker/electron/build.sh @@ -0,0 +1,7 @@ +RELEASE=1.1.1 +ARCH=linux-x64 + +docker build \ + --build-arg RELEASE=${RELEASE} \ + --build-arg ARCH=${ARCH} \ + -t hyperchat:${RELEASE} . diff --git a/docker/electron/docker-compose.yml b/docker/electron/docker-compose.yml new file mode 100644 index 0000000..5038c0c --- /dev/null +++ b/docker/electron/docker-compose.yml @@ -0,0 +1,9 @@ +version: '3' + +services: + ubuntu-desktop: + image: hyperchat + ports: + - "6080:80" + + restart: unless-stopped \ No newline at end of file diff --git a/docker/electron/start.sh b/docker/electron/start.sh new file mode 100644 index 0000000..c468a96 --- /dev/null +++ b/docker/electron/start.sh @@ -0,0 +1,31 @@ +#!/bin/bash +echo "Starting HyperChat..." + + +docker rm hyperchat && docker run --name hyperchat -p 6080:80 -v /dev/shm:/dev/shm hyperchat + + +docker rm hyperchat && docker run --name hyperchat -p 5901:5901 -p 6901:6901 -p 16200:16100 -v C:\\Users\\0laop\\Documents\\HyperChat:~/Documents/HyperChat -e VNC_PASSWORDLESS=true hyperchat + +# docker run -it --user 0 -p 6911:6901 consol/debian-xfce-vnc + +# # Start the VNC server if it's not running +# if [ ! -e /tmp/.X1-lock ]; then +# /usr/bin/vncserver :1 -geometry 1280x800 -depth 24 +# fi + +# Wait for X server to be ready +# echo "Waiting for X server to be ready..." +# until xdpyinfo -display :1 >/dev/null 2>&1; do +# sleep 0.5 +# done +# echo "X server is ready" + +# # Export display for GUI applications +# export DISPLAY=:1 + +# # Run HyperChat +# echo "Starting HyperChat..." +# /root/HyperChat/hyper-chat --no-sandbox + +# Keep container running diff --git a/docker/no_electron/Dockerfile b/docker/no_electron/Dockerfile new file mode 100644 index 0000000..f296059 --- /dev/null +++ b/docker/no_electron/Dockerfile @@ -0,0 +1,23 @@ +FROM ubuntu:22.04 + +# Update package lists +RUN apt-get update + +# Install curl and other dependencies +RUN apt-get install -y curl + +# Add NodeSource repository for Node.js LTS +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - +# Install Node.js and npm +RUN apt-get install -y nodejs + +# Install Python and pip +RUN apt-get install -y python3 python3-pip +# With pip. +RUN pip install uv + +COPY ../../electron/ /root/hyperchat + +ENV NODE_ENV=production + +CMD ["node", "/root/hyperchat/js/main_no_electron.js"] diff --git a/docker/no_electron/Dockerfile-Alpha b/docker/no_electron/Dockerfile-Alpha new file mode 100644 index 0000000..f296059 --- /dev/null +++ b/docker/no_electron/Dockerfile-Alpha @@ -0,0 +1,23 @@ +FROM ubuntu:22.04 + +# Update package lists +RUN apt-get update + +# Install curl and other dependencies +RUN apt-get install -y curl + +# Add NodeSource repository for Node.js LTS +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - +# Install Node.js and npm +RUN apt-get install -y nodejs + +# Install Python and pip +RUN apt-get install -y python3 python3-pip +# With pip. +RUN pip install uv + +COPY ../../electron/ /root/hyperchat + +ENV NODE_ENV=production + +CMD ["node", "/root/hyperchat/js/main_no_electron.js"] diff --git a/docker/no_electron/docker-compose.yml b/docker/no_electron/docker-compose.yml new file mode 100644 index 0000000..2447601 --- /dev/null +++ b/docker/no_electron/docker-compose.yml @@ -0,0 +1,10 @@ +version: '3' + +services: + hyperchat-mini: + image: hyperchat-mini + ports: + - "16100:16100" + volumes: + - "~/Documents/HyperChat:/root/Documents/HyperChat" + restart: unless-stopped \ No newline at end of file diff --git a/docker/no_electron/hg.Dockerfile b/docker/no_electron/hg.Dockerfile new file mode 100644 index 0000000..8228c34 --- /dev/null +++ b/docker/no_electron/hg.Dockerfile @@ -0,0 +1,35 @@ +FROM ubuntu:22.04 + +# Update package lists +RUN apt-get update + +# Install curl and other dependencies +RUN apt-get install -y curl + +# Add NodeSource repository for Node.js LTS +RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - +# Install Node.js and npm +RUN apt-get install -y nodejs + +# Install Python and pip +RUN apt-get install -y python3 python3-pip +# With pip. +RUN pip install uv + +RUN npm i -g @dadigua/hyper-chat + +ENV NODE_ENV=production + +# Set up a new user named "user" with user ID 1000 +RUN useradd -m -u 1000 user + +# Switch to the "user" user +USER user + +# Set home to the user's home directory +ENV HOME=/home/user \ + PATH=/home/user/.local/bin:$PATH + +WORKDIR $HOME/app + +CMD ["npx", "hyper-chat", "--appDataDir=/home/user/app/HyperChat"] \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..83e3ee9 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,6 @@ +# VuePress 默认临时文件目录 +.vuepress/.temp +# VuePress 默认缓存目录 +.vuepress/.cache +# VuePress 默认构建生成的静态文件目录 +.vuepress/dist \ No newline at end of file diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js new file mode 100644 index 0000000..1537f40 --- /dev/null +++ b/docs/.vuepress/config.js @@ -0,0 +1,51 @@ +import { viteBundler } from '@vuepress/bundler-vite' +import { defaultTheme } from '@vuepress/theme-default' +import { defineUserConfig } from 'vuepress' + +export default defineUserConfig({ + bundler: viteBundler(), + theme: defaultTheme({ + // 默认主题配置 + navbar: [ + { + text: '首页', + link: '/', + }, + ], + sidebar: [ + { + text: '项目介绍', + link: '/', + }, + { + text: '指南', + children: [ + { + text: '快速开始', + link: '/guide/quick-start.md', + }, + { + text: '安装MCP', + link: '/guide/mcp.md', + }, + { + text: '内置MCP', + link: '/guide/builtin-mcp.md', + }, + { + text: '进阶', + link: '/guide/advanced.md', + children: [ + { + text: '变量', + link: '/guide/var.md', + }, + + ], + }, + ], + }, + ], + }), + port: 18080, +}) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..c84918f --- /dev/null +++ b/docs/README.md @@ -0,0 +1,12 @@ +--- +lang: zh-CN +title: HyperChat +description: +--- + +# HyperChat + +HyperChat 设计理念是: + +* 1.一个开源的Chat客户端,支持MCP,可以使用各家LLM的API,实现最好的Chat体验。 +* 2.实现本机Agent + 任务系统,由AI帮忙完成任务。 diff --git a/docs/doc.md b/docs/doc.md new file mode 100644 index 0000000..dd8ebf6 --- /dev/null +++ b/docs/doc.md @@ -0,0 +1,27 @@ + +这个项目在3个月前就开始开发了,去年`Claude`才出MCP协议的时候,我就觉这个很厉害,然后,当时`Claude`账号立马也被封了,就搞了这个开源项目,目标是最佳的Chat体验+实现AI生产力。 + +介绍一下这个Chat项目的核心吧:我理解的 `Agent =智能(大模型)+Tool+记忆`。所以这样才能帮人完成任务`Task`来实现生产力,这个软件也是贯彻这思想。 + +1. HyperChat添加Agent时候,支持选择MCP Tool,通过系统提示词,定义Agent![image](https://github.com/user-attachments/assets/3fa6ec84-7e29-4df1-a149-3f672332629d) +2. 支持添加Task,定时通过发送消息的方式,调用Agent完成任务,同时支持Web Api方式调用 ![image](https://github.com/user-attachments/assets/de5328f9-3b7c-483d-956f-c76aebd564cd) +3. 支持Agent Call Agent,把Agent看做一个智能体,同时通过内置的MCP,通过发消息的方式,调用另一个Agent(比如,这个4o-mini,本来答不对9.8和9.11的,但是,我要他call `Gemini Think` Agent回答,他就会了。) ![image](https://github.com/user-attachments/assets/4201af2d-8fe2-427a-8ca4-a25595fc2aa8) + +这就是这个软件是核心了,虽然他是一个Chat软件,但是核心是Agent,创建Agent和它聊天+调用工具。ps:我上面说的`Agent =智能(大模型)+Tool+记忆`,还有记忆没有很好的解决,目前没啥好用的办法,RAG的知识库实在是不咋地,以后会关注技术进步。 + + +HyperChat特点 +1. 一切皆MCP的概念,内置了4个常用的MCP,把知识库封装成MCP,别的应该没这么搞 + - 常用工具(网页+谷歌+Bing搜索+获取时间) + - 知识库,(使用那个知识库都可以让大模型选择,还可以让它把内容添加到知识库) + - Agent相关 (支持Call Agent,新建Task) + - 命令行 (命令行MCP,为什么内置?这个mcp很难安装,你可以让他执行命令 or ssh,很好用)![image](https://github.com/user-attachments/assets/954c6eaf-7c38-47de-bccd-a89dc48ef438) + +2. 基于Web,可以脱离electron,可以用命令行运行`npx -y @dadigua/hyper-chat`,或者docker。 + - 支持了H5适配,可以端口映射,通过Web在任何设备访问,包括手机。 + - 可设置访问密码,安全访问。 + - 可以通过Web接口调用软件的功能,比如,你可以把它当成一个MCP Tool网关 + +3. 极致的Chat理念,现在其他的Chat软件输入框一大堆按钮,我总是感觉这样不太对劲,比如连个网搜索,还要点一下联网搜索按钮,首先我认为应该是模型决定回答这个问题是不是要联网么,这里我把搜索封装一个MCP工具,让模型决定是否调用工具,如何模型决定错了,我加上提示词让他记得使用工具。`就像龙珠里面许愿一样,发送消息就够了。`所以这里我想到了必须支持快速输入提示词,HyperChat通过一个@,可以快速输入Agent名称+快速输入短语,完成提示词 ![image](https://github.com/user-attachments/assets/0b42b361-a85e-40b3-9604-37b67be59f13)![image](https://github.com/user-attachments/assets/2a38f7bc-41fe-4360-bc74-aabddbdc73de) + + diff --git a/docs/guide/advanced.md b/docs/guide/advanced.md new file mode 100644 index 0000000..5664c30 --- /dev/null +++ b/docs/guide/advanced.md @@ -0,0 +1,10 @@ +--- +lang: zh-CN +title: 高级用法 +description: +--- + +#### HyperChat 高级用法 + +* 变量使用 +* 定时任务 \ No newline at end of file diff --git a/docs/guide/builtin-mcp.md b/docs/guide/builtin-mcp.md new file mode 100644 index 0000000..b55deeb --- /dev/null +++ b/docs/guide/builtin-mcp.md @@ -0,0 +1,29 @@ +--- +lang: zh-CN +title: 内置MCP +description: 内置MCP的安装和使用指南 +--- + +#### HyperChat 内置MCP目前有5个 +为了帮助大家使用,以下是内置MCP的详细介绍: +![alt text](image-13.png) + +### 1. **hyper_tools** +hypertools 内置3个工具 +- current_time: 获取当前时间 +- fetch 打开页面,获取页面数据 +- search 使用搜索引擎搜索,支持谷歌和必应 + +#### hyper_tools设置 +![alt text](image-15.png) +* Web_Tools_Platform可以设置,使用chrome打开页面,或者electron打开页面,或者禁用关于网页相关的内容。 +![alt text](image-17.png) +* SearchEngine,设置搜索引擎,支持谷歌和必应 +![alt text](image-16.png) +* 其他还可以设置,是否调用远程的chrome打开网页,等 + + +### 2. **hyper_knowledge_base** +这个是内置知识库相关的mcp,可以通过mcp添加知识库内容,不过,内置的知识库还是实验版本,可以等以后完善。 + +### 3. **hyper_agent** diff --git a/docs/guide/image-1.png b/docs/guide/image-1.png new file mode 100644 index 0000000..d103f4c Binary files /dev/null and b/docs/guide/image-1.png differ diff --git a/docs/guide/image-10.png b/docs/guide/image-10.png new file mode 100644 index 0000000..fdbc22b Binary files /dev/null and b/docs/guide/image-10.png differ diff --git a/docs/guide/image-11.png b/docs/guide/image-11.png new file mode 100644 index 0000000..52a597b Binary files /dev/null and b/docs/guide/image-11.png differ diff --git a/docs/guide/image-12.png b/docs/guide/image-12.png new file mode 100644 index 0000000..12fa7bc Binary files /dev/null and b/docs/guide/image-12.png differ diff --git a/docs/guide/image-13.png b/docs/guide/image-13.png new file mode 100644 index 0000000..6a540a6 Binary files /dev/null and b/docs/guide/image-13.png differ diff --git a/docs/guide/image-14.png b/docs/guide/image-14.png new file mode 100644 index 0000000..c97b99d Binary files /dev/null and b/docs/guide/image-14.png differ diff --git a/docs/guide/image-15.png b/docs/guide/image-15.png new file mode 100644 index 0000000..93c0326 Binary files /dev/null and b/docs/guide/image-15.png differ diff --git a/docs/guide/image-16.png b/docs/guide/image-16.png new file mode 100644 index 0000000..aab600c Binary files /dev/null and b/docs/guide/image-16.png differ diff --git a/docs/guide/image-17.png b/docs/guide/image-17.png new file mode 100644 index 0000000..c731a13 Binary files /dev/null and b/docs/guide/image-17.png differ diff --git a/docs/guide/image-2.png b/docs/guide/image-2.png new file mode 100644 index 0000000..8c21104 Binary files /dev/null and b/docs/guide/image-2.png differ diff --git a/docs/guide/image-3.png b/docs/guide/image-3.png new file mode 100644 index 0000000..4de2380 Binary files /dev/null and b/docs/guide/image-3.png differ diff --git a/docs/guide/image-4.png b/docs/guide/image-4.png new file mode 100644 index 0000000..7e6fc45 Binary files /dev/null and b/docs/guide/image-4.png differ diff --git a/docs/guide/image-5.png b/docs/guide/image-5.png new file mode 100644 index 0000000..390b80d Binary files /dev/null and b/docs/guide/image-5.png differ diff --git a/docs/guide/image-6.png b/docs/guide/image-6.png new file mode 100644 index 0000000..7b09218 Binary files /dev/null and b/docs/guide/image-6.png differ diff --git a/docs/guide/image-7.png b/docs/guide/image-7.png new file mode 100644 index 0000000..c69094a Binary files /dev/null and b/docs/guide/image-7.png differ diff --git a/docs/guide/image-8.png b/docs/guide/image-8.png new file mode 100644 index 0000000..470e20d Binary files /dev/null and b/docs/guide/image-8.png differ diff --git a/docs/guide/image-9.png b/docs/guide/image-9.png new file mode 100644 index 0000000..a4c9b32 Binary files /dev/null and b/docs/guide/image-9.png differ diff --git a/docs/guide/image.png b/docs/guide/image.png new file mode 100644 index 0000000..3fad396 Binary files /dev/null and b/docs/guide/image.png differ diff --git a/docs/guide/mcp.md b/docs/guide/mcp.md new file mode 100644 index 0000000..b3cd55d --- /dev/null +++ b/docs/guide/mcp.md @@ -0,0 +1,42 @@ +--- +lang: zh-CN +title: MCP安装 +description: +--- + +#### HyperChat 安装MCP,支持`stdio`,`sse`,`streamableHttp`,支持启用,禁用,同步MCP。 + + +#### 点击添加 +![alt text](image-7.png) + +### stdio类型的添加 +HyperChat添加mcp,和其他的客户端一样,只是把,`command` 和 `args` ,放在一起填入,用空格分开。如图,一一对应。 + +``` +{ + "command": "npx", + "args": [ + "-y", + "@amap/amap-maps-mcp-server" + ], + "env": { + "AMAP_MAPS_API_KEY": "xxxxxxxxxxxxxxxxxxxxxxxxx" + }, +} +``` + +![alt text](image-8.png) + +### `sse`和`streamableHttp`类型的添加 + +![alt text](image-9.png) + + +### MCP启用,禁用 +![alt text](image-10.png) + +### MCP同步 +通过MCP,同步这mcp配置 +![alt text](image-12.png) + diff --git a/docs/guide/quick-start.md b/docs/guide/quick-start.md new file mode 100644 index 0000000..6cc60a7 --- /dev/null +++ b/docs/guide/quick-start.md @@ -0,0 +1,23 @@ +--- +lang: zh-CN +title: 快速开始 +description: +--- + + +### 添加LLM的ApiKey. + +![alt text](image.png) + + +![alt text](image-3.png) + +#### 工具模式,一般默认就行。标准,用tools参数传递工具,如果,类似开源的大模型,Qwen3,通过返回的内容里的``通过正则表达式获取参数,这种方式类似cline。 +![alt text](image-2.png) + +#### 点击提交,会帮你测试llm的能力 + +![alt text](image-4.png) + +#### 开始聊天 +![alt text](image-1.png) \ No newline at end of file diff --git a/docs/guide/var.md b/docs/guide/var.md new file mode 100644 index 0000000..e69de29 diff --git a/images/7f613001-daa3-4f2e-a0b5-c3380bc0a25f.png b/images/7f613001-daa3-4f2e-a0b5-c3380bc0a25f.png new file mode 100644 index 0000000..08c8f15 Binary files /dev/null and b/images/7f613001-daa3-4f2e-a0b5-c3380bc0a25f.png differ diff --git a/images/image1.png b/images/image1.png new file mode 100644 index 0000000..8bf2856 Binary files /dev/null and b/images/image1.png differ diff --git a/images/image11.png b/images/image11.png new file mode 100644 index 0000000..9f90f63 Binary files /dev/null and b/images/image11.png differ diff --git a/images/image12.png b/images/image12.png new file mode 100644 index 0000000..ff2e4d8 Binary files /dev/null and b/images/image12.png differ diff --git a/images/image13.png b/images/image13.png new file mode 100644 index 0000000..6c2abff Binary files /dev/null and b/images/image13.png differ diff --git a/images/image14.png b/images/image14.png new file mode 100644 index 0000000..30ffee7 Binary files /dev/null and b/images/image14.png differ diff --git a/images/image2.png b/images/image2.png new file mode 100644 index 0000000..3c9acd1 Binary files /dev/null and b/images/image2.png differ diff --git a/images/image20.png b/images/image20.png new file mode 100644 index 0000000..1cc8934 Binary files /dev/null and b/images/image20.png differ diff --git a/images/image21.png b/images/image21.png new file mode 100644 index 0000000..96ec2a7 Binary files /dev/null and b/images/image21.png differ diff --git a/images/image22.png b/images/image22.png new file mode 100644 index 0000000..a2cc4ae Binary files /dev/null and b/images/image22.png differ diff --git a/images/image3.png b/images/image3.png new file mode 100644 index 0000000..3881658 Binary files /dev/null and b/images/image3.png differ diff --git a/images/image30.png b/images/image30.png new file mode 100644 index 0000000..cb54a3f Binary files /dev/null and b/images/image30.png differ diff --git a/images/image31.png b/images/image31.png new file mode 100644 index 0000000..771c234 Binary files /dev/null and b/images/image31.png differ diff --git a/images/image32.png b/images/image32.png new file mode 100644 index 0000000..9fc9cfb Binary files /dev/null and b/images/image32.png differ diff --git a/images/image33.png b/images/image33.png new file mode 100644 index 0000000..9cc5eb6 Binary files /dev/null and b/images/image33.png differ diff --git a/images/image34.png b/images/image34.png new file mode 100644 index 0000000..724dc0f Binary files /dev/null and b/images/image34.png differ diff --git a/images/image35.png b/images/image35.png new file mode 100644 index 0000000..a7f039c Binary files /dev/null and b/images/image35.png differ diff --git a/images/image36.png b/images/image36.png new file mode 100644 index 0000000..99d844b Binary files /dev/null and b/images/image36.png differ diff --git a/images/image40.png b/images/image40.png new file mode 100644 index 0000000..dc9edfa Binary files /dev/null and b/images/image40.png differ diff --git a/images/image41.png b/images/image41.png new file mode 100644 index 0000000..d862320 Binary files /dev/null and b/images/image41.png differ diff --git a/images/image42.png b/images/image42.png new file mode 100644 index 0000000..c6a2ff9 Binary files /dev/null and b/images/image42.png differ diff --git a/images/image43.png b/images/image43.png new file mode 100644 index 0000000..96023d5 Binary files /dev/null and b/images/image43.png differ diff --git a/images/image44.png b/images/image44.png new file mode 100644 index 0000000..ef3e5af Binary files /dev/null and b/images/image44.png differ diff --git a/images/image45.png b/images/image45.png new file mode 100644 index 0000000..6e0d960 Binary files /dev/null and b/images/image45.png differ diff --git a/images/image46.png b/images/image46.png new file mode 100644 index 0000000..bc60fe9 Binary files /dev/null and b/images/image46.png differ diff --git a/images/image47.png b/images/image47.png new file mode 100644 index 0000000..cf27035 Binary files /dev/null and b/images/image47.png differ diff --git a/images/image48.png b/images/image48.png new file mode 100644 index 0000000..b261ac8 Binary files /dev/null and b/images/image48.png differ diff --git a/images/image50.png b/images/image50.png new file mode 100644 index 0000000..309b737 Binary files /dev/null and b/images/image50.png differ diff --git a/images/image51.png b/images/image51.png new file mode 100644 index 0000000..eefa977 Binary files /dev/null and b/images/image51.png differ diff --git a/images/image52.png b/images/image52.png new file mode 100644 index 0000000..34367a4 Binary files /dev/null and b/images/image52.png differ diff --git a/images/image53.png b/images/image53.png new file mode 100644 index 0000000..efdaf0b Binary files /dev/null and b/images/image53.png differ diff --git a/images/image55.png b/images/image55.png new file mode 100644 index 0000000..2ae548e Binary files /dev/null and b/images/image55.png differ diff --git a/images/image60.png b/images/image60.png new file mode 100644 index 0000000..d3a3a94 Binary files /dev/null and b/images/image60.png differ diff --git a/images/image61.png b/images/image61.png new file mode 100644 index 0000000..0bf509b Binary files /dev/null and b/images/image61.png differ diff --git a/images/image62.png b/images/image62.png new file mode 100644 index 0000000..96e6c22 Binary files /dev/null and b/images/image62.png differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3c9e673 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4861 @@ +{ + "name": "@dadigua/hyperchat", + "version": "2.0.0-alpha.63", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@dadigua/hyperchat", + "version": "2.0.0-alpha.63", + "dependencies": { + "@ai-sdk/anthropic": "2.0.4", + "@ai-sdk/google": "2.0.6", + "@ai-sdk/openai": "2.0.15", + "@ai-sdk/openai-compatible": "1.0.7", + "@ai-sdk/react": "2.0.15", + "@anthropic-ai/sdk": "^0.39.0", + "@modelcontextprotocol/sdk": "^1.13.3", + "@openrouter/ai-sdk-provider": "1.1.2", + "ai": "5.0.15", + "boxen": "^7.1.1", + "cross-env": "^7.0.3", + "dayjs": "^1.11.13", + "express": "^4.21.2", + "js-yaml": "^4.1.0", + "json-schema-to-zod": "^2.6.1", + "lodash": "^4.17.21", + "log4js": "^6.9.1", + "openai": "^4.94.0", + "tsx": "^4.9.3", + "typescript": "^5.5.2", + "uuid": "^11.0.3", + "webpack": "^5.92.1", + "webpack-cli": "^5.1.4", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.24.6", + "zx": "^8.0.1" + }, + "devDependencies": { + "@types/inquirer": "^9.0.7", + "@types/js-yaml": "^4.0.9", + "@types/lodash": "^4.17.16", + "@types/node": "^22.7.5", + "@types/react": "^18.3.4", + "@types/react-dom": "^18.3.0", + "@types/update-notifier": "^6.0.8", + "@types/uuid": "^10.0.0", + "husky": "^9.1.6", + "nodemon": "^3.1.4", + "ts-loader": "^9.5.1" + } + }, + "node_modules/@ai-sdk/anthropic": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/anthropic/-/anthropic-2.0.4.tgz", + "integrity": "sha512-ii2bZEUPwBitUiK1dpX+HsOarcDGY71G9TVdSJqbfXSVqa+speJNZ8PA/bjuNMml0NyX8VxNsaMg3SwBUCZspA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/gateway": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/gateway/-/gateway-1.0.7.tgz", + "integrity": "sha512-Athrq7OARuNc0iHZJP6InhSQ53tImCc990vMWyR1UHaZgPZJbXjKhIMiOj54F0I0Nlemx48V4fHYUTfLkJotnQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/google": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@ai-sdk/google/-/google-2.0.6.tgz", + "integrity": "sha512-8acuseWJI+RRH99JDWM/n7IJRuuGNa4YzLXB/leqE/ZByHyIiVWGADjJi/vfnJnmdM5fQnezJ6SRTF6feI5rSQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/openai": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-2.0.15.tgz", + "integrity": "sha512-/IUyQ9ck4uUTtGojvQamcUWpNWkwpL/P1F6LYRxpQGj07H00oJEBH/VUizrIq0ZvW/vkuK6c6X4UJS9PrdYyxA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/openai-compatible": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai-compatible/-/openai-compatible-1.0.7.tgz", + "integrity": "sha512-mH+0yoJCvPQZBwwyw8ALil0cA40dQAPc+YhaANFxpjDJKqtATpHXPxq7u2SiMNkbqV26jO92etHPM+EP2+p2VA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-2.0.0.tgz", + "integrity": "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==", + "license": "Apache-2.0", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/provider-utils": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-3.0.3.tgz", + "integrity": "sha512-kAxIw1nYmFW1g5TvE54ZB3eNtgZna0RnLjPUp1ltz1+t9xkXJIuDT4atrwfau9IbS0BOef38wqrI8CjFfQrxhw==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider": "2.0.0", + "@standard-schema/spec": "^1.0.0", + "eventsource-parser": "^3.0.3", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/@ai-sdk/react": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-2.0.15.tgz", + "integrity": "sha512-6saQ4495OhxfmUHrR+HIk0/9S3n4I/ZR/G0mYr29ua4vqi5wOj1DbLO5zIFWiYiSvd/Ie1yFtXG4G9Cuglm+VA==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/provider-utils": "3.0.3", + "ai": "5.0.15", + "swr": "^2.2.5", + "throttleit": "2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "zod": "^3.25.76 || ^4" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.39.0.tgz", + "integrity": "sha512-eMyDIPRZbt1CCLErRCi3exlAvNkBtRe+kW5vvJyef93PmNr/clstYgHhtvmkxN82nlKgzyGPCyGxrm0JQ1ZIdg==", + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/@types/node": { + "version": "18.19.123", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.123.tgz", + "integrity": "sha512-K7DIaHnh0mzVxreCR9qwgNxp3MH9dltPNIEddW9MYUlcKAzm+3grKNSTe2vCJHI1FaLpvpL5JGJrz1UZDKYvDg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@anthropic-ai/sdk/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "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/@jridgewell/trace-mapping": { + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.17.3.tgz", + "integrity": "sha512-JPwUKWSsbzx+DLFznf/QZ32Qa+ptfbUlHhRLrBQBAFu9iI1iYvizM4p+zhhRDceSsPutXp4z+R/HPVphlIiclg==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.6", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@openrouter/ai-sdk-provider": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@openrouter/ai-sdk-provider/-/ai-sdk-provider-1.1.2.tgz", + "integrity": "sha512-cfiKVpNygGFaJojBHFvtTf7UiF458Xh9yPcTg4FXF7bGYN5V33Rxx9dXNE12fjv6lHeC5C7jwQHDrzUIFol1iQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "ai": "^5.0.0", + "zod": "^3.24.1 || ^v4" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "license": "MIT" + }, + "node_modules/@types/configstore": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-6.0.2.tgz", + "integrity": "sha512-OS//b51j9uyR3zvwD04Kfs5kHpve2qalQ18JhY/ho3voGYUTPLEG90/ocfKPI48hyHH8T04f7KEEbK6Ue60oZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "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/inquirer": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.9.tgz", + "integrity": "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.17.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.2.tgz", + "integrity": "sha512-gL6z5N9Jm9mhY+U2KXZpteb+09zyffliRkZyZOHODGATyC5B1Jt/7TzuuiLkFsSUMLbS1OLmlj/E+/3KF4Q/4w==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.23.tgz", + "integrity": "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/update-notifier": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@types/update-notifier/-/update-notifier-6.0.8.tgz", + "integrity": "sha512-IlDFnfSVfYQD+cKIg63DEXn3RFmd7W1iYtKQsJodcHK9R1yr8aKbKaPKfBxzPpcHCq2DU8zUq4PIPmy19Thjfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/configstore": "*", + "boxen": "^7.1.1" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", + "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", + "license": "MIT", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/ai": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/ai/-/ai-5.0.15.tgz", + "integrity": "sha512-EX5hF+NVFm6R11mvdZRbg6eJEjyMlniI4/xOnyTh4VtDQ457lhIgi3kDGrHW3/qw9ELon9m2e7AK3g5z5sLwsQ==", + "license": "Apache-2.0", + "dependencies": { + "@ai-sdk/gateway": "1.0.7", + "@ai-sdk/provider": "2.0.0", + "@ai-sdk/provider-utils": "3.0.3", + "@opentelemetry/api": "1.9.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.25.76 || ^4" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz", + "integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001733", + "electron-to-chromium": "^1.5.199", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001735", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", + "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.5.0.tgz", + "integrity": "sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.203", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.203.tgz", + "integrity": "sha512-uz4i0vLhfm6dLZWbz/iH88KNDV+ivj5+2SA+utpgjKaj9Q0iDLuwk6Idhe9BTxciHudyx6IvTvijhkPvFGUQ0g==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.3.tgz", + "integrity": "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "license": "ISC" + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "license": "MIT" + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "license": "MIT", + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", + "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT", + "peer": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-to-zod": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/json-schema-to-zod/-/json-schema-to-zod-2.6.1.tgz", + "integrity": "sha512-uiHmWH21h9FjKJkRBntfVGTLpYlCZ1n98D0izIlByqQLqpmkQpNTBtfbdP04Na6+43lgsvrShFh2uWLkQDKJuQ==", + "license": "ISC", + "bin": { + "json-schema-to-zod": "dist/cjs/cli.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/log4js/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", + "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openai": { + "version": "4.104.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", + "integrity": "sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7" + }, + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.23.8" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.123", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.123.tgz", + "integrity": "sha512-K7DIaHnh0mzVxreCR9qwgNxp3MH9dltPNIEddW9MYUlcKAzm+3grKNSTe2vCJHI1FaLpvpL5JGJrz1UZDKYvDg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/openai/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/openai/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "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/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/streamroller/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swr": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", + "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/throttleit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", + "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/ts-loader": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-loader/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-loader/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.4.tgz", + "integrity": "sha512-yyxBKfORQ7LuRt/BQKBXrpcq59ZvSW0XxwfjAt3w2/8PmdxaFzijtMhTawprSHhpzeM5BgU2hXHG3lklIERZXg==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.2.tgz", + "integrity": "sha512-4JLXU0tD6OZNVqlwzm3HGEhAHufSiyv+skb7q0d2367VDMzrU1Q/ZeepvkcHH0rZie6uqEtTQQe0OEOOluH3Mg==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.6", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", + "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zx": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/zx/-/zx-8.8.0.tgz", + "integrity": "sha512-v0VZXgSHusDvTtZROno3Ws8xkE1uNSSwH/yF8Fm+ZwBrYhr+bRNNpsnTJ32eR/t6umc7lAz5WqdP800ugW9zFA==", + "license": "Apache-2.0", + "bin": { + "zx": "build/cli.js" + }, + "engines": { + "node": ">= 12.17.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c02671d --- /dev/null +++ b/package.json @@ -0,0 +1,77 @@ +{ + "name": "@dadigua/hyperchat", + "author": { + "name": "Dadigua", + "email": "0laopo0@gmail.com" + }, + "version": "2.0.0-alpha.63", + "private": true, + "scripts": { + "dev": "node scripts/build.mjs dev", + "dev:web": "node scripts/build.mjs dev web", + "dev:core": "node scripts/build.mjs dev core", + "dev:electron": "node scripts/build.mjs dev electron", + "dev:all": "node scripts/build.mjs dev all", + "build": "node scripts/build.mjs buildAll", + "build:shared": "node scripts/build.mjs buildShared", + "build:web": "node scripts/build.mjs buildWeb", + "build:core": "node scripts/build.mjs buildCore", + "build:electron": "node scripts/build.mjs buildElectron", + "build:publish": "node scripts/build.mjs buildForPublish", + "publish:core": "node scripts/build.mjs publishCore", + "clean": "node scripts/build.mjs clean", + "typecheck": "cd packages/shared && npm run typecheck && cd ../core && npm run typecheck && cd ../web && npm run typecheck && cd ../electron && npm run typecheck", + "lint": "cd packages/shared && npm run lint && cd ../core && npm run lint && cd ../web && npm run lint && cd ../electron && npm run lint", + "extract-i18n": "node scripts/extract-i18n.mjs", + "i18n": "node scripts/extract-i18n.mjs", + "version:sync": "node scripts/sync-version.mjs", + "version:patch": "npm version patch --no-git-tag-version && npm run version:sync", + "version:minor": "npm version minor --no-git-tag-version && npm run version:sync", + "version:major": "npm version major --no-git-tag-version && npm run version:sync", + "release": "node scripts/release.mjs", + "prepare": "husky install", + "pre-commit": "npm run typecheck && npm run lint", + "pre-push": "npm run build" + }, + "dependencies": { + "@ai-sdk/anthropic": "2.0.4", + "@ai-sdk/google": "2.0.6", + "@ai-sdk/openai": "2.0.15", + "@ai-sdk/openai-compatible": "1.0.7", + "@ai-sdk/react": "2.0.15", + "@anthropic-ai/sdk": "^0.39.0", + "@modelcontextprotocol/sdk": "^1.13.3", + "@openrouter/ai-sdk-provider": "1.1.2", + "ai": "5.0.15", + "boxen": "^7.1.1", + "cross-env": "^7.0.3", + "dayjs": "^1.11.13", + "express": "^4.21.2", + "js-yaml": "^4.1.0", + "json-schema-to-zod": "^2.6.1", + "lodash": "^4.17.21", + "log4js": "^6.9.1", + "openai": "^4.94.0", + "tsx": "^4.9.3", + "typescript": "^5.5.2", + "uuid": "^11.0.3", + "webpack": "^5.92.1", + "webpack-cli": "^5.1.4", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.24.6", + "zx": "^8.0.1" + }, + "devDependencies": { + "@types/inquirer": "^9.0.7", + "@types/js-yaml": "^4.0.9", + "@types/lodash": "^4.17.16", + "@types/node": "^22.7.5", + "@types/react": "^18.3.4", + "@types/react-dom": "^18.3.0", + "@types/update-notifier": "^6.0.8", + "@types/uuid": "^10.0.0", + "husky": "^9.1.6", + "nodemon": "^3.1.4", + "ts-loader": "^9.5.1" + } +} diff --git a/packages/core/.gitignore b/packages/core/.gitignore new file mode 100644 index 0000000..e4ed402 --- /dev/null +++ b/packages/core/.gitignore @@ -0,0 +1,49 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +dist/ + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.env.production +# package-lock.json +*.js.map +*.mjs.map +metahuman/ + +web-build/ +voices/ +videos/ +.token +lib/ +lib.zip +web-build/ +js/ +tmp/ +__pycache__/ +*.spec +*.log +.env +*.log +js/ +uploads/ + +*.mts.bak + +README.md \ No newline at end of file diff --git a/packages/core/.hyperchat/agents/Hyper/agent.md b/packages/core/.hyperchat/agents/Hyper/agent.md new file mode 100644 index 0000000..970dcff --- /dev/null +++ b/packages/core/.hyperchat/agents/Hyper/agent.md @@ -0,0 +1,20 @@ +--- +name: Hyper +allowMCPs: + - hyper_system + - hyper_browser +blockMCPTools: [] +isConfirmCallTool: false +maxTokens: 4000 +maxContextTokens: 32000 +tags: [] +subAgents: [] +version: 1 +temperature: 0.7 +modelKey: kimi:kimi-k2-0711-preview +maxAttachedDialogs: 5 +compressionStrategy: tokens +description: '' +--- + +Hyper \ No newline at end of file diff --git a/packages/core/.hyperchat/agents/Hyper/commands/commit.md b/packages/core/.hyperchat/agents/Hyper/commands/commit.md new file mode 100644 index 0000000..ae67fd0 --- /dev/null +++ b/packages/core/.hyperchat/agents/Hyper/commands/commit.md @@ -0,0 +1,49 @@ +帮我提交,$ARG + +你是一个专业的 Git 助手,专门帮助用户进行 git 代码提交操作。 + + ## 核心职责 + - 分析代码变更内容,理解修改的目的和影响 + - 编写清晰、规范的 commit 消息 + - 执行 git add 和 git commit 操作 + - **重要:绝对不能执行 git push 操作** + + ## Git Commit 消息规范 + 请遵循以下格式编写 commit 消息: + ``` + (): + + + +