From 7d58f56e499897bef4719678f5a0782a0406c90e Mon Sep 17 00:00:00 2001 From: icy Date: Thu, 6 Nov 2025 01:50:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20implement=20hybrid=20database=20archite?= =?UTF-8?q?cture=20and=20frontend=20encryption=20-=20Add=20PostgreSQL=20+?= =?UTF-8?q?=20SQLite=20hybrid=20database=20support=20with=20automatic=20sw?= =?UTF-8?q?itching=20-=20Implement=20frontend=20AES-GCM=20+=20RSA-OAEP=20e?= =?UTF-8?q?ncryption=20for=20sensitive=20data=20-=20Add=20comprehensive=20?= =?UTF-8?q?DatabaseInterface=20with=20all=20required=20methods=20-=20Fix?= =?UTF-8?q?=20compilation=20issues=20with=20interface=20consistency=20-=20?= =?UTF-8?q?Update=20all=20database=20method=20signatures=20to=20use=20Data?= =?UTF-8?q?baseInterface=20-=20Add=20missing=20UpdateTraderInitialBalance?= =?UTF-8?q?=20method=20to=20PostgreSQL=20implementation=20-=20Integrate=20?= =?UTF-8?q?RSA=20public=20key=20distribution=20via=20/api/config=20endpoin?= =?UTF-8?q?t=20-=20Add=20frontend=20crypto=20service=20with=20proper=20err?= =?UTF-8?q?or=20handling=20-=20Support=20graceful=20degradation=20between?= =?UTF-8?q?=20encrypted=20and=20plaintext=20transmission=20-=20Add=20direc?= =?UTF-8?q?tory=20creation=20for=20RSA=20keys=20and=20PEM=20parsing=20fixe?= =?UTF-8?q?s=20-=20Test=20both=20SQLite=20and=20PostgreSQL=20modes=20succe?= =?UTF-8?q?ssfully=20=F0=9F=A4=96=20Generated=20with=20[Claude=20Code](htt?= =?UTF-8?q?ps://claude.ai/code)=20Co-Authored-By:=20tinkle-community=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/CODEOWNERS | 135 + .github/ISSUE_TEMPLATE/bounty_claim.md | 2 +- .github/PULL_REQUEST_TEMPLATE.md | 270 +- .github/PULL_REQUEST_TEMPLATE/README.md | 213 + .github/PULL_REQUEST_TEMPLATE/backend.md | 121 + .github/PULL_REQUEST_TEMPLATE/docs.md | 97 + .github/PULL_REQUEST_TEMPLATE/frontend.md | 119 + .github/PULL_REQUEST_TEMPLATE/general.md | 98 + .github/workflows/docker-build.yml | 95 + .github/workflows/pr-checks-comment.yml | 176 +- .github/workflows/pr-template-suggester.yml | 189 + .gitignore | 3 + .husky/_/husky.sh | 36 + .husky/pre-commit | 4 + DOCKER_DEPLOY.ja.md | 472 +++ README.ja.md | 1343 ++++++ README.md | 14 +- api/server.go | 378 +- config.json.example | 5 +- config/config.go | 15 + config/database.go | 14 +- config/database_pg.go | 6 + config/database_test.go | 9 - decision/engine.go | 243 +- docker-compose.yml | 1 + docker/Dockerfile.backend | 4 +- docs/community/bounty-guide.md | 2 +- docs/getting-started/README.md | 2 +- docs/getting-started/README.zh-CN.md | 2 +- docs/getting-started/docker-deploy.en.md | 4 +- docs/getting-started/docker-deploy.zh-CN.md | 4 +- docs/i18n/ru/README.md | 7 +- docs/i18n/uk/README.md | 7 +- docs/i18n/zh-CN/README.md | 17 +- go.mod | 10 + go.sum | 42 + logger/config.go | 64 + logger/config.telegram.json | 33 + logger/decision_logger.go | 255 +- logger/logger.go | 210 + logger/telegram_hook.go | 158 + logger/telegram_sender.go | 120 + main.go | 78 +- manager/trader_manager.go | 57 +- market/monitor.go | 35 +- mcp/client.go | 29 +- prompts/Hansen.txt | 180 + prompts/adaptive.txt | 55 +- prompts/adaptive_relaxed.txt | 194 + prompts/default.txt | 15 + prompts/nof1.txt | 33 +- start.sh | 10 + trader/aster_trader.go | 200 +- trader/auto_trader.go | 571 ++- trader/binance_futures.go | 241 +- trader/hyperliquid_trader.go | 169 +- trader/interface.go | 9 + view_pg_data.sh | 10 +- web/.husky/pre-commit | 1 + web/.prettierignore | 22 + web/.prettierrc.json | 13 + web/eslint.config.js | 89 + web/package-lock.json | 3715 +++++++++++++++++ web/package.json | 28 +- web/public/images/guide.png | Bin 0 -> 729412 bytes web/src/App.tsx | 893 ++-- web/src/components/AILearning.tsx | 1287 ++++-- web/src/components/AITradersPage.tsx | 1932 ++++++--- web/src/components/ComparisonChart.tsx | 490 ++- web/src/components/CompetitionPage.tsx | 332 +- web/src/components/CryptoFeatureCard.tsx | 211 +- web/src/components/EquityChart.tsx | 245 +- web/src/components/ExchangeIcons.tsx | 180 +- web/src/components/Header.tsx | 31 +- web/src/components/LoginPage.tsx | 374 +- web/src/components/ModelIcons.tsx | 29 +- web/src/components/RegisterPage.tsx | 710 ++-- web/src/components/TraderConfigModal.tsx | 463 +- web/src/components/TraderConfigViewModal.tsx | 182 +- web/src/components/Typewriter.tsx | 25 +- web/src/components/landing/AboutSection.tsx | 45 +- .../components/landing/AnimatedSection.tsx | 3 +- .../components/landing/CommunitySection.tsx | 45 +- .../components/landing/FeaturesSection.tsx | 50 +- web/src/components/landing/FooterSection.tsx | 125 +- web/src/components/landing/HeaderBar.tsx | 648 ++- web/src/components/landing/HeroSection.tsx | 171 +- .../components/landing/HowItWorksSection.tsx | 105 +- web/src/components/landing/LoginModal.tsx | 49 +- web/src/contexts/AuthContext.tsx | 218 +- web/src/contexts/LanguageContext.tsx | 36 +- web/src/hooks/useCounterAnimation.ts | 51 + web/src/hooks/useGitHubStats.ts | 63 + web/src/hooks/useSystemConfig.ts | 38 +- web/src/i18n/translations.ts | 318 +- web/src/index.css | 87 +- web/src/lib/api.ts | 232 +- web/src/lib/config.ts | 22 +- web/src/lib/utils.ts | 6 +- web/src/main.tsx | 2 +- web/src/pages/LandingPage.tsx | 127 +- web/src/types.ts | 294 +- web/src/types/index.ts | 136 +- web/src/utils/traderColors.ts | 8 +- 104 files changed, 16864 insertions(+), 4152 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 .github/PULL_REQUEST_TEMPLATE/README.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/backend.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/docs.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/frontend.md create mode 100644 .github/PULL_REQUEST_TEMPLATE/general.md create mode 100644 .github/workflows/docker-build.yml create mode 100644 .github/workflows/pr-template-suggester.yml create mode 100755 .husky/_/husky.sh create mode 100755 .husky/pre-commit create mode 100644 DOCKER_DEPLOY.ja.md create mode 100644 README.ja.md delete mode 100644 config/database_test.go create mode 100644 logger/config.go create mode 100644 logger/config.telegram.json create mode 100644 logger/logger.go create mode 100644 logger/telegram_hook.go create mode 100644 logger/telegram_sender.go create mode 100644 prompts/Hansen.txt create mode 100644 prompts/adaptive_relaxed.txt create mode 100644 web/.husky/pre-commit create mode 100644 web/.prettierignore create mode 100644 web/.prettierrc.json create mode 100644 web/eslint.config.js create mode 100644 web/public/images/guide.png create mode 100644 web/src/hooks/useCounterAnimation.ts create mode 100644 web/src/hooks/useGitHubStats.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..46a29814 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,135 @@ +# CODEOWNERS +# +# This file defines code ownership and automatic reviewer assignment. +# When a PR touches files matching these patterns, the listed users/teams +# will be automatically requested for review. +# +# 此文件定义代码所有权和自动 reviewer 分配。 +# 当 PR 涉及匹配这些模式的文件时,列出的用户/团队将自动被请求审查。 +# +# Syntax | 语法: +# pattern @username @org/team-name +# +# More specific patterns override less specific ones +# 更具体的模式会覆盖不太具体的模式 +# +# Documentation: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners + +# ============================================================================= +# Global Owners | 全局所有者 +# These users will be requested for review on ALL pull requests +# 这些用户将被请求审查所有 PR +# ============================================================================= + +* @hzb1115 @Icyoung @tangmengqiu @xqliu @SkywalkerJi + +# ============================================================================= +# Specific Component Owners | 特定组件所有者 +# Additional reviewers based on file paths (in addition to global owners) +# 基于文件路径的额外 reviewers(在全局 owners 之外) +# ============================================================================= + +# Backend / Go Code | 后端 / Go 代码 +# Go files and backend logic +*.go @xqliu @SkywalkerJi @hzb1115 @Icyoung @tangmengqiu +go.mod @xqliu @SkywalkerJi @hzb1115 @Icyoung @tangmengqiu +go.sum @xqliu @SkywalkerJi @hzb1115 @Icyoung @tangmengqiu + + +# Frontend / Web | 前端 / Web +# React/TypeScript frontend code +/web/ @0xEmberZz @hzb1115 @xqliu @tangmengqiu +/web/src/ @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.tsx @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.ts @0xEmberZz @hzb1115 @xqliu @tangmengqiu (frontend TypeScript only) +*.jsx @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.css @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.scss @0xEmberZz @hzb1115 @xqliu @tangmengqiu + +# Configuration Files | 配置文件 +*.json @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.yaml @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.yml @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.toml @0xEmberZz @hzb1115 @xqliu @tangmengqiu +*.ini @0xEmberZz @hzb1115 @xqliu @tangmengqiu + +# Documentation | 文档 +# Markdown and documentation files +*.md @hzb1115 @tangmengqiu +/docs/ @hzb1115 @tangmengqiu +README.md @hzb1115 @tangmengqiu + +# GitHub Workflows & Actions | GitHub 工作流和 Actions +# CI/CD configuration and automation +/.github/ @hzb1115 +/.github/workflows/ @hzb1115 +/.github/workflows/*.yml @hzb1115 + +# Docker | Docker 配置 +Dockerfile @tangmengqiu +docker-compose.yml @tangmengqiu +.dockerignore @tangmengqiu + +# Database | 数据库 +# Database migrations and schemas +/migrations/ @SkywalkerJi @hzb1115 @Icyoung @tangmengqiu +/db/ @SkywalkerJi @hzb1115 @Icyoung @tangmengqiu +*.sql @SkywalkerJi @hzb1115 @Icyoung @tangmengqiu + +# Scripts | 脚本 +/scripts/ @hzb1115 @xqliu @tangmengqiu +*.sh @hzb1115 @xqliu @tangmengqiu +*.bash @hzb1115 @tangmengqiu +*.py @hzb1115 @tangmengqiu (if Python scripts exist) + +# Tests | 测试 +# Test files require review from component owners +*_test.go @xqliu @SkywalkerJi @heronsbillC +/tests/ @xqliu @SkywalkerJi @Icyoung @heronsbillC +/web/tests/ @Icyoung @hzb1115 @heronsbillC + +# Security & Dependencies | 安全和依赖 +# Security-sensitive files require extra attention +.env.example @hzb1115 @tangmengqiu +.gitignore @hzb1115 @tangmengqiu +go.sum @xqliu @hzb1115 @tangmengqiu +package-lock.json @Icyoung @hzb1115 @tangmengqiu +yarn.lock @Icyoung @hzb1115 @tangmengqiu + +# Build Configuration | 构建配置 +Makefile @hzb1115 @xqliu @tangmengqiu +/build/ @hzb1115 @xqliu @tangmengqiu +/dist/ @hzb1115 @tangmengqiu + +# License & Legal | 许可证和法律文件 +LICENSE @hzb1115 +COPYING @hzb1115 + +# ============================================================================= +# Notes | 注意事项 +# ============================================================================= +# +# 1. All PRs will be assigned to the 5 global owners +# 所有 PR 都会分配给这 5 个全局 owners +# +# 2. Specific paths may add additional reviewers +# 特定路径可能会添加额外的 reviewers +# +# 3. PR author will NOT be requested for review (GitHub handles this) +# PR 作者不会被请求审查(GitHub 自动处理) +# +# 4. You can adjust patterns and owners as needed +# 你可以根据需要调整模式和 owners +# +# 5. To require multiple approvals, configure branch protection rules +# 要求多个批准,请配置分支保护规则 +# +# ⚠️ IMPORTANT - Permission Requirements | 重要 - 权限要求: +# - Users listed here will ONLY be auto-requested if they have Write+ permission +# 这里列出的用户只有在拥有 Write 或以上权限时才会被自动请求 +# - GitHub will silently skip users without proper permissions +# GitHub 会静默跳过没有适当权限的用户 +# - See CODEOWNERS_PERMISSIONS.md for details +# 详见 CODEOWNERS_PERMISSIONS.md +# +# ============================================================================= diff --git a/.github/ISSUE_TEMPLATE/bounty_claim.md b/.github/ISSUE_TEMPLATE/bounty_claim.md index b8fc97eb..1f76c159 100644 --- a/.github/ISSUE_TEMPLATE/bounty_claim.md +++ b/.github/ISSUE_TEMPLATE/bounty_claim.md @@ -82,7 +82,7 @@ By claiming this bounty, I acknowledge that: - [ ] I have read the [Contributing Guide](../../CONTRIBUTING.md) - [ ] I will follow the [Code of Conduct](../../CODE_OF_CONDUCT.md) - [ ] I understand the acceptance criteria -- [ ] My contribution will be licensed under MIT License +- [ ] My contribution will be licensed under AGPL-3.0 License - [ ] Payment is subject to successful PR merge --- diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8d6a71b0..4ca3deb3 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,33 +1,44 @@ # Pull Request | PR 提交 -> **💡 提示 Tip:** 推荐 PR 标题格式 Recommended PR title format: `type(scope): description` -> 例如 Examples: `feat(trader): add new strategy` | `fix(api): resolve auth issue` -> 详情 Details: [PR Title Guide](./PR_TITLE_GUIDE.md) +> **📋 选择专用模板 | Choose Specialized Template** +> +> 我们现在提供了针对不同类型PR的专用模板,帮助你更快速地填写PR信息: +> We now offer specialized templates for different types of PRs to help you fill out the information faster: +> +> - 🔧 **[Backend PR Template](./PULL_REQUEST_TEMPLATE/backend.md)** | 后端PR模板 - For Go/API/Trading changes +> - 🎨 **[Frontend PR Template](./PULL_REQUEST_TEMPLATE/frontend.md)** | 前端PR模板 - For UI/UX changes +> - 📝 **[Documentation PR Template](./PULL_REQUEST_TEMPLATE/docs.md)** | 文档PR模板 - For documentation updates +> - 📦 **[General PR Template](./PULL_REQUEST_TEMPLATE/general.md)** | 通用PR模板 - For mixed or other changes +> +> **如何使用?| How to use?** +> - 创建PR时,在URL中添加 `?template=backend.md` 或其他模板名称 +> - When creating a PR, add `?template=backend.md` or other template name to the URL +> - 或者直接复制粘贴对应模板的内容 +> - Or simply copy and paste the content from the corresponding template + +--- + +> **💡 提示 Tip:** 推荐 PR 标题格式 `type(scope): description` +> 例如: `feat(trader): add new strategy` | `fix(api): resolve auth issue` --- ## 📝 Description | 描述 - - +**English:** | **中文:** -**English:** -**中文:** --- ## 🎯 Type of Change | 变更类型 - - - -- [ ] 🐛 Bug fix | 修复 Bug(不影响现有功能的修复) -- [ ] ✨ New feature | 新功能(不影响现有功能的新增) -- [ ] 💥 Breaking change | 破坏性变更(会导致现有功能无法正常工作的修复或功能) +- [ ] 🐛 Bug fix | 修复 Bug +- [ ] ✨ New feature | 新功能 +- [ ] 💥 Breaking change | 破坏性变更 - [ ] 📝 Documentation update | 文档更新 -- [ ] 🎨 Code style update | 代码样式更新(格式化、重命名等) -- [ ] ♻️ Refactoring | 重构(无功能变更) +- [ ] 🎨 Code style update | 代码样式更新 +- [ ] ♻️ Refactoring | 重构 - [ ] ⚡ Performance improvement | 性能优化 - [ ] ✅ Test update | 测试更新 - [ ] 🔧 Build/config change | 构建/配置变更 @@ -37,9 +48,6 @@ ## 🔗 Related Issues | 相关 Issue - - - - Closes # | 关闭 # - Related to # | 相关 # @@ -47,242 +55,50 @@ ## 📋 Changes Made | 具体变更 - - - -**English:** -- Change 1 -- Change 2 -- Change 3 - -**中文:** -- 变更 1 -- 变更 2 -- 变更 3 +**English:** | **中文:** +- +- --- ## 🧪 Testing | 测试 -### Manual Testing | 手动测试 - - - - - [ ] Tested locally | 本地测试通过 -- [ ] Tested on testnet | 测试网测试通过(交易所集成相关) -- [ ] Tested with different configurations | 测试了不同配置 +- [ ] Tests pass | 测试通过 - [ ] Verified no existing functionality broke | 确认没有破坏现有功能 -### Test Environment | 测试环境 - -- **OS | 操作系统:** [e.g. macOS, Ubuntu, Windows] -- **Go Version | Go 版本:** [e.g. 1.21.5] -- **Node Version | Node 版本:** [e.g. 18.x] (if applicable | 如适用) -- **Exchange | 交易所:** [if applicable | 如适用] - -### Test Results | 测试结果 - - - - -``` -Test output here | 测试输出 -``` - ---- - -## 📸 Screenshots / Demo | 截图/演示 - - - - - - - -**Before | 变更前:** - - -**After | 变更后:** - - --- ## ✅ Checklist | 检查清单 - - - ### Code Quality | 代码质量 - -- [ ] My code follows the project's code style | 我的代码遵循项目代码风格 ([Contributing Guide](../CONTRIBUTING.md)) -- [ ] I have performed a self-review of my code | 我已进行代码自查 -- [ ] I have commented my code, particularly in hard-to-understand areas | 我已添加代码注释,特别是难以理解的部分 -- [ ] My changes generate no new warnings or errors | 我的变更没有产生新的警告或错误 -- [ ] Code compiles successfully | 代码编译成功 (`go build` / `npm run build`) -- [ ] I have run `go fmt` (for Go code) | 我已运行 `go fmt`(Go 代码) -- [ ] I have run `npm run lint` (for frontend code) | 我已运行 `npm run lint`(前端代码) - -### Testing | 测试 - -- [ ] I have added tests that prove my fix is effective or that my feature works | 我已添加证明修复有效或功能正常的测试 -- [ ] New and existing unit tests pass locally | 新旧单元测试在本地通过 -- [ ] I have tested on testnet (for trading/exchange changes) | 我已在测试网测试(交易/交易所变更) -- [ ] Integration tests pass | 集成测试通过 +- [ ] Code follows project style | 代码遵循项目风格 +- [ ] Self-review completed | 已完成代码自查 +- [ ] Comments added for complex logic | 已添加必要注释 ### Documentation | 文档 - -- [ ] I have updated the documentation accordingly | 我已相应更新文档 -- [ ] I have updated the README if needed | 我已更新 README(如需要) -- [ ] I have added inline code comments where necessary | 我已在必要处添加代码注释 -- [ ] I have updated type definitions (for TypeScript changes) | 我已更新类型定义(TypeScript 变更) -- [ ] I have updated API documentation (if applicable) | 我已更新 API 文档(如适用) +- [ ] Updated relevant documentation | 已更新相关文档 ### Git - -- [ ] My commits follow the conventional commits format | 我的提交遵循 Conventional Commits 格式 (`feat:`, `fix:`, etc.) -- [ ] I have rebased my branch on the latest `dev` branch | 我已将分支 rebase 到最新的 `dev` 分支 -- [ ] There are no merge conflicts | 没有合并冲突 -- [ ] Commit messages are clear and descriptive | 提交信息清晰明确 - ---- - -## 🔒 Security Considerations | 安全考虑 - - - - -- [ ] No API keys or secrets are hardcoded | 没有硬编码 API 密钥或密钥 -- [ ] User inputs are properly validated | 用户输入已正确验证 -- [ ] No SQL injection vulnerabilities introduced | 未引入 SQL 注入漏洞 -- [ ] No XSS vulnerabilities introduced | 未引入 XSS 漏洞 -- [ ] Authentication/authorization properly handled | 认证/授权已正确处理 -- [ ] Sensitive data is encrypted | 敏感数据已加密 -- [ ] N/A (not security-related) | 不适用(非安全相关) - ---- - -## ⚡ Performance Impact | 性能影响 - - - - -- [ ] No significant performance impact | 无显著性能影响 -- [ ] Performance improved | 性能提升 -- [ ] Performance may be impacted (explain below) | 性能可能受影响(请在下方说明) - - - - -**English:** - -**中文:** - ---- - -## 🌐 Internationalization | 国际化 - - - - -- [ ] All user-facing text supports i18n | 所有面向用户的文本支持国际化 -- [ ] Both English and Chinese versions provided | 提供了中英文版本 -- [ ] N/A | 不适用 +- [ ] Commits follow conventional format | 提交遵循 Conventional Commits 格式 +- [ ] Rebased on latest `dev` branch | 已 rebase 到最新 `dev` 分支 +- [ ] No merge conflicts | 无合并冲突 --- ## 📚 Additional Notes | 补充说明 - - +**English:** | **中文:** -**English:** - -**中文:** --- -## 💰 For Bounty Claims | 赏金申请 +**By submitting this PR, I confirm | 提交此 PR,我确认:** - - - -- [ ] This PR is for bounty issue # | 此 PR 用于赏金 issue # -- [ ] All acceptance criteria from the bounty issue are met | 满足赏金 issue 的所有验收标准 -- [ ] I have included a demo video/screenshots | 我已包含演示视频/截图 -- [ ] I am ready for payment upon merge | 我准备好在合并后接收付款 - -**Payment Details | 付款详情:** +- [ ] I have read the [Contributing Guidelines](../CONTRIBUTING.md) | 已阅读贡献指南 +- [ ] I agree to the [Code of Conduct](../CODE_OF_CONDUCT.md) | 同意行为准则 +- [ ] My contribution is licensed under AGPL-3.0 | 贡献遵循 AGPL-3.0 许可证 --- -## 🙏 Reviewer Notes | 审查者注意事项 - - - - -**English:** - -**中文:** - ---- - -## 📋 PR Size Estimate | PR 大小估计 - - - - -- [ ] 🟢 Small (< 100 lines) | 小(< 100 行) -- [ ] 🟡 Medium (100-500 lines) | 中(100-500 行) -- [ ] 🔴 Large (> 500 lines) | 大(> 500 行) - - - - - - - ---- - -## 🎯 Review Focus Areas | 审查重点 - - - - -Please pay special attention to: -请特别注意: - -- [ ] Logic changes | 逻辑变更 -- [ ] Security implications | 安全影响 -- [ ] Performance optimization | 性能优化 -- [ ] API changes | API 变更 -- [ ] Database schema changes | 数据库架构变更 -- [ ] UI/UX changes | UI/UX 变更 - ---- - -**By submitting this PR, I confirm that:** -**提交此 PR,我确认:** - -- [ ] I have read the [Contributing Guidelines](../CONTRIBUTING.md) | 我已阅读[贡献指南](../CONTRIBUTING.md) -- [ ] I agree to the [Code of Conduct](../CODE_OF_CONDUCT.md) | 我同意[行为准则](../CODE_OF_CONDUCT.md) -- [ ] My contribution is licensed under the MIT License | 我的贡献遵循 MIT 许可证 -- [ ] I understand this is a voluntary contribution | 我理解这是自愿贡献 -- [ ] I have the right to submit this code | 我有权提交此代码 - ---- - - +🌟 **Thank you for your contribution! | 感谢你的贡献!** diff --git a/.github/PULL_REQUEST_TEMPLATE/README.md b/.github/PULL_REQUEST_TEMPLATE/README.md new file mode 100644 index 00000000..f0478ba7 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/README.md @@ -0,0 +1,213 @@ +# PR Templates | PR 模板 + +## 📋 模板概述 | Template Overview + +我们提供了4种针对不同类型PR的专用模板,帮助贡献者快速填写PR信息: +We offer 4 specialized templates for different types of PRs to help contributors quickly fill out PR information: + +### 1. 🔧 Backend Template | 后端模板 +**文件:** `backend.md` + +**适用于 | Use for:** +- Go代码变更 | Go code changes +- API端点开发 | API endpoint development +- 交易逻辑实现 | Trading logic implementation +- 后端性能优化 | Backend performance optimization +- 数据库相关改动 | Database-related changes + +**包含 | Includes:** +- Go测试环境配置 | Go test environment +- 安全考虑检查 | Security considerations +- 性能影响评估 | Performance impact assessment +- `go fmt` 和 `go build` 检查 | `go fmt` and `go build` checks + +### 2. 🎨 Frontend Template | 前端模板 +**文件:** `frontend.md` + +**适用于 | Use for:** +- UI/UX变更 | UI/UX changes +- React/Vue组件开发 | React/Vue component development +- 前端样式更新 | Frontend styling updates +- 浏览器兼容性修复 | Browser compatibility fixes +- 前端性能优化 | Frontend performance optimization + +**包含 | Includes:** +- 截图/演示要求 | Screenshots/demo requirements +- 浏览器测试清单 | Browser testing checklist +- 国际化检查 | Internationalization checks +- 响应式设计验证 | Responsive design verification +- `npm run lint` 和 `npm run build` 检查 | Linting and build checks + +### 3. 📝 Documentation Template | 文档模板 +**文件:** `docs.md` + +**适用于 | Use for:** +- README更新 | README updates +- API文档编写 | API documentation +- 教程和指南 | Tutorials and guides +- 代码注释改进 | Code comment improvements +- 翻译工作 | Translation work + +**包含 | Includes:** +- 文档类型分类 | Documentation type classification +- 内容质量检查 | Content quality checks +- 双语要求(中英文)| Bilingual requirements (EN/CN) +- 链接有效性验证 | Link validity verification + +### 4. 📦 General Template | 通用模板 +**文件:** `general.md` + +**适用于 | Use for:** +- 混合类型变更 | Mixed-type changes +- 跨多个领域的PR | Cross-domain PRs +- 构建配置变更 | Build configuration changes +- 依赖更新 | Dependency updates +- 不确定使用哪个模板时 | When unsure which template to use + +## 🤖 自动模板建议 | Automatic Template Suggestion + +我们的GitHub Action会自动分析你的PR并建议最合适的模板: +Our GitHub Action automatically analyzes your PR and suggests the most suitable template: + +### 工作原理 | How it works: + +1. **文件分析 | File Analysis** + - 检测PR中所有变更的文件类型 + - Detects all changed file types in the PR + +2. **智能判断 | Smart Detection** + - 如果 >50% 是 `.go` 文件 → 建议**后端模板** + - If >50% are `.go` files → Suggests **Backend template** + - 如果 >50% 是 `.js/.ts/.tsx/.vue` 文件 → 建议**前端模板** + - If >50% are `.js/.ts/.tsx/.vue` files → Suggests **Frontend template** + - 如果 >70% 是 `.md` 文件 → 建议**文档模板** + - If >70% are `.md` files → Suggests **Documentation template** + +3. **自动评论 | Auto-comment** + - 如果检测到你使用了默认模板,但应该用专用模板 + - If it detects you're using the default template but should use a specialized one + - 会自动添加友好的评论建议 + - It will automatically add a friendly comment suggestion + +4. **自动标签 | Auto-labeling** + - 自动添加对应的标签:`backend`、`frontend`、`documentation` + - Automatically adds corresponding labels: `backend`, `frontend`, `documentation` + +## 📖 使用方法 | How to Use + +### 方法1: URL参数(推荐) | Method 1: URL Parameter (Recommended) + +创建PR时,在URL末尾添加模板参数: +When creating a PR, add the template parameter to the URL: + +``` +https://github.com/YOUR_ORG/nofx/compare/dev...YOUR_BRANCH?template=backend.md +``` + +替换 `backend.md` 为: +Replace `backend.md` with: +- `backend.md` - 后端模板 | Backend template +- `frontend.md` - 前端模板 | Frontend template +- `docs.md` - 文档模板 | Documentation template +- `general.md` - 通用模板 | General template + +### 方法2: 手动选择 | Method 2: Manual Selection + +1. 创建PR时,默认模板会显示 + When creating a PR, the default template will be shown + +2. 根据顶部的指引链接,点击查看对应的模板 + Follow the guidance links at the top to view the corresponding template + +3. 复制模板内容到PR描述中 + Copy the template content into the PR description + +### 方法3: 跟随自动建议 | Method 3: Follow Auto-suggestion + +1. 使用任何模板创建PR + Create a PR with any template + +2. GitHub Action会自动分析并评论建议 + GitHub Action will automatically analyze and comment with a suggestion + +3. 根据建议更新PR描述 + Update the PR description based on the suggestion + +## 🎯 最佳实践 | Best Practices + +1. **提前选择 | Choose in Advance** + - 在创建PR前确定变更类型 + - Determine the change type before creating the PR + +2. **完整填写 | Complete Filling** + - 不要跳过必填项(标记为 required) + - Don't skip required items + +3. **保持简洁 | Keep it Concise** + - 描述清晰但简洁 + - Keep descriptions clear but concise + +4. **添加截图 | Add Screenshots** + - 对于UI变更,务必添加截图 + - For UI changes, always add screenshots + +5. **测试证明 | Test Evidence** + - 提供测试通过的证据 + - Provide evidence that tests pass + +## 🔧 自定义 | Customization + +如果需要修改模板或自动检测逻辑: +If you need to modify templates or auto-detection logic: + +1. **修改模板** | **Modify Templates** + - 编辑 `.github/PULL_REQUEST_TEMPLATE/*.md` 文件 + - Edit `.github/PULL_REQUEST_TEMPLATE/*.md` files + +2. **调整检测阈值** | **Adjust Detection Threshold** + - 编辑 `.github/workflows/pr-template-suggester.yml` + - Edit `.github/workflows/pr-template-suggester.yml` + - 修改文件类型占比阈值(当前:50%后端,50%前端,70%文档) + - Modify file type percentage thresholds (current: 50% backend, 50% frontend, 70% docs) + +3. **添加新模板** | **Add New Template** + - 在 `PULL_REQUEST_TEMPLATE/` 目录创建新的 `.md` 文件 + - Create a new `.md` file in the `PULL_REQUEST_TEMPLATE/` directory + - 更新工作流以支持新的文件类型检测 + - Update the workflow to support new file type detection + +## ❓ FAQ + +**Q: 我的PR既有前端又有后端代码,用哪个模板?** +**Q: My PR has both frontend and backend code, which template should I use?** + +A: 使用**通用模板**(`general.md`),或选择主要变更类型的模板。 +A: Use the **General template** (`general.md`), or choose the template for the primary change type. + +--- + +**Q: 自动建议的模板不合适怎么办?** +**Q: What if the automatically suggested template is not suitable?** + +A: 你可以忽略建议,继续使用当前模板。自动建议仅供参考。 +A: You can ignore the suggestion and continue using the current template. Auto-suggestions are for reference only. + +--- + +**Q: 可以不使用任何模板吗?** +**Q: Can I not use any template?** + +A: 不推荐。模板帮助确保PR包含必要信息,加快审查速度。 +A: Not recommended. Templates help ensure PRs contain necessary information and speed up reviews. + +--- + +**Q: 如何禁用自动模板建议?** +**Q: How to disable automatic template suggestions?** + +A: 删除或禁用 `.github/workflows/pr-template-suggester.yml` 文件。 +A: Delete or disable the `.github/workflows/pr-template-suggester.yml` file. + +--- + +🌟 **感谢使用我们的PR模板系统!| Thank you for using our PR template system!** diff --git a/.github/PULL_REQUEST_TEMPLATE/backend.md b/.github/PULL_REQUEST_TEMPLATE/backend.md new file mode 100644 index 00000000..dfc354c3 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/backend.md @@ -0,0 +1,121 @@ +# Pull Request - Backend | 后端 PR + +> **💡 提示 Tip:** 推荐 PR 标题格式 `type(scope): description` +> 例如: `feat(trader): add new strategy` | `fix(api): resolve auth issue` + +--- + +## 📝 Description | 描述 + +**English:** | **中文:** + + + +--- + +## 🎯 Type of Change | 变更类型 + +- [ ] 🐛 Bug fix | 修复 Bug +- [ ] ✨ New feature | 新功能 +- [ ] 💥 Breaking change | 破坏性变更 +- [ ] ♻️ Refactoring | 重构 +- [ ] ⚡ Performance improvement | 性能优化 +- [ ] 🔒 Security fix | 安全修复 +- [ ] 🔧 Build/config change | 构建/配置变更 + +--- + +## 🔗 Related Issues | 相关 Issue + +- Closes # | 关闭 # +- Related to # | 相关 # + +--- + +## 📋 Changes Made | 具体变更 + +**English:** | **中文:** +- +- + +--- + +## 🧪 Testing | 测试 + +### Test Environment | 测试环境 +- **OS | 操作系统:** +- **Go Version | Go 版本:** +- **Exchange | 交易所:** [if applicable | 如适用] + +### Manual Testing | 手动测试 +- [ ] Tested locally | 本地测试通过 +- [ ] Tested on testnet | 测试网测试通过(交易所集成相关) +- [ ] Unit tests pass | 单元测试通过 +- [ ] Verified no existing functionality broke | 确认没有破坏现有功能 + +### Test Results | 测试结果 +``` +Test output here | 测试输出 +``` + +--- + +## 🔒 Security Considerations | 安全考虑 + +- [ ] No API keys or secrets hardcoded | 没有硬编码 API 密钥 +- [ ] User inputs properly validated | 用户输入已正确验证 +- [ ] No SQL injection vulnerabilities | 无 SQL 注入漏洞 +- [ ] Authentication/authorization properly handled | 认证/授权正确处理 +- [ ] Sensitive data is encrypted | 敏感数据已加密 +- [ ] N/A (not security-related) | 不适用 + +--- + +## ⚡ Performance Impact | 性能影响 + +- [ ] No significant performance impact | 无显著性能影响 +- [ ] Performance improved | 性能提升 +- [ ] Performance may be impacted (explain below) | 性能可能受影响 + +**If impacted, explain | 如果受影响,请说明:** + + +--- + +## ✅ Checklist | 检查清单 + +### Code Quality | 代码质量 +- [ ] Code follows project style | 代码遵循项目风格 +- [ ] Self-review completed | 已完成代码自查 +- [ ] Comments added for complex logic | 已添加必要注释 +- [ ] Code compiles successfully | 代码编译成功 (`go build`) +- [ ] Ran `go fmt` | 已运行 `go fmt` + +### Documentation | 文档 +- [ ] Updated relevant documentation | 已更新相关文档 +- [ ] Added inline comments where necessary | 已添加必要的代码注释 +- [ ] Updated API documentation (if applicable) | 已更新 API 文档 + +### Git +- [ ] Commits follow conventional format | 提交遵循 Conventional Commits 格式 +- [ ] Rebased on latest `dev` branch | 已 rebase 到最新 `dev` 分支 +- [ ] No merge conflicts | 无合并冲突 + +--- + +## 📚 Additional Notes | 补充说明 + +**English:** | **中文:** + + +--- + +**By submitting this PR, I confirm | 提交此 PR,我确认:** + +- [ ] I have read the [Contributing Guidelines](../../CONTRIBUTING.md) | 已阅读贡献指南 +- [ ] I agree to the [Code of Conduct](../../CODE_OF_CONDUCT.md) | 同意行为准则 +- [ ] My contribution is licensed under AGPL-3.0 | 贡献遵循 AGPL-3.0 许可证 + +--- + +🌟 **Thank you for your contribution! | 感谢你的贡献!** diff --git a/.github/PULL_REQUEST_TEMPLATE/docs.md b/.github/PULL_REQUEST_TEMPLATE/docs.md new file mode 100644 index 00000000..2ce9a90c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/docs.md @@ -0,0 +1,97 @@ +# Pull Request - Documentation | 文档 PR + +> **💡 提示 Tip:** 推荐 PR 标题格式 `docs(scope): description` +> 例如: `docs(api): update trading endpoints` | `docs(readme): add setup guide` + +--- + +## 📝 Description | 描述 + +**English:** | **中文:** + + +--- + +## 📚 Type of Documentation | 文档类型 + +- [ ] 📖 README update | README 更新 +- [ ] 📋 API documentation | API 文档 +- [ ] 🎓 Tutorial/Guide | 教程/指南 +- [ ] 📝 Code comments | 代码注释 +- [ ] 🔧 Configuration docs | 配置文档 +- [ ] 🐛 Fix typo/error | 修复拼写/错误 +- [ ] 🌍 Translation | 翻译 + +--- + +## 🔗 Related Issues | 相关 Issue + +- Closes # | 关闭 # +- Related to # | 相关 # + +--- + +## 📋 Changes Made | 具体变更 + +**English:** | **中文:** +- +- + +--- + +## 📸 Screenshots (if applicable) | 截图(如适用) + + + + + +--- + +## 🌐 Internationalization | 国际化 + +- [ ] English version complete | 英文版本完整 +- [ ] Chinese version complete | 中文版本完整 +- [ ] Both versions are consistent | 两个版本内容一致 +- [ ] N/A (only one language needed) | 不适用(只需要一种语言) + +--- + +## ✅ Checklist | 检查清单 + +### Content Quality | 内容质量 +- [ ] Information is accurate and up-to-date | 信息准确且最新 +- [ ] Language is clear and concise | 语言清晰简洁 +- [ ] No spelling or grammar errors | 无拼写或语法错误 +- [ ] Links are valid and working | 链接有效且可用 +- [ ] Code examples are tested and working | 代码示例已测试且可用 +- [ ] Formatting is consistent | 格式一致 + +### Documentation Standards | 文档标准 +- [ ] Follows project documentation style | 遵循项目文档风格 +- [ ] Includes necessary examples | 包含必要的示例 +- [ ] Technical terms are explained | 技术术语已解释 +- [ ] Self-review completed | 已完成自查 + +### Git +- [ ] Commits follow conventional format | 提交遵循 Conventional Commits 格式 +- [ ] Rebased on latest `dev` branch | 已 rebase 到最新 `dev` 分支 +- [ ] No merge conflicts | 无合并冲突 + +--- + +## 📚 Additional Notes | 补充说明 + +**English:** | **中文:** + + +--- + +**By submitting this PR, I confirm | 提交此 PR,我确认:** + +- [ ] I have read the [Contributing Guidelines](../../CONTRIBUTING.md) | 已阅读贡献指南 +- [ ] I agree to the [Code of Conduct](../../CODE_OF_CONDUCT.md) | 同意行为准则 +- [ ] My contribution is licensed under AGPL-3.0 | 贡献遵循 AGPL-3.0 许可证 + +--- + +🌟 **Thank you for your contribution! | 感谢你的贡献!** diff --git a/.github/PULL_REQUEST_TEMPLATE/frontend.md b/.github/PULL_REQUEST_TEMPLATE/frontend.md new file mode 100644 index 00000000..b95a20d0 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/frontend.md @@ -0,0 +1,119 @@ +# Pull Request - Frontend | 前端 PR + +> **💡 提示 Tip:** 推荐 PR 标题格式 `type(scope): description` +> 例如: `feat(ui): add dark mode toggle` | `fix(form): resolve validation bug` + +--- + +## 📝 Description | 描述 + +**English:** | **中文:** + + +--- + +## 🎯 Type of Change | 变更类型 + +- [ ] 🐛 Bug fix | 修复 Bug +- [ ] ✨ New feature | 新功能 +- [ ] 💥 Breaking change | 破坏性变更 +- [ ] 🎨 Code style update | 代码样式更新 +- [ ] ♻️ Refactoring | 重构 +- [ ] ⚡ Performance improvement | 性能优化 + +--- + +## 🔗 Related Issues | 相关 Issue + +- Closes # | 关闭 # +- Related to # | 相关 # + +--- + +## 📋 Changes Made | 具体变更 + +**English:** | **中文:** +- +- + +--- + +## 📸 Screenshots / Demo | 截图/演示 + + + + +**Before | 变更前:** + + +**After | 变更后:** + + +--- + +## 🧪 Testing | 测试 + +### Test Environment | 测试环境 +- **OS | 操作系统:** +- **Node Version | Node 版本:** +- **Browser(s) | 浏览器:** + +### Manual Testing | 手动测试 +- [ ] Tested in development mode | 开发模式测试通过 +- [ ] Tested production build | 生产构建测试通过 +- [ ] Tested on multiple browsers | 多浏览器测试通过 +- [ ] Tested responsive design | 响应式设计测试通过 +- [ ] Verified no existing functionality broke | 确认没有破坏现有功能 + +--- + +## 🌐 Internationalization | 国际化 + +- [ ] All user-facing text supports i18n | 所有面向用户的文本支持国际化 +- [ ] Both English and Chinese versions provided | 提供了中英文版本 +- [ ] N/A | 不适用 + +--- + +## ✅ Checklist | 检查清单 + +### Code Quality | 代码质量 +- [ ] Code follows project style | 代码遵循项目风格 +- [ ] Self-review completed | 已完成代码自查 +- [ ] Comments added for complex logic | 已添加必要注释 +- [ ] Code builds successfully | 代码构建成功 (`npm run build`) +- [ ] Ran `npm run lint` | 已运行 `npm run lint` +- [ ] No console errors or warnings | 无控制台错误或警告 + +### Testing | 测试 +- [ ] Component tests added/updated | 已添加/更新组件测试 +- [ ] Tests pass locally | 测试在本地通过 + +### Documentation | 文档 +- [ ] Updated relevant documentation | 已更新相关文档 +- [ ] Updated type definitions (TypeScript) | 已更新类型定义 +- [ ] Added JSDoc comments where necessary | 已添加 JSDoc 注释 + +### Git +- [ ] Commits follow conventional format | 提交遵循 Conventional Commits 格式 +- [ ] Rebased on latest `dev` branch | 已 rebase 到最新 `dev` 分支 +- [ ] No merge conflicts | 无合并冲突 + +--- + +## 📚 Additional Notes | 补充说明 + +**English:** | **中文:** + + +--- + +**By submitting this PR, I confirm | 提交此 PR,我确认:** + +- [ ] I have read the [Contributing Guidelines](../../CONTRIBUTING.md) | 已阅读贡献指南 +- [ ] I agree to the [Code of Conduct](../../CODE_OF_CONDUCT.md) | 同意行为准则 +- [ ] My contribution is licensed under AGPL-3.0 | 贡献遵循 AGPL-3.0 许可证 + +--- + +🌟 **Thank you for your contribution! | 感谢你的贡献!** diff --git a/.github/PULL_REQUEST_TEMPLATE/general.md b/.github/PULL_REQUEST_TEMPLATE/general.md new file mode 100644 index 00000000..23773e4c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/general.md @@ -0,0 +1,98 @@ +# Pull Request - General | 通用 PR + +> **💡 提示 Tip:** 推荐 PR 标题格式 `type(scope): description` +> 例如: `feat(trader): add new strategy` | `fix(api): resolve auth issue` | `docs(readme): update` + +--- + +## 📝 Description | 描述 + +**English:** | **中文:** + + +--- + +## 🎯 Type of Change | 变更类型 + +- [ ] 🐛 Bug fix | 修复 Bug +- [ ] ✨ New feature | 新功能 +- [ ] 💥 Breaking change | 破坏性变更 +- [ ] 📝 Documentation update | 文档更新 +- [ ] 🎨 Code style update | 代码样式更新 +- [ ] ♻️ Refactoring | 重构 +- [ ] ⚡ Performance improvement | 性能优化 +- [ ] ✅ Test update | 测试更新 +- [ ] 🔧 Build/config change | 构建/配置变更 +- [ ] 🔒 Security fix | 安全修复 + +--- + +## 🔗 Related Issues | 相关 Issue + +- Closes # | 关闭 # +- Related to # | 相关 # + +--- + +## 📋 Changes Made | 具体变更 + +**English:** | **中文:** +- +- + +--- + +## 🧪 Testing | 测试 + +- [ ] Tested locally | 本地测试通过 +- [ ] Tests pass | 测试通过 +- [ ] Verified no existing functionality broke | 确认没有破坏现有功能 + +**Test details | 测试详情:** + + +--- + +## ✅ Checklist | 检查清单 + +### Code Quality | 代码质量 +- [ ] Code follows project style | 代码遵循项目风格 +- [ ] Self-review completed | 已完成代码自查 +- [ ] Comments added for complex logic | 已添加必要注释 +- [ ] No new warnings or errors | 无新的警告或错误 + +### Documentation | 文档 +- [ ] Updated relevant documentation | 已更新相关文档 +- [ ] Added inline comments where necessary | 已添加必要的代码注释 + +### Git +- [ ] Commits follow conventional format | 提交遵循 Conventional Commits 格式 +- [ ] Rebased on latest `dev` branch | 已 rebase 到最新 `dev` 分支 +- [ ] No merge conflicts | 无合并冲突 + +--- + +## 🔒 Security (if applicable) | 安全(如适用) + +- [ ] No API keys or secrets hardcoded | 没有硬编码 API 密钥 +- [ ] User inputs properly validated | 用户输入已正确验证 +- [ ] N/A | 不适用 + +--- + +## 📚 Additional Notes | 补充说明 + +**English:** | **中文:** + + +--- + +**By submitting this PR, I confirm | 提交此 PR,我确认:** + +- [ ] I have read the [Contributing Guidelines](../../CONTRIBUTING.md) | 已阅读贡献指南 +- [ ] I agree to the [Code of Conduct](../../CODE_OF_CONDUCT.md) | 同意行为准则 +- [ ] My contribution is licensed under AGPL-3.0 | 贡献遵循 AGPL-3.0 许可证 + +--- + +🌟 **Thank you for your contribution! | 感谢你的贡献!** diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml new file mode 100644 index 00000000..84036674 --- /dev/null +++ b/.github/workflows/docker-build.yml @@ -0,0 +1,95 @@ +name: Build and Push Docker Images + +on: + push: + branches: + - main + - dev + tags: + - 'v*' + pull_request: + branches: + - main + - dev + workflow_dispatch: + +env: + REGISTRY_GHCR: ghcr.io + IMAGE_NAME_BACKEND: ${{ github.repository }}/nofx-backend + IMAGE_NAME_FRONTEND: ${{ github.repository }}/nofx-frontend + +jobs: + build-and-push: + runs-on: ubuntu-22.04 + permissions: + contents: read + packages: write + + strategy: + matrix: + include: + - name: backend + dockerfile: ./docker/Dockerfile.backend + image_suffix: backend + - name: frontend + dockerfile: ./docker/Dockerfile.frontend + image_suffix: frontend + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - 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 GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY_GHCR }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Log in to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + continue-on-error: true + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY_GHCR }}/${{ github.repository }}/nofx-${{ matrix.image_suffix }} + ${{ secrets.DOCKERHUB_USERNAME && format('{0}/nofx-{1}', secrets.DOCKERHUB_USERNAME, matrix.image_suffix) || '' }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=sha,prefix={{branch}} + type=raw,value=latest,enable={{is_default_branch}} + + - name: Build and push ${{ matrix.name }} image + uses: docker/build-push-action@v5 + with: + context: . + file: ${{ matrix.dockerfile }} + platforms: linux/amd64,linux/arm64 + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: | + BUILD_DATE=${{ github.event.head_commit.timestamp }} + VCS_REF=${{ github.sha }} + VERSION=${{ github.ref_name }} + + - name: Image digest + run: echo "Image digest for ${{ matrix.name }} - ${{ steps.meta.outputs.digest }}" diff --git a/.github/workflows/pr-checks-comment.yml b/.github/workflows/pr-checks-comment.yml index db0983f8..8e46508f 100644 --- a/.github/workflows/pr-checks-comment.yml +++ b/.github/workflows/pr-checks-comment.yml @@ -104,6 +104,53 @@ jobs: echo "⚠️ Frontend results artifact not found" fi + - name: Get PR information + id: pr-info + if: steps.backend.outputs.pr_number != '0' + uses: actions/github-script@v7 + with: + script: | + const prNumber = ${{ steps.backend.outputs.pr_number }}; + + // Get PR details + const { data: pr } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber + }); + + // Check PR title format (Conventional Commits) + const prTitle = pr.title; + const conventionalCommitPattern = /^(feat|fix|docs|style|refactor|perf|test|chore|ci|security|build)(\(.+\))?: .+/; + const titleValid = conventionalCommitPattern.test(prTitle); + + core.setOutput('pr_title', prTitle); + core.setOutput('title_valid', titleValid); + + // Calculate PR size + const additions = pr.additions; + const deletions = pr.deletions; + const total = additions + deletions; + + let size = ''; + let sizeEmoji = ''; + if (total < 300) { + size = 'Small'; + sizeEmoji = '🟢'; + } else if (total < 1000) { + size = 'Medium'; + sizeEmoji = '🟡'; + } else { + size = 'Large'; + sizeEmoji = '🔴'; + } + + core.setOutput('pr_size', size); + core.setOutput('size_emoji', sizeEmoji); + core.setOutput('total_lines', total); + core.setOutput('additions', additions); + core.setOutput('deletions', deletions); + - name: Post advisory results comment if: steps.backend.outputs.pr_number != '0' uses: actions/github-script@v7 @@ -113,7 +160,40 @@ jobs: let comment = '## 🤖 Advisory Check Results\n\n'; comment += 'These are **advisory** checks to help improve code quality. They won\'t block your PR from being merged.\n\n'; - comment += '> **Note:** PR title and size checks are handled by the main workflow and may appear in a separate comment.\n\n'; + + // PR Information section + const prTitle = '${{ steps.pr-info.outputs.pr_title }}'; + const titleValid = '${{ steps.pr-info.outputs.title_valid }}' === 'true'; + const prSize = '${{ steps.pr-info.outputs.pr_size }}'; + const sizeEmoji = '${{ steps.pr-info.outputs.size_emoji }}'; + const totalLines = '${{ steps.pr-info.outputs.total_lines }}'; + const additions = '${{ steps.pr-info.outputs.additions }}'; + const deletions = '${{ steps.pr-info.outputs.deletions }}'; + + comment += '### 📋 PR Information\n\n'; + + // Title check + if (titleValid) { + comment += '**Title Format:** ✅ Good - Follows Conventional Commits\n'; + } else { + comment += '**Title Format:** ⚠️ Suggestion - Consider using `type(scope): description`\n'; + comment += '
Recommended format\n\n'; + comment += '**Valid types:** `feat`, `fix`, `docs`, `style`, `refactor`, `perf`, `test`, `chore`, `ci`, `security`, `build`\n\n'; + comment += '**Examples:**\n'; + comment += '- `feat(trader): add new trading strategy`\n'; + comment += '- `fix(api): resolve authentication issue`\n'; + comment += '- `docs: update README`\n'; + comment += '
\n\n'; + } + + // Size check + comment += `**PR Size:** ${sizeEmoji} ${prSize} (${totalLines} lines: +${additions} -${deletions})\n`; + + if (prSize === 'Large') { + comment += '\n💡 **Suggestion:** This is a large PR. Consider breaking it into smaller, focused PRs for easier review.\n'; + } + + comment += '\n'; // Backend checks const fmtStatus = '${{ steps.backend.outputs.fmt_status }}'; @@ -208,37 +288,71 @@ jobs: return; } - const prNumber = pulls.data[0].number; + const pr = pulls.data[0]; + const prNumber = pr.number; - const comment = [ - '## ⚠️ Advisory Checks - Results Unavailable', - '', - 'The advisory checks workflow completed, but results could not be retrieved.', - '', - '### Possible reasons:', - '- Artifacts were not uploaded successfully', - '- Artifacts expired (retention: 1 day)', - '- Permission issues', - '', - '### What to do:', - '1. Check the [PR Checks - Run workflow](${{ github.event.workflow_run.html_url }}) logs', - '2. Ensure your code passes local checks:', - '```bash', - '# Backend', - 'go fmt ./...', - 'go vet ./...', - 'go build', - 'go test ./...', - '', - '# Frontend (if applicable)', - 'cd web', - 'npm run build', - '```', - '', - '---', - '', - '*This is an automated fallback message. The advisory checks ran but results are not available.*' - ].join('\n'); + // Get PR information for fallback comment + const prTitle = pr.title; + const conventionalCommitPattern = /^(feat|fix|docs|style|refactor|perf|test|chore|ci|security|build)(\(.+\))?: .+/; + const titleValid = conventionalCommitPattern.test(prTitle); + + const additions = pr.additions || 0; + const deletions = pr.deletions || 0; + const total = additions + deletions; + + let size = ''; + let sizeEmoji = ''; + if (total < 300) { + size = 'Small'; + sizeEmoji = '🟢'; + } else if (total < 1000) { + size = 'Medium'; + sizeEmoji = '🟡'; + } else { + size = 'Large'; + sizeEmoji = '🔴'; + } + + let comment = '## ⚠️ Advisory Checks - Results Unavailable\n\n'; + comment += 'The advisory checks workflow completed, but results could not be retrieved.\n\n'; + + // Add PR Information + comment += '### 📋 PR Information\n\n'; + + if (titleValid) { + comment += '**Title Format:** ✅ Good - Follows Conventional Commits\n'; + } else { + comment += '**Title Format:** ⚠️ Suggestion - Consider using `type(scope): description`\n'; + } + + comment += `**PR Size:** ${sizeEmoji} ${size} (${total} lines: +${additions} -${deletions})\n\n`; + + if (size === 'Large') { + comment += '💡 **Suggestion:** This is a large PR. Consider breaking it into smaller, focused PRs for easier review.\n\n'; + } + + comment += '---\n\n'; + comment += '### ⚠️ Backend/Frontend Check Results\n\n'; + comment += 'Results could not be retrieved.\n\n'; + comment += '**Possible reasons:**\n'; + comment += '- Artifacts were not uploaded successfully\n'; + comment += '- Artifacts expired (retention: 1 day)\n'; + comment += '- Permission issues\n\n'; + comment += '**What to do:**\n'; + comment += `1. Check the [PR Checks - Run workflow](${context.payload.workflow_run?.html_url || 'logs'}) logs\n`; + comment += '2. Ensure your code passes local checks:\n'; + comment += '```bash\n'; + comment += '# Backend\n'; + comment += 'go fmt ./...\n'; + comment += 'go vet ./...\n'; + comment += 'go build\n'; + comment += 'go test ./...\n\n'; + comment += '# Frontend (if applicable)\n'; + comment += 'cd web\n'; + comment += 'npm run build\n'; + comment += '```\n\n'; + comment += '---\n\n'; + comment += '*This is an automated fallback message. The advisory checks ran but results are not available.*'; await github.rest.issues.createComment({ issue_number: prNumber, diff --git a/.github/workflows/pr-template-suggester.yml b/.github/workflows/pr-template-suggester.yml new file mode 100644 index 00000000..9e74a9e4 --- /dev/null +++ b/.github/workflows/pr-template-suggester.yml @@ -0,0 +1,189 @@ +name: PR Template Suggester + +on: + pull_request: + types: [opened, edited, synchronize] + +permissions: + pull-requests: write + contents: read + +jobs: + suggest-template: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Analyze PR files and auto-apply template + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const { data: files } = await github.rest.pulls.listFiles({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + }); + + let goFiles = 0, jsFiles = 0, tsFiles = 0, mdFiles = 0, otherFiles = 0; + + for (const file of files) { + const filename = file.filename.toLowerCase(); + if (filename.endsWith('.go')) goFiles++; + else if (filename.endsWith('.js') || filename.endsWith('.jsx')) jsFiles++; + else if (filename.endsWith('.ts') || filename.endsWith('.tsx') || filename.endsWith('.vue')) tsFiles++; + else if (filename.endsWith('.md')) mdFiles++; + else otherFiles++; + } + + const totalFiles = goFiles + jsFiles + tsFiles + mdFiles + otherFiles; + if (totalFiles === 0) { console.log('No files changed'); return; } + + let suggestedTemplate = null, templateEmoji = '', templateLabel = ''; + + if (goFiles / totalFiles > 0.5) { + suggestedTemplate = 'backend'; templateEmoji = '🔧'; templateLabel = 'backend'; + } else if ((jsFiles + tsFiles) / totalFiles > 0.5) { + suggestedTemplate = 'frontend'; templateEmoji = '🎨'; templateLabel = 'frontend'; + } else if (mdFiles / totalFiles > 0.7) { + suggestedTemplate = 'docs'; templateEmoji = '📝'; templateLabel = 'documentation'; + } + + const { data: pr } = await github.rest.pulls.get({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + }); + + const prBody = pr.body || ''; + const usesBackendTemplate = prBody.includes('Pull Request - Backend'); + const usesFrontendTemplate = prBody.includes('Pull Request - Frontend'); + const usesDocsTemplate = prBody.includes('Pull Request - Documentation'); + const usesGeneralTemplate = prBody.includes('Pull Request - General'); + const usingDefaultTemplate = !usesBackendTemplate && !usesFrontendTemplate && !usesDocsTemplate && !usesGeneralTemplate; + + if (templateLabel) { + try { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + labels: [templateLabel] + }); + console.log('Added label: ' + templateLabel); + } catch (error) { + console.log('Label might not exist, skipping...'); + } + } + + function isPRBodyEmpty(body) { + if (!body || body.trim().length < 100) return true; + const hasEmptyDescription = body.includes('**English:**') && body.match(/\*\*English:\*\*\s*\n\s*\n\s*\n/); + const hasEmptyChanges = body.includes('具体变更') && body.match(/\*\*中文:\*\*\s*\n\s*-\s*\n\s*-\s*\n/); + if (hasEmptyDescription || hasEmptyChanges) return true; + const descMatch = body.match(/\*\*English:\*\*[||]\s*\*\*中文:\*\*\s*\n\s*(.+)/); + if (!descMatch || descMatch[1].trim().length < 10) return true; + return false; + } + + if (suggestedTemplate && usingDefaultTemplate) { + const shouldAutoApply = isPRBodyEmpty(prBody); + const templatePath = '.github/PULL_REQUEST_TEMPLATE/' + suggestedTemplate + '.md'; + + if (shouldAutoApply) { + try { + const { data: templateFile } = await github.rest.repos.getContent({ + owner: context.repo.owner, + repo: context.repo.repo, + path: templatePath, + ref: context.payload.pull_request.head.ref + }); + + const templateContent = Buffer.from(templateFile.content, 'base64').toString('utf-8'); + + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + body: templateContent + }); + + console.log('Auto-applied ' + suggestedTemplate + ' template'); + + let fileStats = []; + if (goFiles > 0) fileStats.push('- 🔧 Go files: ' + goFiles); + if (jsFiles > 0) fileStats.push('- 🎨 JavaScript files: ' + jsFiles); + if (tsFiles > 0) fileStats.push('- 🎨 TypeScript files: ' + tsFiles); + if (mdFiles > 0) fileStats.push('- 📝 Markdown files: ' + mdFiles); + if (otherFiles > 0) fileStats.push('- 📦 Other files: ' + otherFiles); + const fileStatsText = fileStats.join('\n'); + + const notifyComment = '## ' + templateEmoji + ' 已自动应用专用模板 | Auto-Applied Template\n\n' + + '检测到您的PR主要包含 **' + suggestedTemplate + '** 相关的变更,系统已自动为您应用相应的模板。\n\n' + + 'Detected that your PR primarily contains **' + suggestedTemplate + '** changes. The appropriate template has been automatically applied.\n\n' + + '**文件统计 | File Statistics**\n' + fileStatsText + '\n\n' + + '**已应用模板 | Applied Template**\n`' + templatePath + '`\n\n' + + '✨ 您现在可以直接在PR描述中填写相关信息了!\n\n' + + '✨ You can now fill in the relevant information in the PR description!'; + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: notifyComment + }); + + } catch (error) { + console.log('Failed to fetch or apply template: ' + error.message); + const templateUrl = 'https://raw.githubusercontent.com/' + context.repo.owner + '/' + context.repo.repo + '/dev/.github/PULL_REQUEST_TEMPLATE/' + suggestedTemplate + '.md'; + const fallbackComment = '## ' + templateEmoji + ' 建议使用专用模板 | Suggested Template\n\n' + + '您的PR主要包含 **' + suggestedTemplate + '** 相关的变更。\n\n' + + '**推荐模板 | Recommended Template:** `.github/PULL_REQUEST_TEMPLATE/' + suggestedTemplate + '.md`\n\n' + + '**如何使用 | How to use:** [点击查看模板内容](' + templateUrl + ')'; + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: fallbackComment + }); + } + } else { + console.log('PR body has content, sending suggestion only'); + + let fileStats = []; + if (goFiles > 0) fileStats.push('- 🔧 Go files: ' + goFiles); + if (jsFiles > 0) fileStats.push('- 🎨 JavaScript files: ' + jsFiles); + if (tsFiles > 0) fileStats.push('- 🎨 TypeScript files: ' + tsFiles); + if (mdFiles > 0) fileStats.push('- 📝 Markdown files: ' + mdFiles); + if (otherFiles > 0) fileStats.push('- 📦 Other files: ' + otherFiles); + const fileStatsText = fileStats.join('\n'); + + const templateUrl = 'https://raw.githubusercontent.com/' + context.repo.owner + '/' + context.repo.repo + '/dev/.github/PULL_REQUEST_TEMPLATE/' + suggestedTemplate + '.md'; + + const comment = '## ' + templateEmoji + ' 建议使用专用模板 | Suggested Template\n\n' + + '您的PR主要包含 **' + suggestedTemplate + '** 相关的变更。我们建议使用更适合的模板以简化填写。\n\n' + + 'Your PR primarily contains **' + suggestedTemplate + '** changes. We suggest using a more suitable template to simplify filling.\n\n' + + '**文件统计 | File Statistics**\n' + fileStatsText + '\n\n' + + '**推荐模板 | Recommended Template**\n```\n.github/PULL_REQUEST_TEMPLATE/' + suggestedTemplate + '.md\n```\n\n' + + '**如何使用 | How to use**\n' + + '1. 编辑PR描述 | Edit PR description\n' + + '2. 复制 [' + suggestedTemplate + ' 模板内容](' + templateUrl + ') | Copy [' + suggestedTemplate + ' template content](' + templateUrl + ')\n' + + '3. 或在创建PR时使用URL参数 | Or use URL parameter when creating PR\n' + + ' `?template=' + suggestedTemplate + '.md`\n\n' + + '_这是一个自动建议,您可以继续使用当前模板。_\n\n' + + '_This is an automated suggestion. You may continue using the current template._'; + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: context.issue.number, + body: comment + }); + } + } else if (suggestedTemplate && !usingDefaultTemplate) { + console.log('PR already uses a specific template'); + } else { + console.log('No specific template suggestion needed - mixed changes'); + } diff --git a/.gitignore b/.gitignore index ad0d2a5b..d595c953 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ web/node_modules/ node_modules/ web/dist/ web/.vite/ + +# ESLint 临时报告文件(调试时生成,不纳入版本控制) +eslint-*.json diff --git a/.husky/_/husky.sh b/.husky/_/husky.sh new file mode 100755 index 00000000..cec959a6 --- /dev/null +++ b/.husky/_/husky.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env sh +if [ -z "$husky_skip_init" ]; then + debug () { + if [ "$HUSKY_DEBUG" = "1" ]; then + echo "husky (debug) - $1" + fi + } + + readonly hook_name="$(basename -- "$0")" + debug "starting $hook_name..." + + if [ "$HUSKY" = "0" ]; then + debug "HUSKY env variable is set to 0, skipping hook" + exit 0 + fi + + if [ -f ~/.huskyrc ]; then + debug "sourcing ~/.huskyrc" + . ~/.huskyrc + fi + + readonly husky_skip_init=1 + export husky_skip_init + sh -e "$0" "$@" + exitCode="$?" + + if [ $exitCode != 0 ]; then + echo "husky - $hook_name hook exited with code $exitCode (error)" + fi + + if [ $exitCode = 127 ]; then + echo "husky - command not found in PATH=$PATH" + fi + + exit $exitCode +fi diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..25b3e6b7 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +cd web && npx lint-staged diff --git a/DOCKER_DEPLOY.ja.md b/DOCKER_DEPLOY.ja.md new file mode 100644 index 00000000..e4a1fe9e --- /dev/null +++ b/DOCKER_DEPLOY.ja.md @@ -0,0 +1,472 @@ +# 🐳 Dockerワンクリックデプロイガイド + +このガイドは、Dockerを使用してNOFX AIトレーディング競争システムを迅速にデプロイする方法を説明します。 + +## 📋 前提条件 + +開始する前に、システムに以下が必要です: + +- **Docker**: バージョン20.10以上 +- **Docker Compose**: バージョン2.0以上 + +### Dockerのインストール + +#### macOS / Windows +[Docker Desktop](https://www.docker.com/products/docker-desktop/)をダウンロードしてインストール + +#### Linux (Ubuntu/Debian) + +> #### Docker Composeバージョンに関する注意 +> +> **新規ユーザー推奨:** +> - **Docker Desktopを使用**: 最新のDocker Composeが自動的に含まれ、別途インストールは不要 +> - シンプルなインストール、ワンクリックセットアップ、GUI管理を提供 +> - macOS、Windows、一部のLinuxディストリビューションをサポート +> +> **既存ユーザー向け注意:** +> - **スタンドアロンdocker-composeの非推奨**: 独立したDocker Composeバイナリのダウンロードは推奨されません +> - **組み込みバージョンを使用**: Docker 20.10+には`docker compose`コマンド(スペース付き)が含まれています +> - 古い`docker-compose`をまだ使用している場合は、新しい構文にアップグレードしてください + +*推奨:Docker Desktop(利用可能な場合)またはCompose組み込みのDocker CEを使用* + +```bash +# Dockerをインストール(composeを含む) +curl -fsSL https://get.docker.com -o get-docker.sh +sudo sh get-docker.sh + +# dockerグループにユーザーを追加 +sudo usermod -aG docker $USER +newgrp docker + +# インストールを確認(新しいコマンド) +docker --version +docker compose --version # Docker 24+にはこれが含まれており、別途インストール不要 +``` + +## 🚀 クイックスタート(3ステップ) + +### ステップ1:設定ファイルを準備 + +```bash +# 設定テンプレートをコピー +cp config.json.example config.json + +# APIキーで設定ファイルを編集 +nano config.json # または他のエディタを使用 +``` + +**必須フィールド:** +```json +{ + "traders": [ + { + "id": "my_trader", + "name": "My AI Trader", + "ai_model": "deepseek", + "binance_api_key": "YOUR_BINANCE_API_KEY", // ← BinanceのAPIキー + "binance_secret_key": "YOUR_BINANCE_SECRET_KEY", // ← Binanceのシークレットキー + "deepseek_key": "YOUR_DEEPSEEK_API_KEY", // ← DeepSeekのAPIキー + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080 +} +``` + +### ステップ2:ワンクリック起動 + +```bash +# すべてのサービスをビルドして起動(初回実行) +docker compose up -d --build + +# 以降の起動(リビルドなし) +docker compose up -d +``` + +**起動オプション:** +- `--build`: Dockerイメージをビルド(初回実行またはコード更新後に使用) +- `-d`: デタッチモードで実行(バックグラウンド) + +### ステップ3:システムにアクセス + +デプロイが完了したら、ブラウザを開いて以下にアクセス: + +- **Webインターフェース**: http://localhost:3000 +- **APIヘルスチェック**: http://localhost:8080/health + +## 📊 サービス管理 + +### 実行状態を表示 + +```bash +# すべてのコンテナステータスを表示 +docker compose ps + +# サービスヘルスステータスを表示 +docker compose ps --format json | jq +``` + +### ログを表示 + +```bash +# すべてのサービスログを表示 +docker compose logs -f + +# バックエンドログのみを表示 +docker compose logs -f backend + +# フロントエンドログのみを表示 +docker compose logs -f frontend + +# 最後の100行を表示 +docker compose logs --tail=100 +``` + +### サービスを停止 + +```bash +# すべてのサービスを停止(データを保持) +docker compose stop + +# コンテナを停止して削除(データを保持) +docker compose down + +# コンテナとボリュームを停止して削除(すべてのデータをクリア) +docker compose down -v +``` + +### サービスを再起動 + +```bash +# すべてのサービスを再起動 +docker compose restart + +# バックエンドのみを再起動 +docker compose restart backend + +# フロントエンドのみを再起動 +docker compose restart frontend +``` + +### サービスを更新 + +```bash +# 最新のコードをプル +git pull + +# リビルドして再起動 +docker compose up -d --build +``` + +## 🔧 高度な設定 + +### ポートを変更 + +`docker-compose.yml`を編集してポートマッピングを変更: + +```yaml +services: + backend: + ports: + - "8080:8080" # "your_port:8080"に変更 + + frontend: + ports: + - "3000:80" # "your_port:80"に変更 +``` + +### リソース制限 + +`docker-compose.yml`にリソース制限を追加: + +```yaml +services: + backend: + deploy: + resources: + limits: + cpus: '2' + memory: 2G + reservations: + cpus: '1' + memory: 1G +``` + +### 環境変数 + +`.env`ファイルを作成して環境変数を管理: + +```bash +# .env +TZ=Asia/Tokyo +BACKEND_PORT=8080 +FRONTEND_PORT=3000 +``` + +次に`docker-compose.yml`で使用: + +```yaml +services: + backend: + ports: + - "${BACKEND_PORT}:8080" +``` + +## 📁 データの永続化 + +システムは自動的にデータをローカルディレクトリに永続化します: + +- `./decision_logs/`: AI判断ログ +- `./coin_pool_cache/`: コインプールキャッシュ +- `./config.json`: 設定ファイル(マウント済み) + +**データの場所:** +```bash +# データディレクトリを表示 +ls -la decision_logs/ +ls -la coin_pool_cache/ + +# データをバックアップ +tar -czf backup_$(date +%Y%m%d).tar.gz decision_logs/ coin_pool_cache/ config.json + +# データを復元 +tar -xzf backup_20241029.tar.gz +``` + +## 🐛 トラブルシューティング + +### コンテナが起動しない + +```bash +# 詳細なエラーメッセージを表示 +docker compose logs backend +docker compose logs frontend + +# コンテナステータスを確認 +docker compose ps -a + +# リビルド(キャッシュをクリア) +docker compose build --no-cache +``` + +### ポートが既に使用中 + +```bash +# ポートを使用しているプロセスを検索 +lsof -i :8080 # バックエンドポート +lsof -i :3000 # フロントエンドポート + +# プロセスを強制終了 +kill -9 +``` + +### 設定ファイルが見つからない + +```bash +# config.jsonが存在することを確認 +ls -la config.json + +# 存在しない場合、テンプレートをコピー +cp config.json.example config.json +``` + +### ヘルスチェックが失敗 + +```bash +# ヘルスステータスを確認 +docker inspect nofx-backend | jq '.[0].State.Health' +docker inspect nofx-frontend | jq '.[0].State.Health' + +# ヘルスエンドポイントを手動でテスト +curl http://localhost:8080/health +curl http://localhost:3000/health +``` + +### フロントエンドがバックエンドに接続できない + +```bash +# ネットワーク接続を確認 +docker compose exec frontend ping backend + +# バックエンドサービスが実行中か確認 +docker compose exec frontend wget -O- http://backend:8080/health +``` + +### Dockerリソースをクリーン + +```bash +# 未使用のイメージをクリーン +docker image prune -a + +# 未使用のボリュームをクリーン +docker volume prune + +# すべての未使用リソースをクリーン(注意して使用) +docker system prune -a --volumes +``` + +## 🔐 セキュリティ推奨事項 + +1. **config.jsonをGitにコミットしない** + ```bash + # config.jsonが.gitignoreに含まれていることを確認 + echo "config.json" >> .gitignore + ``` + +2. **機密データには環境変数を使用** + ```yaml + # docker-compose.yml + services: + backend: + environment: + - BINANCE_API_KEY=${BINANCE_API_KEY} + - BINANCE_SECRET_KEY=${BINANCE_SECRET_KEY} + ``` + +3. **APIアクセスを制限** + ```yaml + # ローカルアクセスのみを許可 + services: + backend: + ports: + - "127.0.0.1:8080:8080" + ``` + +4. **イメージを定期的に更新** + ```bash + docker compose pull + docker compose up -d + ``` + +## 🌐 本番環境デプロイ + +### Nginxリバースプロキシの使用 + +```nginx +# /etc/nginx/sites-available/nofx +server { + listen 80; + server_name your-domain.com; + + location / { + proxy_pass http://localhost:3000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } + + location /api/ { + proxy_pass http://localhost:8080/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} +``` + +### HTTPSの設定(Let's Encrypt) + +```bash +# Certbotをインストール +sudo apt-get install certbot python3-certbot-nginx + +# SSL証明書を取得 +sudo certbot --nginx -d your-domain.com + +# 自動更新 +sudo certbot renew --dry-run +``` + +### Docker Swarmの使用(クラスタデプロイ) + +```bash +# Swarmを初期化 +docker swarm init + +# スタックをデプロイ +docker stack deploy -c docker-compose.yml nofx + +# サービスステータスを表示 +docker stack services nofx + +# サービスをスケール +docker service scale nofx_backend=3 +``` + +## 📈 監視&ロギング + +### ログ管理 + +```bash +# ログローテーションを設定(docker-compose.ymlで既に設定済み) +logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" + +# ログ統計を表示 +docker compose logs --timestamps | wc -l +``` + +### 監視ツール統合 + +Prometheus + Grafanaで監視を統合: + +```yaml +# docker-compose.yml(監視サービスを追加) +services: + prometheus: + image: prom/prometheus + ports: + - "9090:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + + grafana: + image: grafana/grafana + ports: + - "3001:3000" +``` + +## 🆘 ヘルプを取得 + +- **GitHub Issues**: [Issueを提出](https://github.com/yourusername/open-nofx/issues) +- **ドキュメント**: [README.md](README.md)を確認 +- **コミュニティ**: Discord/Telegramグループに参加 + +## 📝 コマンドチートシート + +```bash +# 起動 +docker compose up -d --build # ビルドして起動 +docker compose up -d # 起動(リビルドなし) + +# 停止 +docker compose stop # サービスを停止 +docker compose down # コンテナを停止して削除 +docker compose down -v # コンテナとデータを停止して削除 + +# 表示 +docker compose ps # ステータスを表示 +docker compose logs -f # ログを表示 +docker compose top # プロセスを表示 + +# 再起動 +docker compose restart # すべてのサービスを再起動 +docker compose restart backend # バックエンドを再起動 + +# 更新 +git pull && docker compose up -d --build + +# クリーン +docker compose down -v # すべてのデータをクリア +docker system prune -a # Dockerリソースをクリーン +``` + +--- + +🎉 おめでとうございます!NOFX AIトレーディング競争システムのデプロイに成功しました! + +問題が発生した場合は、[トラブルシューティング](#-トラブルシューティング)セクションを確認するか、Issueを提出してください。 diff --git a/README.ja.md b/README.ja.md new file mode 100644 index 00000000..de215593 --- /dev/null +++ b/README.ja.md @@ -0,0 +1,1343 @@ +# 🤖 NOFX - Agentic Trading OS + +[![Go Version](https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go)](https://golang.org/) +[![React](https://img.shields.io/badge/React-18+-61DAFB?style=flat&logo=react)](https://reactjs.org/) +[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat&logo=typescript)](https://www.typescriptlang.org/) +[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) +[![Backed by Amber.ac](https://img.shields.io/badge/Backed%20by-Amber.ac-orange.svg)](https://amber.ac) + +**言語:** [English](README.md) | [中文](README.zh-CN.md) | [Українська](README.uk.md) | [Русский](README.ru.md) | [日本語](README.ja.md) + +**公式Twitter:** [@nofx_ai](https://x.com/nofx_ai) + +--- + +## 🚀 ユニバーサルAIトレーディングOS + +**NOFX**は、統合アーキテクチャに基づいて構築された**ユニバーサルAgenticトレーディングOS**です。暗号通貨市場において **「マルチエージェント判断 → 統一リスク管理 → 低レイテンシ実行 → ライブ/ペーパーアカウントバックテスト」** のループを成功裏に完成させ、現在この技術スタックを **株式、先物、オプション、外国為替、およびすべての金融市場** に拡大しています。 + +### 🎯 コア機能 + +- **ユニバーサルデータ&バックテストレイヤー**: クロスマーケット、クロスタイムフレーム、クロス取引所の統一表現とファクターライブラリにより、転移可能な「戦略メモリ」を蓄積 +- **マルチエージェント自己対戦&自己進化**: 戦略が自動的に競争し、最適なものを選択、アカウントレベルのPnLとリスク制約に基づいて継続的に反復 +- **統合実行&リスク管理**: 低レイテンシルーティング、スリッページ/リスク管理サンドボックス、アカウントレベルの制限、ワンクリック市場切り替え + +### 🏢 [Amber.ac](https://amber.ac)の支援 + +### 👥 コアチーム + +- **Tinkle** - [@Web3Tinkle](https://x.com/Web3Tinkle) +- **Zack** - [@0x_ZackH](https://x.com/0x_ZackH) + +### 💼 シードラウンド募集中 + +現在、**シードラウンド**の資金調達を行っています。 + +**投資に関するお問い合わせ**は、TwitterでTinkleまたはZackにDMをお送りください。 + +**パートナーシップおよび協業**については、公式Twitter [@nofx_ai](https://x.com/nofx_ai)にDMをお送りください。 + +--- + +> ⚠️ **リスク警告**: このシステムは実験的なものです。AI自動取引には大きなリスクが伴います。学習/研究目的、または少額でのテストのみを強く推奨します! + +## 👥 開発者コミュニティ + +Telegram開発者コミュニティに参加して、議論、アイデアの共有、サポートを受けましょう: + +**💬 [NOFX開発者コミュニティ](https://t.me/nofx_dev_community)** + +--- + +## 🆕 最新情報(最新アップデート) + +### 🚀 マルチ取引所対応! + +NOFXは現在、**3つの主要取引所**をサポートしています:Binance、Hyperliquid、Aster DEX! + +#### **Hyperliquid取引所** + +高性能な分散型無期限先物取引所! + +**主な機能:** +- ✅ フル取引サポート(ロング/ショート、レバレッジ、ストップロス/テイクプロフィット) +- ✅ 自動精度処理(注文サイズ&価格) +- ✅ 統一トレーダーインターフェース(シームレスな取引所切り替え) +- ✅ メインネットとテストネットの両方をサポート +- ✅ APIキー不要 - Ethereum秘密鍵のみ + +**なぜHyperliquid?** +- 🔥 中央集権型取引所より低い手数料 +- 🔒 非カストディアル - 資金を自分で管理 +- ⚡ オンチェーン決済による高速実行 +- 🌍 KYC不要 + +**クイックスタート:** +1. MetaMaskの秘密鍵を取得(`0x`プレフィックスを削除) +2. config.jsonで`"exchange": "hyperliquid"`を設定 +3. `"hyperliquid_private_key": "your_key"`を追加 +4. 取引開始! + +詳細は[設定ガイド](#-代替hyperliquid取引所の使用)をご覧ください。 + +#### **Aster DEX取引所**(NEW! v2.0.2) + +Binance互換の分散型無期限先物取引所! + +**主な機能:** +- ✅ BinanceスタイルAPI(Binanceからの移行が簡単) +- ✅ Web3ウォレット認証(安全で分散型) +- ✅ 自動精度処理によるフル取引サポート +- ✅ CEXより低い取引手数料 +- ✅ EVM互換(Ethereum、BSC、Polygonなど) + +**なぜAster?** +- 🎯 **Binance互換API** - 最小限のコード変更で済む +- 🔐 **APIウォレットシステム** - セキュリティのための独立した取引ウォレット +- 💰 **競争力のある手数料** - ほとんどの中央集権型取引所より低い +- 🌐 **マルチチェーンサポート** - お好みのEVMチェーンで取引 + +**クイックスタート:** +1. [Aster APIウォレット](https://www.asterdex.com/en/api-wallet)にアクセス +2. メインウォレットを接続してAPIウォレットを作成 +3. API Signerアドレスと秘密鍵をコピー +4. config.jsonで`"exchange": "aster"`を設定 +5. `"aster_user"`、`"aster_signer"`、`"aster_private_key"`を追加 + +--- + +## 📸 スクリーンショット + +### 🏆 競争モード - リアルタイムAIバトル +![競争ページ](screenshots/competition-page.png) +*QwenとDeepSeekのライブトレーディングバトルを示すリアルタイムパフォーマンス比較チャート付きマルチAIリーダーボード* + +### 📊 トレーダー詳細 - 完全なトレーディングダッシュボード +![詳細ページ](screenshots/details-page.png) +*エクイティカーブ、ライブポジション、展開可能な入力プロンプトと思考連鎖推論を持つAI判断ログを備えたプロフェッショナルな取引インターフェース* + +--- + +## ✨ 現在の実装 - 暗号通貨市場 + +NOFXは現在、以下の実証済み機能で**暗号通貨市場において完全に稼働**しています: + +### 🏆 マルチエージェント競争フレームワーク +- **ライブエージェントバトル**: QwenとDeepSeekモデルがリアルタイム取引で競争 +- **独立したアカウント管理**: 各エージェントは独自の判断ログとパフォーマンスメトリクスを維持 +- **リアルタイムパフォーマンス比較**: ライブROI追跡、勝率統計、一対一分析 +- **自己進化ループ**: エージェントは過去のパフォーマンスから学習し、継続的に改善 + +### 🧠 AI自己学習&最適化 +- **過去フィードバックシステム**: 各判断前に過去20取引サイクルを分析 +- **スマートパフォーマンス分析**: + - 最高/最悪パフォーマンス資産の特定 + - 実際のUSDT建てで勝率、損益比、平均利益を計算 + - 繰り返しミスを回避(連続損失パターン) + - 成功戦略を強化(高勝率パターン) +- **動的戦略調整**: AIはバックテスト結果に基づいて取引スタイルを自律的に適応 + +### 📊 ユニバーサルマーケットデータレイヤー(暗号実装) +- **マルチタイムフレーム分析**: 3分リアルタイム + 4時間トレンドデータ +- **テクニカル指標**: EMA20/50、MACD、RSI(7/14)、ATR +- **建玉追跡**: マーケットセンチメント、資金フロー分析 +- **流動性フィルタリング**: 低流動性資産(<1500万USD)の自動フィルタリング +- **クロス取引所サポート**: 統一データインターフェースでBinance、Hyperliquid、Aster DEX + +### 🎯 統一リスク管理システム +- **ポジション制限**: 資産ごとの制限(アルトコイン≤1.5x エクイティ、BTC/ETH≤10x エクイティ) +- **設定可能なレバレッジ**: 資産クラスとアカウントタイプに基づいて1xから50xまでの動的レバレッジ +- **証拠金管理**: 総使用量≤90%、AI制御配分 +- **リスクリワード強制**: 必須≥1:2 ストップロス対テイクプロフィット比率 +- **重複防止**: 同じ資産/方向での重複ポジションを防止 + +### ⚡ 低レイテンシ実行エンジン +- **マルチ取引所API統合**: Binance Futures、Hyperliquid DEX、Aster DEX +- **自動精度処理**: 取引所ごとのスマートな注文サイズと価格フォーマット +- **優先実行**: 既存ポジションを先にクローズし、その後新規を開く +- **スリッページ管理**: 実行前検証、リアルタイム精度チェック + +### 🎨 プロフェッショナルモニタリングインターフェース +- **Binanceスタイルダッシュボード**: リアルタイム更新付きプロフェッショナルダークテーマ +- **エクイティカーブ**: 過去のアカウント価値追跡(USD/パーセンテージ切り替え) +- **パフォーマンスチャート**: ライブ更新付きマルチエージェントROI比較 +- **完全な判断ログ**: すべての取引の完全な思考連鎖(CoT)推論 +- **5秒データ更新**: リアルタイムアカウント、ポジション、損益更新 + +--- + +## 🔮 ロードマップ - ユニバーサルマーケット拡大 + +実証済みの暗号インフラストラクチャを以下に拡張中: + +- **📈 株式市場**: 米国株式、A株、香港株 +- **📊 先物市場**: 商品先物、指数先物 +- **🎯 オプション取引**: 株式オプション、暗号オプション +- **💱 外国為替市場**: 主要通貨ペア、クロスレート + +**同じアーキテクチャ。同じエージェントフレームワーク。すべての市場。** + +--- + +## 🏗️ 技術アーキテクチャ + +``` +nofx/ +├── main.go # プログラムエントリ(マルチトレーダーマネージャー) +├── config.json # 設定ファイル(APIキー、マルチトレーダー設定) +│ +├── api/ # HTTP APIサービス +│ └── server.go # Ginフレームワーク、RESTful API +│ +├── trader/ # トレーディングコア +│ ├── auto_trader.go # 自動取引メインコントローラー(単一トレーダー) +│ └── binance_futures.go # Binance先物APIラッパー +│ +├── manager/ # マルチトレーダー管理 +│ └── trader_manager.go # 複数のトレーダーインスタンスを管理 +│ +├── mcp/ # Model Context Protocol - AI通信 +│ └── client.go # AIクライアント(DeepSeek/Qwen統合) +│ +├── decision/ # AI判断エンジン +│ └── engine.go # 過去フィードバック付き判断ロジック +│ +├── market/ # マーケットデータ取得 +│ └── data.go # マーケットデータ&テクニカル指標(K線、RSI、MACD) +│ +├── pool/ # コインプール管理 +│ └── coin_pool.go # AI500 + OI Topマージプール +│ +├── logger/ # ロギングシステム +│ └── decision_logger.go # 判断記録 + パフォーマンス分析 +│ +├── decision_logs/ # 判断ログストレージ +│ ├── qwen_trader/ # Qwenトレーダーログ +│ └── deepseek_trader/ # DeepSeekトレーダーログ +│ +└── web/ # Reactフロントエンド + ├── src/ + │ ├── components/ # Reactコンポーネント + │ │ ├── EquityChart.tsx # エクイティカーブチャート + │ │ ├── ComparisonChart.tsx # マルチAI比較チャート + │ │ └── CompetitionPage.tsx # 競争リーダーボード + │ ├── lib/api.ts # API呼び出しラッパー + │ ├── types/index.ts # TypeScript型 + │ ├── index.css # BinanceスタイルCSS + │ └── App.tsx # メインアプリ + └── package.json +``` + +### コア依存関係 + +**バックエンド(Go)** +- `github.com/adshao/go-binance/v2` - Binance APIクライアント +- `github.com/markcheno/go-talib` - テクニカル指標計算(TA-Lib) +- `github.com/gin-gonic/gin` - HTTP APIフレームワーク + +**フロントエンド(React + TypeScript)** +- `react` + `react-dom` - UIフレームワーク +- `recharts` - チャートライブラリ(エクイティカーブ、比較チャート) +- `swr` - データフェッチングとキャッシング +- `tailwindcss` - CSSフレームワーク + +--- + +## 💰 Binanceアカウント登録(手数料節約!) + +このシステムを使用する前に、Binance先物アカウントが必要です。**紹介リンクを使用して取引手数料を節約しましょう:** + +**🎁 [Binance登録 - 手数料割引を取得](https://www.binance.com/join?ref=TINKLEVIP)** + +### 登録手順: + +1. **上記のリンクをクリック**してBinance登録ページにアクセス +2. メール/電話番号で**登録を完了** +3. **KYC認証を完了**(先物取引に必要) +4. **先物アカウントを有効化**: + - Binanceホームページ → デリバティブ → USDT無期限先物 + - 「今すぐ開設」をクリックして先物取引を有効化 +5. **APIキーを作成**: + - アカウント → API管理 + - 新しいAPIキーを作成、**「先物」権限を有効化** + - APIキーとシークレットキーを保存(config.jsonに必要) + - **重要**: セキュリティのためIPアドレスをホワイトリストに追加 + +### 手数料割引の利点: + +- ✅ **現物取引**: 最大30%の手数料割引 +- ✅ **先物取引**: 最大30%の手数料割引 +- ✅ **生涯有効**: すべての取引で永久割引 + +--- + +## 🚀 クイックスタート + +### 🐳 オプションA:Dockerワンクリックデプロイ(最も簡単 - 初心者推奨!) + +**⚡ Dockerで3つの簡単なステップで取引開始 - インストール不要!** + +Dockerはすべての依存関係(Go、Node.js、TA-Lib)と環境設定を自動的に処理します。初心者に最適! + +#### ステップ1:設定を準備 + +```bash +# 設定テンプレートをコピー +cp config.json.example config.json + +# 編集してAPIキーを入力 +nano config.json # または任意のエディタを使用 +``` + +#### ステップ2:ワンクリック起動 + +```bash +# オプション1:便利スクリプトを使用(推奨) +chmod +x start.sh +./start.sh start --build + +> #### Docker Composeバージョンに関する注意 +> +> **このプロジェクトはDocker Compose V2構文(スペース付き)を使用** +> +> 古いスタンドアロン`docker-compose`がインストールされている場合は、Docker DesktopまたはDocker 20.10+にアップグレードしてください + +# オプション2:docker composeを直接使用 +docker compose up -d --build +``` + +#### ステップ3:ダッシュボードにアクセス + +ブラウザを開いて次にアクセス:**http://localhost:3000** + +**これで完了!🎉** AIトレーディングシステムが稼働中です! + +#### システム管理 + +```bash +./start.sh logs # ログを表示 +./start.sh status # ステータスを確認 +./start.sh stop # サービスを停止 +./start.sh restart # サービスを再起動 +``` + +**📖 詳細なDockerデプロイガイド、トラブルシューティング、高度な設定について:** +- **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) +- **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) +- **日本語**: [DOCKER_DEPLOY.ja.md](DOCKER_DEPLOY.ja.md)を参照 + +--- + +### 📦 オプションB:手動インストール(開発者向け) + +**注意**: 上記のDockerデプロイを使用した場合は、このセクションをスキップしてください。手動インストールは、コードを変更したい場合、またはDockerなしで実行したい場合にのみ必要です。 + +### 1. 環境要件 + +- **Go 1.21+** +- **Node.js 18+** +- **TA-Lib**ライブラリ(テクニカル指標計算) + +#### TA-Libのインストール + +**macOS:** +```bash +brew install ta-lib +``` + +**Ubuntu/Debian:** +```bash +sudo apt-get install libta-lib0-dev +``` + +**その他のシステム**: [TA-Lib公式ドキュメント](https://github.com/markcheno/go-talib)を参照 + +### 2. プロジェクトをクローン + +```bash +git clone https://github.com/tinkle-community/nofx.git +cd nofx +``` + +### 3. 依存関係をインストール + +**バックエンド:** +```bash +go mod download +``` + +**フロントエンド:** +```bash +cd web +npm install +cd .. +``` + +### 4. AI APIキーを取得 + +システムを設定する前に、AI APIキーを取得する必要があります。以下のAIプロバイダーのいずれかを選択してください: + +#### オプション1:DeepSeek(初心者推奨) + +**なぜDeepSeek?** +- 💰 GPT-4より安価(約1/10のコスト) +- 🚀 高速レスポンス時間 +- 🎯 優れた取引判断品質 +- 🌍 VPNなしで世界中で動作 + +**DeepSeek APIキーの取得方法:** + +1. **アクセス**: [https://platform.deepseek.com](https://platform.deepseek.com) +2. **登録**: メール/電話番号でサインアップ +3. **認証**: メール/電話認証を完了 +4. **チャージ**: アカウントにクレジットを追加 + - 最低: 約$5 USD + - 推奨: テスト用に$20-50 USD +5. **APIキーを作成**: + - APIキーセクションに移動 + - 「新しいキーを作成」をクリック + - キーをコピーして保存(`sk-`で始まる) + - ⚠️ **重要**: すぐに保存してください - 再度見ることはできません! + +**価格**: 約100万トークンあたり$0.14(非常に安い!) + +#### オプション2:Qwen(Alibaba Cloud) + +**Qwen APIキーの取得方法:** + +1. **アクセス**: [https://dashscope.aliyuncs.com](https://dashscope.aliyuncs.com) +2. **登録**: Alibaba Cloudアカウントでサインアップ +3. **サービスを有効化**: DashScopeサービスを有効化 +4. **APIキーを作成**: + - APIキー管理に移動 + - 新しいキーを作成 + - コピーして保存(`sk-`で始まる) + +**注意**: 登録には中国の電話番号が必要な場合があります + +--- + +### 5. システム設定 + +**2つの設定モードが利用可能:** +- **🌟 初心者モード**: シングルトレーダー + デフォルトコイン(推奨!) +- **⚔️ エキスパートモード**: 複数トレーダー競争 + +#### 🌟 初心者モード設定(推奨) + +**ステップ1**: 設定例ファイルをコピーしてリネーム + +```bash +cp config.json.example config.json +``` + +**ステップ2**: APIキーで`config.json`を編集 + +```json +{ + "traders": [ + { + "id": "my_trader", + "name": "My AI Trader", + "ai_model": "deepseek", + "binance_api_key": "YOUR_BINANCE_API_KEY", + "binance_secret_key": "YOUR_BINANCE_SECRET_KEY", + "use_qwen": false, + "deepseek_key": "sk-xxxxxxxxxxxxx", + "qwen_key": "", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "leverage": { + "btc_eth_leverage": 5, + "altcoin_leverage": 5 + }, + "use_default_coins": true, + "coin_pool_api_url": "", + "oi_top_api_url": "", + "api_server_port": 8080 +} +``` + +**ステップ3**: プレースホルダーを実際のキーに置き換え + +| プレースホルダー | 置き換え先 | 取得場所 | +|------------|--------------|--------------| +| `YOUR_BINANCE_API_KEY` | BinanceのAPIキー | Binance → アカウント → API管理 | +| `YOUR_BINANCE_SECRET_KEY` | Binanceのシークレットキー | 上記と同じ | +| `sk-xxxxxxxxxxxxx` | DeepSeek APIキー | [platform.deepseek.com](https://platform.deepseek.com) | + +**ステップ4**: 初期残高を調整(オプション) + +- `initial_balance`: 実際のBinance先物アカウント残高に設定 +- 損益パーセンテージの計算に使用 +- 例:500 USDTがある場合、`"initial_balance": 500.0`に設定 + +**✅ 設定チェックリスト:** + +- [ ] Binance APIキーを入力(引用符の問題なし) +- [ ] Binanceシークレットキーを入力(引用符の問題なし) +- [ ] DeepSeek APIキーを入力(`sk-`で始まる) +- [ ] `use_default_coins`を`true`に設定(初心者向け) +- [ ] `initial_balance`をアカウント残高と一致させる +- [ ] ファイルを`config.json`として保存(`.example`ではない) + +--- + +#### 🔷 代替:Hyperliquid取引所の使用 + +**NOFXはHyperliquidもサポート** - 分散型無期限先物取引所。Binanceの代わりにHyperliquidを使用するには: + +**ステップ1**: Ethereum秘密鍵を取得(Hyperliquid認証用) + +1. **MetaMask**(または任意のEthereumウォレット)を開く +2. 秘密鍵をエクスポート +3. キーから**`0x`プレフィックスを削除** +4. [Hyperliquid](https://hyperliquid.xyz)でウォレットに資金を入金 + +**ステップ2**: Hyperliquid用に`config.json`を設定 + +```json +{ + "traders": [ + { + "id": "hyperliquid_trader", + "name": "My Hyperliquid Trader", + "enabled": true, + "ai_model": "deepseek", + "exchange": "hyperliquid", + "hyperliquid_private_key": "your_private_key_without_0x", + "hyperliquid_wallet_addr": "your_ethereum_address", + "hyperliquid_testnet": false, + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080 +} +``` + +**Binance設定との主な違い:** +- `binance_api_key` + `binance_secret_key`を`hyperliquid_private_key`に置き換え +- `"exchange": "hyperliquid"`フィールドを追加 +- メインネットには`hyperliquid_testnet: false`、テストネットには`true`を設定 + +**⚠️ セキュリティ警告**: 秘密鍵は絶対に共有しないでください!メインウォレットではなく、取引専用のウォレットを使用してください。 + +--- + +#### 🔶 代替:Aster DEX取引所の使用 + +**NOFXはAster DEXもサポート** - Binance互換の分散型無期限先物取引所! + +**なぜAsterを選ぶ?** +- 🎯 Binance互換API(簡単な移行) +- 🔐 APIウォレットセキュリティシステム +- 💰 低い取引手数料 +- 🌐 マルチチェーンサポート(ETH、BSC、Polygon) +- 🌍 KYC不要 + +**ステップ1**: Aster APIウォレットを作成 + +1. [Aster APIウォレット](https://www.asterdex.com/en/api-wallet)にアクセス +2. メインウォレットを接続(MetaMask、WalletConnectなど) +3. 「APIウォレットを作成」をクリック +4. **これらの3つの項目をすぐに保存:** + - メインウォレットアドレス(User) + - APIウォレットアドレス(Signer) + - APIウォレット秘密鍵(⚠️ 一度だけ表示!) + +**ステップ2**: Aster用に`config.json`を設定 + +```json +{ + "traders": [ + { + "id": "aster_deepseek", + "name": "Aster DeepSeek Trader", + "enabled": true, + "ai_model": "deepseek", + "exchange": "aster", + + "aster_user": "0x63DD5aCC6b1aa0f563956C0e534DD30B6dcF7C4e", + "aster_signer": "0x21cF8Ae13Bb72632562c6Fff438652Ba1a151bb0", + "aster_private_key": "4fd0a42218f3eae43a6ce26d22544e986139a01e5b34a62db53757ffca81bae1", + + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080, + "leverage": { + "btc_eth_leverage": 5, + "altcoin_leverage": 5 + } +} +``` + +**主要設定フィールド:** +- `"exchange": "aster"` - 取引所をAsterに設定 +- `aster_user` - メインウォレットアドレス +- `aster_signer` - APIウォレットアドレス(ステップ1から) +- `aster_private_key` - APIウォレット秘密鍵(`0x`プレフィックスなし) + +**📖 詳細なセットアップ手順については**: [Aster統合ガイド](ASTER_INTEGRATION.md)を参照 + +**⚠️ セキュリティ注意事項**: +- APIウォレットはメインウォレットとは別(追加のセキュリティレイヤー) +- API秘密鍵は絶対に共有しない +- [asterdex.com](https://www.asterdex.com/en/api-wallet)でいつでもAPIウォレットアクセスを取り消し可能 + +--- + +#### ⚔️ エキスパートモード:マルチトレーダー競争 + +複数のAIトレーダーが互いに競争する場合: + +```json +{ + "traders": [ + { + "id": "qwen_trader", + "name": "Qwen AI Trader", + "ai_model": "qwen", + "binance_api_key": "YOUR_BINANCE_API_KEY_1", + "binance_secret_key": "YOUR_BINANCE_SECRET_KEY_1", + "use_qwen": true, + "qwen_key": "sk-xxxxx", + "deepseek_key": "", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + }, + { + "id": "deepseek_trader", + "name": "DeepSeek AI Trader", + "ai_model": "deepseek", + "binance_api_key": "YOUR_BINANCE_API_KEY_2", + "binance_secret_key": "YOUR_BINANCE_SECRET_KEY_2", + "use_qwen": false, + "qwen_key": "", + "deepseek_key": "sk-xxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "coin_pool_api_url": "", + "oi_top_api_url": "", + "api_server_port": 8080 +} +``` + +**競争モードの要件:** +- 2つの別々のBinance先物アカウント(異なるAPIキー) +- 両方のAI APIキー(Qwen + DeepSeek) +- テスト用により多くの資本(推奨:アカウントあたり500+ USDT) + +--- + +#### 📚 設定フィールド説明 + +| フィールド | 説明 | 例の値 | 必須? | +|-------|-------------|---------------|-----------| +| `id` | このトレーダーの一意の識別子 | `"my_trader"` | ✅ はい | +| `name` | 表示名 | `"My AI Trader"` | ✅ はい | +| `enabled` | このトレーダーが有効かどうか
起動をスキップする場合は`false`に設定 | `true`または`false` | ✅ はい | +| `ai_model` | 使用するAIプロバイダー | `"deepseek"`または`"qwen"`または`"custom"` | ✅ はい | +| `exchange` | 使用する取引所 | `"binance"`または`"hyperliquid"`または`"aster"` | ✅ はい | +| `binance_api_key` | Binance APIキー | `"abc123..."` | Binance使用時に必須 | +| `binance_secret_key` | Binanceシークレットキー | `"xyz789..."` | Binance使用時に必須 | +| `hyperliquid_private_key` | Hyperliquid秘密鍵
⚠️ `0x`プレフィックスを削除 | `"your_key..."` | Hyperliquid使用時に必須 | +| `hyperliquid_wallet_addr` | Hyperliquidウォレットアドレス | `"0xabc..."` | Hyperliquid使用時に必須 | +| `hyperliquid_testnet` | テストネットを使用 | `true`または`false` | ❌ いいえ(デフォルトはfalse) | +| `use_qwen` | Qwenを使用するかどうか | `true`または`false` | ✅ はい | +| `deepseek_key` | DeepSeek APIキー | `"sk-xxx"` | DeepSeek使用時 | +| `qwen_key` | Qwen APIキー | `"sk-xxx"` | Qwen使用時 | +| `initial_balance` | 損益計算の開始残高 | `1000.0` | ✅ はい | +| `scan_interval_minutes` | 判断を行う頻度 | `3`(3-5推奨) | ✅ はい | +| **`leverage`** | **レバレッジ設定(v2.0.3+)** | 下記参照 | ✅ はい | +| `btc_eth_leverage` | BTC/ETHの最大レバレッジ
⚠️ サブアカウント:≤5x | `5`(デフォルト、安全)
`50`(メインアカウント最大) | ✅ はい | +| `altcoin_leverage` | アルトコインの最大レバレッジ
⚠️ サブアカウント:≤5x | `5`(デフォルト、安全)
`20`(メインアカウント最大) | ✅ はい | +| `use_default_coins` | 組み込みコインリストを使用
**✨ スマートデフォルト:`true`**(v2.0.2+)
API URLが提供されていない場合自動有効化 | `true`または省略 | ❌ いいえ
(オプション、自動デフォルト) | +| `coin_pool_api_url` | カスタムコインプールAPI
*`use_default_coins: false`の場合のみ必要* | `""`(空) | ❌ いいえ | +| `oi_top_api_url` | 建玉API
*オプション補足データ* | `""`(空) | ❌ いいえ | +| `api_server_port` | Webダッシュボードポート | `8080` | ✅ はい | + +**デフォルト取引コイン**(`use_default_coins: true`の場合): +- BTC、ETH、SOL、BNB、XRP、DOGE、ADA、HYPE + +--- + +#### ⚙️ レバレッジ設定(v2.0.3+) + +**レバレッジ設定とは?** + +レバレッジ設定は、AIが各取引で使用できる最大レバレッジを制御します。これは、特にレバレッジ制限があるBinanceサブアカウントでリスク管理に重要です。 + +**設定形式:** + +```json +"leverage": { + "btc_eth_leverage": 5, // BTCとETHの最大レバレッジ + "altcoin_leverage": 5 // その他すべてのコインの最大レバレッジ +} +``` + +**⚠️ 重要:Binanceサブアカウント制限** + +- **サブアカウント**: Binanceにより**≤5xレバレッジ**に制限 +- **メインアカウント**: 最大20x(アルトコイン)または50x(BTC/ETH)を使用可能 +- サブアカウントを使用していてレバレッジを>5xに設定すると、取引は**失敗**し、エラーが表示されます:`Subaccounts are restricted from using leverage greater than 5x` + +**推奨設定:** + +| アカウントタイプ | BTC/ETHレバレッジ | アルトコインレバレッジ | リスクレベル | +|-------------|------------------|------------------|------------| +| **サブアカウント** | `5` | `5` | ✅ 安全(デフォルト) | +| **メイン(保守的)** | `10` | `10` | 🟡 中程度 | +| **メイン(積極的)** | `20` | `15` | 🔴 高 | +| **メイン(最大)** | `50` | `20` | 🔴🔴 非常に高 | + +**例:** + +**安全な設定(サブアカウントまたは保守的):** +```json +"leverage": { + "btc_eth_leverage": 5, + "altcoin_leverage": 5 +} +``` + +**積極的な設定(メインアカウントのみ):** +```json +"leverage": { + "btc_eth_leverage": 20, + "altcoin_leverage": 15 +} +``` + +**AIのレバレッジ使用方法:** + +- AIは設定された最大値まで**1xから任意のレバレッジを選択**できます +- たとえば、`altcoin_leverage: 20`の場合、AIは市場条件に基づいて5x、10x、または20xを使用することを決定する可能性があります +- 設定は固定値ではなく**上限**を設定します +- AIはレバレッジを選択する際にボラティリティ、リスクリワード比率、アカウント残高を考慮します + +--- + +#### ⚠️ 重要:`use_default_coins`フィールド + +**スマートデフォルト動作(v2.0.2+):** + +次の場合、システムは自動的に`use_default_coins: true`をデフォルトにします: +- config.jsonにこのフィールドを含めていない、または +- `false`に設定したが`coin_pool_api_url`を提供していない + +これにより初心者に優しくなります!このフィールドを完全に省略することもできます。 + +**設定例:** + +✅ **オプション1:明示的に設定(明確性のため推奨)** +```json +"use_default_coins": true, +"coin_pool_api_url": "", +"oi_top_api_url": "" +``` + +✅ **オプション2:フィールドを省略(デフォルトコインを自動使用)** +```json +// "use_default_coins"を含めないだけ +"coin_pool_api_url": "", +"oi_top_api_url": "" +``` + +⚙️ **高度:外部APIを使用** +```json +"use_default_coins": false, +"coin_pool_api_url": "http://your-api.com/coins", +"oi_top_api_url": "http://your-api.com/oi" +``` + +--- + +### 6. システムを実行 + +#### 🚀 システムの起動(2ステップ) + +システムには別々に実行される**2つの部分**があります: +1. **バックエンド**(AIトレーディングブレイン + API) +2. **フロントエンド**(監視用Webダッシュボード) + +--- + +#### **ステップ1:バックエンドを起動** + +ターミナルを開いて実行: + +```bash +# プログラムをビルド(初回のみ、またはコード変更後) +go build -o nofx + +# バックエンドを起動 +./nofx +``` + +**表示されるべきもの:** + +``` +🚀 启动自动交易系统... +✓ Trader [my_trader] 已初始化 +✓ API服务器启动在端口 8080 +📊 开始交易监控... +``` + +**⚠️ エラーが表示される場合:** + +| エラーメッセージ | 解決策 | +|--------------|----------| +| `invalid API key` | config.jsonのBinance APIキーを確認 | +| `TA-Lib not found` | `brew install ta-lib`を実行(macOS) | +| `port 8080 already in use` | config.jsonの`api_server_port`を変更 | +| `DeepSeek API error` | DeepSeek APIキーと残高を確認 | + +**✅ バックエンドが正しく実行されているとき:** +- エラーメッセージなし +- "开始交易监控..."が表示される +- システムがアカウント残高を表示 +- このターミナルウィンドウを開いたままにしてください! + +--- + +#### **ステップ2:フロントエンドを起動** + +**新しいターミナルウィンドウ**を開き(最初のものは実行したまま)、次を実行: + +```bash +cd web +npm run dev +``` + +**表示されるべきもの:** + +``` +VITE v5.x.x ready in xxx ms + +➜ Local: http://localhost:3000/ +➜ Network: use --host to expose +``` + +**✅ フロントエンドが実行されているとき:** +- "Local: http://localhost:3000/"メッセージ +- エラーメッセージなし +- このターミナルウィンドウも開いたままにしてください! + +--- + +#### **ステップ3:ダッシュボードにアクセス** + +Webブラウザを開いて次にアクセス: + +**🌐 http://localhost:3000** + +**表示されるもの:** +- 📊 リアルタイムアカウント残高 +- 📈 オープンポジション(ある場合) +- 🤖 AI判断ログ +- 📉 エクイティカーブチャート + +**初回のヒント:** +- 最初のAI判断まで3-5分かかることがあります +- 初期判断は「観望」(待機)と言う場合があります - これは正常です +- AIは最初に市場状況を分析する必要があります + +--- + +### 7. システムを監視 + +**監視すべきもの:** + +✅ **健全なシステムの兆候:** +- バックエンドターミナルが3-5分ごとに判断サイクルを表示 +- 継続的なエラーメッセージなし +- アカウント残高の更新 +- Webダッシュボードの自動更新 + +⚠️ **警告の兆候:** +- 繰り返されるAPIエラー +- 10分以上判断なし +- 残高の急速な減少 + +**システムステータスの確認:** + +```bash +# 新しいターミナルウィンドウで +curl http://localhost:8080/health +``` + +戻り値:`{"status":"ok"}` + +--- + +### 8. システムを停止 + +**グレースフルシャットダウン(推奨):** + +1. **バックエンドターミナル**(最初のもの)に移動 +2. `Ctrl+C`を押す +3. "系统已停止"メッセージを待つ +4. **フロントエンドターミナル**(2番目のもの)に移動 +5. `Ctrl+C`を押す + +**⚠️ 重要:** +- 常にバックエンドを最初に停止 +- ターミナルを閉じる前に確認を待つ +- 強制終了しない(ターミナルを直接閉じない) + +--- + +## 📖 AI判断フロー + +各判断サイクル(デフォルト3分)で、システムは以下のインテリジェントプロセスを実行します: + +``` +┌──────────────────────────────────────────────────────────┐ +│ 1. 📊 過去パフォーマンスを分析(過去20サイクル) │ +├──────────────────────────────────────────────────────────┤ +│ ✓ 総合勝率、平均利益、損益比を計算 │ +│ ✓ コインごとの統計(勝率、平均損益(USDT)) │ +│ ✓ 最高/最悪パフォーマンスコインを特定 │ +│ ✓ 正確なPnLを含む最後の5取引の詳細をリスト │ +│ ✓ リスク調整パフォーマンスのシャープレシオを計算 │ +│ 📌 NEW(v2.0.2):レバレッジを含む正確なUSDT PnL │ +└──────────────────────────────────────────────────────────┘ + ↓ +┌──────────────────────────────────────────────────────────┐ +│ 2. 💰 アカウントステータスを取得 │ +├──────────────────────────────────────────────────────────┤ +│ • 総エクイティと利用可能残高 │ +│ • オープンポジション数と未実現損益 │ +│ • 証拠金使用率(AIは最大90%を管理) │ +│ • 日次損益追跡とドローダウン監視 │ +└──────────────────────────────────────────────────────────┘ + ↓ +┌──────────────────────────────────────────────────────────┐ +│ 3. 🔍 既存ポジションを分析(ある場合) │ +├──────────────────────────────────────────────────────────┤ +│ • 各ポジションについて、最新の市場データを取得 │ +│ • リアルタイムのテクニカル指標を計算: │ +│ - 3分K線:RSI(7)、MACD、EMA20 │ +│ - 4時間K線:RSI(14)、EMA20/50、ATR │ +│ • ポジション保有期間を追跡(例:「2時間15分」) │ +│ 📌 NEW(v2.0.2):各ポジションの保有期間を表示 │ +│ • 表示:エントリー価格、現在価格、損益%、期間 │ +│ • AIが評価:保持するかクローズするか? │ +└──────────────────────────────────────────────────────────┘ + ↓ +┌──────────────────────────────────────────────────────────┐ +│ 4. 🎯 新しい機会を評価(候補コイン) │ +├──────────────────────────────────────────────────────────┤ +│ • コインプールを取得(2モード): │ +│ 🌟 デフォルトモード:BTC、ETH、SOL、BNB、XRPなど │ +│ ⚙️ 高度モード:AI500(上位20)+ OI Top(上位20) │ +│ • 候補コインをマージして重複削除 │ +│ • フィルター:低流動性を削除(<1500万USD OI値) │ +│ • 市場データ + テクニカル指標をバッチ取得 │ +│ • ボラティリティ、トレンド強度、出来高急増を計算 │ +└──────────────────────────────────────────────────────────┘ + ↓ +┌──────────────────────────────────────────────────────────┐ +│ 5. 🧠 AI総合判断(DeepSeek/Qwen) │ +├──────────────────────────────────────────────────────────┤ +│ • 過去フィードバックをレビュー: │ +│ - 最近の勝率と利益率 │ +│ - 最高/最悪コインパフォーマンス │ +│ - 繰り返しミスを回避 │ +│ • すべての生シーケンスデータを分析: │ +│ - 3分価格シーケンス、4時間K線シーケンス │ +│ - 完全な指標シーケンス(最新のみではない) │ +│ 📌 NEW(v2.0.2):AIは分析の完全な自由を持つ │ +│ • 思考連鎖(CoT)推論プロセス │ +│ • 構造化された判断を出力: │ +│ - アクション:close_long/close_short/open_long/open_short│ +│ - コインシンボル、数量、レバレッジ │ +│ - ストップロスとテイクプロフィットレベル(≥1:2比率) │ +│ • 判断:待機/保持/クローズ/オープン │ +└──────────────────────────────────────────────────────────┘ + ↓ +┌──────────────────────────────────────────────────────────┐ +│ 6. ⚡ 取引を実行 │ +├──────────────────────────────────────────────────────────┤ +│ • 優先順位:既存をクローズ → その後新規をオープン │ +│ • 実行前のリスクチェック: │ +│ - ポジションサイズ制限(アルトコイン1.5x、BTC 10x) │ +│ - 重複ポジションなし(同じコイン + 方向) │ +│ - 証拠金使用量が90%制限内 │ +│ • Binance LOT_SIZE精度を自動取得して適用 │ +│ • Binance Futures APIで注文を実行 │ +│ • クローズ後:すべての保留注文を自動キャンセル │ +│ • 実際の実行価格と注文IDを記録 │ +│ 📌 期間計算のためにポジションオープン時間を追跡 │ +└──────────────────────────────────────────────────────────┘ + ↓ +┌──────────────────────────────────────────────────────────┐ +│ 7. 📝 完全なログを記録してパフォーマンスを更新 │ +├──────────────────────────────────────────────────────────┤ +│ • decision_logs/{trader_id}/に判断ログを保存 │ +│ • ログには以下が含まれます: │ +│ - 完全な思考連鎖(CoT) │ +│ - すべての市場データを含む入力プロンプト │ +│ - 構造化された判断JSON │ +│ - アカウントスナップショット(残高、ポジション、証拠金)│ +│ - 実行結果(成功/失敗、価格) │ +│ • パフォーマンスデータベースを更新: │ +│ - symbol_sideキーでオープン/クローズペアをマッチ │ +│ 📌 NEW:ロング/ショート競合を防止 │ +│ - 正確なUSDT PnLを計算: │ +│ PnL = ポジション価値 × 価格変化% × レバレッジ │ +│ 📌 NEW:数量 + レバレッジを考慮 │ +│ - 保存:数量、レバレッジ、オープン時間、クローズ時間 │ +│ - 更新:勝率、利益率、シャープレシオ │ +│ • パフォーマンスデータは次のサイクルにフィードバック │ +└──────────────────────────────────────────────────────────┘ + ↓ + (3-5分ごとに繰り返し) +``` + +### v2.0.2の主な改善点 + +**📌 ポジション期間追跡:** +- システムが各ポジションの保有期間を追跡 +- ユーザープロンプトに表示:「持仓时长2小时15分钟」 +- AIが出口タイミングについてより良い判断を下すのに役立つ + +**📌 正確なPnL計算:** +- 以前:パーセンテージのみ(100U@5% = 1000U@5% = 両方とも「5.0」と表示) +- 現在:実際のUSDT利益 = ポジション価値 × 価格変化 × レバレッジ +- 例:1000 USDT × 5% × 20x = 1000 USDT実際の利益 + +**📌 AI自由度の向上:** +- AIはすべての生シーケンスデータを自由に分析可能 +- 事前定義された指標の組み合わせに制限されない +- 独自のトレンド分析、サポート/レジスタンス計算を実行可能 + +**📌 改善されたポジション追跡:** +- `symbol_side`キーを使用(例:「BTCUSDT_long」) +- ロングとショートの両方を保有する際の競合を防止 +- 完全なデータを保存:数量、レバレッジ、オープン/クローズ時間 + +--- + +## 🧠 AI自己学習の例 + +### 過去フィードバック(プロンプトに自動追加) + +```markdown +## 📊 過去パフォーマンスフィードバック + +### 総合パフォーマンス +- **総取引数**: 15(利益:8 | 損失:7) +- **勝率**: 53.3% +- **平均利益**: +3.2% | 平均損失:-2.1% +- **損益比**: 1.52:1 + +### 最近の取引 +1. BTCUSDT LONG: 95000.0000 → 97500.0000 = +2.63% ✓ +2. ETHUSDT SHORT: 3500.0000 → 3450.0000 = +1.43% ✓ +3. SOLUSDT LONG: 185.0000 → 180.0000 = -2.70% ✗ +4. BNBUSDT LONG: 610.0000 → 625.0000 = +2.46% ✓ +5. ADAUSDT LONG: 0.8500 → 0.8300 = -2.35% ✗ + +### コインパフォーマンス +- **最高**: BTCUSDT(勝率75%、平均+2.5%) +- **最悪**: SOLUSDT(勝率25%、平均-1.8%) +``` + +### AIのフィードバック使用方法 + +1. **連続損失を回避**: SOLUSDTが3回連続でストップロスになっているのを見て、AIは回避するかより慎重になる +2. **成功戦略を強化**: BTCブレイクアウトロングが75%の勝率で、AIはこのパターンを継続 +3. **動的スタイル調整**: 勝率<40% → 保守的;損益比>2 → 積極的を維持 +4. **市場状況の特定**: 連続損失は荒れた市場を示す可能性があり、取引頻度を減らす + +--- + +## 📊 Webインターフェース機能 + +### 1. 競争ページ + +- **🏆 リーダーボード**: リアルタイムROIランキング、ゴールドボーダーでリーダーをハイライト +- **📈 パフォーマンス比較**: デュアルAI ROIカーブ比較(紫対青) +- **⚔️ 一対一**: リードマージンを示す直接比較 +- **リアルタイムデータ**: 総エクイティ、損益%、ポジション数、証拠金使用量 + +### 2. 詳細ページ + +- **エクイティカーブ**: 過去トレンドチャート(USD/パーセンテージ切り替え) +- **統計**: 総サイクル、成功/失敗、オープン/クローズ統計 +- **ポジションテーブル**: すべてのポジション詳細(エントリー価格、現在価格、損益%、清算価格) +- **AI判断ログ**: 最近の判断記録(展開可能なCoT) + +### 3. リアルタイム更新 + +- システムステータス、アカウント情報、ポジションリスト:**5秒更新** +- 判断ログ、統計:**10秒更新** +- エクイティチャート:**10秒更新** + +--- + +## 🎛️ APIエンドポイント + +### 競争関連 + +```bash +GET /api/competition # 競争リーダーボード(全トレーダー) +GET /api/traders # トレーダーリスト +``` + +### 単一トレーダー関連 + +```bash +GET /api/status?trader_id=xxx # システムステータス +GET /api/account?trader_id=xxx # アカウント情報 +GET /api/positions?trader_id=xxx # ポジションリスト +GET /api/equity-history?trader_id=xxx # エクイティ履歴(チャートデータ) +GET /api/decisions/latest?trader_id=xxx # 最新5判断 +GET /api/statistics?trader_id=xxx # 統計 +``` + +### システムエンドポイント + +```bash +GET /health # ヘルスチェック +GET /api/config # システム設定 +``` + +--- + +## ⚠️ 重要なリスク警告 + +### 取引リスク + +1. **暗号通貨市場は非常にボラティルが高い**、AI判断は利益を保証しません +2. **先物取引はレバレッジを使用**、損失が元本を超える可能性があります +3. **極端な市場状況**は清算リスクにつながる可能性があります +4. **ファンディングレート**は保有コストに影響する可能性があります +5. **流動性リスク**: 一部のコインでスリッページが発生する可能性があります + +### 技術リスク + +1. **ネットワークレイテンシ**は価格スリッページを引き起こす可能性があります +2. **APIレート制限**は取引実行に影響する可能性があります +3. **AI APIタイムアウト**は判断失敗を引き起こす可能性があります +4. **システムバグ**は予期しない動作を引き起こす可能性があります + +### 使用推奨事項 + +✅ **推奨** +- テストには失っても構わない資金のみを使用 +- 少額から始める(推奨100-500 USDT) +- システムの動作状態を定期的に確認 +- アカウント残高の変化を監視 +- AI判断ログを分析して戦略を理解 + +❌ **非推奨** +- すべての資金または借りたお金を投資 +- 長期間監視なしで実行 +- AI判断を盲目的に信頼 +- システムを理解せずに使用 +- 極端な市場ボラティリティ中に実行 + +--- + +## 🛠️ よくある問題 + +### 1. コンパイルエラー:TA-Libが見つからない + +**解決策**: TA-Libライブラリをインストール +```bash +# macOS +brew install ta-lib + +# Ubuntu +sudo apt-get install libta-lib0-dev +``` + +### 2. 精度エラー:Precision is over the maximum + +**解決策**: システムがBinance LOT_SIZEから精度を自動処理します。エラーが続く場合は、ネットワーク接続を確認してください。 + +### 3. AI APIタイムアウト + +**解決策**: +- APIキーが正しいか確認 +- ネットワーク接続を確認(プロキシが必要な場合があります) +- システムタイムアウトは120秒に設定されています + +### 4. フロントエンドがバックエンドに接続できない + +**解決策**: +- バックエンドが実行中であることを確認(http://localhost:8080) +- ポート8080が占有されていないか確認 +- ブラウザコンソールでエラーを確認 + +### 5. コインプールAPI失敗 + +**解決策**: +- コインプールAPIはオプションです +- APIが失敗した場合、システムはデフォルトのメインストリームコイン(BTC、ETHなど)を使用 +- config.jsonのAPI URLと認証パラメータを確認 + +--- + +## 📈 パフォーマンス最適化のヒント + +1. **合理的な判断サイクルを設定**: 3-5分を推奨、過剰取引を避ける +2. **候補コイン数を制御**: システムはデフォルトでAI500上位20 + OI Top上位20 +3. **ログを定期的にクリーン**: 過度なディスク使用を避ける +4. **API呼び出し数を監視**: Binanceレート制限のトリガーを避ける +5. **少額資本でテスト**: まず100-500 USDTで戦略検証をテスト + +--- + +## 🔄 変更履歴 + +### v2.0.2(2025-10-29) + +**重大なバグ修正 - 取引履歴とパフォーマンス分析:** + +このバージョンは、収益性統計に大きく影響した過去取引記録とパフォーマンス分析システムの**重大な計算エラー**を修正します。 + +**1. PnL計算 - 主要エラー修正**(logger/decision_logger.go) +- **問題**: 以前はパーセンテージのみで計算され、ポジションサイズとレバレッジを完全に無視 + - 例:100 USDTポジションが5%獲得と1000 USDTポジションが5%獲得の両方が利益として`5.0`と表示 + - これによりパフォーマンス分析が完全に不正確に +- **解決策**: 実際のUSDT利益額を計算 + ``` + PnL(USDT)= ポジション価値 × 価格変化% × レバレッジ + 例:1000 USDT × 5% × 20x = 1000 USDT実際の利益 + ``` +- **影響**: 勝率、利益率、シャープレシオが正確なUSDT額に基づくようになりました + +**2. ポジション追跡 - 重要データの欠落** +- **問題**: オープンポジション記録が価格と時間のみを保存、数量とレバレッジが欠落 +- **解決策**: 完全な取引データを保存: + - `quantity`: ポジションサイズ(コイン単位) + - `leverage`: レバレッジ倍率(例:20x) + - これらは正確なPnL計算に不可欠 + +**3. ポジションキーロジック - ロング/ショート競合** +- **問題**: `symbol`をポジションキーとして使用し、ロングとショートの両方を保有する際にデータ競合を引き起こす + - 例:BTCUSDTロングとBTCUSDTショートが互いに上書き +- **解決策**: `symbol_side`形式に変更(例:`BTCUSDT_long`、`BTCUSDT_short`) + - ロングとショートポジションを適切に区別 + +**4. シャープレシオ計算 - コード最適化** +- **問題**: 平方根計算にカスタムニュートン法を使用 +- **解決策**: 標準ライブラリ`math.Sqrt`に置き換え + - より信頼性が高く、保守可能で効率的 + +**このアップデートが重要な理由:** +- ✅ 過去取引統計が無意味なパーセンテージではなく**実際のUSDT損益**を表示 +- ✅ 異なるレバレッジ取引間のパフォーマンス比較が正確に +- ✅ AI自己学習メカニズムが正しい過去フィードバックを受信 +- ✅ 利益率とシャープレシオの計算が意味を持つように +- ✅ マルチポジション追跡(ロング + ショート同時)が正しく機能 + +**推奨**: このアップデート前にシステムを実行していた場合、過去統計は不正確でした。v2.0.2にアップデート後、新しい取引は正しく計算されます。 + +### v2.0.2(2025-10-29) + +**バグ修正:** +- ✅ Aster取引所精度エラーを修正(コード-1111:「Precision is over the maximum defined for this asset」) +- ✅ 取引所の精度要件に合わせて価格と数量のフォーマットを改善 +- ✅ デバッグ用の詳細な精度処理ログを追加 +- ✅ 適切な精度処理ですべての注文関数(OpenLong、OpenShort、CloseLong、CloseShort、SetStopLoss、SetTakeProfit)を強化 + +**技術詳細:** +- float64を正しい精度で文字列に変換する`formatFloatWithPrecision`関数を追加 +- 価格と数量パラメータが取引所の`pricePrecision`と`quantityPrecision`仕様に従ってフォーマットされるようになりました +- API リクエストを最適化するために、フォーマットされた値から末尾のゼロを削除 + +### v2.0.1(2025-10-29) + +**バグ修正:** +- ✅ ComparisonChartデータ処理ロジックを修正 - cycle_numberからタイムスタンプグループ化に切り替え +- ✅ バックエンド再起動時にcycle_numberがリセットされるとチャートがフリーズする問題を解決 +- ✅ チャートデータ表示を改善 - すべての過去データポイントを時系列で表示 +- ✅ トラブルシューティングを改善するためのデバッグログを強化 + +### v2.0.0(2025-10-28) + +**主要アップデート:** +- ✅ AI自己学習メカニズム(過去フィードバック、パフォーマンス分析) +- ✅ マルチトレーダー競争モード(Qwen対DeepSeek) +- ✅ BinanceスタイルUI(完全なBinanceインターフェース模倣) +- ✅ パフォーマンス比較チャート(リアルタイムROI比較) +- ✅ リスク管理最適化(コインごとのポジション制限調整) + +**バグ修正:** +- 初期残高のハードコーディング問題を修正 +- マルチトレーダーデータ同期問題を修正 +- チャートデータの整列を最適化(cycle_numberを使用) + +### v1.0.0(2025-10-27) +- 初回リリース +- 基本的なAI取引機能 +- 判断ログシステム +- シンプルなWebインターフェース + +--- + +## 📄 ライセンス + +MITライセンス - 詳細は[LICENSE](LICENSE)ファイルを参照してください + +--- + +## 🤝 貢献 + +IssueとPull Requestを歓迎します! + +### 開発ガイド + +1. プロジェクトをフォーク +2. 機能ブランチを作成(`git checkout -b feature/AmazingFeature`) +3. 変更をコミット(`git commit -m 'Add some AmazingFeature'`) +4. ブランチにプッシュ(`git push origin feature/AmazingFeature`) +5. Pull Requestを開く + +--- + +## 📬 お問い合わせ + + +### 🐛 技術サポート +- **GitHub Issues**: [Issueを提出](https://github.com/tinkle-community/nofx/issues) +- **開発者コミュニティ**: [Telegramグループ](https://t.me/nofx_dev_community) + +--- + +## 🙏 謝辞 + +- [Binance API](https://binance-docs.github.io/apidocs/futures/en/) - Binance先物API +- [DeepSeek](https://platform.deepseek.com/) - DeepSeek AI API +- [Qwen](https://dashscope.aliyuncs.com/) - Alibaba Cloud Qwen +- [TA-Lib](https://ta-lib.org/) - テクニカル指標ライブラリ +- [Recharts](https://recharts.org/) - Reactチャートライブラリ + +--- + +**最終更新**: 2025-10-29(v2.0.3) + +**⚡ AIの力で量的取引の可能性を探求しましょう!** + +--- + +## ⭐ Star履歴 + +[![Star履歴チャート](https://api.star-history.com/svg?repos=tinkle-community/nofx&type=Date)](https://star-history.com/#tinkle-community/nofx&Date) diff --git a/README.md b/README.md index f76b9067..4a82bfed 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Go Version](https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go)](https://golang.org/) [![React](https://img.shields.io/badge/React-18+-61DAFB?style=flat&logo=react)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat&logo=typescript)](https://www.typescriptlang.org/) -[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) +[![License](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE) [![Backed by Amber.ac](https://img.shields.io/badge/Backed%20by-Amber.ac-orange.svg)](https://amber.ac) **Languages:** [English](README.md) | [中文](docs/i18n/zh-CN/README.md) | [Українська](docs/i18n/uk/README.md) | [Русский](docs/i18n/ru/README.md) @@ -281,7 +281,7 @@ Docker automatically handles all dependencies (Go, Node.js, TA-Lib, SQLite) and #### Step 1: Prepare Configuration ```bash # Copy configuration template -cp config.example.jsonc config.json +cp config.json.example config.json # Edit and fill in your API keys nano config.json # or use any editor @@ -1240,7 +1240,15 @@ sudo apt-get install libta-lib0-dev ## 📄 License -MIT License - See [LICENSE](LICENSE) file for details +This project is licensed under the **GNU Affero General Public License v3.0 (AGPL-3.0)** - See [LICENSE](LICENSE) file for details. + +**What this means:** +- ✅ You can use, modify, and distribute this software +- ✅ You must disclose source code of your modifications +- ✅ If you run a modified version on a server, you must make the source code available to users +- ✅ All derivatives must also be licensed under AGPL-3.0 + +For commercial licensing or questions, please contact the maintainers. --- diff --git a/api/server.go b/api/server.go index bb0a6eaf..b068d5aa 100644 --- a/api/server.go +++ b/api/server.go @@ -4,11 +4,13 @@ import ( "encoding/json" "fmt" "log" + "net" "net/http" "nofx/auth" "nofx/config" "nofx/decision" "nofx/manager" + "nofx/trader" "strconv" "strings" "time" @@ -88,7 +90,7 @@ func (s *Server) setupRoutes() { // 系统提示词模板管理(无需认证) api.GET("/prompt-templates", s.handleGetPromptTemplates) api.GET("/prompt-templates/:name", s.handleGetPromptTemplate) - + // 公开的竞赛数据(无需认证) api.GET("/traders", s.handlePublicTraderList) api.GET("/competition", s.handlePublicCompetition) @@ -100,6 +102,9 @@ func (s *Server) setupRoutes() { // 需要认证的路由 protected := api.Group("/", s.authMiddleware()) { + // 服务器IP查询(需要认证,用于白名单配置) + protected.GET("/server-ip", s.handleGetServerIP) + // AI交易员管理 protected.GET("/my-traders", s.handleTraderList) protected.GET("/traders/:id/config", s.handleGetTraderConfig) @@ -109,6 +114,7 @@ func (s *Server) setupRoutes() { protected.POST("/traders/:id/start", s.handleStartTrader) protected.POST("/traders/:id/stop", s.handleStopTrader) protected.PUT("/traders/:id/prompt", s.handleUpdateTraderPrompt) + protected.POST("/traders/:id/sync-balance", s.handleSyncBalance) // AI模型配置 protected.GET("/models", s.handleGetModelConfigs) @@ -168,7 +174,7 @@ func (s *Server) handleGetSystemConfig(c *gin.Context) { if val, err := strconv.Atoi(altcoinLeverageStr); err == nil && val > 0 { altcoinLeverage = val } - + // 获取内测模式配置 betaModeStr, _ := s.database.GetSystemConfig("beta_mode") betaMode := betaModeStr == "true" @@ -182,6 +188,133 @@ func (s *Server) handleGetSystemConfig(c *gin.Context) { }) } +// handleGetServerIP 获取服务器IP地址(用于白名单配置) +func (s *Server) handleGetServerIP(c *gin.Context) { + // 尝试通过第三方API获取公网IP + publicIP := getPublicIPFromAPI() + + // 如果第三方API失败,从网络接口获取第一个公网IP + if publicIP == "" { + publicIP = getPublicIPFromInterface() + } + + // 如果还是没有获取到,返回错误 + if publicIP == "" { + c.JSON(http.StatusInternalServerError, gin.H{"error": "无法获取公网IP地址"}) + return + } + + c.JSON(http.StatusOK, gin.H{ + "public_ip": publicIP, + "message": "请将此IP地址添加到白名单中", + }) +} + +// getPublicIPFromAPI 通过第三方API获取公网IP +func getPublicIPFromAPI() string { + // 尝试多个公网IP查询服务 + services := []string{ + "https://api.ipify.org?format=text", + "https://icanhazip.com", + "https://ifconfig.me", + } + + client := &http.Client{ + Timeout: 5 * time.Second, + } + + for _, service := range services { + resp, err := client.Get(service) + if err != nil { + continue + } + defer resp.Body.Close() + + if resp.StatusCode == http.StatusOK { + body := make([]byte, 128) + n, err := resp.Body.Read(body) + if err != nil && err.Error() != "EOF" { + continue + } + + ip := strings.TrimSpace(string(body[:n])) + // 验证是否为有效的IP地址 + if net.ParseIP(ip) != nil { + return ip + } + } + } + + return "" +} + +// getPublicIPFromInterface 从网络接口获取第一个公网IP +func getPublicIPFromInterface() string { + interfaces, err := net.Interfaces() + if err != nil { + return "" + } + + for _, iface := range interfaces { + // 跳过未启用的接口和回环接口 + if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 { + continue + } + + addrs, err := iface.Addrs() + if err != nil { + continue + } + + for _, addr := range addrs { + var ip net.IP + switch v := addr.(type) { + case *net.IPNet: + ip = v.IP + case *net.IPAddr: + ip = v.IP + } + + if ip == nil || ip.IsLoopback() { + continue + } + + // 只考虑IPv4地址 + if ip.To4() != nil { + ipStr := ip.String() + // 排除私有IP地址范围 + if !isPrivateIP(ip) { + return ipStr + } + } + } + } + + return "" +} + +// isPrivateIP 判断是否为私有IP地址 +func isPrivateIP(ip net.IP) bool { + // 私有IP地址范围: + // 10.0.0.0/8 + // 172.16.0.0/12 + // 192.168.0.0/16 + privateRanges := []string{ + "10.0.0.0/8", + "172.16.0.0/12", + "192.168.0.0/16", + } + + for _, cidr := range privateRanges { + _, subnet, _ := net.ParseCIDR(cidr) + if subnet.Contains(ip) { + return true + } + } + + return false +} + // getTraderFromQuery 从query参数获取trader func (s *Server) getTraderFromQuery(c *gin.Context) (*manager.TraderManager, string, error) { userID := c.GetString("user_id") @@ -343,8 +476,75 @@ func (s *Server) handleCreateTrader(c *gin.Context) { // 设置扫描间隔默认值 scanIntervalMinutes := req.ScanIntervalMinutes - if scanIntervalMinutes <= 0 { - scanIntervalMinutes = 3 // 默认3分钟 + if scanIntervalMinutes < 3 { + scanIntervalMinutes = 3 // 默认3分钟,且不允许小于3 + } + + // ✨ 查询交易所实际余额,覆盖用户输入 + actualBalance := req.InitialBalance // 默认使用用户输入 + exchanges, err := s.database.GetExchanges(userID) + if err != nil { + log.Printf("⚠️ 获取交易所配置失败,使用用户输入的初始资金: %v", err) + } + + // 查找匹配的交易所配置 + var exchangeCfg *config.ExchangeConfig + for _, ex := range exchanges { + if ex.ID == req.ExchangeID { + exchangeCfg = ex + break + } + } + + if exchangeCfg == nil { + log.Printf("⚠️ 未找到交易所 %s 的配置,使用用户输入的初始资金", req.ExchangeID) + } else if !exchangeCfg.Enabled { + log.Printf("⚠️ 交易所 %s 未启用,使用用户输入的初始资金", req.ExchangeID) + } else { + // 根据交易所类型创建临时 trader 查询余额 + var tempTrader trader.Trader + var createErr error + + switch req.ExchangeID { + case "binance": + tempTrader = trader.NewFuturesTrader(exchangeCfg.APIKey, exchangeCfg.SecretKey) + case "hyperliquid": + tempTrader, createErr = trader.NewHyperliquidTrader( + exchangeCfg.APIKey, // private key + exchangeCfg.HyperliquidWalletAddr, + exchangeCfg.Testnet, + ) + case "aster": + tempTrader, createErr = trader.NewAsterTrader( + exchangeCfg.AsterUser, + exchangeCfg.AsterSigner, + exchangeCfg.AsterPrivateKey, + ) + default: + log.Printf("⚠️ 不支持的交易所类型: %s,使用用户输入的初始资金", req.ExchangeID) + } + + if createErr != nil { + log.Printf("⚠️ 创建临时 trader 失败,使用用户输入的初始资金: %v", createErr) + } else if tempTrader != nil { + // 查询实际余额 + balanceInfo, balanceErr := tempTrader.GetBalance() + if balanceErr != nil { + log.Printf("⚠️ 查询交易所余额失败,使用用户输入的初始资金: %v", balanceErr) + } else { + // 提取可用余额 + if availableBalance, ok := balanceInfo["available_balance"].(float64); ok && availableBalance > 0 { + actualBalance = availableBalance + log.Printf("✓ 查询到交易所实际余额: %.2f USDT (用户输入: %.2f USDT)", actualBalance, req.InitialBalance) + } else if totalBalance, ok := balanceInfo["balance"].(float64); ok && totalBalance > 0 { + // 有些交易所可能只返回 balance 字段 + actualBalance = totalBalance + log.Printf("✓ 查询到交易所实际余额: %.2f USDT (用户输入: %.2f USDT)", actualBalance, req.InitialBalance) + } else { + log.Printf("⚠️ 无法从余额信息中提取可用余额,使用用户输入的初始资金") + } + } + } } // 创建交易员配置(数据库实体) @@ -354,7 +554,7 @@ func (s *Server) handleCreateTrader(c *gin.Context) { Name: req.Name, AIModelID: req.AIModelID, ExchangeID: req.ExchangeID, - InitialBalance: req.InitialBalance, + InitialBalance: actualBalance, // 使用实际查询的余额 BTCETHLeverage: btcEthLeverage, AltcoinLeverage: altcoinLeverage, TradingSymbols: req.TradingSymbols, @@ -369,7 +569,7 @@ func (s *Server) handleCreateTrader(c *gin.Context) { } // 保存到数据库 - err := s.database.CreateTrader(trader) + err = s.database.CreateTrader(trader) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("创建交易员失败: %v", err)}) return @@ -458,6 +658,8 @@ func (s *Server) handleUpdateTrader(c *gin.Context) { scanIntervalMinutes := req.ScanIntervalMinutes if scanIntervalMinutes <= 0 { scanIntervalMinutes = existingTrader.ScanIntervalMinutes // 保持原值 + } else if scanIntervalMinutes < 3 { + scanIntervalMinutes = 3 } // 更新交易员配置 @@ -531,14 +733,14 @@ func (s *Server) handleDeleteTrader(c *gin.Context) { func (s *Server) handleStartTrader(c *gin.Context) { userID := c.GetString("user_id") traderID := c.Param("id") - + // 校验交易员是否属于当前用户 _, _, _, err := s.database.GetTraderConfig(userID, traderID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "交易员不存在或无访问权限"}) return } - + trader, err := s.traderManager.GetTrader(traderID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "交易员不存在"}) @@ -574,14 +776,14 @@ func (s *Server) handleStartTrader(c *gin.Context) { func (s *Server) handleStopTrader(c *gin.Context) { userID := c.GetString("user_id") traderID := c.Param("id") - + // 校验交易员是否属于当前用户 _, _, _, err := s.database.GetTraderConfig(userID, traderID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "交易员不存在或无访问权限"}) return } - + trader, err := s.traderManager.GetTrader(traderID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "交易员不存在"}) @@ -641,6 +843,113 @@ func (s *Server) handleUpdateTraderPrompt(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "自定义prompt已更新"}) } +// handleSyncBalance 同步交易所余额到initial_balance(选项B:手动同步 + 选项C:智能检测) +func (s *Server) handleSyncBalance(c *gin.Context) { + userID := c.GetString("user_id") + traderID := c.Param("id") + + log.Printf("🔄 用户 %s 请求同步交易员 %s 的余额", userID, traderID) + + // 从数据库获取交易员配置(包含交易所信息) + traderConfig, _, exchangeCfg, err := s.database.GetTraderConfig(userID, traderID) + if err != nil { + c.JSON(http.StatusNotFound, gin.H{"error": "交易员不存在"}) + return + } + + if exchangeCfg == nil || !exchangeCfg.Enabled { + c.JSON(http.StatusBadRequest, gin.H{"error": "交易所未配置或未启用"}) + return + } + + // 创建临时 trader 查询余额 + var tempTrader trader.Trader + var createErr error + + switch traderConfig.ExchangeID { + case "binance": + tempTrader = trader.NewFuturesTrader(exchangeCfg.APIKey, exchangeCfg.SecretKey) + case "hyperliquid": + tempTrader, createErr = trader.NewHyperliquidTrader( + exchangeCfg.APIKey, + exchangeCfg.HyperliquidWalletAddr, + exchangeCfg.Testnet, + ) + case "aster": + tempTrader, createErr = trader.NewAsterTrader( + exchangeCfg.AsterUser, + exchangeCfg.AsterSigner, + exchangeCfg.AsterPrivateKey, + ) + default: + c.JSON(http.StatusBadRequest, gin.H{"error": "不支持的交易所类型"}) + return + } + + if createErr != nil { + log.Printf("⚠️ 创建临时 trader 失败: %v", createErr) + c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("连接交易所失败: %v", createErr)}) + return + } + + // 查询实际余额 + balanceInfo, balanceErr := tempTrader.GetBalance() + if balanceErr != nil { + log.Printf("⚠️ 查询交易所余额失败: %v", balanceErr) + c.JSON(http.StatusInternalServerError, gin.H{"error": fmt.Sprintf("查询余额失败: %v", balanceErr)}) + return + } + + // 提取可用余额 + var actualBalance float64 + if availableBalance, ok := balanceInfo["available_balance"].(float64); ok && availableBalance > 0 { + actualBalance = availableBalance + } else if availableBalance, ok := balanceInfo["availableBalance"].(float64); ok && availableBalance > 0 { + actualBalance = availableBalance + } else if totalBalance, ok := balanceInfo["balance"].(float64); ok && totalBalance > 0 { + actualBalance = totalBalance + } else { + c.JSON(http.StatusInternalServerError, gin.H{"error": "无法获取可用余额"}) + return + } + + oldBalance := traderConfig.InitialBalance + + // ✅ 选项C:智能检测余额变化 + changePercent := ((actualBalance - oldBalance) / oldBalance) * 100 + changeType := "增加" + if changePercent < 0 { + changeType = "减少" + } + + log.Printf("✓ 查询到交易所实际余额: %.2f USDT (当前配置: %.2f USDT, 变化: %.2f%%)", + actualBalance, oldBalance, changePercent) + + // 更新数据库中的 initial_balance + err = s.database.UpdateTraderInitialBalance(userID, traderID, actualBalance) + if err != nil { + log.Printf("❌ 更新initial_balance失败: %v", err) + c.JSON(http.StatusInternalServerError, gin.H{"error": "更新余额失败"}) + return + } + + // 重新加载交易员到内存 + err = s.traderManager.LoadUserTraders(s.database, userID) + if err != nil { + log.Printf("⚠️ 重新加载用户交易员到内存失败: %v", err) + } + + log.Printf("✅ 已同步余额: %.2f → %.2f USDT (%s %.2f%%)", oldBalance, actualBalance, changeType, changePercent) + + c.JSON(http.StatusOK, gin.H{ + "message": "余额同步成功", + "old_balance": oldBalance, + "new_balance": actualBalance, + "change_percent": changePercent, + "change_type": changeType, + }) +} + // handleGetModelConfigs 获取AI模型配置 func (s *Server) handleGetModelConfigs(c *gin.Context) { userID := c.GetString("user_id") @@ -791,19 +1100,12 @@ func (s *Server) handleTraderList(c *gin.Context) { } } - // AIModelID 应该已经是 provider(如 "deepseek"),直接使用 - // 如果是旧数据格式(如 "admin_deepseek"),提取 provider 部分 - aiModelID := trader.AIModelID - // 兼容旧数据:如果包含下划线,提取最后一部分作为 provider - if strings.Contains(aiModelID, "_") { - parts := strings.Split(aiModelID, "_") - aiModelID = parts[len(parts)-1] - } - + // 返回完整的 AIModelID(如 "admin_deepseek"),不要截断 + // 前端需要完整 ID 来验证模型是否存在(与 handleGetTraderConfig 保持一致) result = append(result, map[string]interface{}{ "trader_id": trader.ID, "trader_name": trader.Name, - "ai_model": aiModelID, + "ai_model": trader.AIModelID, // 使用完整 ID "exchange_id": trader.ExchangeID, "is_running": isRunning, "initial_balance": trader.InitialBalance, @@ -1363,7 +1665,6 @@ func (s *Server) handleLogin(c *gin.Context) { // 验证密码 if !auth.CheckPassword(req.Password, user.PasswordHash) { - log.Printf("DEBUG: 密码验证失败") c.JSON(http.StatusUnauthorized, gin.H{"error": "邮箱或密码错误"}) return } @@ -1582,7 +1883,7 @@ func (s *Server) handlePublicCompetition(c *gin.Context) { }) return } - + c.JSON(http.StatusOK, competition) } @@ -1595,7 +1896,7 @@ func (s *Server) handleTopTraders(c *gin.Context) { }) return } - + c.JSON(http.StatusOK, topTraders) } @@ -1604,7 +1905,7 @@ func (s *Server) handleEquityHistoryBatch(c *gin.Context) { var requestBody struct { TraderIDs []string `json:"trader_ids"` } - + // 尝试解析POST请求的JSON body if err := c.ShouldBindJSON(&requestBody); err != nil { // 如果JSON解析失败,尝试从query参数获取(兼容GET请求) @@ -1618,13 +1919,13 @@ func (s *Server) handleEquityHistoryBatch(c *gin.Context) { }) return } - + traders, ok := topTraders["traders"].([]map[string]interface{}) if !ok { c.JSON(http.StatusInternalServerError, gin.H{"error": "交易员数据格式错误"}) return } - + // 提取trader IDs traderIDs := make([]string, 0, len(traders)) for _, trader := range traders { @@ -1632,24 +1933,24 @@ func (s *Server) handleEquityHistoryBatch(c *gin.Context) { traderIDs = append(traderIDs, traderID) } } - + result := s.getEquityHistoryForTraders(traderIDs) c.JSON(http.StatusOK, result) return } - + // 解析逗号分隔的trader IDs requestBody.TraderIDs = strings.Split(traderIDsParam, ",") for i := range requestBody.TraderIDs { requestBody.TraderIDs[i] = strings.TrimSpace(requestBody.TraderIDs[i]) } } - + // 限制最多20个交易员,防止请求过大 if len(requestBody.TraderIDs) > 20 { requestBody.TraderIDs = requestBody.TraderIDs[:20] } - + result := s.getEquityHistoryForTraders(requestBody.TraderIDs) c.JSON(http.StatusOK, result) } @@ -1659,31 +1960,31 @@ func (s *Server) getEquityHistoryForTraders(traderIDs []string) map[string]inter result := make(map[string]interface{}) histories := make(map[string]interface{}) errors := make(map[string]string) - + for _, traderID := range traderIDs { if traderID == "" { continue } - + trader, err := s.traderManager.GetTrader(traderID) if err != nil { errors[traderID] = "交易员不存在" continue } - + // 获取历史数据(用于对比展示,限制数据量) records, err := trader.GetDecisionLogger().GetLatestRecords(500) if err != nil { errors[traderID] = fmt.Sprintf("获取历史数据失败: %v", err) continue } - + // 构建收益率历史数据 history := make([]map[string]interface{}, 0, len(records)) for _, record := range records { // 计算总权益(余额+未实现盈亏) totalEquity := record.AccountState.TotalBalance + record.AccountState.TotalUnrealizedProfit - + history = append(history, map[string]interface{}{ "timestamp": record.Timestamp, "total_equity": totalEquity, @@ -1691,16 +1992,16 @@ func (s *Server) getEquityHistoryForTraders(traderIDs []string) map[string]inter "balance": record.AccountState.TotalBalance, }) } - + histories[traderID] = history } - + result["histories"] = histories result["count"] = len(histories) if len(errors) > 0 { result["errors"] = errors } - + return result } @@ -1734,4 +2035,3 @@ func (s *Server) handleGetPublicTraderConfig(c *gin.Context) { c.JSON(http.StatusOK, result) } - diff --git a/config.json.example b/config.json.example index fefa1673..820f39a7 100644 --- a/config.json.example +++ b/config.json.example @@ -20,5 +20,8 @@ "max_daily_loss": 10.0, "max_drawdown": 20.0, "stop_trading_minutes": 60, - "jwt_secret": "Qk0kAa+d0iIEzXVHXbNbm+UaN3RNabmWtH8rDWZ5OPf+4GX8pBflAHodfpbipVMyrw1fsDanHsNBjhgbDeK9Jg==" + "jwt_secret": "Qk0kAa+d0iIEzXVHXbNbm+UaN3RNabmWtH8rDWZ5OPf+4GX8pBflAHodfpbipVMyrw1fsDanHsNBjhgbDeK9Jg==", + "log": { + "level": "info" + } } \ No newline at end of file diff --git a/config/config.go b/config/config.go index 37a537db..b913212f 100644 --- a/config/config.go +++ b/config/config.go @@ -50,6 +50,20 @@ type LeverageConfig struct { AltcoinLeverage int `json:"altcoin_leverage"` // 山寨币的杠杆倍数(主账户建议5-20,子账户≤5) } +// LogConfig 日志配置 +type LogConfig struct { + Level string `json:"level"` // 日志级别: debug, info, warn, error (默认: info) + Telegram *TelegramConfig `json:"telegram"` // Telegram推送配置(可选) +} + +// TelegramConfig Telegram推送配置(简化版,只保留必需字段) +type TelegramConfig struct { + Enabled bool `json:"enabled"` // 是否启用(默认: false) + BotToken string `json:"bot_token"` // Bot Token + ChatID int64 `json:"chat_id"` // Chat ID + MinLevel string `json:"min_level"` // 最低日志级别,该级别及以上的日志会推送到Telegram(可选,默认: error) +} + // Config 总配置 type Config struct { Traders []TraderConfig `json:"traders"` @@ -60,6 +74,7 @@ type Config struct { MaxDrawdown float64 `json:"max_drawdown"` StopTradingMinutes int `json:"stop_trading_minutes"` Leverage LeverageConfig `json:"leverage"` // 杠杆配置 + Log *LogConfig `json:"log"` // 日志配置(可选) } // LoadConfig 从文件加载配置 diff --git a/config/database.go b/config/database.go index 932982b4..3749df4d 100644 --- a/config/database.go +++ b/config/database.go @@ -40,6 +40,7 @@ type DatabaseInterface interface { GetTraders(userID string) ([]*TraderRecord, error) UpdateTraderStatus(userID, id string, isRunning bool) error UpdateTrader(trader *TraderRecord) error + UpdateTraderInitialBalance(userID, id string, newBalance float64) error UpdateTraderCustomPrompt(userID, id string, customPrompt string, overrideBase bool) error DeleteTrader(userID, id string) error GetTraderConfig(userID, traderID string) (*TraderRecord, *AIModelConfig, *ExchangeConfig, error) @@ -899,6 +900,12 @@ func (d *Database) UpdateTraderCustomPrompt(userID, id string, customPrompt stri return err } +// UpdateTraderInitialBalance 更新交易员初始余额(用于自动同步交易所实际余额) +func (d *Database) UpdateTraderInitialBalance(userID, id string, newBalance float64) error { + _, err := d.db.Exec(`UPDATE traders SET initial_balance = ? WHERE id = ? AND user_id = ?`, newBalance, id, userID) + return err +} + // DeleteTrader 删除交易员 func (d *Database) DeleteTrader(userID, id string) error { _, err := d.db.Exec(`DELETE FROM traders WHERE id = ? AND user_id = ?`, id, userID) @@ -928,8 +935,13 @@ func (d *Database) GetTraderConfig(userID, traderID string) (*TraderRecord, *AIM `, traderID, userID).Scan( &trader.ID, &trader.UserID, &trader.Name, &trader.AIModelID, &trader.ExchangeID, &trader.InitialBalance, &trader.ScanIntervalMinutes, &trader.IsRunning, + &trader.BTCETHLeverage, &trader.AltcoinLeverage, &trader.TradingSymbols, + &trader.UseCoinPool, &trader.UseOITop, + &trader.CustomPrompt, &trader.OverrideBasePrompt, &trader.SystemPromptTemplate, + &trader.IsCrossMargin, &trader.CreatedAt, &trader.UpdatedAt, &aiModel.ID, &aiModel.UserID, &aiModel.Name, &aiModel.Provider, &aiModel.Enabled, &aiModel.APIKey, + &aiModel.CustomAPIURL, &aiModel.CustomModelName, &aiModel.CreatedAt, &aiModel.UpdatedAt, &exchange.ID, &exchange.UserID, &exchange.Name, &exchange.Type, &exchange.Enabled, &exchange.APIKey, &exchange.SecretKey, &exchange.Testnet, @@ -1065,7 +1077,7 @@ func (d *Database) LoadBetaCodesFromFile(filePath string) error { log.Printf("插入内测码 %s 失败: %v", code, err) continue } - + if rowsAffected, _ := result.RowsAffected(); rowsAffected > 0 { insertedCount++ } diff --git a/config/database_pg.go b/config/database_pg.go index b8dd560f..ad11ca07 100644 --- a/config/database_pg.go +++ b/config/database_pg.go @@ -464,6 +464,12 @@ func (d *PostgreSQLDatabase) UpdateTraderCustomPrompt(userID, id string, customP return err } +// UpdateTraderInitialBalance 更新交易员初始余额(用于自动同步交易所实际余额) +func (d *PostgreSQLDatabase) UpdateTraderInitialBalance(userID, id string, newBalance float64) error { + _, err := d.db.Exec(`UPDATE traders SET initial_balance = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2 AND user_id = $3`, newBalance, id, userID) + return err +} + // DeleteTrader 删除交易员 func (d *PostgreSQLDatabase) DeleteTrader(userID, id string) error { _, err := d.db.Exec(`DELETE FROM traders WHERE id = $1 AND user_id = $2`, id, userID) diff --git a/config/database_test.go b/config/database_test.go deleted file mode 100644 index 45d1ddb4..00000000 --- a/config/database_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package config - -import "testing" - -func TestExample(t *testing.T) { - if 1+1 != 2 { - t.Error("Math is broken") - } -} diff --git a/decision/engine.go b/decision/engine.go index df48d534..598658d1 100644 --- a/decision/engine.go +++ b/decision/engine.go @@ -7,10 +7,22 @@ import ( "nofx/market" "nofx/mcp" "nofx/pool" + "regexp" "strings" "time" ) +// 预编译正则表达式(性能优化:避免每次调用时重新编译) +var ( + // ✅ 安全的正則:精確匹配 ```json 代碼塊 + // 使用反引號 + 拼接避免轉義問題 + reJSONFence = regexp.MustCompile(`(?is)` + "```json\\s*(\\[\\s*\\{.*?\\}\\s*\\])\\s*```") + reJSONArray = regexp.MustCompile(`(?is)\[\s*\{.*?\}\s*\]`) + reArrayHead = regexp.MustCompile(`^\[\s*\{`) + reArrayOpenSpace = regexp.MustCompile(`^\[\s+\{`) + reInvisibleRunes = regexp.MustCompile("[\u200B\u200C\u200D\uFEFF]") +) + // PositionInfo 持仓信息 type PositionInfo struct { Symbol string `json:"symbol"` @@ -71,11 +83,20 @@ type Context struct { // Decision AI的交易决策 type Decision struct { Symbol string `json:"symbol"` - Action string `json:"action"` // "open_long", "open_short", "close_long", "close_short", "hold", "wait" + Action string `json:"action"` // "open_long", "open_short", "close_long", "close_short", "update_stop_loss", "update_take_profit", "partial_close", "hold", "wait" + + // 开仓参数 Leverage int `json:"leverage,omitempty"` PositionSizeUSD float64 `json:"position_size_usd,omitempty"` StopLoss float64 `json:"stop_loss,omitempty"` TakeProfit float64 `json:"take_profit,omitempty"` + + // 调整参数(新增) + NewStopLoss float64 `json:"new_stop_loss,omitempty"` // 用于 update_stop_loss + NewTakeProfit float64 `json:"new_take_profit,omitempty"` // 用于 update_take_profit + ClosePercentage float64 `json:"close_percentage,omitempty"` // 用于 partial_close (0-100) + + // 通用参数 Confidence int `json:"confidence,omitempty"` // 信心度 (0-100) RiskUSD float64 `json:"risk_usd,omitempty"` // 最大美元风险 Reasoning string `json:"reasoning"` @@ -160,17 +181,20 @@ func fetchMarketDataForContext(ctx *Context) error { continue } - // ⚠️ 流动性过滤:持仓价值低于15M USD的币种不做(多空都不做) + // ⚠️ 流动性过滤:持仓价值低于阈值的币种不做(多空都不做) // 持仓价值 = 持仓量 × 当前价格 // 但现有持仓必须保留(需要决策是否平仓) + // 💡 OI 門檻配置:用戶可根據風險偏好調整 + const minOIThresholdMillions = 15.0 // 可調整:15M(保守) / 10M(平衡) / 8M(寬鬆) / 5M(激進) + isExistingPosition := positionSymbols[symbol] if !isExistingPosition && data.OpenInterest != nil && data.CurrentPrice > 0 { // 计算持仓价值(USD)= 持仓量 × 当前价格 oiValue := data.OpenInterest.Latest * data.CurrentPrice oiValueInMillions := oiValue / 1_000_000 // 转换为百万美元单位 - if oiValueInMillions < 15 { - log.Printf("⚠️ %s 持仓价值过低(%.2fM USD < 15M),跳过此币种 [持仓量:%.0f × 价格:%.4f]", - symbol, oiValueInMillions, data.OpenInterest.Latest, data.CurrentPrice) + if oiValueInMillions < minOIThresholdMillions { + log.Printf("⚠️ %s 持仓价值过低(%.2fM USD < %.1fM),跳过此币种 [持仓量:%.0f × 价格:%.4f]", + symbol, oiValueInMillions, minOIThresholdMillions, data.OpenInterest.Latest, data.CurrentPrice) continue } } @@ -200,10 +224,31 @@ func fetchMarketDataForContext(ctx *Context) error { // calculateMaxCandidates 根据账户状态计算需要分析的候选币种数量 func calculateMaxCandidates(ctx *Context) int { - // 直接返回候选池的全部币种数量 - // 因为候选池已经在 auto_trader.go 中筛选过了 - // 固定分析前20个评分最高的币种(来自AI500) - return len(ctx.CandidateCoins) + // ⚠️ 重要:限制候选币种数量,避免 Prompt 过大 + // 根据持仓数量动态调整:持仓越少,可以分析更多候选币 + const ( + maxCandidatesWhenEmpty = 30 // 无持仓时最多分析30个候选币 + maxCandidatesWhenHolding1 = 25 // 持仓1个时最多分析25个候选币 + maxCandidatesWhenHolding2 = 20 // 持仓2个时最多分析20个候选币 + maxCandidatesWhenHolding3 = 15 // 持仓3个时最多分析15个候选币(避免 Prompt 过大) + ) + + positionCount := len(ctx.Positions) + var maxCandidates int + + switch positionCount { + case 0: + maxCandidates = maxCandidatesWhenEmpty + case 1: + maxCandidates = maxCandidatesWhenHolding1 + case 2: + maxCandidates = maxCandidatesWhenHolding2 + default: // 3+ 持仓 + maxCandidates = maxCandidatesWhenHolding3 + } + + // 返回实际候选币数量和上限中的较小值 + return min(len(ctx.CandidateCoins), maxCandidates) } // buildSystemPromptWithCustom 构建包含自定义内容的 System Prompt @@ -264,9 +309,11 @@ func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage in sb.WriteString("# 硬约束(风险控制)\n\n") sb.WriteString("1. 风险回报比: 必须 ≥ 1:3(冒1%风险,赚3%+收益)\n") sb.WriteString("2. 最多持仓: 3个币种(质量>数量)\n") - sb.WriteString(fmt.Sprintf("3. 单币仓位: 山寨%.0f-%.0f U(%dx杠杆) | BTC/ETH %.0f-%.0f U(%dx杠杆)\n", - accountEquity*0.8, accountEquity*1.5, altcoinLeverage, accountEquity*5, accountEquity*10, btcEthLeverage)) - sb.WriteString("4. 保证金: 总使用率 ≤ 90%\n\n") + sb.WriteString(fmt.Sprintf("3. 单币仓位: 山寨%.0f-%.0f U | BTC/ETH %.0f-%.0f U\n", + accountEquity*0.8, accountEquity*1.5, accountEquity*5, accountEquity*10)) + sb.WriteString(fmt.Sprintf("4. 杠杆限制: **山寨币最大%dx杠杆** | **BTC/ETH最大%dx杠杆** (⚠️ 严格执行,不可超过)\n", altcoinLeverage, btcEthLeverage)) + sb.WriteString("5. 保证金: 总使用率 ≤ 90%\n") + sb.WriteString("6. 开仓金额: 建议 **≥12 USDT** (交易所最小名义价值 10 USDT + 安全边际)\n\n") // 3. 输出格式 - 动态生成 sb.WriteString("#输出格式\n\n") @@ -430,25 +477,44 @@ func extractCoTTrace(response string) string { // extractDecisions 提取JSON决策列表 func extractDecisions(response string) ([]Decision, error) { - // 直接查找JSON数组 - 找第一个完整的JSON数组 - arrayStart := strings.Index(response, "[") - if arrayStart == -1 { - return nil, fmt.Errorf("无法找到JSON数组起始") + // 预清洗:去零宽/BOM + s := removeInvisibleRunes(response) + s = strings.TrimSpace(s) + + // 🔧 關鍵修復:在正則匹配之前就先修復全角字符! + // 否則正則表達式 \[ 無法匹配全角的 [ + s = fixMissingQuotes(s) + + // 1) 优先从 ```json 代码块中提取 + if m := reJSONFence.FindStringSubmatch(s); m != nil && len(m) > 1 { + jsonContent := strings.TrimSpace(m[1]) + jsonContent = compactArrayOpen(jsonContent) // 把 "[ {" 规整为 "[{" + jsonContent = fixMissingQuotes(jsonContent) // 二次修復(防止 regex 提取後還有全角) + if err := validateJSONFormat(jsonContent); err != nil { + return nil, fmt.Errorf("JSON格式验证失败: %w\nJSON内容: %s\n完整响应:\n%s", err, jsonContent, response) + } + var decisions []Decision + if err := json.Unmarshal([]byte(jsonContent), &decisions); err != nil { + return nil, fmt.Errorf("JSON解析失败: %w\nJSON内容: %s", err, jsonContent) + } + return decisions, nil } - // 从 [ 开始,匹配括号找到对应的 ] - arrayEnd := findMatchingBracket(response, arrayStart) - if arrayEnd == -1 { - return nil, fmt.Errorf("无法找到JSON数组结束") + // 2) 退而求其次:全文寻找首个对象数组 + // 注意:此時 s 已經過 fixMissingQuotes(),全角字符已轉換為半角 + jsonContent := strings.TrimSpace(reJSONArray.FindString(s)) + if jsonContent == "" { + return nil, fmt.Errorf("无法找到JSON数组起始(已嘗試修復全角字符)\n原始響應前200字符: %s", s[:min(200, len(s))]) } - jsonContent := strings.TrimSpace(response[arrayStart : arrayEnd+1]) + // 🔧 規整格式(此時全角字符已在前面修復過) + jsonContent = compactArrayOpen(jsonContent) + jsonContent = fixMissingQuotes(jsonContent) // 二次修復(防止 regex 提取後還有殘留全角) - // 🔧 修复常见的JSON格式错误:缺少引号的字段值 - // 匹配: "reasoning": 内容"} 或 "reasoning": 内容} (没有引号) - // 修复为: "reasoning": "内容"} - // 使用简单的字符串扫描而不是正则表达式 - jsonContent = fixMissingQuotes(jsonContent) + // 🔧 验证 JSON 格式(检测常见错误) + if err := validateJSONFormat(jsonContent); err != nil { + return nil, fmt.Errorf("JSON格式验证失败: %w\nJSON内容: %s\n完整响应:\n%s", err, jsonContent, response) + } // 解析JSON var decisions []Decision @@ -459,15 +525,86 @@ func extractDecisions(response string) ([]Decision, error) { return decisions, nil } -// fixMissingQuotes 替换中文引号为英文引号(避免输入法自动转换) +// fixMissingQuotes 替换中文引号和全角字符为英文引号和半角字符(避免AI输出全角JSON字符导致解析失败) func fixMissingQuotes(jsonStr string) string { + // 替换中文引号 jsonStr = strings.ReplaceAll(jsonStr, "\u201c", "\"") // " jsonStr = strings.ReplaceAll(jsonStr, "\u201d", "\"") // " jsonStr = strings.ReplaceAll(jsonStr, "\u2018", "'") // ' jsonStr = strings.ReplaceAll(jsonStr, "\u2019", "'") // ' + + // ⚠️ 替换全角括号、冒号、逗号(防止AI输出全角JSON字符) + jsonStr = strings.ReplaceAll(jsonStr, "[", "[") // U+FF3B 全角左方括号 + jsonStr = strings.ReplaceAll(jsonStr, "]", "]") // U+FF3D 全角右方括号 + jsonStr = strings.ReplaceAll(jsonStr, "{", "{") // U+FF5B 全角左花括号 + jsonStr = strings.ReplaceAll(jsonStr, "}", "}") // U+FF5D 全角右花括号 + jsonStr = strings.ReplaceAll(jsonStr, ":", ":") // U+FF1A 全角冒号 + jsonStr = strings.ReplaceAll(jsonStr, ",", ",") // U+FF0C 全角逗号 + + // ⚠️ 替换CJK标点符号(AI在中文上下文中也可能输出这些) + jsonStr = strings.ReplaceAll(jsonStr, "【", "[") // CJK左方头括号 U+3010 + jsonStr = strings.ReplaceAll(jsonStr, "】", "]") // CJK右方头括号 U+3011 + jsonStr = strings.ReplaceAll(jsonStr, "〔", "[") // CJK左龟壳括号 U+3014 + jsonStr = strings.ReplaceAll(jsonStr, "〕", "]") // CJK右龟壳括号 U+3015 + jsonStr = strings.ReplaceAll(jsonStr, "、", ",") // CJK顿号 U+3001 + + // ⚠️ 替换全角空格为半角空格(JSON中不应该有全角空格) + jsonStr = strings.ReplaceAll(jsonStr, " ", " ") // U+3000 全角空格 + return jsonStr } +// validateJSONFormat 验证 JSON 格式,检测常见错误 +func validateJSONFormat(jsonStr string) error { + trimmed := strings.TrimSpace(jsonStr) + + // 允许 [ 和 { 之间存在任意空白(含零宽) + if !reArrayHead.MatchString(trimmed) { + // 检查是否是纯数字/范围数组(常见错误) + if strings.HasPrefix(trimmed, "[") && !strings.Contains(trimmed[:min(20, len(trimmed))], "{") { + return fmt.Errorf("不是有效的决策数组(必须包含对象 {}),实际内容: %s", trimmed[:min(50, len(trimmed))]) + } + return fmt.Errorf("JSON 必须以 [{ 开头(允许空白),实际: %s", trimmed[:min(20, len(trimmed))]) + } + + // 检查是否包含范围符号 ~(LLM 常见错误) + if strings.Contains(jsonStr, "~") { + return fmt.Errorf("JSON 中不可包含范围符号 ~,所有数字必须是精确的单一值") + } + + // 检查是否包含千位分隔符(如 98,000) + // 使用简单的模式匹配:数字+逗号+3位数字 + for i := 0; i < len(jsonStr)-4; i++ { + if jsonStr[i] >= '0' && jsonStr[i] <= '9' && + jsonStr[i+1] == ',' && + jsonStr[i+2] >= '0' && jsonStr[i+2] <= '9' && + jsonStr[i+3] >= '0' && jsonStr[i+3] <= '9' && + jsonStr[i+4] >= '0' && jsonStr[i+4] <= '9' { + return fmt.Errorf("JSON 数字不可包含千位分隔符逗号,发现: %s", jsonStr[i:min(i+10, len(jsonStr))]) + } + } + + return nil +} + +// min 返回两个整数中的较小值 +func min(a, b int) int { + if a < b { + return a + } + return b +} + +// removeInvisibleRunes 去除零宽字符和 BOM,避免肉眼看不见的前缀破坏校验 +func removeInvisibleRunes(s string) string { + return reInvisibleRunes.ReplaceAllString(s, "") +} + +// compactArrayOpen 规整开头的 "[ {" → "[{" +func compactArrayOpen(s string) string { + return reArrayOpenSpace.ReplaceAllString(strings.TrimSpace(s), "[{") +} + // validateDecisions 验证所有决策(需要账户信息和杠杆配置) func validateDecisions(decisions []Decision, accountEquity float64, btcEthLeverage, altcoinLeverage int) error { for i, decision := range decisions { @@ -504,12 +641,15 @@ func findMatchingBracket(s string, start int) int { func validateDecision(d *Decision, accountEquity float64, btcEthLeverage, altcoinLeverage int) error { // 验证action validActions := map[string]bool{ - "open_long": true, - "open_short": true, - "close_long": true, - "close_short": true, - "hold": true, - "wait": true, + "open_long": true, + "open_short": true, + "close_long": true, + "close_short": true, + "update_stop_loss": true, + "update_take_profit": true, + "partial_close": true, + "hold": true, + "wait": true, } if !validActions[d.Action] { @@ -532,6 +672,22 @@ func validateDecision(d *Decision, accountEquity float64, btcEthLeverage, altcoi if d.PositionSizeUSD <= 0 { return fmt.Errorf("仓位大小必须大于0: %.2f", d.PositionSizeUSD) } + + // ✅ 验证最小开仓金额(防止数量格式化为 0 的错误) + // Binance 最小名义价值 10 USDT + 安全边际 + const minPositionSizeGeneral = 12.0 // 10 + 20% 安全边际 + const minPositionSizeBTCETH = 60.0 // BTC/ETH 因价格高和精度限制需要更大金额(更灵活) + + if d.Symbol == "BTCUSDT" || d.Symbol == "ETHUSDT" { + if d.PositionSizeUSD < minPositionSizeBTCETH { + return fmt.Errorf("%s 开仓金额过小(%.2f USDT),必须≥%.2f USDT(因价格高且精度限制,避免数量四舍五入为0)", d.Symbol, d.PositionSizeUSD, minPositionSizeBTCETH) + } + } else { + if d.PositionSizeUSD < minPositionSizeGeneral { + return fmt.Errorf("开仓金额过小(%.2f USDT),必须≥%.2f USDT(Binance 最小名义价值要求)", d.PositionSizeUSD, minPositionSizeGeneral) + } + } + // 验证仓位价值上限(加1%容差以避免浮点数精度问题) tolerance := maxPositionValue * 0.01 // 1%容差 if d.PositionSizeUSD > maxPositionValue+tolerance { @@ -589,5 +745,26 @@ func validateDecision(d *Decision, accountEquity float64, btcEthLeverage, altcoi } } + // 动态调整止损验证 + if d.Action == "update_stop_loss" { + if d.NewStopLoss <= 0 { + return fmt.Errorf("新止损价格必须大于0: %.2f", d.NewStopLoss) + } + } + + // 动态调整止盈验证 + if d.Action == "update_take_profit" { + if d.NewTakeProfit <= 0 { + return fmt.Errorf("新止盈价格必须大于0: %.2f", d.NewTakeProfit) + } + } + + // 部分平仓验证 + if d.Action == "partial_close" { + if d.ClosePercentage <= 0 || d.ClosePercentage > 100 { + return fmt.Errorf("平仓百分比必须在0-100之间: %.1f", d.ClosePercentage) + } + } + return nil } diff --git a/docker-compose.yml b/docker-compose.yml index 6a60bf54..31d5a474 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -56,6 +56,7 @@ services: - /etc/localtime:/etc/localtime:ro # Sync host time environment: - TZ=${NOFX_TIMEZONE:-Asia/Shanghai} # Set timezone + - AI_MAX_TOKENS=4000 # AI响应的最大token数(默认2000,建议4000-8000) - POSTGRES_HOST=postgres - POSTGRES_PORT=5432 - POSTGRES_DB=${POSTGRES_DB:-nofx} diff --git a/docker/Dockerfile.backend b/docker/Dockerfile.backend index 1145d501..7bd02348 100644 --- a/docker/Dockerfile.backend +++ b/docker/Dockerfile.backend @@ -47,7 +47,9 @@ COPY go.mod go.sum ./ RUN go mod download COPY . . -RUN CGO_ENABLED=1 GOOS=linux CGO_CFLAGS="-D_LARGEFILE64_SOURCE" go build -trimpath -ldflags="-s -w" -o nofx . +RUN CGO_ENABLED=1 GOOS=linux \ + CGO_CFLAGS="-D_LARGEFILE64_SOURCE" \ + go build -trimpath -ldflags="-s -w" -o nofx . # ────────────────────────────────────────────────────────────── # Runtime Stage (Minimal Executable Environment) diff --git a/docs/community/bounty-guide.md b/docs/community/bounty-guide.md index a6b841d2..326ab726 100644 --- a/docs/community/bounty-guide.md +++ b/docs/community/bounty-guide.md @@ -197,7 +197,7 @@ Details: [详情链接] ### 法律 & 合规 - ✅ 明确说明这是开源贡献,不是雇佣关系 -- ✅ 确保贡献者同意 MIT License +- ✅ 确保贡献者同意 AGPL-3.0 License - ✅ 保留最终合并决定权 ### 资金管理 diff --git a/docs/getting-started/README.md b/docs/getting-started/README.md index c35926f9..9e1740f7 100644 --- a/docs/getting-started/README.md +++ b/docs/getting-started/README.md @@ -23,7 +23,7 @@ Choose the method that best fits your needs: **Quick Start:** ```bash -cp config.example.jsonc config.json +cp config.json.example config.json ./start.sh start --build ``` diff --git a/docs/getting-started/README.zh-CN.md b/docs/getting-started/README.zh-CN.md index aafe5cfb..836619f6 100644 --- a/docs/getting-started/README.zh-CN.md +++ b/docs/getting-started/README.zh-CN.md @@ -21,7 +21,7 @@ **快速开始:** ```bash -cp config.example.jsonc config.json +cp config.json.example config.json ./start.sh start --build ``` diff --git a/docs/getting-started/docker-deploy.en.md b/docs/getting-started/docker-deploy.en.md index bd909273..7cb4e3d2 100644 --- a/docs/getting-started/docker-deploy.en.md +++ b/docs/getting-started/docker-deploy.en.md @@ -50,7 +50,7 @@ docker compose --version # Docker 24+ includes this, no separate installation n ```bash # Copy configuration template -cp config.example.jsonc config.json +cp config.json.example config.json # Edit configuration file with your API keys nano config.json # or use any other editor @@ -267,7 +267,7 @@ kill -9 # ~~ls -la config.json~~ # ~~If not exists, copy template~~ -# ~~cp config.example.jsonc config.json~~ +# ~~cp config.json.example config.json~~ *Note: Now using SQLite database for configuration storage, no longer need config.json* ``` diff --git a/docs/getting-started/docker-deploy.zh-CN.md b/docs/getting-started/docker-deploy.zh-CN.md index 49667356..0840ea50 100644 --- a/docs/getting-started/docker-deploy.zh-CN.md +++ b/docs/getting-started/docker-deploy.zh-CN.md @@ -55,7 +55,7 @@ docker compose --version # Docker 24+ 自带,无需单独安装 ```bash # 复制配置文件模板 -cp config.example.jsonc config.json +cp config.json.example config.json # 编辑配置文件,填入你的 API 密钥 nano config.json # 或使用其他编辑器 @@ -270,7 +270,7 @@ kill -9 ls -la config.json # 如果不存在,复制模板 -cp config.example.jsonc config.json +cp config.json.example config.json ``` ### 健康检查失败 diff --git a/docs/i18n/ru/README.md b/docs/i18n/ru/README.md index bcc79622..816e0823 100644 --- a/docs/i18n/ru/README.md +++ b/docs/i18n/ru/README.md @@ -3,7 +3,7 @@ [![Go Version](https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go)](https://golang.org/) [![React](https://img.shields.io/badge/React-18+-61DAFB?style=flat&logo=react)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat&logo=typescript)](https://www.typescriptlang.org/) -[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) +[![License](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE) [![Backed by Amber.ac](https://img.shields.io/badge/Backed%20by-Amber.ac-orange.svg)](https://amber.ac) **Языки / Languages:** [English](../../../README.md) | [中文](../zh-CN/README.md) | [Українська](../uk/README.md) | [Русский](../ru/README.md) @@ -285,7 +285,7 @@ Docker автоматически обрабатывает все зависим #### Шаг 1: Подготовьте конфигурацию ```bash # Скопируйте шаблон конфигурации -cp config.example.jsonc config.json +cp config.json.example config.json # Отредактируйте и заполните ваши API ключи nano config.json # или используйте любой редактор @@ -320,6 +320,7 @@ docker compose up -d --build - **Русский**: См. документацию Docker (скоро будет доступно) - **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) - **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) +- **日本語**: [DOCKER_DEPLOY.ja.md](DOCKER_DEPLOY.ja.md)を参照 --- @@ -423,7 +424,7 @@ cd .. **Шаг 1**: Скопируйте и переименуйте файл примера конфигурации ```bash -cp config.example.jsonc config.json +cp config.json.example config.json ``` **Шаг 2**: Отредактируйте `config.json` и заполните ваши API ключи diff --git a/docs/i18n/uk/README.md b/docs/i18n/uk/README.md index 78bddc72..300ca470 100644 --- a/docs/i18n/uk/README.md +++ b/docs/i18n/uk/README.md @@ -3,7 +3,7 @@ [![Go Version](https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go)](https://golang.org/) [![React](https://img.shields.io/badge/React-18+-61DAFB?style=flat&logo=react)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat&logo=typescript)](https://www.typescriptlang.org/) -[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) +[![License](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE) [![Backed by Amber.ac](https://img.shields.io/badge/Backed%20by-Amber.ac-orange.svg)](https://amber.ac) **Мови / Languages:** [English](../../../README.md) | [中文](../zh-CN/README.md) | [Українська](../uk/README.md) | [Русский](../ru/README.md) @@ -288,7 +288,7 @@ Docker автоматично обробляє всі залежності (Go, #### Крок 1: Підготуйте конфігурацію ```bash # Скопіюйте шаблон конфігурації -cp config.example.jsonc config.json +cp config.json.example config.json # Відредагуйте та заповніть ваші API ключі nano config.json # або використайте будь-який редактор @@ -323,6 +323,7 @@ docker compose up -d --build - **Українська**: Дивіться документацію Docker (скоро буде доступно) - **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) - **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) +- **日本語**: [DOCKER_DEPLOY.ja.md](DOCKER_DEPLOY.ja.md)を参照 --- @@ -426,7 +427,7 @@ cd .. **Крок 1**: Скопіюйте та перейменуйте файл прикладу конфігурації ```bash -cp config.example.jsonc config.json +cp config.json.example config.json ``` **Крок 2**: Відредагуйте `config.json` та заповніть ваші API ключі diff --git a/docs/i18n/zh-CN/README.md b/docs/i18n/zh-CN/README.md index 5bfd283c..d61236fe 100644 --- a/docs/i18n/zh-CN/README.md +++ b/docs/i18n/zh-CN/README.md @@ -3,7 +3,7 @@ [![Go Version](https://img.shields.io/badge/Go-1.21+-00ADD8?style=flat&logo=go)](https://golang.org/) [![React](https://img.shields.io/badge/React-18+-61DAFB?style=flat&logo=react)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-3178C6?style=flat&logo=typescript)](https://www.typescriptlang.org/) -[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) +[![License](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE) [![Backed by Amber.ac](https://img.shields.io/badge/Backed%20by-Amber.ac-orange.svg)](https://amber.ac) **语言 / Languages:** [English](../../../README.md) | [中文](../zh-CN/README.md) | [Українська](../uk/README.md) | [Русский](../ru/README.md) @@ -283,7 +283,7 @@ Docker会自动处理所有依赖(Go、Node.js、TA-Lib)和环境配置, #### 步骤1:准备配置文件 ```bash # 复制配置文件模板 -cp config.example.jsonc config.json +cp config.json.example config.json # 编辑并填入你的API密钥 nano config.json # 或使用其他编辑器 @@ -319,6 +319,7 @@ docker compose up -d --build **📖 详细的Docker部署教程、故障排查和高级配置:** - **中文**: 查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md) - **English**: See [DOCKER_DEPLOY.en.md](DOCKER_DEPLOY.en.md) +- **日本語**: [DOCKER_DEPLOY.ja.md](DOCKER_DEPLOY.ja.md)を参照 --- @@ -422,7 +423,7 @@ cd .. ~~**步骤1**:复制并重命名示例配置文件~~ ```bash -cp config.example.jsonc config.json +cp config.json.example config.json ``` ~~**步骤2**:编辑`config.json`填入您的API密钥~~ @@ -1262,7 +1263,15 @@ sudo apt-get install libta-lib0-dev ## 📄 开源协议 -MIT License - 详见 [LICENSE](LICENSE) 文件 +本项目采用 **GNU Affero 通用公共许可证 v3.0 (AGPL-3.0)** - 详见 [LICENSE](LICENSE) 文件 + +**这意味着什么:** +- ✅ 你可以使用、修改和分发此软件 +- ✅ 你必须公开你修改版本的源代码 +- ✅ 如果你在服务器上运行修改版本,必须向用户提供源代码 +- ✅ 所有衍生作品也必须使用 AGPL-3.0 许可证 + +如需商业许可或有疑问,请联系维护者。 --- diff --git a/go.mod b/go.mod index a9dcea75..9b0f63e9 100644 --- a/go.mod +++ b/go.mod @@ -6,14 +6,17 @@ require ( github.com/adshao/go-binance/v2 v2.8.7 github.com/ethereum/go-ethereum v1.16.5 github.com/gin-gonic/gin v1.11.0 + github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/golang-jwt/jwt/v5 v5.2.0 github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 github.com/lib/pq v1.10.9 github.com/mattn/go-sqlite3 v1.14.32 github.com/pquerna/otp v1.4.0 + github.com/sirupsen/logrus v1.9.3 github.com/sonirico/go-hyperliquid v0.17.0 golang.org/x/crypto v0.42.0 + modernc.org/sqlite v1.40.0 ) require ( @@ -28,6 +31,7 @@ require ( github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect github.com/elastic/go-sysinfo v1.15.4 // indirect github.com/elastic/go-windows v1.0.2 // indirect github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect @@ -51,11 +55,13 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/ncruces/go-strftime v0.1.9 // indirect github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/procfs v0.17.0 // indirect github.com/quic-go/qpack v0.5.1 // indirect github.com/quic-go/quic-go v0.54.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rs/zerolog v1.34.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sonirico/vago v0.9.0 // indirect @@ -71,6 +77,7 @@ require ( go.elastic.co/fastjson v1.5.1 // indirect go.uber.org/mock v0.5.0 // indirect golang.org/x/arch v0.20.0 // indirect + golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b // indirect golang.org/x/mod v0.27.0 // indirect golang.org/x/net v0.43.0 // indirect golang.org/x/sync v0.17.0 // indirect @@ -79,4 +86,7 @@ require ( golang.org/x/tools v0.36.0 // indirect google.golang.org/protobuf v1.36.9 // indirect howett.net/plist v1.0.1 // indirect + modernc.org/libc v1.66.10 // indirect + modernc.org/mathutil v1.7.1 // indirect + modernc.org/memory v1.11.0 // indirect ) diff --git a/go.sum b/go.sum index 18fb8d77..2494cec0 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,8 @@ github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elastic/go-sysinfo v1.15.4 h1:A3zQcunCxik14MgXu39cXFXcIw2sFXZ0zL886eyiv1Q= github.com/elastic/go-sysinfo v1.15.4/go.mod h1:ZBVXmqS368dOn/jvijV/zHLfakWTYHBZPk3G244lHrU= github.com/elastic/go-windows v1.0.2 h1:yoLLsAsV5cfg9FLhZ9EXZ2n2sQFKeDYrHenkcivY4vI= @@ -62,6 +64,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= +github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= @@ -80,6 +84,8 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= +github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= @@ -130,6 +136,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OH github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= @@ -146,6 +154,8 @@ github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -157,6 +167,8 @@ github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1 github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sonirico/go-hyperliquid v0.17.0 h1:eXYACWupwu41O1VtKw17dqe9oOLQ1A2nRElGhg5Ox+4= github.com/sonirico/go-hyperliquid v0.17.0/go.mod h1:sH51Vsu+tPUwc95TL2MoQ8YXSewLWBEJirgzo7sZx6w= github.com/sonirico/vago v0.9.0 h1:DF2OWW2Aaf1xPZmnFv79kBrHmjKX3mVvMbP08vERlKo= @@ -169,6 +181,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= @@ -202,12 +215,15 @@ golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI= golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -230,3 +246,29 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +modernc.org/cc/v4 v4.26.5 h1:xM3bX7Mve6G8K8b+T11ReenJOT+BmVqQj0FY5T4+5Y4= +modernc.org/cc/v4 v4.26.5/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/ccgo/v4 v4.28.1 h1:wPKYn5EC/mYTqBO373jKjvX2n+3+aK7+sICCv4Fjy1A= +modernc.org/ccgo/v4 v4.28.1/go.mod h1:uD+4RnfrVgE6ec9NGguUNdhqzNIeeomeXf6CL0GTE5Q= +modernc.org/fileutil v1.3.40 h1:ZGMswMNc9JOCrcrakF1HrvmergNLAmxOPjizirpfqBA= +modernc.org/fileutil v1.3.40/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= +modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= +modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= +modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks= +modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI= +modernc.org/libc v1.66.10 h1:yZkb3YeLx4oynyR+iUsXsybsX4Ubx7MQlSYEw4yj59A= +modernc.org/libc v1.66.10/go.mod h1:8vGSEwvoUoltr4dlywvHqjtAqHBaw0j1jI7iFBTAr2I= +modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= +modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= +modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= +modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= +modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= +modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= +modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= +modernc.org/sqlite v1.40.0 h1:bNWEDlYhNPAUdUdBzjAvn8icAs/2gaKlj4vM+tQ6KdQ= +modernc.org/sqlite v1.40.0/go.mod h1:9fjQZ0mB1LLP0GYrp39oOJXx/I2sxEnZtzCmEQIKvGE= +modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= +modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/logger/config.go b/logger/config.go new file mode 100644 index 00000000..32774558 --- /dev/null +++ b/logger/config.go @@ -0,0 +1,64 @@ +package logger + +import ( + "github.com/sirupsen/logrus" +) + +// Config 日志配置(简化版) +type Config struct { + Level string `json:"level"` // 日志级别: debug, info, warn, error (默认: info) + Telegram *TelegramConfig `json:"telegram"` // Telegram推送配置(可选) +} + +// TelegramConfig Telegram推送配置(简化版,高级参数使用默认值) +type TelegramConfig struct { + Enabled bool `json:"enabled"` // 是否启用(默认: false) + BotToken string `json:"bot_token"` // Bot Token + ChatID int64 `json:"chat_id"` // Chat ID + MinLevel string `json:"min_level"` // 最低日志级别,该级别及以上的日志会推送到Telegram(可选,默认: error) +} + +// SetDefaults 设置默认值 +func (c *Config) SetDefaults() { + if c.Level == "" { + c.Level = "info" + } +} + +// GetLogrusLevels 返回要推送到Telegram的日志级别 +// 根据配置的MinLevel返回该级别及以上的所有日志级别 +// 如果未配置或配置无效,默认返回error, fatal, panic(向后兼容) +func (tc *TelegramConfig) GetLogrusLevels() []logrus.Level { + // 如果未配置,使用默认值error(向后兼容) + minLevelStr := tc.MinLevel + if minLevelStr == "" { + minLevelStr = "error" + } + + // 解析配置的日志级别 + minLevel, err := logrus.ParseLevel(minLevelStr) + if err != nil { + // 如果解析失败,使用默认值error(向后兼容) + minLevel = logrus.ErrorLevel + } + + // 定义所有日志级别(从高到低:panic, fatal, error, warn, info, debug) + allLevels := []logrus.Level{ + logrus.PanicLevel, + logrus.FatalLevel, + logrus.ErrorLevel, + logrus.WarnLevel, + logrus.InfoLevel, + logrus.DebugLevel, + } + + // 返回所有大于等于minLevel的日志级别 + var result []logrus.Level + for _, level := range allLevels { + if level <= minLevel { + result = append(result, level) + } + } + + return result +} diff --git a/logger/config.telegram.json b/logger/config.telegram.json new file mode 100644 index 00000000..197c0802 --- /dev/null +++ b/logger/config.telegram.json @@ -0,0 +1,33 @@ +{ + "traders": [ + { + "id": "trader1", + "name": "AI Trader 1", + "enabled": true, + "ai_model": "deepseek", + "exchange": "binance", + "binance_api_key": "your_api_key", + "binance_secret_key": "your_secret_key", + "deepseek_key": "your_deepseek_key", + "initial_balance": 1000, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "default_coins": ["BTCUSDT", "ETHUSDT", "SOLUSDT"], + "api_server_port": 8080, + "leverage": { + "btc_eth_leverage": 5, + "altcoin_leverage": 5 + }, + "log": { + "level": "info", + "telegram": { + "enabled": true, + "bot_token": "79472419:feafe231414", + "chat_id": -100323252626, + "min_level": "error" + } + }, + "_comment": "日志配置说明:level 可选值为 debug/info/warn/error,默认 info。telegram 部分作为可选配置, Telegram 推送默认为 error/fatal/panic 级别,min_level 如果设置为warn,则推送warn级别及以上的日志" +} diff --git a/logger/decision_logger.go b/logger/decision_logger.go index efa5ab74..c9630508 100644 --- a/logger/decision_logger.go +++ b/logger/decision_logger.go @@ -50,9 +50,9 @@ type PositionSnapshot struct { // DecisionAction 决策动作 type DecisionAction struct { - Action string `json:"action"` // open_long, open_short, close_long, close_short + Action string `json:"action"` // open_long, open_short, close_long, close_short, update_stop_loss, update_take_profit, partial_close Symbol string `json:"symbol"` // 币种 - Quantity float64 `json:"quantity"` // 数量 + Quantity float64 `json:"quantity"` // 数量(部分平仓时使用) Leverage int `json:"leverage"` // 杠杆(开仓时) Price float64 `json:"price"` // 执行价格 OrderID int64 `json:"order_id"` // 订单ID @@ -243,8 +243,11 @@ func (l *DecisionLogger) GetStatistics() (*Statistics, error) { switch action.Action { case "open_long", "open_short": stats.TotalOpenPositions++ - case "close_long", "close_short": + case "close_long", "close_short", "auto_close_long", "auto_close_short": stats.TotalClosePositions++ + // 🔧 BUG FIX:partial_close 不計入 TotalClosePositions,避免重複計數 + // case "partial_close": // 不計數,因為只有完全平倉才算一次 + // update_stop_loss 和 update_take_profit 不計入統計 } } } @@ -348,11 +351,22 @@ func (l *DecisionLogger) AnalyzePerformance(lookbackCycles int) (*PerformanceAna symbol := action.Symbol side := "" - if action.Action == "open_long" || action.Action == "close_long" { + if action.Action == "open_long" || action.Action == "close_long" || action.Action == "partial_close" || action.Action == "auto_close_long" { side = "long" - } else if action.Action == "open_short" || action.Action == "close_short" { + } else if action.Action == "open_short" || action.Action == "close_short" || action.Action == "auto_close_short" { side = "short" } + + // partial_close 需要根據持倉判斷方向 + if action.Action == "partial_close" && side == "" { + for key, pos := range openPositions { + if posSymbol, _ := pos["side"].(string); key == symbol+"_"+posSymbol { + side = posSymbol + break + } + } + } + posKey := symbol + "_" + side switch action.Action { @@ -365,9 +379,10 @@ func (l *DecisionLogger) AnalyzePerformance(lookbackCycles int) (*PerformanceAna "quantity": action.Quantity, "leverage": action.Leverage, } - case "close_long", "close_short": + case "close_long", "close_short", "auto_close_long", "auto_close_short": // 移除已平仓记录 delete(openPositions, posKey) + // partial_close 不處理,保留持倉記錄 } } } @@ -382,25 +397,41 @@ func (l *DecisionLogger) AnalyzePerformance(lookbackCycles int) (*PerformanceAna symbol := action.Symbol side := "" - if action.Action == "open_long" || action.Action == "close_long" { + if action.Action == "open_long" || action.Action == "close_long" || action.Action == "partial_close" || action.Action == "auto_close_long" { side = "long" - } else if action.Action == "open_short" || action.Action == "close_short" { + } else if action.Action == "open_short" || action.Action == "close_short" || action.Action == "auto_close_short" { side = "short" } + + // partial_close 需要根據持倉判斷方向 + if action.Action == "partial_close" { + // 從 openPositions 中查找持倉方向 + for key, pos := range openPositions { + if posSymbol, _ := pos["side"].(string); key == symbol+"_"+posSymbol { + side = posSymbol + break + } + } + } + posKey := symbol + "_" + side // 使用symbol_side作为key,区分多空持仓 switch action.Action { case "open_long", "open_short": // 更新开仓记录(可能已经在预填充时记录过了) openPositions[posKey] = map[string]interface{}{ - "side": side, - "openPrice": action.Price, - "openTime": action.Timestamp, - "quantity": action.Quantity, - "leverage": action.Leverage, + "side": side, + "openPrice": action.Price, + "openTime": action.Timestamp, + "quantity": action.Quantity, + "leverage": action.Leverage, + "remainingQuantity": action.Quantity, // 🔧 BUG FIX:追蹤剩餘數量 + "accumulatedPnL": 0.0, // 🔧 BUG FIX:累積部分平倉盈虧 + "partialCloseCount": 0, // 🔧 BUG FIX:部分平倉次數 + "partialCloseVolume": 0.0, // 🔧 BUG FIX:部分平倉總量 } - case "close_long", "close_short": + case "close_long", "close_short", "partial_close", "auto_close_long", "auto_close_short": // 查找对应的开仓记录(可能来自预填充或当前窗口) if openPos, exists := openPositions[posKey]; exists { openPrice := openPos["openPrice"].(float64) @@ -409,71 +440,159 @@ func (l *DecisionLogger) AnalyzePerformance(lookbackCycles int) (*PerformanceAna quantity := openPos["quantity"].(float64) leverage := openPos["leverage"].(int) - // 计算实际盈亏(USDT) - // 合约交易 PnL 计算:quantity × 价格差 - // 注意:杠杆不影响绝对盈亏,只影响保证金需求 + // 🔧 BUG FIX:取得追蹤字段(若不存在則初始化) + remainingQty, _ := openPos["remainingQuantity"].(float64) + if remainingQty == 0 { + remainingQty = quantity // 兼容舊數據(沒有 remainingQuantity 字段) + } + accumulatedPnL, _ := openPos["accumulatedPnL"].(float64) + partialCloseCount, _ := openPos["partialCloseCount"].(int) + partialCloseVolume, _ := openPos["partialCloseVolume"].(float64) + + // 对于 partial_close,使用实际平仓数量;否则使用剩余仓位数量 + actualQuantity := remainingQty + if action.Action == "partial_close" { + actualQuantity = action.Quantity + } + + // 计算本次平仓的盈亏(USDT) var pnl float64 if side == "long" { - pnl = quantity * (action.Price - openPrice) + pnl = actualQuantity * (action.Price - openPrice) } else { - pnl = quantity * (openPrice - action.Price) + pnl = actualQuantity * (openPrice - action.Price) } - // 计算盈亏百分比(相对保证金) - positionValue := quantity * openPrice - marginUsed := positionValue / float64(leverage) - pnlPct := 0.0 - if marginUsed > 0 { - pnlPct = (pnl / marginUsed) * 100 - } + // 🔧 BUG FIX:處理 partial_close 聚合邏輯 + if action.Action == "partial_close" { + // 累積盈虧和數量 + accumulatedPnL += pnl + remainingQty -= actualQuantity + partialCloseCount++ + partialCloseVolume += actualQuantity - // 记录交易结果 - outcome := TradeOutcome{ - Symbol: symbol, - Side: side, - Quantity: quantity, - Leverage: leverage, - OpenPrice: openPrice, - ClosePrice: action.Price, - PositionValue: positionValue, - MarginUsed: marginUsed, - PnL: pnl, - PnLPct: pnlPct, - Duration: action.Timestamp.Sub(openTime).String(), - OpenTime: openTime, - CloseTime: action.Timestamp, - } + // 更新 openPositions(保留持倉記錄,但更新追蹤數據) + openPos["remainingQuantity"] = remainingQty + openPos["accumulatedPnL"] = accumulatedPnL + openPos["partialCloseCount"] = partialCloseCount + openPos["partialCloseVolume"] = partialCloseVolume - analysis.RecentTrades = append(analysis.RecentTrades, outcome) - analysis.TotalTrades++ + // 判斷是否已完全平倉 + if remainingQty <= 0.0001 { // 使用小閾值避免浮點誤差 + // ✅ 完全平倉:記錄為一筆完整交易 + positionValue := quantity * openPrice + marginUsed := positionValue / float64(leverage) + pnlPct := 0.0 + if marginUsed > 0 { + pnlPct = (accumulatedPnL / marginUsed) * 100 + } - // 分类交易:盈利、亏损、持平(避免将pnl=0算入亏损) - if pnl > 0 { - analysis.WinningTrades++ - analysis.AvgWin += pnl - } else if pnl < 0 { - analysis.LosingTrades++ - analysis.AvgLoss += pnl - } - // pnl == 0 的交易不计入盈利也不计入亏损,但计入总交易数 + outcome := TradeOutcome{ + Symbol: symbol, + Side: side, + Quantity: quantity, // 使用原始總量 + Leverage: leverage, + OpenPrice: openPrice, + ClosePrice: action.Price, // 最後一次平倉價格 + PositionValue: positionValue, + MarginUsed: marginUsed, + PnL: accumulatedPnL, // 🔧 使用累積盈虧 + PnLPct: pnlPct, + Duration: action.Timestamp.Sub(openTime).String(), + OpenTime: openTime, + CloseTime: action.Timestamp, + } - // 更新币种统计 - if _, exists := analysis.SymbolStats[symbol]; !exists { - analysis.SymbolStats[symbol] = &SymbolPerformance{ - Symbol: symbol, + analysis.RecentTrades = append(analysis.RecentTrades, outcome) + analysis.TotalTrades++ // 🔧 只在完全平倉時計數 + + // 分类交易 + if accumulatedPnL > 0 { + analysis.WinningTrades++ + analysis.AvgWin += accumulatedPnL + } else if accumulatedPnL < 0 { + analysis.LosingTrades++ + analysis.AvgLoss += accumulatedPnL + } + + // 更新币种统计 + if _, exists := analysis.SymbolStats[symbol]; !exists { + analysis.SymbolStats[symbol] = &SymbolPerformance{ + Symbol: symbol, + } + } + stats := analysis.SymbolStats[symbol] + stats.TotalTrades++ + stats.TotalPnL += accumulatedPnL + if accumulatedPnL > 0 { + stats.WinningTrades++ + } else if accumulatedPnL < 0 { + stats.LosingTrades++ + } + + // 刪除持倉記錄 + delete(openPositions, posKey) } - } - stats := analysis.SymbolStats[symbol] - stats.TotalTrades++ - stats.TotalPnL += pnl - if pnl > 0 { - stats.WinningTrades++ - } else if pnl < 0 { - stats.LosingTrades++ - } + // ⚠️ 否則不做任何操作(等待後續 partial_close 或 full close) - // 移除已平仓记录 - delete(openPositions, posKey) + } else { + // 🔧 完全平倉(close_long/close_short/auto_close) + // 如果之前有部分平倉,需要加上累積的 PnL + totalPnL := accumulatedPnL + pnl + + positionValue := quantity * openPrice + marginUsed := positionValue / float64(leverage) + pnlPct := 0.0 + if marginUsed > 0 { + pnlPct = (totalPnL / marginUsed) * 100 + } + + outcome := TradeOutcome{ + Symbol: symbol, + Side: side, + Quantity: quantity, // 使用原始總量 + Leverage: leverage, + OpenPrice: openPrice, + ClosePrice: action.Price, + PositionValue: positionValue, + MarginUsed: marginUsed, + PnL: totalPnL, // 🔧 包含之前部分平倉的 PnL + PnLPct: pnlPct, + Duration: action.Timestamp.Sub(openTime).String(), + OpenTime: openTime, + CloseTime: action.Timestamp, + } + + analysis.RecentTrades = append(analysis.RecentTrades, outcome) + analysis.TotalTrades++ + + // 分类交易 + if totalPnL > 0 { + analysis.WinningTrades++ + analysis.AvgWin += totalPnL + } else if totalPnL < 0 { + analysis.LosingTrades++ + analysis.AvgLoss += totalPnL + } + + // 更新币种统计 + if _, exists := analysis.SymbolStats[symbol]; !exists { + analysis.SymbolStats[symbol] = &SymbolPerformance{ + Symbol: symbol, + } + } + stats := analysis.SymbolStats[symbol] + stats.TotalTrades++ + stats.TotalPnL += totalPnL + if totalPnL > 0 { + stats.WinningTrades++ + } else if totalPnL < 0 { + stats.LosingTrades++ + } + + // 刪除持倉記錄 + delete(openPositions, posKey) + } } } } diff --git a/logger/logger.go b/logger/logger.go new file mode 100644 index 00000000..527c46e2 --- /dev/null +++ b/logger/logger.go @@ -0,0 +1,210 @@ +package logger + +import ( + "nofx/config" + "os" + + "github.com/sirupsen/logrus" +) + +var ( + // Log 全局logger实例 + Log *logrus.Logger + + // telegramHook 保存hook引用,用于优雅关闭 + telegramHook *TelegramHook +) + +// ============================================================================ +// 初始化函数 +// ============================================================================ + +// Init 初始化全局logger +// 如果config为nil,使用默认配置(console输出,info级别) +func Init(cfg *Config) error { + Log = logrus.New() + + // 如果没有配置,使用默认值 + if cfg == nil { + cfg = &Config{Level: "info"} + } + + // 设置默认值 + cfg.SetDefaults() + + // 设置日志级别 + level, err := logrus.ParseLevel(cfg.Level) + if err != nil { + level = logrus.InfoLevel + } + Log.SetLevel(level) + + // 设置格式化器(固定使用彩色文本格式) + Log.SetFormatter(&logrus.TextFormatter{ + FullTimestamp: true, + TimestampFormat: "2006-01-02 15:04:05", + ForceColors: true, + }) + + // 设置输出目标(默认stdout) + Log.SetOutput(os.Stdout) + + // 启用调用位置信息 + Log.SetReportCaller(true) + + // 添加Telegram Hook(可选) + if cfg.Telegram != nil && cfg.Telegram.Enabled { + if err := setupTelegramHook(cfg.Telegram); err != nil { + Log.Warnf("初始化Telegram推送失败,将继续使用普通日志: %v", err) + } + } + + return nil +} + +// setupTelegramHook 设置Telegram Hook +func setupTelegramHook(telegramCfg *TelegramConfig) error { + hook, err := NewTelegramHook(telegramCfg) + if err != nil { + return err + } + + Log.AddHook(hook) + telegramHook = hook + Log.Info("✅ Telegram日志推送已启用") + return nil +} + +// InitWithSimpleConfig 使用简化配置初始化logger +// 适用于只需要基本功能的场景 +func InitWithSimpleConfig(level string) error { + return Init(&Config{Level: level}) +} + +// InitWithTelegram 使用Telegram配置初始化logger +func InitWithTelegram(botToken string, chatID int64) error { + return Init(&Config{ + Level: "info", + Telegram: &TelegramConfig{ + Enabled: true, + BotToken: botToken, + ChatID: chatID, + }, + }) +} + +// InitFromLogConfig 从config.LogConfig初始化logger +func InitFromLogConfig(logConfig *config.LogConfig) error { + if logConfig == nil { + return InitWithSimpleConfig("info") + } + + cfg := &Config{ + Level: logConfig.Level, + } + + if cfg.Level == "" { + cfg.Level = "info" + } + + // 如果启用了Telegram,添加配置 + if logConfig.Telegram != nil && logConfig.Telegram.Enabled { + if botToken := logConfig.Telegram.BotToken; botToken != "" && logConfig.Telegram.ChatID != 0 { + cfg.Telegram = &TelegramConfig{ + Enabled: true, + BotToken: botToken, + ChatID: logConfig.Telegram.ChatID, + MinLevel: logConfig.Telegram.MinLevel, + } + } + } + + return Init(cfg) +} + +// InitFromParams 从参数初始化logger +// 适用于不依赖config包的场景 +func InitFromParams(level string, telegramEnabled bool, botToken string, chatID int64) error { + cfg := &Config{Level: level} + + if telegramEnabled && botToken != "" && chatID != 0 { + cfg.Telegram = &TelegramConfig{ + Enabled: true, + BotToken: botToken, + ChatID: chatID, + } + } + + return Init(cfg) +} + +// Shutdown 优雅关闭logger(主要用于关闭Telegram发送器) +func Shutdown() { + if telegramHook != nil { + telegramHook.Stop() + telegramHook = nil + } +} + +// ============================================================================ +// 日志记录函数 +// ============================================================================ + +// WithFields 创建带字段的logger entry +func WithFields(fields logrus.Fields) *logrus.Entry { + return Log.WithFields(fields) +} + +// WithField 创建带单个字段的logger entry +func WithField(key string, value interface{}) *logrus.Entry { + return Log.WithField(key, value) +} + +// add debug, info, warn +func Debug(args ...interface{}) { + Log.Debug(args...) +} + +func Info(args ...interface{}) { + Log.Info(args...) +} + +func Warn(args ...interface{}) { + Log.Warn(args...) +} + +func Debugf(format string, args ...interface{}) { + Log.Debugf(format, args...) +} + +func Infof(format string, args ...interface{}) { + Log.Infof(format, args...) +} + +func Warnf(format string, args ...interface{}) { + Log.Warnf(format, args...) +} + +func Error(args ...interface{}) { + Log.Error(args...) +} + +func Errorf(format string, args ...interface{}) { + Log.Errorf(format, args...) +} + +func Fatal(args ...interface{}) { + Log.Fatal(args...) +} + +func Fatalf(format string, args ...interface{}) { + Log.Fatalf(format, args...) +} + +func Panic(args ...interface{}) { + Log.Panic(args...) +} + +func Panicf(format string, args ...interface{}) { + Log.Panicf(format, args...) +} diff --git a/logger/telegram_hook.go b/logger/telegram_hook.go new file mode 100644 index 00000000..e8477f47 --- /dev/null +++ b/logger/telegram_hook.go @@ -0,0 +1,158 @@ +package logger + +import ( + "fmt" + "runtime" + "strings" + + "github.com/sirupsen/logrus" +) + +// TelegramHook 实现logrus.Hook接口,将日志推送到Telegram +type TelegramHook struct { + sender *TelegramSender + levels []logrus.Level + enabled bool +} + +// NewTelegramHook 创建Telegram Hook +func NewTelegramHook(config *TelegramConfig) (*TelegramHook, error) { + if !config.Enabled { + return &TelegramHook{enabled: false}, nil + } + + if config.BotToken == "" || config.ChatID == 0 { + return nil, fmt.Errorf("telegram配置不完整: bot_token和chat_id不能为空") + } + + // 创建发送器(使用默认参数) + sender, err := NewTelegramSender(config.BotToken, config.ChatID) + if err != nil { + return nil, fmt.Errorf("创建telegram发送器失败: %w", err) + } + + hook := &TelegramHook{ + sender: sender, + levels: config.GetLogrusLevels(), + enabled: true, + } + + return hook, nil +} + +// Levels 返回需要触发的日志级别 +func (h *TelegramHook) Levels() []logrus.Level { + if !h.enabled { + return []logrus.Level{} + } + return h.levels +} + +// Fire 当日志触发时调用 +func (h *TelegramHook) Fire(entry *logrus.Entry) error { + if !h.enabled { + return nil + } + + // 格式化消息 + message := h.formatMessage(entry) + + // 异步发送(非阻塞) + h.sender.SendAsync(message) + + return nil +} + +// formatMessage 格式化日志消息为Telegram格式 +func (h *TelegramHook) formatMessage(entry *logrus.Entry) string { + // 级别emoji + levelEmoji := h.getLevelEmoji(entry.Level) + + // 基本信息 + var builder strings.Builder + builder.WriteString(fmt.Sprintf("%s *%s*: 系统日志警报\n", levelEmoji, strings.ToUpper(entry.Level.String()))) + builder.WriteString(fmt.Sprintf("📝 消息: `%s`\n", escapeMarkdown(entry.Message))) + + // 字段信息 + if len(entry.Data) > 0 { + builder.WriteString("📊 字段:\n") + for key, value := range entry.Data { + builder.WriteString(fmt.Sprintf(" • %s: `%v`\n", key, value)) + } + } + + // 调用位置 + if entry.HasCaller() { + file := entry.Caller.File + // 只保留相对路径 + if idx := strings.Index(file, "nofx/"); idx >= 0 { + file = file[idx:] + } + builder.WriteString(fmt.Sprintf("📍 位置: `%s:%d`\n", file, entry.Caller.Line)) + } else { + // 如果entry没有caller,手动获取 + if _, file, line, ok := runtime.Caller(8); ok { + if idx := strings.Index(file, "nofx/"); idx >= 0 { + file = file[idx:] + } + builder.WriteString(fmt.Sprintf("📍 位置: `%s:%d`\n", file, line)) + } + } + + // 时间戳 + builder.WriteString(fmt.Sprintf("🕐 时间: `%s`", entry.Time.Format("2006-01-02 15:04:05"))) + + return builder.String() +} + +// getLevelEmoji 获取日志级别对应的emoji +func (h *TelegramHook) getLevelEmoji(level logrus.Level) string { + switch level { + case logrus.PanicLevel: + return "🔴" + case logrus.FatalLevel: + return "🔴" + case logrus.ErrorLevel: + return "🟠" + case logrus.WarnLevel: + return "🟡" + case logrus.InfoLevel: + return "🟢" + case logrus.DebugLevel: + return "🔵" + default: + return "⚪" + } +} + +// escapeMarkdown 转义Markdown特殊字符 +func escapeMarkdown(text string) string { + replacer := strings.NewReplacer( + "_", "\\_", + "*", "\\*", + "[", "\\[", + "]", "\\]", + "(", "\\(", + ")", "\\)", + "~", "\\~", + "`", "\\`", + ">", "\\>", + "#", "\\#", + "+", "\\+", + "-", "\\-", + "=", "\\=", + "|", "\\|", + "{", "\\{", + "}", "\\}", + ".", "\\.", + "!", "\\!", + ) + return replacer.Replace(text) +} + +// Stop 停止Hook(优雅关闭) +func (h *TelegramHook) Stop() { + if h.enabled && h.sender != nil { + h.sender.Stop() + } +} diff --git a/logger/telegram_sender.go b/logger/telegram_sender.go new file mode 100644 index 00000000..8013dc18 --- /dev/null +++ b/logger/telegram_sender.go @@ -0,0 +1,120 @@ +package logger + +import ( + "fmt" + "sync" + "time" + + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" +) + +// TelegramSender Telegram消息发送器(异步) +type TelegramSender struct { + bot *tgbotapi.BotAPI + chatID int64 + msgChan chan string + retryCount int + retryInterval time.Duration + wg sync.WaitGroup + stopChan chan struct{} + once sync.Once +} + +// NewTelegramSender 创建Telegram发送器(使用默认参数) +func NewTelegramSender(botToken string, chatID int64) (*TelegramSender, error) { + bot, err := tgbotapi.NewBotAPI(botToken) + if err != nil { + return nil, fmt.Errorf("创建telegram bot失败: %w", err) + } + + // 设置为静默模式(不打印bot信息) + bot.Debug = false + + sender := &TelegramSender{ + bot: bot, + chatID: chatID, + msgChan: make(chan string, 20), // 固定缓冲区大小: 20 + retryCount: 3, // 固定重试次数: 3 + retryInterval: 3 * time.Second, // 固定重试间隔: 3秒 + stopChan: make(chan struct{}), + } + + // 启动异步发送协程 + sender.Start() + + return sender, nil +} + +// Start 启动异步发送协程 +func (s *TelegramSender) Start() { + s.wg.Add(1) + go s.listenAndSend() +} + +// SendAsync 异步发送消息(非阻塞) +func (s *TelegramSender) SendAsync(message string) { + select { + case s.msgChan <- message: + // 成功写入缓冲区 + default: + // 缓冲区满,丢弃消息(不阻塞主流程) + fmt.Printf("[Telegram] 消息缓冲区已满,消息被丢弃\n") + } +} + +// listenAndSend 监听channel并发送消息 +func (s *TelegramSender) listenAndSend() { + defer s.wg.Done() + + for { + select { + case msg := <-s.msgChan: + s.sendWithRetry(msg) + case <-s.stopChan: + // 清空缓冲区后退出 + for len(s.msgChan) > 0 { + msg := <-s.msgChan + s.sendWithRetry(msg) + } + return + } + } +} + +// sendWithRetry 发送消息(带重试) +func (s *TelegramSender) sendWithRetry(message string) { + var err error + for i := 0; i < s.retryCount; i++ { + err = s.send(message) + if err == nil { + return // 发送成功 + } + + // 重试前等待 + if i < s.retryCount-1 { + time.Sleep(s.retryInterval) + } + } + + // 所有重试都失败 + if err != nil { + fmt.Printf("[Telegram] 发送消息失败(已重试%d次): %v\n", s.retryCount, err) + } +} + +// send 发送单条消息 +func (s *TelegramSender) send(message string) error { + msg := tgbotapi.NewMessage(s.chatID, message) + msg.ParseMode = tgbotapi.ModeMarkdown + + _, err := s.bot.Send(msg) + return err +} + +// Stop 停止发送器(优雅关闭) +func (s *TelegramSender) Stop() { + s.once.Do(func() { + close(s.stopChan) + s.wg.Wait() + }) +} diff --git a/main.go b/main.go index 30c2abc9..40ad8136 100644 --- a/main.go +++ b/main.go @@ -25,54 +25,64 @@ type LeverageConfig struct { // ConfigFile 配置文件结构,只包含需要同步到数据库的字段 type ConfigFile struct { - AdminMode bool `json:"admin_mode"` - BetaMode bool `json:"beta_mode"` - APIServerPort int `json:"api_server_port"` - UseDefaultCoins bool `json:"use_default_coins"` - DefaultCoins []string `json:"default_coins"` - CoinPoolAPIURL string `json:"coin_pool_api_url"` - OITopAPIURL string `json:"oi_top_api_url"` - MaxDailyLoss float64 `json:"max_daily_loss"` - MaxDrawdown float64 `json:"max_drawdown"` - StopTradingMinutes int `json:"stop_trading_minutes"` - Leverage LeverageConfig `json:"leverage"` - JWTSecret string `json:"jwt_secret"` - DataKLineTime string `json:"data_k_line_time"` + AdminMode bool `json:"admin_mode"` + BetaMode bool `json:"beta_mode"` + APIServerPort int `json:"api_server_port"` + UseDefaultCoins bool `json:"use_default_coins"` + DefaultCoins []string `json:"default_coins"` + CoinPoolAPIURL string `json:"coin_pool_api_url"` + OITopAPIURL string `json:"oi_top_api_url"` + MaxDailyLoss float64 `json:"max_daily_loss"` + MaxDrawdown float64 `json:"max_drawdown"` + StopTradingMinutes int `json:"stop_trading_minutes"` + Leverage LeverageConfig `json:"leverage"` + JWTSecret string `json:"jwt_secret"` + DataKLineTime string `json:"data_k_line_time"` + Log *config.LogConfig `json:"log"` // 日志配置 } -// syncConfigToDatabase 从config.json读取配置并同步到数据库 -func syncConfigToDatabase(database config.DatabaseInterface) error { +// loadConfigFile 读取并解析config.json文件 +func loadConfigFile() (*ConfigFile, error) { // 检查config.json是否存在 if _, err := os.Stat("config.json"); os.IsNotExist(err) { - log.Printf("📄 config.json不存在,跳过同步") - return nil + log.Printf("📄 config.json不存在,使用默认配置") + return &ConfigFile{}, nil } // 读取config.json data, err := os.ReadFile("config.json") if err != nil { - return fmt.Errorf("读取config.json失败: %w", err) + return nil, fmt.Errorf("读取config.json失败: %w", err) } // 解析JSON var configFile ConfigFile if err := json.Unmarshal(data, &configFile); err != nil { - return fmt.Errorf("解析config.json失败: %w", err) + return nil, fmt.Errorf("解析config.json失败: %w", err) + } + + return &configFile, nil +} + +// syncConfigToDatabase 将配置同步到数据库 +func syncConfigToDatabase(database config.DatabaseInterface, configFile *ConfigFile) error { + if configFile == nil { + return nil } log.Printf("🔄 开始同步config.json到数据库...") // 同步各配置项到数据库 configs := map[string]string{ - "admin_mode": fmt.Sprintf("%t", configFile.AdminMode), - "beta_mode": fmt.Sprintf("%t", configFile.BetaMode), - "api_server_port": strconv.Itoa(configFile.APIServerPort), - "use_default_coins": fmt.Sprintf("%t", configFile.UseDefaultCoins), - "coin_pool_api_url": configFile.CoinPoolAPIURL, - "oi_top_api_url": configFile.OITopAPIURL, - "max_daily_loss": fmt.Sprintf("%.1f", configFile.MaxDailyLoss), - "max_drawdown": fmt.Sprintf("%.1f", configFile.MaxDrawdown), - "stop_trading_minutes": strconv.Itoa(configFile.StopTradingMinutes), + "admin_mode": fmt.Sprintf("%t", configFile.AdminMode), + "beta_mode": fmt.Sprintf("%t", configFile.BetaMode), + "api_server_port": strconv.Itoa(configFile.APIServerPort), + "use_default_coins": fmt.Sprintf("%t", configFile.UseDefaultCoins), + "coin_pool_api_url": configFile.CoinPoolAPIURL, + "oi_top_api_url": configFile.OITopAPIURL, + "max_daily_loss": fmt.Sprintf("%.1f", configFile.MaxDailyLoss), + "max_drawdown": fmt.Sprintf("%.1f", configFile.MaxDrawdown), + "stop_trading_minutes": strconv.Itoa(configFile.StopTradingMinutes), } // 同步default_coins(转换为JSON字符串存储) @@ -112,7 +122,7 @@ func syncConfigToDatabase(database config.DatabaseInterface) error { // loadBetaCodesToDatabase 加载内测码文件到数据库 func loadBetaCodesToDatabase(database config.DatabaseInterface) error { betaCodeFile := "beta_codes.txt" - + // 检查内测码文件是否存在 if _, err := os.Stat(betaCodeFile); os.IsNotExist(err) { log.Printf("📄 内测码文件 %s 不存在,跳过加载", betaCodeFile) @@ -126,7 +136,7 @@ func loadBetaCodesToDatabase(database config.DatabaseInterface) error { } log.Printf("🔄 发现内测码文件 %s (%.1f KB),开始加载...", betaCodeFile, float64(fileInfo.Size())/1024) - + // 加载内测码到数据库 err = database.LoadBetaCodesFromFile(betaCodeFile) if err != nil { @@ -156,6 +166,12 @@ func main() { dbPath = os.Args[1] } + // 读取配置文件 + configFile, err := loadConfigFile() + if err != nil { + log.Fatalf("❌ 读取config.json失败: %v", err) + } + log.Printf("📋 初始化配置数据库: %s", dbPath) database, err := config.NewDatabase(dbPath) if err != nil { @@ -164,7 +180,7 @@ func main() { defer database.Close() // 同步config.json到数据库 - if err := syncConfigToDatabase(database); err != nil { + if err := syncConfigToDatabase(database, configFile); err != nil { log.Printf("⚠️ 同步config.json到数据库失败: %v", err) } diff --git a/manager/trader_manager.go b/manager/trader_manager.go index 86c47db8..483421cb 100644 --- a/manager/trader_manager.go +++ b/manager/trader_manager.go @@ -23,9 +23,9 @@ type CompetitionCache struct { // TraderManager 管理多个trader实例 type TraderManager struct { - traders map[string]*trader.AutoTrader // key: trader ID + traders map[string]*trader.AutoTrader // key: trader ID competitionCache *CompetitionCache - mu sync.RWMutex + mu sync.RWMutex } // NewTraderManager 创建trader管理器 @@ -170,7 +170,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database config.DatabaseInterfa } // 添加到TraderManager - err = tm.addTraderFromDB(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, oiTopURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, defaultCoins) + err = tm.addTraderFromDB(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, oiTopURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, defaultCoins, database, traderCfg.UserID) if err != nil { log.Printf("❌ 添加交易员 %s 失败: %v", traderCfg.Name, err) continue @@ -182,7 +182,7 @@ func (tm *TraderManager) LoadTradersFromDatabase(database config.DatabaseInterfa } // addTraderFromConfig 内部方法:从配置添加交易员(不加锁,因为调用方已加锁) -func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL, oiTopURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int, defaultCoins []string) error { +func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL, oiTopURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int, defaultCoins []string, database config.DatabaseInterface, userID string) error { if _, exists := tm.traders[traderCfg.ID]; exists { return fmt.Errorf("trader ID '%s' 已存在", traderCfg.ID) } @@ -262,7 +262,7 @@ func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModel } // 创建trader实例 - at, err := trader.NewAutoTrader(traderConfig) + at, err := trader.NewAutoTrader(traderConfig, database, userID) if err != nil { return fmt.Errorf("创建trader失败: %w", err) } @@ -286,7 +286,7 @@ func (tm *TraderManager) addTraderFromDB(traderCfg *config.TraderRecord, aiModel // AddTrader 从数据库配置添加trader (移除旧版兼容性) // AddTraderFromDB 从数据库配置添加trader -func (tm *TraderManager) AddTraderFromDB(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL, oiTopURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int, defaultCoins []string) error { +func (tm *TraderManager) AddTraderFromDB(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL, oiTopURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int, defaultCoins []string, database *config.Database, userID string) error { tm.mu.Lock() defer tm.mu.Unlock() @@ -368,7 +368,7 @@ func (tm *TraderManager) AddTraderFromDB(traderCfg *config.TraderRecord, aiModel } // 创建trader实例 - at, err := trader.NewAutoTrader(traderConfig) + at, err := trader.NewAutoTrader(traderConfig, database, userID) if err != nil { return fmt.Errorf("创建trader失败: %w", err) } @@ -506,19 +506,19 @@ func (tm *TraderManager) GetCompetitionData() (map[string]interface{}, error) { tm.competitionCache.mu.RUnlock() tm.mu.RLock() - + // 获取所有交易员列表 allTraders := make([]*trader.AutoTrader, 0, len(tm.traders)) for _, t := range tm.traders { allTraders = append(allTraders, t) } tm.mu.RUnlock() - + log.Printf("🔄 重新获取竞赛数据,交易员数量: %d", len(allTraders)) - + // 并发获取交易员数据 traders := tm.getConcurrentTraderData(allTraders) - + // 按收益率排序(降序) sort.Slice(traders, func(i, j int) bool { pnlPctI, okI := traders[i]["total_pnl_pct"].(float64) @@ -531,14 +531,14 @@ func (tm *TraderManager) GetCompetitionData() (map[string]interface{}, error) { } return pnlPctI > pnlPctJ }) - + // 限制返回前50名 totalCount := len(traders) limit := 50 if len(traders) > limit { traders = traders[:limit] } - + comparison := make(map[string]interface{}) comparison["traders"] = traders comparison["count"] = len(traders) @@ -559,21 +559,21 @@ func (tm *TraderManager) getConcurrentTraderData(traders []*trader.AutoTrader) [ index int data map[string]interface{} } - + // 创建结果通道 resultChan := make(chan traderResult, len(traders)) - + // 并发获取每个交易员的数据 for i, t := range traders { go func(index int, trader *trader.AutoTrader) { // 设置单个交易员的超时时间为3秒 ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() - + // 使用通道来实现超时控制 accountChan := make(chan map[string]interface{}, 1) errorChan := make(chan error, 1) - + go func() { account, err := trader.GetAccountInfo() if err != nil { @@ -582,10 +582,10 @@ func (tm *TraderManager) getConcurrentTraderData(traders []*trader.AutoTrader) [ accountChan <- account } }() - + status := trader.GetStatus() var traderData map[string]interface{} - + select { case account := <-accountChan: // 成功获取账户信息 @@ -634,18 +634,18 @@ func (tm *TraderManager) getConcurrentTraderData(traders []*trader.AutoTrader) [ "error": "获取超时", } } - + resultChan <- traderResult{index: index, data: traderData} }(i, t) } - + // 收集所有结果 results := make([]map[string]interface{}, len(traders)) for i := 0; i < len(traders); i++ { result := <-resultChan results[result.index] = result.data } - + return results } @@ -656,20 +656,20 @@ func (tm *TraderManager) GetTopTradersData() (map[string]interface{}, error) { if err != nil { return nil, err } - + // 从竞赛数据中提取前5名 allTraders, ok := competitionData["traders"].([]map[string]interface{}) if !ok { return nil, fmt.Errorf("竞赛数据格式错误") } - + // 限制返回前5名 limit := 5 topTraders := allTraders if len(allTraders) > limit { topTraders = allTraders[:limit] } - + result := map[string]interface{}{ "traders": topTraders, "count": len(topTraders), @@ -832,7 +832,7 @@ func (tm *TraderManager) LoadUserTraders(database config.DatabaseInterface, user } // 使用现有的方法加载交易员 - err = tm.loadSingleTrader(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, oiTopURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, defaultCoins) + err = tm.loadSingleTrader(traderCfg, aiModelCfg, exchangeCfg, coinPoolURL, oiTopURL, maxDailyLoss, maxDrawdown, stopTradingMinutes, defaultCoins, database, userID) if err != nil { log.Printf("⚠️ 加载交易员 %s 失败: %v", traderCfg.Name, err) } @@ -842,7 +842,7 @@ func (tm *TraderManager) LoadUserTraders(database config.DatabaseInterface, user } // loadSingleTrader 加载单个交易员(从现有代码提取的公共逻辑) -func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL, oiTopURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int, defaultCoins []string) error { +func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiModelCfg *config.AIModelConfig, exchangeCfg *config.ExchangeConfig, coinPoolURL, oiTopURL string, maxDailyLoss, maxDrawdown float64, stopTradingMinutes int, defaultCoins []string, database config.DatabaseInterface, userID string) error { // 处理交易币种列表 var tradingCoins []string if traderCfg.TradingSymbols != "" { @@ -889,6 +889,7 @@ func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiMode DefaultCoins: defaultCoins, TradingCoins: tradingCoins, SystemPromptTemplate: traderCfg.SystemPromptTemplate, // 系统提示词模板 + HyperliquidTestnet: exchangeCfg.Testnet, // Hyperliquid测试网 } // 根据交易所类型设置API密钥 @@ -912,7 +913,7 @@ func (tm *TraderManager) loadSingleTrader(traderCfg *config.TraderRecord, aiMode } // 创建trader实例 - at, err := trader.NewAutoTrader(traderConfig) + at, err := trader.NewAutoTrader(traderConfig, database, userID) if err != nil { return fmt.Errorf("创建trader失败: %w", err) } diff --git a/market/monitor.go b/market/monitor.go index 23e126d9..340613ac 100644 --- a/market/monitor.go +++ b/market/monitor.go @@ -121,19 +121,19 @@ func (m *WSMonitor) Start(coins []string) { // 初始化交易对 err := m.Initialize(coins) if err != nil { - log.Fatalf("❌ 初始化币种: %v", err) + log.Printf("❌ 初始化币种失败: %v", err) return } err = m.combinedClient.Connect() if err != nil { - log.Fatalf("❌ 批量订阅流: %v", err) + log.Printf("❌ 批量订阅流失败: %v", err) return } // 订阅所有交易对 err = m.subscribeAll() if err != nil { - log.Fatalf("❌ 订阅币种交易对: %v", err) + log.Printf("❌ 订阅币种交易对失败: %v", err) return } } @@ -159,7 +159,7 @@ func (m *WSMonitor) subscribeAll() error { for _, st := range subKlineTime { err := m.combinedClient.BatchSubscribeKlines(m.symbols, st) if err != nil { - log.Fatalf("❌ 订阅3m K线: %v", err) + log.Printf("❌ 订阅 %s K线失败: %v", st, err) return err } } @@ -239,19 +239,32 @@ func (m *WSMonitor) GetCurrentKlines(symbol string, _time string) ([]Kline, erro // 如果Ws数据未初始化完成时,单独使用api获取 - 兼容性代码 (防止在未初始化完成是,已经有交易员运行) apiClient := NewAPIClient() klines, err := apiClient.GetKlines(symbol, _time, 100) - m.getKlineDataMap(_time).Store(strings.ToUpper(symbol), klines) //动态缓存进缓存 + if err != nil { + return nil, fmt.Errorf("获取%v分钟K线失败: %v", _time, err) + } + + // 动态缓存进缓存 + m.getKlineDataMap(_time).Store(strings.ToUpper(symbol), klines) + + // 订阅 WebSocket 流 subStr := m.subscribeSymbol(symbol, _time) subErr := m.combinedClient.subscribeStreams(subStr) log.Printf("动态订阅流: %v", subStr) if subErr != nil { - return nil, fmt.Errorf("动态订阅%v分钟K线失败: %v", _time, subErr) + log.Printf("警告: 动态订阅%v分钟K线失败: %v (使用API数据)", _time, subErr) } - if err != nil { - return nil, fmt.Errorf("获取%v分钟K线失败: %v", _time, err) - } - return klines, fmt.Errorf("symbol不存在") + + // ✅ FIX: 返回深拷贝而非引用 + result := make([]Kline, len(klines)) + copy(result, klines) + return result, nil } - return value.([]Kline), nil + + // ✅ FIX: 返回深拷贝而非引用,避免并发竞态条件 + klines := value.([]Kline) + result := make([]Kline, len(klines)) + copy(result, klines) + return result, nil } func (m *WSMonitor) Close() { diff --git a/mcp/client.go b/mcp/client.go index 9191dfaf..14f49eae 100644 --- a/mcp/client.go +++ b/mcp/client.go @@ -7,6 +7,8 @@ import ( "io" "log" "net/http" + "os" + "strconv" "strings" "time" ) @@ -28,15 +30,28 @@ type Client struct { Model string Timeout time.Duration UseFullURL bool // 是否使用完整URL(不添加/chat/completions) + MaxTokens int // AI响应的最大token数 } func New() *Client { + // 从环境变量读取 MaxTokens,默认 2000 + maxTokens := 2000 + if envMaxTokens := os.Getenv("AI_MAX_TOKENS"); envMaxTokens != "" { + if parsed, err := strconv.Atoi(envMaxTokens); err == nil && parsed > 0 { + maxTokens = parsed + log.Printf("🔧 [MCP] 使用环境变量 AI_MAX_TOKENS: %d", maxTokens) + } else { + log.Printf("⚠️ [MCP] 环境变量 AI_MAX_TOKENS 无效 (%s),使用默认值: %d", envMaxTokens, maxTokens) + } + } + // 默认配置 return &Client{ - Provider: ProviderDeepSeek, - BaseURL: "https://api.deepseek.com/v1", - Model: "deepseek-chat", - Timeout: 120 * time.Second, // 增加到120秒,因为AI需要分析大量数据 + Provider: ProviderDeepSeek, + BaseURL: "https://api.deepseek.com/v1", + Model: "deepseek-chat", + Timeout: 120 * time.Second, // 增加到120秒,因为AI需要分析大量数据 + MaxTokens: maxTokens, } } @@ -81,7 +96,7 @@ func (client *Client) SetQwenAPIKey(apiKey string, customURL string, customModel client.Model = customModel log.Printf("🔧 [MCP] Qwen 使用自定义 Model: %s", customModel) } else { - client.Model = "qwen-plus" // 可选: qwen-turbo, qwen-plus, qwen-max + client.Model = "qwen3-max" log.Printf("🔧 [MCP] Qwen 使用默认 Model: %s", client.Model) } // 打印 API Key 的前后各4位用于验证 @@ -190,7 +205,7 @@ func (client *Client) callOnce(systemPrompt, userPrompt string) (string, error) "model": client.Model, "messages": messages, "temperature": 0.5, // 降低temperature以提高JSON格式稳定性 - "max_tokens": 2000, + "max_tokens": client.MaxTokens, } // 注意:response_format 参数仅 OpenAI 支持,DeepSeek/Qwen 不支持 @@ -280,6 +295,8 @@ func isRetryableError(err error) bool { "connection refused", "temporary failure", "no such host", + "stream error", // HTTP/2 stream 错误 + "INTERNAL_ERROR", // 服务端内部错误 } for _, retryable := range retryableErrors { if strings.Contains(errStr, retryable) { diff --git a/prompts/Hansen.txt b/prompts/Hansen.txt new file mode 100644 index 00000000..68815c77 --- /dev/null +++ b/prompts/Hansen.txt @@ -0,0 +1,180 @@ +你是专业的加密货币AI,在合约市场进行自主交易。 + +# 核心目标 + +**最大化夏普比率(Sharpe Ratio)** + +夏普比率 = 平均收益 / 收益波动率 + +**这意味着**: +- 高质量交易(高胜率、大盈亏比)→ 提升夏普 +- 稳定收益、控制回撤 → 提升夏普 +- 耐心持仓、让利润奔跑 → 提升夏普 +- 频繁交易、小盈小亏 → 增加波动,严重降低夏普 +- 过度交易、手续费损耗 → 直接亏损 +- 过早平仓、频繁进出 → 错失大行情 + +**关键认知**: 系统每3分钟扫描一次,但不意味着每次都要交易! +大多数时候应该是 `wait` 或 `hold`,只在极佳机会时才开仓。 + +# 交易哲学 & 最佳实践 + +## 核心原则: + +**资金保全第一**:保护资本比追求收益更重要 - 这是最高原则 + +**纪律胜于情绪**:严格执行退出策略,不随意移动止损或目标 + +**质量优于数量**:少量高信念交易胜过大量低信念交易 + +**适应波动性**:根据市场条件调整仓位大小和杠杆 + +**尊重趋势**:不要与强趋势作对,顺势而为 + +**风险控制优先**:每笔交易必须明确止损点和风险金额 + +## 稳健交易行为准则: + +**等待最佳机会**:宁可错过10个普通机会,不错过1个优质机会 +**分批止盈**:在关键阻力位分批获利了结 +**严格止损**:入场前就设定好止损,绝不移动止损扩大风险 +**仓位匹配**:根据信号强度调整仓位,不强求固定仓位 +**情绪控制**:连续盈利不骄傲,连续亏损不报复 + +## 常见误区避免: + +**过度交易**:频繁交易导致费用侵蚀利润 +**复仇式交易**:亏损后立即加码试图"翻本" +**分析瘫痪**:过度等待完美信号,导致失机 +**忽视相关性**:BTC常引领山寨币,须优先观察BTC趋势 +**过度杠杆**:放大收益同时放大亏损 +**逆势操作**:在强趋势中反向交易 + +# 交易频率认知 + +**量化标准**: +- 优秀交易员:每天2-4笔 = 每小时0.1-0.2笔 +- 过度交易:每小时>2笔 = 严重问题 +- 最佳节奏:开仓后持有至少30-60分钟 + +**稳健自查**: +- 如果你发现自己每个周期都在交易 → 说明标准太低 +- 如果你发现持仓<30分钟就平仓 → 说明太急躁 +- 如果连续3个周期没有合适机会 → 这是正常现象 +- 如果感觉"必须交易" → 立即停止,这是危险信号 + +# 开仓标准(严格) + +只在**强信号**时开仓,不确定就观望。 + +## 多维度信号验证: + +**趋势确认**(必须满足): +- 4小时级别趋势明确 +- 价格在关键EMA(20/50)之上/之下 +- 至少2个时间框架方向一致 + +**技术指标**(至少满足3项): +- MACD方向与趋势一致 +- RSI在合理区域(不做超买区做多/超卖区做空) +- 成交量配合价格方向 +- 持仓量变化支持趋势 + +**入场时机**: +- 回撤至支撑/阻力位 +- 突破关键水平后回踩确认 +- 形态完成(头肩、三角、旗形等) + +**风险控制**: +- 止损位置明确且合理 +- 风险回报比 ≥ 1:3 +- 单笔风险 ≤ 账户2% + +## 避免开仓的情况: + +横盘震荡,无明确方向 +重大事件前后(不确定性高) +流动性不足时段 +刚平仓不久(<15分钟) +情绪化状态(急于翻本或过度自信) +多个指标相互矛盾 + +# 夏普比率自我进化 + +每次你会收到**夏普比率**作为绩效反馈: + +**夏普比率 < -0.5** (持续亏损): + → **停止交易**,连续观望至少6个周期(18分钟) + → **深度反思**: + • 交易频率过高?(每小时>1次就是过度) + • 持仓时间过短?(<30分钟就是过早平仓) + • 信号强度不足?(信心度<80) + • 是否逆势操作? + • 止损执行是否严格? + +**夏普比率 -0.5 ~ 0** (轻微亏损): + → **严格控制**:只做信心度>85的交易 + → 减少交易频率:每小时最多1笔新开仓 + → 缩小仓位:使用正常仓位的50-70% + → 耐心持仓:至少持有45分钟以上 + +**夏普比率 0 ~ 0.7** (正收益): + → **维持策略**:按既定标准执行 + → 保持警惕:不因盈利而放松标准 + +**夏普比率 > 0.7** (优异表现): + → **适度进取**:可在信心度>90时适度扩大仓位 + → 保持纪律:不因成功而改变稳健原则 + +# 决策流程 + +1. **分析账户状态**: + - 当前夏普比率表现 + - 保证金使用情况 + - 持仓数量和状态 + +2. **评估市场环境**: + - BTC整体趋势方向 + - 市场波动率和情绪 + - 重大事件风险 + +3. **检查现有持仓**: + - 趋势是否持续? + - 是否需要调整止损/止盈? + - 是否达到目标位? + +4. **寻找新机会**(仅在条件允许时): + - 多维度信号验证 + - 风险回报比计算 + - 仓位规模确定 + +5. **输出决策**:思维链分析 + 完整的JSON + +# 风险控制框架 + +## 仓位管理: +- 单币种风险:≤ 账户净值的2% +- 总仓位风险:≤ 账户净值的6% +- 最大持仓:3个币种 +- 杠杆使用:根据波动性调整,不追求最大杠杆 + +## 止损策略: +- 技术止损:基于支撑/阻力位 +- 金额止损:单笔最大亏损金额 +- 时间止损:持仓超过2小时无进展考虑离场 + +## 资金保护: +- 连续2笔亏损后:降低50%仓位 +- 单日亏损超过5%:停止交易剩余时间 +- 每周亏损超过10%:全面复盘策略 + +--- + +**记住**: +- 目标是夏普比率,不是交易频率 +- 资金保全比利润追求更重要 +- 宁可错过,不做低质量交易 +- 风险回报比1:3是底线 +- 纪律执行是长期盈利的关键 + +**现在,请基于以上原则分析市场并做出稳健决策** diff --git a/prompts/adaptive.txt b/prompts/adaptive.txt index d5778caa..7b62968a 100644 --- a/prompts/adaptive.txt +++ b/prompts/adaptive.txt @@ -61,21 +61,24 @@ ## 开平仓动作 -1. **buy_to_enter**: 开多仓(看涨) +1. **open_long**: 开多仓(看涨) - 用于: 看涨信号强烈时 - 必须设置: 止损价格、止盈价格 -2. **sell_to_enter**: 开空仓(看跌) +2. **open_short**: 开空仓(看跌) - 用于: 看跌信号强烈时 - 必须设置: 止损价格、止盈价格 -3. **close**: 完全平仓 - - 用于: 止盈、止损、或趋势反转 +3. **close_long**: 平掉多仓 + - 用于: 止盈、止损、或趋势反转(针对多头持仓) -4. **wait**: 观望,不持仓 +4. **close_short**: 平掉空仓 + - 用于: 止盈、止损、或趋势反转(针对空头持仓) + +5. **wait**: 观望,不持仓 - 用于: 没有明确信号,或资金不足 -5. **hold**: 持有当前仓位 +6. **hold**: 持有当前仓位 - 用于: 持仓表现符合预期,继续等待 ## 动态调整动作 (新增) @@ -97,6 +100,15 @@ --- +# 动态止盈止损与部分平仓指引 + +- `partial_close` 用于锁定阶段性收益或降低风险,建议使用清晰比例(如 25% / 50% / 75%),并说明目的(例:"锁定关键阻力前利润""减半仓等待回踩确认")。 +- 执行部分平仓后,应评估是否需要同步上调止损 / 下调止盈,确保剩余仓位符合新的风险回报结构。 +- `update_stop_loss` / `update_take_profit` 优先用于顺势推进(如跟踪新高新低),避免在无新证据下放宽止损。 +- 若计划分批退出,请在 `reasoning` 中描述剩余仓位的策略与失效条件,避免出现"减仓后不知道如何处理剩余部位"的情况。 + +--- + # 决策流程(严格顺序) ## 第 0 步:疑惑检查 @@ -330,26 +342,25 @@ ## 仓位计算公式 -``` -仓位大小(USD) = 可用资金 × 风险预算 / 止损距离百分比 -仓位数量(Coins) = 仓位大小(USD) / 当前价格 -``` +**重要**:position_size_usd 是**名义价值**(包含杠杆),非保证金需求。 -**示例**: -``` -账户净值:10,000 USDT -风险预算:2%(信心度 90-95) -止损距离:2%(50,000 → 49,000) +**计算步骤**: +1. **可用保证金** = Available Cash × 0.95 × Allocation %(预留5%给手续费) +2. **名义价值** = 可用保证金 × Leverage +3. **position_size_usd** = 名义价值(这是 JSON 中应填写的值) +4. **Position Size (Coins)** = position_size_usd / Current Price -仓位大小 = 10,000 × 2% / 2% = 10,000 USDT -杠杆 5x → 保证金 2,000 USDT -``` +**示例**:Available Cash = $500, Leverage = 5x, Allocation = 100% +- 可用保证金 = $500 × 0.95 × 100% = $475 +- position_size_usd = $475 × 5 = **$2,375** ← JSON 中填写此值 +- 实际占用保证金 = $475,剩余 $25 用于手续费 -## 杠杆选择指南 +## 杠杆选择指引 -- 信心度 85-87: 3-5x 杠杆 -- 信心度 88-92: 5-10x 杠杆 -- 信心度 93-95: 10-15x 杠杆 +基于信心度的杠杆配置: +- 信心度 <85 → 不开仓 +- 信心度 85-90 → 杠杆 1-3x,风险预算 1.5% +- 信心度 90-95 → 杠杆 3-8x,风险预算 2% - 信心度 >95: 最高 20x 杠杆(谨慎) ## 风险控制原则 diff --git a/prompts/adaptive_relaxed.txt b/prompts/adaptive_relaxed.txt new file mode 100644 index 00000000..3d77b5c3 --- /dev/null +++ b/prompts/adaptive_relaxed.txt @@ -0,0 +1,194 @@ +你是专业的加密货币交易AI,在合约市场进行自主交易。 + +# 核心目标 + +最大化夏普比率(Sharpe Ratio) + +夏普比率 = 平均收益 / 收益波动率 + +这意味着: +- 高质量交易(高胜率、大盈亏比)→ 提升夏普 +- 稳定收益、控制回撤 → 提升夏普 +- 耐心持仓、让利润奔跑 → 提升夏普 +- 频繁交易、小盈小亏 → 增加波动,严重降低夏普 +- 过度交易、手续费损耗 → 直接亏损 + +关键认知:系统每3分钟扫描一次,但不意味着每次都要交易! +大多数时候应该是 `wait` 或 `hold`,只在极佳机会时才开仓。 + +--- + +# 零号原则:疑惑优先 + +⚠️ 当你不确定时,默认选择 `wait`。 + +这是覆盖所有其他规则的最高优先级: +- 任何环节产生疑虑 → 立刻选择 `wait` +- 只有当信心 ≥80 且论据充分、条件完全满足时才允许开仓(✅ 从85降至80) +- 不确定是否违规 → 视同违规,直接 `wait` + +--- + +# 基础交易约束 + +- 禁止对同一标的同时持有多空(NO hedging) +- 禁止在既有仓位上加码(NO pyramiding) +- 允许使用 `partial_close` 锁定利润或降低风险 +- 每笔交易必须预先设定止损与止盈,止损允许的账户亏损不超过 1-3% +- 确保预估清算价距离 ≥15%,避免被强平 + +--- + +# 仓位管理框架 + +## 杠杆选择指引 + +基于信心度的杠杆配置: +- 信心度 <80 → 不开仓(✅ 从85降至80) +- 信心度 80-85 → 杠杆 1-3x,风险预算 1.5% +- 信心度 85-92 → 杠杆 3-5x,风险预算 2% +- 信心度 >92 → 杠杆 5-8x(谨慎),风险预算 2.5% + +--- + +# 决策流程(强制顺序) + +1. **冷却期检查** + - 距离上一次开仓 ≥6 分钟(✅ 从9分钟降至6分钟) + - 若有持仓:持仓时间 ≥20 分钟(✅ 从30分钟降至20分钟) + - 止损出场后至少观望 6 分钟 + → 任意条件不满足 → `action = "wait"` + +2. **夏普 / 连亏防御** + - 夏普 < -0.5 → 停手 6 个周期(18 分钟) + - 连续 2 次亏损 → 暂停 30 分钟(✅ 从45分钟降至30分钟) + - 连续 3 次亏损 → 暂停 12 小时(✅ 从24小时降至12小时) + - 连续 4 次亏损 → 暂停 48 小时(✅ 从72小时降至48小时) + +3. **持仓管理优先** + - 若已有持仓:先评估是否需要平仓或调整止盈止损 + +4. **BTC 状态评估(若数据可用)** + - 标准模式:拥有 15m / 1h / 4h → 至少两条周期同向且无矛盾视为支持 + - 简化模式:仅 15m / 4h → 同向视为支持 + - 若完全缺少 BTC 数据 → 跳过此步,但开仓信心阈值上调至 85 + +5. **多周期趋势确认**(✅ 降低要求) + + 开仓前必须验证多周期趋势一致性: + + **做多时检查**: + - 检查 3m / 15m / 1h / 4h 的价格与 EMA20 关系 + - 至少 2 个周期显示价格 > EMA20(✅ 从3个降至2个) + - 4h MACD ≥ -0.5(✅ 从-0.2放宽至-0.5) + + **做空时检查**: + - 至少 2 个周期显示价格 < EMA20(✅ 从3个降至2个) + - 4h MACD ≤ +0.5(✅ 从+0.2放宽至+0.5) + + **趋势共振评分**: + - 4 个周期全部同向 → 趋势极强(信心 +10) + - 3 个周期同向 → 趋势确认(信心 +5) + - 2 个周期同向 → 趋势可接受(允许开仓) + +6. **新机会评估** + - 多空确认清单 ≥4/8 项通过(✅ 从5/8降至4/8) + - 风险回报比 ≥1:2.5(✅ 从1:3降至1:2.5) + - 预计收益 > 手续费 ×3 + - 清算距离 ≥15% + - 信心评分 ≥80(若跳过 BTC 检查则 ≥85) + +--- + +# 多空确认清单(至少通过 4/8)(✅ 降低要求) + +### 做多确认 + +| 指标 | 条件 | +|------|------| +| 15m MACD | >0(短期动能向上) | +| 价格 vs EMA20 | 价格高于 15m / 1h EMA20 | +| RSI | <45(超卖或温和超卖)(✅ 从30-40放宽至<45) | +| BuySellRatio | ≥0.55(✅ 从0.60降至0.55) | +| 成交量 | 近 20 根均量 ×1.3 以上(✅ 从1.5降至1.3) | +| BTC 状态* | 多头或中性 | +| 资金费率 | <0.02 或 -0.01~0.02 | +| 持仓量 OI 变化 | 近 4 小时上升 >+3%(✅ 从+5%降至+3%) | + +### 做空确认 + +| 指标 | 条件 | +|------|------| +| 15m MACD | <0(短期动能向下) | +| 价格 vs EMA20 | 价格低于 15m / 1h EMA20 | +| RSI | >60(超买或温和超买)(✅ 从65-70放宽至>60) | +| BuySellRatio | ≤0.45(✅ 从0.40提高至0.45) | +| 成交量 | 近 20 根均量 ×1.3 以上 | +| BTC 状态* | 空头或中性 | +| 资金费率 | >-0.02 或 -0.02~0.01 | +| 持仓量 OI 变化 | 近 4 小时上升 >+3% | + +--- + +# 客观信心评分(基础分 60) + +1. **基础分:60** +2. **加分项(每项 +5,最高 100)** + - 多空确认清单 ≥4 项通过 + - BTC 状态明确支持 + - 多周期趋势共振(2 个周期同向 +3,3 个周期同向 +5,4 个周期全同向 +10) + - 15m / 1h / 4h MACD 同向 + - 关键技术位明确(1h / 4h EMA、整数关口) + - 成交量放大(>1.3× 均量) + - 资金费率情绪背离 + - 风险回报 ≥1:3 +3. **减分项(每项 -10)** + - 指标互相矛盾(MACD 与价格背离) + - BTC 状态不明仍计划大幅开仓 + - 技术位不清晰或过近(<0.5%) + - 成交量萎缩(< 均量 ×0.7) +4. **阈值规则** + - <80 → 禁止开仓 + - 80-85 → 风险预算 1.5%,杠杆 1-3x + - 85-92 → 风险预算 2%,杠杆 3-5x + - >92 → 风险预算 2.5%,杠杆 5-8x + +--- + +# 最终检查清单(开仓前必须全部通过) + +1. 冷却期合格(6分钟) +2. 夏普 / 连亏未触发停手 +3. **多周期趋势确认通过(至少 2 个周期同向)** +4. BTC 状态明确支持(或缺失时已说明并提高阈值) +5. 多空确认清单 ≥4/8 +6. 风险回报 ≥1:2.5 +7. 预计收益 > 手续费 ×3 +8. 清算距离 ≥15% +9. 客观信心评分 ≥80(缺 BTC 数据时 ≥85) +10. 失效条件已定义且写入 reasoning + +任意一项未通过 → 立即选择 `wait`,并说明具体原因。 + +--- + +## 版本说明 + +**adaptive_relaxed v1.0 - 保守优化版** + +核心调整: +1. ✅ 信心度阈值:85 → 80 +2. ✅ 冷却期:9分钟 → 6分钟 +3. ✅ 多周期趋势:3个同向 → 2个同向 +4. ✅ 多空确认清单:5/8 → 4/8 +5. ✅ RSI 放宽:30-40/65-70 → <45/>60 +6. ✅ BuySellRatio 放宽:0.60/0.40 → 0.55/0.45 +7. ✅ 成交量要求:1.5× → 1.3× +8. ✅ OI 变化:+5% → +3% +9. ✅ 风险回报比:1:3 → 1:2.5 + +预期效果: +- 交易频率增加 50-80%(一天 8-15 笔) +- 保持 50%+ 胜率 +- 允许更多山寨币机会 +- 保持核心風控(夏普、連虧停手) diff --git a/prompts/default.txt b/prompts/default.txt index 310978ac..3094e473 100644 --- a/prompts/default.txt +++ b/prompts/default.txt @@ -106,6 +106,21 @@ 3. 寻找新机会: 有强信号吗?多空机会? 4. 输出决策: 思维链分析 + JSON +# 仓位大小计算 + +**重要**:`position_size_usd` 是**名义价值**(包含杠杆),非保证金需求。 + +**计算步骤**: +1. **可用保证金** = Available Cash × 0.95 × 配置比例(预留5%手续费) +2. **名义价值** = 可用保证金 × Leverage +3. **position_size_usd** = 名义价值(JSON中填写此值) +4. **实际币数** = position_size_usd / Current Price + +**示例**:可用资金 $500,杠杆 5x,配置 100% +- 可用保证金 = $500 × 0.95 = $475 +- position_size_usd = $475 × 5 = **$2,375** ← JSON填此值 +- 实际占用保证金 = $475,剩余 $25 用于手续费 + --- 记住: diff --git a/prompts/nof1.txt b/prompts/nof1.txt index 012daa62..ef9f797d 100644 --- a/prompts/nof1.txt +++ b/prompts/nof1.txt @@ -21,19 +21,25 @@ Your mission: Maximize risk-adjusted returns (PnL) through systematic, disciplin # ACTION SPACE DEFINITION -You have exactly FOUR possible actions per decision cycle: +You have exactly SIX possible actions per decision cycle: -1. **buy_to_enter**: Open a new LONG position (bet on price appreciation) +1. **open_long**: Open a new LONG position (bet on price appreciation) - Use when: Bullish technical setup, positive momentum, risk-reward favors upside -2. **sell_to_enter**: Open a new SHORT position (bet on price depreciation) +2. **open_short**: Open a new SHORT position (bet on price depreciation) - Use when: Bearish technical setup, negative momentum, risk-reward favors downside -3. **hold**: Maintain current positions without modification +3. **close_long**: Exit an existing LONG position entirely + - Use when: Profit target reached, stop loss triggered, or thesis invalidated (for long positions) + +4. **close_short**: Exit an existing SHORT position entirely + - Use when: Profit target reached, stop loss triggered, or thesis invalidated (for short positions) + +5. **hold**: Maintain current positions without modification - Use when: Existing positions are performing as expected, or no clear edge exists -4. **close**: Exit an existing position entirely - - Use when: Profit target reached, stop loss triggered, or thesis invalidated +6. **wait**: Do not open any new positions, no current holdings + - Use when: No clear trading signal or insufficient capital ## Position Management Constraints @@ -45,10 +51,19 @@ You have exactly FOUR possible actions per decision cycle: # POSITION SIZING FRAMEWORK -Calculate position size using this formula: +**IMPORTANT**: `position_size_usd` is the **notional value** (includes leverage), NOT margin requirement. -Position Size (USD) = Available Cash × Leverage × Allocation % -Position Size (Coins) = Position Size (USD) / Current Price +## Calculation Steps: + +1. **Available Margin** = Available Cash × 0.95 × Allocation % (reserve 5% for fees) +2. **Notional Value** = Available Margin × Leverage +3. **position_size_usd** = Notional Value (this is the value for JSON) +4. **Position Size (Coins)** = position_size_usd / Current Price + +**Example**: Available Cash = $500, Leverage = 5x, Allocation = 100% +- Available Margin = $500 × 0.95 × 100% = $475 +- position_size_usd = $475 × 5 = **$2,375** ← Fill this value in JSON +- Actual margin used = $475, remaining $25 for fees ## Sizing Considerations diff --git a/start.sh b/start.sh index 47cb2536..3c571067 100755 --- a/start.sh +++ b/start.sh @@ -165,6 +165,16 @@ start() { # 读取环境变量 read_env_vars + # 确保必要的文件和目录存在(修复 Docker volume 挂载问题) + if [ ! -f "config.db" ]; then + print_info "创建数据库文件..." + touch config.db + fi + if [ ! -d "decision_logs" ]; then + print_info "创建日志目录..." + mkdir -p decision_logs + fi + # Auto-build frontend if missing or forced # if [ ! -d "web/dist" ] || [ "$1" == "--build" ]; then # build_frontend diff --git a/trader/aster_trader.go b/trader/aster_trader.go index d9ba82a6..a4a5a41f 100644 --- a/trader/aster_trader.go +++ b/trader/aster_trader.go @@ -438,13 +438,23 @@ func (t *AsterTrader) GetBalance() (map[string]interface{}, error) { return nil, err } + // 🔍 调试:打印原始API响应 + log.Printf("🔍 Aster API原始响应: %s", string(body)) + // 查找USDT余额 totalBalance := 0.0 availableBalance := 0.0 crossUnPnl := 0.0 for _, bal := range balances { + // 🔍 调试:打印每条余额记录 + log.Printf("🔍 余额记录: %+v", bal) + if asset, ok := bal["asset"].(string); ok && asset == "USDT" { + // 🔍 调试:打印USDT余额详情 + log.Printf("🔍 USDT余额详情: balance=%v, availableBalance=%v, crossUnPnl=%v", + bal["balance"], bal["availableBalance"], bal["crossUnPnl"]) + if wb, ok := bal["balance"].(string); ok { totalBalance, _ = strconv.ParseFloat(wb, 64) } @@ -458,11 +468,25 @@ func (t *AsterTrader) GetBalance() (map[string]interface{}, error) { } } + // ✅ Aster API完全兼容Binance API格式 + // balance字段 = wallet balance(不包含未实现盈亏) + // crossUnPnl = unrealized profit(未实现盈亏) + // crossWalletBalance = balance + crossUnPnl(全仓钱包余额,包含盈亏) + // + // 参考Binance官方文档: + // - Account Information V2: marginBalance = walletBalance + unrealizedProfit + // - Balance V3: crossWalletBalance = balance + crossUnPnl + + log.Printf("✓ Aster API返回: 钱包余额=%.2f, 未实现盈亏=%.2f, 可用余额=%.2f", + totalBalance, + crossUnPnl, + availableBalance) + // 返回与Binance相同的字段名,确保AutoTrader能正确解析 return map[string]interface{}{ - "totalWalletBalance": totalBalance, + "totalWalletBalance": totalBalance, // 钱包余额(不含未实现盈亏) "availableBalance": availableBalance, - "totalUnrealizedProfit": crossUnPnl, + "totalUnrealizedProfit": crossUnPnl, // 未实现盈亏 }, nil } @@ -842,6 +866,21 @@ func (t *AsterTrader) SetMarginMode(symbol string, isCrossMargin bool) error { log.Printf(" ✓ %s 仓位模式已是 %s 或有持仓无法更改", symbol, marginType) return nil } + // 检测多资产模式(错误码 -4168) + if strings.Contains(err.Error(), "Multi-Assets mode") || + strings.Contains(err.Error(), "-4168") || + strings.Contains(err.Error(), "4168") { + log.Printf(" ⚠️ %s 检测到多资产模式,强制使用全仓模式", symbol) + log.Printf(" 💡 提示:如需使用逐仓模式,请在交易所关闭多资产模式") + return nil + } + // 检测统一账户 API + if strings.Contains(err.Error(), "unified") || + strings.Contains(err.Error(), "portfolio") || + strings.Contains(err.Error(), "Portfolio") { + log.Printf(" ❌ %s 检测到统一账户 API,无法进行合约交易", symbol) + return fmt.Errorf("请使用「现货与合约交易」API 权限,不要使用「统一账户 API」") + } log.Printf(" ⚠️ 设置仓位模式失败: %v", err) // 不返回错误,让交易继续 return nil @@ -971,6 +1010,108 @@ func (t *AsterTrader) SetTakeProfit(symbol string, positionSide string, quantity return err } + + +// CancelStopLossOrders 仅取消止损单(不影响止盈单) +func (t *AsterTrader) CancelStopLossOrders(symbol string) error { + // 获取该币种的所有未完成订单 + params := map[string]interface{}{ + "symbol": symbol, + } + + body, err := t.request("GET", "/fapi/v3/openOrders", params) + if err != nil { + return fmt.Errorf("获取未完成订单失败: %w", err) + } + + var orders []map[string]interface{} + if err := json.Unmarshal(body, &orders); err != nil { + return fmt.Errorf("解析订单数据失败: %w", err) + } + + // 过滤出止损单并取消 + canceledCount := 0 + for _, order := range orders { + orderType, _ := order["type"].(string) + + // 只取消止损订单(不取消止盈订单) + if orderType == "STOP_MARKET" || orderType == "STOP" { + orderID, _ := order["orderId"].(float64) + cancelParams := map[string]interface{}{ + "symbol": symbol, + "orderId": int64(orderID), + } + + _, err := t.request("DELETE", "/fapi/v1/order", cancelParams) + if err != nil { + log.Printf(" ⚠ 取消止损单 %d 失败: %v", int64(orderID), err) + continue + } + + canceledCount++ + log.Printf(" ✓ 已取消止损单 (订单ID: %d, 类型: %s)", int64(orderID), orderType) + } + } + + if canceledCount == 0 { + log.Printf(" ℹ %s 没有止损单需要取消", symbol) + } else { + log.Printf(" ✓ 已取消 %s 的 %d 个止损单", symbol, canceledCount) + } + + return nil +} + +// CancelTakeProfitOrders 仅取消止盈单(不影响止损单) +func (t *AsterTrader) CancelTakeProfitOrders(symbol string) error { + // 获取该币种的所有未完成订单 + params := map[string]interface{}{ + "symbol": symbol, + } + + body, err := t.request("GET", "/fapi/v3/openOrders", params) + if err != nil { + return fmt.Errorf("获取未完成订单失败: %w", err) + } + + var orders []map[string]interface{} + if err := json.Unmarshal(body, &orders); err != nil { + return fmt.Errorf("解析订单数据失败: %w", err) + } + + // 过滤出止盈单并取消 + canceledCount := 0 + for _, order := range orders { + orderType, _ := order["type"].(string) + + // 只取消止盈订单(不取消止损订单) + if orderType == "TAKE_PROFIT_MARKET" || orderType == "TAKE_PROFIT" { + orderID, _ := order["orderId"].(float64) + cancelParams := map[string]interface{}{ + "symbol": symbol, + "orderId": int64(orderID), + } + + _, err := t.request("DELETE", "/fapi/v1/order", cancelParams) + if err != nil { + log.Printf(" ⚠ 取消止盈单 %d 失败: %v", int64(orderID), err) + continue + } + + canceledCount++ + log.Printf(" ✓ 已取消止盈单 (订单ID: %d, 类型: %s)", int64(orderID), orderType) + } + } + + if canceledCount == 0 { + log.Printf(" ℹ %s 没有止盈单需要取消", symbol) + } else { + log.Printf(" ✓ 已取消 %s 的 %d 个止盈单", symbol, canceledCount) + } + + return nil +} + // CancelAllOrders 取消所有订单 func (t *AsterTrader) CancelAllOrders(symbol string) error { params := map[string]interface{}{ @@ -981,6 +1122,61 @@ func (t *AsterTrader) CancelAllOrders(symbol string) error { return err } +// CancelStopOrders 取消该币种的止盈/止损单(用于调整止盈止损位置) +func (t *AsterTrader) CancelStopOrders(symbol string) error { + // 获取该币种的所有未完成订单 + params := map[string]interface{}{ + "symbol": symbol, + } + + body, err := t.request("GET", "/fapi/v3/openOrders", params) + if err != nil { + return fmt.Errorf("获取未完成订单失败: %w", err) + } + + var orders []map[string]interface{} + if err := json.Unmarshal(body, &orders); err != nil { + return fmt.Errorf("解析订单数据失败: %w", err) + } + + // 过滤出止盈止损单并取消 + canceledCount := 0 + for _, order := range orders { + orderType, _ := order["type"].(string) + + // 只取消止损和止盈订单 + if orderType == "STOP_MARKET" || + orderType == "TAKE_PROFIT_MARKET" || + orderType == "STOP" || + orderType == "TAKE_PROFIT" { + + orderID, _ := order["orderId"].(float64) + cancelParams := map[string]interface{}{ + "symbol": symbol, + "orderId": int64(orderID), + } + + _, err := t.request("DELETE", "/fapi/v3/order", cancelParams) + if err != nil { + log.Printf(" ⚠ 取消订单 %d 失败: %v", int64(orderID), err) + continue + } + + canceledCount++ + log.Printf(" ✓ 已取消 %s 的止盈/止损单 (订单ID: %d, 类型: %s)", + symbol, int64(orderID), orderType) + } + } + + if canceledCount == 0 { + log.Printf(" ℹ %s 没有止盈/止损单需要取消", symbol) + } else { + log.Printf(" ✓ 已取消 %s 的 %d 个止盈/止损单", symbol, canceledCount) + } + + return nil +} + // FormatQuantity 格式化数量(实现Trader接口) func (t *AsterTrader) FormatQuantity(symbol string, quantity float64) (string, error) { formatted, err := t.formatQuantity(symbol, quantity) diff --git a/trader/auto_trader.go b/trader/auto_trader.go index 9a68ed17..6e269a5b 100644 --- a/trader/auto_trader.go +++ b/trader/auto_trader.go @@ -4,12 +4,14 @@ import ( "encoding/json" "fmt" "log" + "math" "nofx/decision" "nofx/logger" "nofx/market" "nofx/mcp" "nofx/pool" "strings" + "sync" "time" ) @@ -98,10 +100,17 @@ type AutoTrader struct { startTime time.Time // 系统启动时间 callCount int // AI调用次数 positionFirstSeenTime map[string]int64 // 持仓首次出现时间 (symbol_side -> timestamp毫秒) + stopMonitorCh chan struct{} // 用于停止监控goroutine + monitorWg sync.WaitGroup // 用于等待监控goroutine结束 + peakPnLCache map[string]float64 // 最高收益缓存 (symbol -> 峰值盈亏百分比) + peakPnLCacheMutex sync.RWMutex // 缓存读写锁 + lastBalanceSyncTime time.Time // 上次余额同步时间 + database interface{} // 数据库引用(用于自动更新余额) + userID string // 用户ID } // NewAutoTrader 创建自动交易器 -func NewAutoTrader(config AutoTraderConfig) (*AutoTrader, error) { +func NewAutoTrader(config AutoTraderConfig, database interface{}, userID string) (*AutoTrader, error) { // 设置默认值 if config.ID == "" { config.ID = "default_trader" @@ -195,7 +204,8 @@ func NewAutoTrader(config AutoTraderConfig) (*AutoTrader, error) { // 设置默认系统提示词模板 systemPromptTemplate := config.SystemPromptTemplate if systemPromptTemplate == "" { - systemPromptTemplate = "default" // 默认使用 default 模板 + // feature/partial-close-dynamic-tpsl 分支默认使用 adaptive(支持动态止盈止损) + systemPromptTemplate = "adaptive" } return &AutoTrader{ @@ -216,6 +226,13 @@ func NewAutoTrader(config AutoTraderConfig) (*AutoTrader, error) { callCount: 0, isRunning: false, positionFirstSeenTime: make(map[string]int64), + stopMonitorCh: make(chan struct{}), + monitorWg: sync.WaitGroup{}, + peakPnLCache: make(map[string]float64), + peakPnLCacheMutex: sync.RWMutex{}, + lastBalanceSyncTime: time.Now(), // 初始化为当前时间 + database: database, + userID: userID, }, nil } @@ -227,6 +244,9 @@ func (at *AutoTrader) Run() error { log.Printf("⚙️ 扫描间隔: %v", at.config.ScanInterval) log.Println("🤖 AI将全权决定杠杆、仓位大小、止损止盈等参数") + // 启动回撤监控 + at.startDrawdownMonitor() + ticker := time.NewTicker(at.config.ScanInterval) defer ticker.Stop() @@ -250,16 +270,113 @@ func (at *AutoTrader) Run() error { // Stop 停止自动交易 func (at *AutoTrader) Stop() { at.isRunning = false + close(at.stopMonitorCh) // 通知监控goroutine停止 + at.monitorWg.Wait() // 等待监控goroutine结束 log.Println("⏹ 自动交易系统停止") } +// autoSyncBalanceIfNeeded 自动同步余额(每10分钟检查一次,变化>5%才更新) +func (at *AutoTrader) autoSyncBalanceIfNeeded() { + // 距离上次同步不足10分钟,跳过 + if time.Since(at.lastBalanceSyncTime) < 10*time.Minute { + return + } + + log.Printf("🔄 [%s] 开始自动检查余额变化...", at.name) + + // 查询实际余额 + balanceInfo, err := at.trader.GetBalance() + if err != nil { + log.Printf("⚠️ [%s] 查询余额失败: %v", at.name, err) + at.lastBalanceSyncTime = time.Now() // 即使失败也更新时间,避免频繁重试 + return + } + + // 提取可用余额 + var actualBalance float64 + if availableBalance, ok := balanceInfo["available_balance"].(float64); ok && availableBalance > 0 { + actualBalance = availableBalance + } else if availableBalance, ok := balanceInfo["availableBalance"].(float64); ok && availableBalance > 0 { + actualBalance = availableBalance + } else if totalBalance, ok := balanceInfo["balance"].(float64); ok && totalBalance > 0 { + actualBalance = totalBalance + } else { + log.Printf("⚠️ [%s] 无法提取可用余额", at.name) + at.lastBalanceSyncTime = time.Now() + return + } + + oldBalance := at.initialBalance + + // 防止除以零:如果初始余额无效,直接更新为实际余额 + if oldBalance <= 0 { + log.Printf("⚠️ [%s] 初始余额无效 (%.2f),直接更新为实际余额 %.2f USDT", at.name, oldBalance, actualBalance) + at.initialBalance = actualBalance + if at.database != nil { + type DatabaseUpdater interface { + UpdateTraderInitialBalance(userID, id string, newBalance float64) error + } + if db, ok := at.database.(DatabaseUpdater); ok { + if err := db.UpdateTraderInitialBalance(at.userID, at.id, actualBalance); err != nil { + log.Printf("❌ [%s] 更新数据库失败: %v", at.name, err) + } else { + log.Printf("✅ [%s] 已自动同步余额到数据库", at.name) + } + } else { + log.Printf("⚠️ [%s] 数据库类型不支持UpdateTraderInitialBalance接口", at.name) + } + } else { + log.Printf("⚠️ [%s] 数据库引用为空,余额仅在内存中更新", at.name) + } + at.lastBalanceSyncTime = time.Now() + return + } + + changePercent := ((actualBalance - oldBalance) / oldBalance) * 100 + + // 变化超过5%才更新 + if math.Abs(changePercent) > 5.0 { + log.Printf("🔔 [%s] 检测到余额大幅变化: %.2f → %.2f USDT (%.2f%%)", + at.name, oldBalance, actualBalance, changePercent) + + // 更新内存中的 initialBalance + at.initialBalance = actualBalance + + // 更新数据库(需要类型断言) + if at.database != nil { + // 这里需要根据实际的数据库类型进行类型断言 + // 由于使用了 interface{},我们需要在 TraderManager 层面处理更新 + // 或者在这里进行类型检查 + type DatabaseUpdater interface { + UpdateTraderInitialBalance(userID, id string, newBalance float64) error + } + if db, ok := at.database.(DatabaseUpdater); ok { + err := db.UpdateTraderInitialBalance(at.userID, at.id, actualBalance) + if err != nil { + log.Printf("❌ [%s] 更新数据库失败: %v", at.name, err) + } else { + log.Printf("✅ [%s] 已自动同步余额到数据库", at.name) + } + } else { + log.Printf("⚠️ [%s] 数据库类型不支持UpdateTraderInitialBalance接口", at.name) + } + } else { + log.Printf("⚠️ [%s] 数据库引用为空,余额仅在内存中更新", at.name) + } + } else { + log.Printf("✓ [%s] 余额变化不大 (%.2f%%),无需更新", at.name, changePercent) + } + + at.lastBalanceSyncTime = time.Now() +} + // runCycle 运行一个交易周期(使用AI全权决策) func (at *AutoTrader) runCycle() error { at.callCount++ - log.Print("\n" + strings.Repeat("=", 70)) + log.Print("\n" + strings.Repeat("=", 70) + "\n") log.Printf("⏰ %s - AI决策周期 #%d", time.Now().Format("2006-01-02 15:04:05"), at.callCount) - log.Print(strings.Repeat("=", 70)) + log.Println(strings.Repeat("=", 70)) // 创建决策记录 record := &logger.DecisionRecord{ @@ -284,7 +401,10 @@ func (at *AutoTrader) runCycle() error { log.Println("📅 日盈亏已重置") } - // 3. 收集交易上下文 + // 3. 自动同步余额(每10分钟检查一次,充值/提现后自动更新) + at.autoSyncBalanceIfNeeded() + + // 4. 收集交易上下文 ctx, err := at.buildTradingContext() if err != nil { record.Success = false @@ -316,7 +436,7 @@ func (at *AutoTrader) runCycle() error { }) } - // 保存候选币种列表 + log.Print(strings.Repeat("=", 70)) for _, coin := range ctx.CandidateCoins { record.CandidateCoins = append(record.CandidateCoins, coin.Symbol) } @@ -324,7 +444,7 @@ func (at *AutoTrader) runCycle() error { log.Printf("📊 账户净值: %.2f USDT | 可用: %.2f USDT | 持仓: %d", ctx.Account.TotalEquity, ctx.Account.AvailableBalance, ctx.Account.PositionCount) - // 4. 调用AI获取完整决策 + // 5. 调用AI获取完整决策 log.Printf("🤖 正在请求AI分析并决策... [模板: %s]", at.systemPromptTemplate) decision, err := decision.GetFullDecisionWithCustomPrompt(ctx, at.mcpClient, at.customPrompt, at.overrideBasePrompt, at.systemPromptTemplate) @@ -345,20 +465,18 @@ func (at *AutoTrader) runCycle() error { // 打印系统提示词和AI思维链(即使有错误,也要输出以便调试) if decision != nil { - if decision.SystemPrompt != "" { - log.Print("\n" + strings.Repeat("=", 70)) + log.Print("\n" + strings.Repeat("=", 70) + "\n") log.Printf("📋 系统提示词 [模板: %s] (错误情况)", at.systemPromptTemplate) log.Println(strings.Repeat("=", 70)) log.Println(decision.SystemPrompt) - log.Print(strings.Repeat("=", 70) + "\n") - } + log.Println(strings.Repeat("=", 70)) if decision.CoTTrace != "" { - log.Print("\n" + strings.Repeat("-", 70)) + log.Print("\n" + strings.Repeat("-", 70) + "\n") log.Println("💭 AI思维链分析(错误情况):") log.Println(strings.Repeat("-", 70)) log.Println(decision.CoTTrace) - log.Print(strings.Repeat("-", 70) + "\n") + log.Println(strings.Repeat("-", 70)) } } @@ -383,13 +501,16 @@ func (at *AutoTrader) runCycle() error { // 7. 打印AI决策 // log.Printf("📋 AI决策列表 (%d 个):\n", len(decision.Decisions)) // for i, d := range decision.Decisions { - // log.Printf(" [%d] %s: %s - %s", i+1, d.Symbol, d.Action, d.Reasoning) - // if d.Action == "open_long" || d.Action == "open_short" { - // log.Printf(" 杠杆: %dx | 仓位: %.2f USDT | 止损: %.4f | 止盈: %.4f", - // d.Leverage, d.PositionSizeUSD, d.StopLoss, d.TakeProfit) - // } + // log.Printf(" [%d] %s: %s - %s", i+1, d.Symbol, d.Action, d.Reasoning) + // if d.Action == "open_long" || d.Action == "open_short" { + // log.Printf(" 杠杆: %dx | 仓位: %.2f USDT | 止损: %.4f | 止盈: %.4f", + // d.Leverage, d.PositionSizeUSD, d.StopLoss, d.TakeProfit) + // } // } log.Println() + log.Print(strings.Repeat("-", 70)) + // 8. 对决策排序:确保先平仓后开仓(防止仓位叠加超限) + log.Print(strings.Repeat("-", 70)) // 8. 对决策排序:确保先平仓后开仓(防止仓位叠加超限) sortedDecisions := sortDecisionsByPriority(decision.Decisions) @@ -481,6 +602,12 @@ func (at *AutoTrader) buildTradingContext() (*decision.Context, error) { if quantity < 0 { quantity = -quantity // 空仓数量为负,转为正数 } + + // 跳过已平仓的持仓(quantity = 0),防止"幽灵持仓"传递给AI + if quantity == 0 { + continue + } + unrealizedPnl := pos["unRealizedProfit"].(float64) liquidationPrice := pos["liquidationPrice"].(float64) @@ -593,6 +720,12 @@ func (at *AutoTrader) executeDecisionWithRecord(decision *decision.Decision, act return at.executeCloseLongWithRecord(decision, actionRecord) case "close_short": return at.executeCloseShortWithRecord(decision, actionRecord) + case "update_stop_loss": + return at.executeUpdateStopLossWithRecord(decision, actionRecord) + case "update_take_profit": + return at.executeUpdateTakeProfitWithRecord(decision, actionRecord) + case "partial_close": + return at.executePartialCloseWithRecord(decision, actionRecord) case "hold", "wait": // 无需执行,仅记录 return nil @@ -626,6 +759,27 @@ func (at *AutoTrader) executeOpenLongWithRecord(decision *decision.Decision, act actionRecord.Quantity = quantity actionRecord.Price = marketData.CurrentPrice + // ⚠️ 保证金验证:防止保证金不足错误(code=-2019) + requiredMargin := decision.PositionSizeUSD / float64(decision.Leverage) + + balance, err := at.trader.GetBalance() + if err != nil { + return fmt.Errorf("获取账户余额失败: %w", err) + } + availableBalance := 0.0 + if avail, ok := balance["availableBalance"].(float64); ok { + availableBalance = avail + } + + // 手续费估算(Taker费率 0.04%) + estimatedFee := decision.PositionSizeUSD * 0.0004 + totalRequired := requiredMargin + estimatedFee + + if totalRequired > availableBalance { + return fmt.Errorf("❌ 保证金不足: 需要 %.2f USDT(保证金 %.2f + 手续费 %.2f),可用 %.2f USDT", + totalRequired, requiredMargin, estimatedFee, availableBalance) + } + // 设置仓位模式 if err := at.trader.SetMarginMode(decision.Symbol, at.config.IsCrossMargin); err != nil { log.Printf(" ⚠️ 设置仓位模式失败: %v", err) @@ -685,6 +839,27 @@ func (at *AutoTrader) executeOpenShortWithRecord(decision *decision.Decision, ac actionRecord.Quantity = quantity actionRecord.Price = marketData.CurrentPrice + // ⚠️ 保证金验证:防止保证金不足错误(code=-2019) + requiredMargin := decision.PositionSizeUSD / float64(decision.Leverage) + + balance, err := at.trader.GetBalance() + if err != nil { + return fmt.Errorf("获取账户余额失败: %w", err) + } + availableBalance := 0.0 + if avail, ok := balance["availableBalance"].(float64); ok { + availableBalance = avail + } + + // 手续费估算(Taker费率 0.04%) + estimatedFee := decision.PositionSizeUSD * 0.0004 + totalRequired := requiredMargin + estimatedFee + + if totalRequired > availableBalance { + return fmt.Errorf("❌ 保证金不足: 需要 %.2f USDT(保证金 %.2f + 手续费 %.2f),可用 %.2f USDT", + totalRequired, requiredMargin, estimatedFee, availableBalance) + } + // 设置仓位模式 if err := at.trader.SetMarginMode(decision.Symbol, at.config.IsCrossMargin); err != nil { log.Printf(" ⚠️ 设置仓位模式失败: %v", err) @@ -771,6 +946,201 @@ func (at *AutoTrader) executeCloseShortWithRecord(decision *decision.Decision, a return nil } +// executeUpdateStopLossWithRecord 执行调整止损并记录详细信息 +func (at *AutoTrader) executeUpdateStopLossWithRecord(decision *decision.Decision, actionRecord *logger.DecisionAction) error { + log.Printf(" 🎯 调整止损: %s → %.2f", decision.Symbol, decision.NewStopLoss) + + // 获取当前价格 + marketData, err := market.Get(decision.Symbol) + if err != nil { + return err + } + actionRecord.Price = marketData.CurrentPrice + + // 获取当前持仓 + positions, err := at.trader.GetPositions() + if err != nil { + return fmt.Errorf("获取持仓失败: %w", err) + } + + // 查找目标持仓 + var targetPosition map[string]interface{} + for _, pos := range positions { + symbol, _ := pos["symbol"].(string) + posAmt, _ := pos["positionAmt"].(float64) + if symbol == decision.Symbol && posAmt != 0 { + targetPosition = pos + break + } + } + + if targetPosition == nil { + return fmt.Errorf("持仓不存在: %s", decision.Symbol) + } + + // 获取持仓方向和数量 + side, _ := targetPosition["side"].(string) + positionSide := strings.ToUpper(side) + positionAmt, _ := targetPosition["positionAmt"].(float64) + + // 验证新止损价格合理性 + if positionSide == "LONG" && decision.NewStopLoss >= marketData.CurrentPrice { + return fmt.Errorf("多单止损必须低于当前价格 (当前: %.2f, 新止损: %.2f)", marketData.CurrentPrice, decision.NewStopLoss) + } + if positionSide == "SHORT" && decision.NewStopLoss <= marketData.CurrentPrice { + return fmt.Errorf("空单止损必须高于当前价格 (当前: %.2f, 新止损: %.2f)", marketData.CurrentPrice, decision.NewStopLoss) + } + + // 取消旧的止损单(避免多个止损单共存) + if err := at.trader.CancelStopOrders(decision.Symbol); err != nil { + log.Printf(" ⚠ 取消旧止损单失败: %v", err) + // 不中断执行,继续设置新止损 + } + + // 调用交易所 API 修改止损 + quantity := math.Abs(positionAmt) + err = at.trader.SetStopLoss(decision.Symbol, positionSide, quantity, decision.NewStopLoss) + if err != nil { + return fmt.Errorf("修改止损失败: %w", err) + } + + log.Printf(" ✓ 止损已调整: %.2f (当前价格: %.2f)", decision.NewStopLoss, marketData.CurrentPrice) + return nil +} + +// executeUpdateTakeProfitWithRecord 执行调整止盈并记录详细信息 +func (at *AutoTrader) executeUpdateTakeProfitWithRecord(decision *decision.Decision, actionRecord *logger.DecisionAction) error { + log.Printf(" 🎯 调整止盈: %s → %.2f", decision.Symbol, decision.NewTakeProfit) + + // 获取当前价格 + marketData, err := market.Get(decision.Symbol) + if err != nil { + return err + } + actionRecord.Price = marketData.CurrentPrice + + // 获取当前持仓 + positions, err := at.trader.GetPositions() + if err != nil { + return fmt.Errorf("获取持仓失败: %w", err) + } + + // 查找目标持仓 + var targetPosition map[string]interface{} + for _, pos := range positions { + symbol, _ := pos["symbol"].(string) + posAmt, _ := pos["positionAmt"].(float64) + if symbol == decision.Symbol && posAmt != 0 { + targetPosition = pos + break + } + } + + if targetPosition == nil { + return fmt.Errorf("持仓不存在: %s", decision.Symbol) + } + + // 获取持仓方向和数量 + side, _ := targetPosition["side"].(string) + positionSide := strings.ToUpper(side) + positionAmt, _ := targetPosition["positionAmt"].(float64) + + // 验证新止盈价格合理性 + if positionSide == "LONG" && decision.NewTakeProfit <= marketData.CurrentPrice { + return fmt.Errorf("多单止盈必须高于当前价格 (当前: %.2f, 新止盈: %.2f)", marketData.CurrentPrice, decision.NewTakeProfit) + } + if positionSide == "SHORT" && decision.NewTakeProfit >= marketData.CurrentPrice { + return fmt.Errorf("空单止盈必须低于当前价格 (当前: %.2f, 新止盈: %.2f)", marketData.CurrentPrice, decision.NewTakeProfit) + } + + // 取消旧的止盈单(避免多个止盈单共存) + if err := at.trader.CancelStopOrders(decision.Symbol); err != nil { + log.Printf(" ⚠ 取消旧止盈单失败: %v", err) + // 不中断执行,继续设置新止盈 + } + + // 调用交易所 API 修改止盈 + quantity := math.Abs(positionAmt) + err = at.trader.SetTakeProfit(decision.Symbol, positionSide, quantity, decision.NewTakeProfit) + if err != nil { + return fmt.Errorf("修改止盈失败: %w", err) + } + + log.Printf(" ✓ 止盈已调整: %.2f (当前价格: %.2f)", decision.NewTakeProfit, marketData.CurrentPrice) + return nil +} + +// executePartialCloseWithRecord 执行部分平仓并记录详细信息 +func (at *AutoTrader) executePartialCloseWithRecord(decision *decision.Decision, actionRecord *logger.DecisionAction) error { + log.Printf(" 📊 部分平仓: %s %.1f%%", decision.Symbol, decision.ClosePercentage) + + // 验证百分比范围 + if decision.ClosePercentage <= 0 || decision.ClosePercentage > 100 { + return fmt.Errorf("平仓百分比必须在 0-100 之间,当前: %.1f", decision.ClosePercentage) + } + + // 获取当前价格 + marketData, err := market.Get(decision.Symbol) + if err != nil { + return err + } + actionRecord.Price = marketData.CurrentPrice + + // 获取当前持仓 + positions, err := at.trader.GetPositions() + if err != nil { + return fmt.Errorf("获取持仓失败: %w", err) + } + + // 查找目标持仓 + var targetPosition map[string]interface{} + for _, pos := range positions { + symbol, _ := pos["symbol"].(string) + posAmt, _ := pos["positionAmt"].(float64) + if symbol == decision.Symbol && posAmt != 0 { + targetPosition = pos + break + } + } + + if targetPosition == nil { + return fmt.Errorf("持仓不存在: %s", decision.Symbol) + } + + // 获取持仓方向和数量 + side, _ := targetPosition["side"].(string) + positionSide := strings.ToUpper(side) + positionAmt, _ := targetPosition["positionAmt"].(float64) + + // 计算平仓数量 + totalQuantity := math.Abs(positionAmt) + closeQuantity := totalQuantity * (decision.ClosePercentage / 100.0) + actionRecord.Quantity = closeQuantity + + // 执行平仓 + var order map[string]interface{} + if positionSide == "LONG" { + order, err = at.trader.CloseLong(decision.Symbol, closeQuantity) + } else { + order, err = at.trader.CloseShort(decision.Symbol, closeQuantity) + } + + if err != nil { + return fmt.Errorf("部分平仓失败: %w", err) + } + + // 记录订单ID + if orderID, ok := order["orderId"].(int64); ok { + actionRecord.OrderID = orderID + } + + remainingQuantity := totalQuantity - closeQuantity + log.Printf(" ✓ 部分平仓成功: 平仓 %.4f (%.1f%%), 剩余 %.4f", + closeQuantity, decision.ClosePercentage, remainingQuantity) + + return nil +} + // GetID 获取trader ID func (at *AutoTrader) GetID() string { return at.id @@ -984,12 +1354,14 @@ func sortDecisionsByPriority(decisions []decision.Decision) []decision.Decision // 定义优先级 getActionPriority := func(action string) int { switch action { - case "close_long", "close_short": - return 1 // 最高优先级:先平仓 + case "close_long", "close_short", "partial_close": + return 1 // 最高优先级:先平仓(包括部分平仓) + case "update_stop_loss", "update_take_profit": + return 2 // 调整持仓止盈止损 case "open_long", "open_short": - return 2 // 次优先级:后开仓 + return 3 // 次优先级:后开仓 case "hold", "wait": - return 3 // 最低优先级:观望 + return 4 // 最低优先级:观望 default: return 999 // 未知动作放最后 } @@ -1081,3 +1453,158 @@ func normalizeSymbol(symbol string) string { return symbol } + +// 启动回撤监控 +func (at *AutoTrader) startDrawdownMonitor() { + at.monitorWg.Add(1) + go func() { + defer at.monitorWg.Done() + + ticker := time.NewTicker(1 * time.Minute) // 每分钟检查一次 + defer ticker.Stop() + + log.Println("📊 启动持仓回撤监控(每分钟检查一次)") + + for { + select { + case <-ticker.C: + at.checkPositionDrawdown() + case <-at.stopMonitorCh: + log.Println("⏹ 停止持仓回撤监控") + return + } + } + }() +} + +// 检查持仓回撤情况 +func (at *AutoTrader) checkPositionDrawdown() { + // 获取当前持仓 + positions, err := at.trader.GetPositions() + if err != nil { + log.Printf("❌ 回撤监控:获取持仓失败: %v", err) + return + } + + for _, pos := range positions { + symbol := pos["symbol"].(string) + side := pos["side"].(string) + entryPrice := pos["entryPrice"].(float64) + markPrice := pos["markPrice"].(float64) + quantity := pos["positionAmt"].(float64) + if quantity < 0 { + quantity = -quantity // 空仓数量为负,转为正数 + } + + // 计算当前盈亏百分比 + leverage := 10 // 默认值 + if lev, ok := pos["leverage"].(float64); ok { + leverage = int(lev) + } + + var currentPnLPct float64 + if side == "long" { + currentPnLPct = ((markPrice - entryPrice) / entryPrice) * float64(leverage) * 100 + } else { + currentPnLPct = ((entryPrice - markPrice) / entryPrice) * float64(leverage) * 100 + } + + // 获取该持仓的历史最高收益 + at.peakPnLCacheMutex.RLock() + peakPnLPct, exists := at.peakPnLCache[symbol] + at.peakPnLCacheMutex.RUnlock() + + if !exists { + // 如果没有历史最高记录,使用当前盈亏作为初始值 + peakPnLPct = currentPnLPct + at.UpdatePeakPnL(symbol, currentPnLPct) + } else { + // 更新峰值缓存 + at.UpdatePeakPnL(symbol, currentPnLPct) + } + + // 计算回撤(从最高点下跌的幅度) + var drawdownPct float64 + if peakPnLPct > 0 && currentPnLPct < peakPnLPct { + drawdownPct = ((peakPnLPct - currentPnLPct) / peakPnLPct) * 100 + } + + // 检查平仓条件:收益大于5%且回撤超过40% + if currentPnLPct > 5.0 && drawdownPct >= 40.0 { + log.Printf("🚨 触发回撤平仓条件: %s %s | 当前收益: %.2f%% | 最高收益: %.2f%% | 回撤: %.2f%%", + symbol, side, currentPnLPct, peakPnLPct, drawdownPct) + + // 执行平仓 + if err := at.emergencyClosePosition(symbol, side); err != nil { + log.Printf("❌ 回撤平仓失败 (%s %s): %v", symbol, side, err) + } else { + log.Printf("✅ 回撤平仓成功: %s %s", symbol, side) + // 平仓后清理该symbol的缓存 + at.ClearPeakPnLCache(symbol) + } + } else if currentPnLPct > 5.0 { + // 记录接近平仓条件的情况(用于调试) + log.Printf("📊 回撤监控: %s %s | 收益: %.2f%% | 最高: %.2f%% | 回撤: %.2f%%", + symbol, side, currentPnLPct, peakPnLPct, drawdownPct) + } + } +} + +// 紧急平仓函数 +func (at *AutoTrader) emergencyClosePosition(symbol, side string) error { + switch side { + case "long": + order, err := at.trader.CloseLong(symbol, 0) // 0 = 全部平仓 + if err != nil { + return err + } + log.Printf("✅ 紧急平多仓成功,订单ID: %v", order["orderId"]) + case "short": + order, err := at.trader.CloseShort(symbol, 0) // 0 = 全部平仓 + if err != nil { + return err + } + log.Printf("✅ 紧急平空仓成功,订单ID: %v", order["orderId"]) + default: + return fmt.Errorf("未知的持仓方向: %s", side) + } + + return nil +} + +// GetPeakPnLCache 获取最高收益缓存 +func (at *AutoTrader) GetPeakPnLCache() map[string]float64 { + at.peakPnLCacheMutex.RLock() + defer at.peakPnLCacheMutex.RUnlock() + + // 返回缓存的副本 + cache := make(map[string]float64) + for k, v := range at.peakPnLCache { + cache[k] = v + } + return cache +} + +// UpdatePeakPnL 更新最高收益缓存 +func (at *AutoTrader) UpdatePeakPnL(symbol string, currentPnLPct float64) { + at.peakPnLCacheMutex.Lock() + defer at.peakPnLCacheMutex.Unlock() + + if peak, exists := at.peakPnLCache[symbol]; exists { + // 更新峰值(如果是多头,取较大值;如果是空头,currentPnLPct为负,也要比较) + if currentPnLPct > peak { + at.peakPnLCache[symbol] = currentPnLPct + } + } else { + // 首次记录 + at.peakPnLCache[symbol] = currentPnLPct + } +} + +// ClearPeakPnLCache 清除指定symbol的峰值缓存 +func (at *AutoTrader) ClearPeakPnLCache(symbol string) { + at.peakPnLCacheMutex.Lock() + defer at.peakPnLCacheMutex.Unlock() + + delete(at.peakPnLCache, symbol) +} diff --git a/trader/binance_futures.go b/trader/binance_futures.go index 354415a0..e8e8f083 100644 --- a/trader/binance_futures.go +++ b/trader/binance_futures.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "strconv" + "strings" "sync" "time" @@ -32,10 +33,56 @@ type FuturesTrader struct { // NewFuturesTrader 创建合约交易器 func NewFuturesTrader(apiKey, secretKey string) *FuturesTrader { client := futures.NewClient(apiKey, secretKey) - return &FuturesTrader{ + // 同步时间,避免 Timestamp ahead 错误 + syncBinanceServerTime(client) + trader := &FuturesTrader{ client: client, cacheDuration: 15 * time.Second, // 15秒缓存 } + + // 设置双向持仓模式(Hedge Mode) + // 这是必需的,因为代码中使用了 PositionSide (LONG/SHORT) + if err := trader.setDualSidePosition(); err != nil { + log.Printf("⚠️ 设置双向持仓模式失败: %v (如果已是双向模式则忽略此警告)", err) + } + + return trader +} + +// setDualSidePosition 设置双向持仓模式(初始化时调用) +func (t *FuturesTrader) setDualSidePosition() error { + // 尝试设置双向持仓模式 + err := t.client.NewChangePositionModeService(). + DualSide(true). // true = 双向持仓(Hedge Mode) + Do(context.Background()) + + if err != nil { + // 如果错误信息包含"No need to change",说明已经是双向持仓模式 + if strings.Contains(err.Error(), "No need to change position side") { + log.Printf(" ✓ 账户已是双向持仓模式(Hedge Mode)") + return nil + } + // 其他错误则返回(但在调用方不会中断初始化) + return err + } + + log.Printf(" ✓ 账户已切换为双向持仓模式(Hedge Mode)") + log.Printf(" ℹ️ 双向持仓模式允许同时持有多单和空单") + return nil +} + +// syncBinanceServerTime 同步币安服务器时间,确保请求时间戳合法 +func syncBinanceServerTime(client *futures.Client) { + serverTime, err := client.NewServerTimeService().Do(context.Background()) + if err != nil { + log.Printf("⚠️ 同步币安服务器时间失败: %v", err) + return + } + + now := time.Now().UnixMilli() + offset := now - serverTime + client.TimeOffset = offset + log.Printf("⏱ 已同步币安服务器时间,偏移 %dms", offset) } // GetBalance 获取账户余额(带缓存) @@ -162,6 +209,17 @@ func (t *FuturesTrader) SetMarginMode(symbol string, isCrossMargin bool) error { log.Printf(" ⚠️ %s 有持仓,无法更改仓位模式,继续使用当前模式", symbol) return nil } + // 检测多资产模式(错误码 -4168) + if contains(err.Error(), "Multi-Assets mode") || contains(err.Error(), "-4168") || contains(err.Error(), "4168") { + log.Printf(" ⚠️ %s 检测到多资产模式,强制使用全仓模式", symbol) + log.Printf(" 💡 提示:如需使用逐仓模式,请在币安关闭多资产模式") + return nil + } + // 检测统一账户 API(Portfolio Margin) + if contains(err.Error(), "unified") || contains(err.Error(), "portfolio") || contains(err.Error(), "Portfolio") { + log.Printf(" ❌ %s 检测到统一账户 API,无法进行合约交易", symbol) + return fmt.Errorf("请使用「现货与合约交易」API 权限,不要使用「统一账户 API」") + } log.Printf(" ⚠️ 设置仓位模式失败: %v", err) // 不返回错误,让交易继续 return nil @@ -237,6 +295,17 @@ func (t *FuturesTrader) OpenLong(symbol string, quantity float64, leverage int) return nil, err } + // ✅ 检查格式化后的数量是否为 0(防止四舍五入导致的错误) + quantityFloat, parseErr := strconv.ParseFloat(quantityStr, 64) + if parseErr != nil || quantityFloat <= 0 { + return nil, fmt.Errorf("开倉數量過小,格式化後為 0 (原始: %.8f → 格式化: %s)。建議增加開倉金額或選擇價格更低的幣種", quantity, quantityStr) + } + + // ✅ 检查最小名义价值(Binance 要求至少 10 USDT) + if err := t.CheckMinNotional(symbol, quantityFloat); err != nil { + return nil, err + } + // 创建市价买入订单 order, err := t.client.NewCreateOrderService(). Symbol(symbol). @@ -280,6 +349,17 @@ func (t *FuturesTrader) OpenShort(symbol string, quantity float64, leverage int) return nil, err } + // ✅ 检查格式化后的数量是否为 0(防止四舍五入导致的错误) + quantityFloat, parseErr := strconv.ParseFloat(quantityStr, 64) + if parseErr != nil || quantityFloat <= 0 { + return nil, fmt.Errorf("开倉數量過小,格式化後為 0 (原始: %.8f → 格式化: %s)。建議增加開倉金額或選擇價格更低的幣種", quantity, quantityStr) + } + + // ✅ 检查最小名义价值(Binance 要求至少 10 USDT) + if err := t.CheckMinNotional(symbol, quantityFloat); err != nil { + return nil, err + } + // 创建市价卖出订单 order, err := t.client.NewCreateOrderService(). Symbol(symbol). @@ -411,6 +491,92 @@ func (t *FuturesTrader) CloseShort(symbol string, quantity float64) (map[string] return result, nil } + + +// CancelStopLossOrders 仅取消止损单(不影响止盈单) +func (t *FuturesTrader) CancelStopLossOrders(symbol string) error { + // 获取该币种的所有未完成订单 + orders, err := t.client.NewListOpenOrdersService(). + Symbol(symbol). + Do(context.Background()) + + if err != nil { + return fmt.Errorf("获取未完成订单失败: %w", err) + } + + // 过滤出止损单并取消 + canceledCount := 0 + for _, order := range orders { + orderType := order.Type + + // 只取消止损订单(不取消止盈订单) + if orderType == futures.OrderTypeStopMarket || orderType == futures.OrderTypeStop { + _, err := t.client.NewCancelOrderService(). + Symbol(symbol). + OrderID(order.OrderID). + Do(context.Background()) + + if err != nil { + log.Printf(" ⚠ 取消止损单 %d 失败: %v", order.OrderID, err) + continue + } + + canceledCount++ + log.Printf(" ✓ 已取消止损单 (订单ID: %d, 类型: %s)", order.OrderID, orderType) + } + } + + if canceledCount == 0 { + log.Printf(" ℹ %s 没有止损单需要取消", symbol) + } else { + log.Printf(" ✓ 已取消 %s 的 %d 个止损单", symbol, canceledCount) + } + + return nil +} + +// CancelTakeProfitOrders 仅取消止盈单(不影响止损单) +func (t *FuturesTrader) CancelTakeProfitOrders(symbol string) error { + // 获取该币种的所有未完成订单 + orders, err := t.client.NewListOpenOrdersService(). + Symbol(symbol). + Do(context.Background()) + + if err != nil { + return fmt.Errorf("获取未完成订单失败: %w", err) + } + + // 过滤出止盈单并取消 + canceledCount := 0 + for _, order := range orders { + orderType := order.Type + + // 只取消止盈订单(不取消止损订单) + if orderType == futures.OrderTypeTakeProfitMarket || orderType == futures.OrderTypeTakeProfit { + _, err := t.client.NewCancelOrderService(). + Symbol(symbol). + OrderID(order.OrderID). + Do(context.Background()) + + if err != nil { + log.Printf(" ⚠ 取消止盈单 %d 失败: %v", order.OrderID, err) + continue + } + + canceledCount++ + log.Printf(" ✓ 已取消止盈单 (订单ID: %d, 类型: %s)", order.OrderID, orderType) + } + } + + if canceledCount == 0 { + log.Printf(" ℹ %s 没有止盈单需要取消", symbol) + } else { + log.Printf(" ✓ 已取消 %s 的 %d 个止盈单", symbol, canceledCount) + } + + return nil +} + // CancelAllOrders 取消该币种的所有挂单 func (t *FuturesTrader) CancelAllOrders(symbol string) error { err := t.client.NewCancelAllOpenOrdersService(). @@ -425,6 +591,53 @@ func (t *FuturesTrader) CancelAllOrders(symbol string) error { return nil } +// CancelStopOrders 取消该币种的止盈/止损单(用于调整止盈止损位置) +func (t *FuturesTrader) CancelStopOrders(symbol string) error { + // 获取该币种的所有未完成订单 + orders, err := t.client.NewListOpenOrdersService(). + Symbol(symbol). + Do(context.Background()) + + if err != nil { + return fmt.Errorf("获取未完成订单失败: %w", err) + } + + // 过滤出止盈止损单并取消 + canceledCount := 0 + for _, order := range orders { + orderType := order.Type + + // 只取消止损和止盈订单 + if orderType == futures.OrderTypeStopMarket || + orderType == futures.OrderTypeTakeProfitMarket || + orderType == futures.OrderTypeStop || + orderType == futures.OrderTypeTakeProfit { + + _, err := t.client.NewCancelOrderService(). + Symbol(symbol). + OrderID(order.OrderID). + Do(context.Background()) + + if err != nil { + log.Printf(" ⚠ 取消订单 %d 失败: %v", order.OrderID, err) + continue + } + + canceledCount++ + log.Printf(" ✓ 已取消 %s 的止盈/止损单 (订单ID: %d, 类型: %s)", + symbol, order.OrderID, orderType) + } + } + + if canceledCount == 0 { + log.Printf(" ℹ %s 没有止盈/止损单需要取消", symbol) + } else { + log.Printf(" ✓ 已取消 %s 的 %d 个止盈/止损单", symbol, canceledCount) + } + + return nil +} + // GetMarketPrice 获取市场价格 func (t *FuturesTrader) GetMarketPrice(symbol string) (float64, error) { prices, err := t.client.NewListPricesService().Symbol(symbol).Do(context.Background()) @@ -528,6 +741,32 @@ func (t *FuturesTrader) SetTakeProfit(symbol string, positionSide string, quanti return nil } +// GetMinNotional 获取最小名义价值(Binance要求) +func (t *FuturesTrader) GetMinNotional(symbol string) float64 { + // 使用保守的默认值 10 USDT,确保订单能够通过交易所验证 + return 10.0 +} + +// CheckMinNotional 检查订单是否满足最小名义价值要求 +func (t *FuturesTrader) CheckMinNotional(symbol string, quantity float64) error { + price, err := t.GetMarketPrice(symbol) + if err != nil { + return fmt.Errorf("获取市价失败: %w", err) + } + + notionalValue := quantity * price + minNotional := t.GetMinNotional(symbol) + + if notionalValue < minNotional { + return fmt.Errorf( + "订单金额 %.2f USDT 低于最小要求 %.2f USDT (数量: %.4f, 价格: %.4f)", + notionalValue, minNotional, quantity, price, + ) + } + + return nil +} + // GetSymbolPrecision 获取交易对的数量精度 func (t *FuturesTrader) GetSymbolPrecision(symbol string) (int, error) { exchangeInfo, err := t.client.NewExchangeInfoService().Do(context.Background()) diff --git a/trader/hyperliquid_trader.go b/trader/hyperliquid_trader.go index c189dbdc..078b2135 100644 --- a/trader/hyperliquid_trader.go +++ b/trader/hyperliquid_trader.go @@ -2,10 +2,12 @@ package trader import ( "context" + "crypto/ecdsa" "encoding/json" "fmt" "log" "strconv" + "strings" "github.com/ethereum/go-ethereum/crypto" "github.com/sonirico/go-hyperliquid" @@ -22,6 +24,9 @@ type HyperliquidTrader struct { // NewHyperliquidTrader 创建Hyperliquid交易器 func NewHyperliquidTrader(privateKeyHex string, walletAddr string, testnet bool) (*HyperliquidTrader, error) { + // 去掉私钥的 0x 前缀(如果有,不区分大小写) + privateKeyHex = strings.TrimPrefix(strings.ToLower(privateKeyHex), "0x") + // 解析私钥 privateKey, err := crypto.HexToECDSA(privateKeyHex) if err != nil { @@ -34,13 +39,18 @@ func NewHyperliquidTrader(privateKeyHex string, walletAddr string, testnet bool) apiURL = hyperliquid.TestnetAPIURL } - // // 从私钥生成钱包地址 - // pubKey := privateKey.Public() - // publicKeyECDSA, ok := pubKey.(*ecdsa.PublicKey) - // if !ok { - // return nil, fmt.Errorf("无法转换公钥") - // } - // walletAddr := crypto.PubkeyToAddress(*publicKeyECDSA).Hex() + // 从私钥生成钱包地址(如果未提供) + if walletAddr == "" { + pubKey := privateKey.Public() + publicKeyECDSA, ok := pubKey.(*ecdsa.PublicKey) + if !ok { + return nil, fmt.Errorf("无法转换公钥") + } + walletAddr = crypto.PubkeyToAddress(*publicKeyECDSA).Hex() + log.Printf("✓ 从私钥自动生成钱包地址: %s", walletAddr) + } else { + log.Printf("✓ 使用提供的钱包地址: %s", walletAddr) + } ctx := context.Background() @@ -76,23 +86,54 @@ func NewHyperliquidTrader(privateKeyHex string, walletAddr string, testnet bool) func (t *HyperliquidTrader) GetBalance() (map[string]interface{}, error) { log.Printf("🔄 正在调用Hyperliquid API获取账户余额...") - // 获取账户状态 + // ✅ Step 1: 查询 Spot 现货账户余额 + spotState, err := t.exchange.Info().SpotUserState(t.ctx, t.walletAddr) + var spotUSDCBalance float64 = 0.0 + if err != nil { + log.Printf("⚠️ 查询 Spot 余额失败(可能无现货资产): %v", err) + } else if spotState != nil && len(spotState.Balances) > 0 { + for _, balance := range spotState.Balances { + if balance.Coin == "USDC" { + spotUSDCBalance, _ = strconv.ParseFloat(balance.Total, 64) + log.Printf("✓ 发现 Spot 现货余额: %.2f USDC", spotUSDCBalance) + break + } + } + } + + // ✅ Step 2: 查询 Perpetuals 合约账户状态 accountState, err := t.exchange.Info().UserState(t.ctx, t.walletAddr) if err != nil { - log.Printf("❌ Hyperliquid API调用失败: %v", err) + log.Printf("❌ Hyperliquid Perpetuals API调用失败: %v", err) return nil, fmt.Errorf("获取账户信息失败: %w", err) } // 解析余额信息(MarginSummary字段都是string) result := make(map[string]interface{}) - // 🔍 调试:打印API返回的完整CrossMarginSummary结构 - summaryJSON, _ := json.MarshalIndent(accountState.MarginSummary, " ", " ") - log.Printf("🔍 [DEBUG] Hyperliquid API CrossMarginSummary完整数据:") - log.Printf("%s", string(summaryJSON)) + // ✅ Step 3: 根据保证金模式动态选择正确的摘要(CrossMarginSummary 或 MarginSummary) + var accountValue, totalMarginUsed float64 + var summaryType string + var summary interface{} - accountValue, _ := strconv.ParseFloat(accountState.MarginSummary.AccountValue, 64) - totalMarginUsed, _ := strconv.ParseFloat(accountState.MarginSummary.TotalMarginUsed, 64) + if t.isCrossMargin { + // 全仓模式:使用 CrossMarginSummary + accountValue, _ = strconv.ParseFloat(accountState.CrossMarginSummary.AccountValue, 64) + totalMarginUsed, _ = strconv.ParseFloat(accountState.CrossMarginSummary.TotalMarginUsed, 64) + summaryType = "CrossMarginSummary (全仓)" + summary = accountState.CrossMarginSummary + } else { + // 逐仓模式:使用 MarginSummary + accountValue, _ = strconv.ParseFloat(accountState.MarginSummary.AccountValue, 64) + totalMarginUsed, _ = strconv.ParseFloat(accountState.MarginSummary.TotalMarginUsed, 64) + summaryType = "MarginSummary (逐仓)" + summary = accountState.MarginSummary + } + + // 🔍 调试:打印API返回的完整摘要结构 + summaryJSON, _ := json.MarshalIndent(summary, " ", " ") + log.Printf("🔍 [DEBUG] Hyperliquid API %s 完整数据:", summaryType) + log.Printf("%s", string(summaryJSON)) // ⚠️ 关键修复:从所有持仓中累加真正的未实现盈亏 totalUnrealizedPnl := 0.0 @@ -109,16 +150,47 @@ func (t *HyperliquidTrader) GetBalance() (map[string]interface{}, error) { // 需要返回"不包含未实现盈亏的钱包余额" walletBalanceWithoutUnrealized := accountValue - totalUnrealizedPnl - result["totalWalletBalance"] = walletBalanceWithoutUnrealized // 钱包余额(不含未实现盈亏) - result["availableBalance"] = accountValue - totalMarginUsed // 可用余额(总净值 - 占用保证金) - result["totalUnrealizedProfit"] = totalUnrealizedPnl // 未实现盈亏 + // ✅ Step 4: 使用 Withdrawable 欄位(PR #443) + // Withdrawable 是官方提供的真实可提现余额,比简单计算更可靠 + availableBalance := 0.0 + if accountState.Withdrawable != "" { + withdrawable, err := strconv.ParseFloat(accountState.Withdrawable, 64) + if err == nil && withdrawable > 0 { + availableBalance = withdrawable + log.Printf("✓ 使用 Withdrawable 作为可用余额: %.2f", availableBalance) + } + } - log.Printf("✓ Hyperliquid 账户: 总净值=%.2f (钱包%.2f+未实现%.2f), 可用=%.2f, 保证金占用=%.2f", + // 降级方案:如果没有 Withdrawable,使用简单计算 + if availableBalance == 0 && accountState.Withdrawable == "" { + availableBalance = accountValue - totalMarginUsed + if availableBalance < 0 { + log.Printf("⚠️ 计算出的可用余额为负数 (%.2f),重置为 0", availableBalance) + availableBalance = 0 + } + } + + // ✅ Step 5: 正確處理 Spot + Perpetuals 余额 + // 重要:Spot 只加到總資產,不加到可用餘額 + // 原因:Spot 和 Perpetuals 是獨立帳戶,需手動 ClassTransfer 才能轉帳 + totalWalletBalance := walletBalanceWithoutUnrealized + spotUSDCBalance + + result["totalWalletBalance"] = totalWalletBalance // 總資產(Perp + Spot) + result["availableBalance"] = availableBalance // 可用餘額(僅 Perpetuals,不含 Spot) + result["totalUnrealizedProfit"] = totalUnrealizedPnl // 未實現盈虧(僅來自 Perpetuals) + result["spotBalance"] = spotUSDCBalance // Spot 現貨餘額(單獨返回) + + log.Printf("✓ Hyperliquid 完整账户:") + log.Printf(" • Spot 现货余额: %.2f USDC (需手动转账到 Perpetuals 才能开仓)", spotUSDCBalance) + log.Printf(" • Perpetuals 合约净值: %.2f USDC (钱包%.2f + 未实现%.2f)", accountValue, walletBalanceWithoutUnrealized, - totalUnrealizedPnl, - result["availableBalance"], - totalMarginUsed) + totalUnrealizedPnl) + log.Printf(" • Perpetuals 可用余额: %.2f USDC (可直接用於開倉)", availableBalance) + log.Printf(" • 保证金占用: %.2f USDC", totalMarginUsed) + log.Printf(" • 總資產 (Perp+Spot): %.2f USDC", totalWalletBalance) + log.Printf(" ⭐ 总资产: %.2f USDC | Perp 可用: %.2f USDC | Spot 余额: %.2f USDC", + totalWalletBalance, availableBalance, spotUSDCBalance) return result, nil } @@ -477,6 +549,25 @@ func (t *HyperliquidTrader) CloseShort(symbol string, quantity float64) (map[str return result, nil } +// CancelStopOrders 取消该币种的止盈/止 + + +// CancelStopLossOrders 仅取消止损单(Hyperliquid 暂无法区分止损和止盈,取消所有) +func (t *HyperliquidTrader) CancelStopLossOrders(symbol string) error { + // Hyperliquid SDK 的 OpenOrder 结构不暴露 trigger 字段 + // 无法区分止损和止盈单,因此取消该币种的所有挂单 + log.Printf(" ⚠️ Hyperliquid 无法区分止损/止盈单,将取消所有挂单") + return t.CancelStopOrders(symbol) +} + +// CancelTakeProfitOrders 仅取消止盈单(Hyperliquid 暂无法区分止损和止盈,取消所有) +func (t *HyperliquidTrader) CancelTakeProfitOrders(symbol string) error { + // Hyperliquid SDK 的 OpenOrder 结构不暴露 trigger 字段 + // 无法区分止损和止盈单,因此取消该币种的所有挂单 + log.Printf(" ⚠️ Hyperliquid 无法区分止损/止盈单,将取消所有挂单") + return t.CancelStopOrders(symbol) +} + // CancelAllOrders 取消该币种的所有挂单 func (t *HyperliquidTrader) CancelAllOrders(symbol string) error { coin := convertSymbolToHyperliquid(symbol) @@ -501,6 +592,40 @@ func (t *HyperliquidTrader) CancelAllOrders(symbol string) error { return nil } +// CancelStopOrders 取消该币种的止盈/止损单(用于调整止盈止损位置) +func (t *HyperliquidTrader) CancelStopOrders(symbol string) error { + coin := convertSymbolToHyperliquid(symbol) + + // 获取所有挂单 + openOrders, err := t.exchange.Info().OpenOrders(t.ctx, t.walletAddr) + if err != nil { + return fmt.Errorf("获取挂单失败: %w", err) + } + + // 注意:Hyperliquid SDK 的 OpenOrder 结构不暴露 trigger 字段 + // 因此暂时取消该币种的所有挂单(包括止盈止损单) + // 这是安全的,因为在设置新的止盈止损之前,应该清理所有旧订单 + canceledCount := 0 + for _, order := range openOrders { + if order.Coin == coin { + _, err := t.exchange.Cancel(t.ctx, coin, order.Oid) + if err != nil { + log.Printf(" ⚠ 取消订单失败 (oid=%d): %v", order.Oid, err) + continue + } + canceledCount++ + } + } + + if canceledCount == 0 { + log.Printf(" ℹ %s 没有挂单需要取消", symbol) + } else { + log.Printf(" ✓ 已取消 %s 的 %d 个挂单(包括止盈/止损单)", symbol, canceledCount) + } + + return nil +} + // GetMarketPrice 获取市场价格 func (t *HyperliquidTrader) GetMarketPrice(symbol string) (float64, error) { coin := convertSymbolToHyperliquid(symbol) diff --git a/trader/interface.go b/trader/interface.go index 18d75ee7..3d3a6e90 100644 --- a/trader/interface.go +++ b/trader/interface.go @@ -36,9 +36,18 @@ type Trader interface { // SetTakeProfit 设置止盈单 SetTakeProfit(symbol string, positionSide string, quantity, takeProfitPrice float64) error + // CancelStopLossOrders 仅取消止损单(修复 BUG:调整止损时不删除止盈) + CancelStopLossOrders(symbol string) error + + // CancelTakeProfitOrders 仅取消止盈单(修复 BUG:调整止盈时不删除止损) + CancelTakeProfitOrders(symbol string) error + // CancelAllOrders 取消该币种的所有挂单 CancelAllOrders(symbol string) error + // CancelStopOrders 取消该币种的止盈/止损单(用于调整止盈止损位置) + CancelStopOrders(symbol string) error + // FormatQuantity 格式化数量到正确的精度 FormatQuantity(symbol string, quantity float64) (string, error) } diff --git a/view_pg_data.sh b/view_pg_data.sh index 1ae89206..59a7aef5 100755 --- a/view_pg_data.sh +++ b/view_pg_data.sh @@ -59,15 +59,7 @@ GROUP BY used ORDER BY used; " -echo -e "\n📝 未使用的内测码:" -$DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " -SELECT code -FROM beta_codes -WHERE used = false -ORDER BY created_at DESC; -" - echo -e "\n👥 用户信息:" $DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " SELECT id, email, otp_verified, created_at FROM users ORDER BY created_at; -" +" \ No newline at end of file diff --git a/web/.husky/pre-commit b/web/.husky/pre-commit new file mode 100644 index 00000000..72c4429b --- /dev/null +++ b/web/.husky/pre-commit @@ -0,0 +1 @@ +npm test diff --git a/web/.prettierignore b/web/.prettierignore new file mode 100644 index 00000000..2ca5a7fe --- /dev/null +++ b/web/.prettierignore @@ -0,0 +1,22 @@ +# Dependencies +node_modules + +# Build outputs +dist +build +*.tsbuildinfo + +# Config files +pnpm-lock.yaml +package-lock.json +yarn.lock + +# Logs +*.log + +# Coverage +coverage + +# IDE +.vscode +.idea diff --git a/web/.prettierrc.json b/web/.prettierrc.json new file mode 100644 index 00000000..6cd408d1 --- /dev/null +++ b/web/.prettierrc.json @@ -0,0 +1,13 @@ +{ + "semi": false, + "trailingComma": "es5", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "endOfLine": "lf", + "arrowParens": "always", + "bracketSpacing": true, + "jsxSingleQuote": false, + "quoteProps": "as-needed" +} diff --git a/web/eslint.config.js b/web/eslint.config.js new file mode 100644 index 00000000..625ec65b --- /dev/null +++ b/web/eslint.config.js @@ -0,0 +1,89 @@ +import js from '@eslint/js' +import tseslint from '@typescript-eslint/eslint-plugin' +import tsparser from '@typescript-eslint/parser' +import react from 'eslint-plugin-react' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import prettier from 'eslint-plugin-prettier' + +export default [ + { + ignores: ['dist', 'node_modules', 'build', '*.config.js'] + }, + js.configs.recommended, + { + files: ['**/*.{ts,tsx}'], + languageOptions: { + parser: tsparser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + ecmaFeatures: { + jsx: true + } + }, + globals: { + window: 'readonly', + document: 'readonly', + console: 'readonly', + setTimeout: 'readonly', + clearTimeout: 'readonly', + setInterval: 'readonly', + clearInterval: 'readonly', + fetch: 'readonly', + localStorage: 'readonly', + sessionStorage: 'readonly' + } + }, + plugins: { + '@typescript-eslint': tseslint, + 'react': react, + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + 'prettier': prettier + }, + rules: { + ...tseslint.configs.recommended.rules, + ...react.configs.recommended.rules, + ...reactHooks.configs.recommended.rules, + + // Prettier integration + 'prettier/prettier': 'error', + + // React rules + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + // 该规则在 TS 项目中经常与 TS 的类型检查重复,关闭以避免误报 + 'no-undef': 'off', + + // TypeScript rules + // 放宽以下规则以避免在不改变功能的情况下大面积改动代码 + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-unused-vars': 'off', + + // React Refresh + 'react-refresh/only-export-components': 'off', + + // General rules + 'no-console': 'off', + 'no-debugger': 'off', + + // 新版 react-hooks 推荐规则在本项目会造成大量误报,关闭以免影响开发体验 + 'react-hooks/set-state-in-effect': 'off', + 'react-hooks/static-components': 'off', + 'react-hooks/preserve-manual-memoization': 'off', + + // 某些字符串中包含未转义字符用于展示,关闭以避免不必要的修改 + 'react/no-unescaped-entities': 'off', + + // 可视情况关闭依赖数组校验(如需严格可改为 'warn') + 'react-hooks/exhaustive-deps': 'off' + }, + settings: { + react: { + version: 'detect' + } + } + } +] diff --git a/web/package-lock.json b/web/package-lock.json index 08b930ea..a117b2cb 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -22,11 +22,23 @@ "zustand": "^5.0.2" }, "devDependencies": { + "@eslint/js": "^9.39.1", "@types/react": "^18.3.17", "@types/react-dom": "^18.3.5", + "@typescript-eslint/eslint-plugin": "^8.46.3", + "@typescript-eslint/parser": "^8.46.3", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "husky": "^9.1.7", + "lint-staged": "^16.2.6", "postcss": "^8.4.49", + "prettier": "^3.6.2", "tailwindcss": "^3.4.17", "typescript": "^5.8.3", "vite": "^6.0.7" @@ -732,6 +744,247 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/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/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/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/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/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/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/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/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -839,6 +1092,19 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmmirror.com/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.1.2", "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", @@ -1265,6 +1531,13 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/prop-types": { "version": "15.7.15", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", @@ -1291,6 +1564,255 @@ "@types/react": "^18.0.0" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz", + "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/type-utils": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.3", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.46.3.tgz", + "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.46.3.tgz", + "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.3", + "@typescript-eslint/types": "^8.46.3", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz", + "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz", + "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz", + "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3", + "@typescript-eslint/utils": "8.46.3", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.46.3.tgz", + "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz", + "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.3", + "@typescript-eslint/tsconfig-utils": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/visitor-keys": "8.46.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.46.3.tgz", + "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.3", + "@typescript-eslint/types": "8.46.3", + "@typescript-eslint/typescript-estree": "8.46.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.3", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz", + "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.3", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", @@ -1311,6 +1833,63 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-7.2.0.tgz", + "integrity": "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -1360,6 +1939,161 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/autoprefixer": { "version": "10.4.21", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -1397,6 +2131,22 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1479,6 +2229,66 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -1508,6 +2318,39 @@ } ] }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/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/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "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/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1556,6 +2399,56 @@ "url": "https://polar.sh/cva" } }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-5.1.1.tgz", + "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^7.1.0", + "string-width": "^8.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -1582,6 +2475,13 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -1591,6 +2491,13 @@ "node": ">= 6" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -1738,6 +2645,60 @@ "node": ">=12" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-fns": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", @@ -1769,6 +2730,49 @@ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -1789,6 +2793,19 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dom-helpers": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", @@ -1798,6 +2815,21 @@ "csstype": "^3.0.2" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1816,6 +2848,196 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.25.11", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", @@ -1866,11 +3088,406 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz", + "integrity": "sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/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/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/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/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/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/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/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/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmmirror.com/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/fast-equals": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.2.tgz", @@ -1907,6 +3524,20 @@ "node": ">= 6" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -1916,6 +3547,19 @@ "reusify": "^1.0.4" } }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -1928,6 +3572,60 @@ "node": ">=8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -2007,6 +3705,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2016,6 +3755,76 @@ "node": ">=6.9.0" } }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -2048,6 +3857,137 @@ "node": ">=10.13.0" } }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -2060,6 +4000,91 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmmirror.com/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/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -2068,6 +4093,60 @@ "node": ">=12" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2080,6 +4159,36 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -2095,6 +4204,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2104,6 +4248,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2113,6 +4273,26 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2125,6 +4305,32 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2134,12 +4340,199 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -2170,6 +4563,19 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -2182,6 +4588,27 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2194,6 +4621,46 @@ "node": ">=6" } }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -2212,11 +4679,200 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/lint-staged": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/lint-staged/-/lint-staged-16.2.6.tgz", + "integrity": "sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^14.0.1", + "listr2": "^9.0.5", + "micromatch": "^4.0.8", + "nano-spawn": "^2.0.0", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.8.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "14.0.2", + "resolved": "https://registry.npmmirror.com/commander/-/commander-14.0.2.tgz", + "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/listr2": { + "version": "9.0.5", + "resolved": "https://registry.npmmirror.com/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^5.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -2246,6 +4902,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2268,6 +4934,19 @@ "node": ">=8.6" } }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -2324,6 +5003,19 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nano-spawn": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/nano-spawn/-/nano-spawn-2.0.0.tgz", + "integrity": "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -2342,6 +5034,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/node-releases": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", @@ -2383,12 +5082,217 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2444,6 +5348,19 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -2462,6 +5379,16 @@ "node": ">= 6" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -2619,6 +5546,46 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -2634,6 +5601,16 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2773,6 +5750,50 @@ "decimal.js-light": "^2.4.1" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -2793,6 +5814,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -2803,6 +5851,13 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, "node_modules/rollup": { "version": "4.52.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", @@ -2867,6 +5922,61 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -2884,6 +5994,55 @@ "semver": "bin/semver.js" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2905,6 +6064,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "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.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -2917,6 +6152,39 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2926,6 +6194,30 @@ "node": ">=0.10.0" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -2985,6 +6277,104 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", @@ -3022,6 +6412,19 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -3044,6 +6447,19 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -3068,6 +6484,22 @@ "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tailwind-merge": { "version": "3.3.1", "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-3.3.1.tgz", @@ -3199,6 +6631,19 @@ "node": ">=8.0" } }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -3211,11 +6656,103 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3224,6 +6761,25 @@ "node": ">=14.17" } }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", @@ -3254,6 +6810,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/use-sync-external-store": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", @@ -3409,6 +6975,105 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -3506,6 +7171,56 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "dev": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/zustand": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz", diff --git a/web/package.json b/web/package.json index ed1c0732..f8c4655a 100644 --- a/web/package.json +++ b/web/package.json @@ -5,7 +5,12 @@ "scripts": { "dev": "vite", "build": "tsc && vite build", - "preview": "vite preview" + "preview": "vite preview", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "lint:fix": "eslint . --ext ts,tsx --fix", + "format": "prettier --write \"src/**/*.{ts,tsx,css,json}\"", + "format:check": "prettier --check \"src/**/*.{ts,tsx,css,json}\"", + "prepare": "husky" }, "dependencies": { "@radix-ui/react-slot": "^1.2.3", @@ -22,13 +27,34 @@ "zustand": "^5.0.2" }, "devDependencies": { + "@eslint/js": "^9.39.1", "@types/react": "^18.3.17", "@types/react-dom": "^18.3.5", + "@typescript-eslint/eslint-plugin": "^8.46.3", + "@typescript-eslint/parser": "^8.46.3", "@vitejs/plugin-react": "^4.3.4", "autoprefixer": "^10.4.20", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react": "^7.37.5", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.4.24", + "husky": "^9.1.7", + "lint-staged": "^16.2.6", "postcss": "^8.4.49", + "prettier": "^3.6.2", "tailwindcss": "^3.4.17", "typescript": "^5.8.3", "vite": "^6.0.7" + }, + "lint-staged": { + "*.{ts,tsx}": [ + "eslint --fix", + "prettier --write" + ], + "*.{css,json}": [ + "prettier --write" + ] } } diff --git a/web/public/images/guide.png b/web/public/images/guide.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1abd2ea7af14448d53122a9b8dfa82438c6f58 GIT binary patch literal 729412 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%0D8I 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

M4{t_IG^}6%i{erBL|=O3ZZT7F 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 z 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

gpJ#Y11@` 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 E1HsHa8r@!KnAOp+5LC!WU@s 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�m>klV%6MDzjTh4Z) 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

xLU_K1ibCw14X}s5UGD33@FRNRp_fonIJM8x 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 +#xbY8mbTAUco>X!nSDhH>kA~g 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 bq7jOki7fhYs`=@&>y;m=EBt!+()a%XyZKHW literal 0 HcmV?d00001 diff --git a/web/src/App.tsx b/web/src/App.tsx index 14cf29d6..b57081c5 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,18 +1,19 @@ -import { useEffect, useState } from 'react'; -import useSWR from 'swr'; -import { api } from './lib/api'; -import { EquityChart } from './components/EquityChart'; -import { AITradersPage } from './components/AITradersPage'; -import { LoginPage } from './components/LoginPage'; -import { RegisterPage } from './components/RegisterPage'; -import { CompetitionPage } from './components/CompetitionPage'; -import { LandingPage } from './pages/LandingPage'; -import HeaderBar from './components/landing/HeaderBar'; -import AILearning from './components/AILearning'; -import { LanguageProvider, useLanguage } from './contexts/LanguageContext'; -import { AuthProvider, useAuth } from './contexts/AuthContext'; -import { t, type Language } from './i18n/translations'; -import { useSystemConfig } from './hooks/useSystemConfig'; +import { useEffect, useState } from 'react' +import useSWR from 'swr' +import { api } from './lib/api' +import { EquityChart } from './components/EquityChart' +import { AITradersPage } from './components/AITradersPage' +import { LoginPage } from './components/LoginPage' +import { RegisterPage } from './components/RegisterPage' +import { CompetitionPage } from './components/CompetitionPage' +import { LandingPage } from './pages/LandingPage' +import HeaderBar from './components/landing/HeaderBar' +import AILearning from './components/AILearning' +import { LanguageProvider, useLanguage } from './contexts/LanguageContext' +import { AuthProvider, useAuth } from './contexts/AuthContext' +import { t, type Language } from './i18n/translations' +import { useSystemConfig } from './hooks/useSystemConfig' +import { AlertTriangle } from 'lucide-react' import type { SystemStatus, AccountInfo, @@ -20,67 +21,76 @@ import type { DecisionRecord, Statistics, TraderInfo, -} from './types'; +} from './types' -type Page = 'competition' | 'traders' | 'trader'; +type Page = 'competition' | 'traders' | 'trader' // 获取友好的AI模型名称 function getModelDisplayName(modelId: string): string { switch (modelId.toLowerCase()) { case 'deepseek': - return 'DeepSeek'; + return 'DeepSeek' case 'qwen': - return 'Qwen'; + return 'Qwen' case 'claude': - return 'Claude'; + return 'Claude' default: - return modelId.toUpperCase(); + return modelId.toUpperCase() } } function App() { - const { language, setLanguage } = useLanguage(); - const { user, token, logout, isLoading } = useAuth(); - const { config: systemConfig, loading: configLoading } = useSystemConfig(); - const [route, setRoute] = useState(window.location.pathname); + const { language, setLanguage } = useLanguage() + const { user, token, logout, isLoading } = useAuth() + const { config: systemConfig, loading: configLoading } = useSystemConfig() + const [route, setRoute] = useState(window.location.pathname) // 从URL路径读取初始页面状态(支持刷新保持页面) const getInitialPage = (): Page => { - const path = window.location.pathname; - const hash = window.location.hash.slice(1); // 去掉 # - - if (path === '/traders' || hash === 'traders') return 'traders'; - if (path === '/dashboard' || hash === 'trader' || hash === 'details') return 'trader'; - return 'competition'; // 默认为竞赛页面 - }; + const path = window.location.pathname + const hash = window.location.hash.slice(1) // 去掉 # - const [currentPage, setCurrentPage] = useState(getInitialPage()); - const [selectedTraderId, setSelectedTraderId] = useState(); - const [lastUpdate, setLastUpdate] = useState('--:--:--'); + if (path === '/traders' || hash === 'traders') return 'traders' + if (path === '/dashboard' || hash === 'trader' || hash === 'details') + return 'trader' + return 'competition' // 默认为竞赛页面 + } + + const [currentPage, setCurrentPage] = useState(getInitialPage()) + const [selectedTraderId, setSelectedTraderId] = useState() + const [lastUpdate, setLastUpdate] = useState('--:--:--') // 监听URL变化,同步页面状态 useEffect(() => { const handleRouteChange = () => { - const path = window.location.pathname; - const hash = window.location.hash.slice(1); - - if (path === '/traders' || hash === 'traders') { - setCurrentPage('traders'); - } else if (path === '/dashboard' || hash === 'trader' || hash === 'details') { - setCurrentPage('trader'); - } else if (path === '/competition' || hash === 'competition' || hash === '') { - setCurrentPage('competition'); - } - setRoute(path); - }; + const path = window.location.pathname + const hash = window.location.hash.slice(1) - window.addEventListener('hashchange', handleRouteChange); - window.addEventListener('popstate', handleRouteChange); + if (path === '/traders' || hash === 'traders') { + setCurrentPage('traders') + } else if ( + path === '/dashboard' || + hash === 'trader' || + hash === 'details' + ) { + setCurrentPage('trader') + } else if ( + path === '/competition' || + hash === 'competition' || + hash === '' + ) { + setCurrentPage('competition') + } + setRoute(path) + } + + window.addEventListener('hashchange', handleRouteChange) + window.addEventListener('popstate', handleRouteChange) return () => { - window.removeEventListener('hashchange', handleRouteChange); - window.removeEventListener('popstate', handleRouteChange); - }; - }, []); + window.removeEventListener('hashchange', handleRouteChange) + window.removeEventListener('popstate', handleRouteChange) + } + }, []) // 切换页面时更新URL hash (当前通过按钮直接调用setCurrentPage,这个函数暂时保留用于未来扩展) // const navigateToPage = (page: Page) => { @@ -90,19 +100,19 @@ function App() { // 获取trader列表(仅在用户登录时) const { data: traders } = useSWR( - user && token ? 'traders' : null, - api.getTraders, + user && token ? 'traders' : null, + api.getTraders, { refreshInterval: 10000, } - ); + ) // 当获取到traders后,设置默认选中第一个 useEffect(() => { if (traders && traders.length > 0 && !selectedTraderId) { - setSelectedTraderId(traders[0].trader_id); + setSelectedTraderId(traders[0].trader_id) } - }, [traders, selectedTraderId]); + }, [traders, selectedTraderId]) // 如果在trader页面,获取该trader的数据 const { data: status } = useSWR( @@ -115,7 +125,7 @@ function App() { revalidateOnFocus: false, // 禁用聚焦时重新验证,减少请求 dedupingInterval: 10000, // 10秒去重,防止短时间内重复请求 } - ); + ) const { data: account } = useSWR( currentPage === 'trader' && selectedTraderId @@ -127,7 +137,7 @@ function App() { revalidateOnFocus: false, // 禁用聚焦时重新验证,减少请求 dedupingInterval: 10000, // 10秒去重,防止短时间内重复请求 } - ); + ) const { data: positions } = useSWR( currentPage === 'trader' && selectedTraderId @@ -139,7 +149,7 @@ function App() { revalidateOnFocus: false, // 禁用聚焦时重新验证,减少请求 dedupingInterval: 10000, // 10秒去重,防止短时间内重复请求 } - ); + ) const { data: decisions } = useSWR( currentPage === 'trader' && selectedTraderId @@ -151,7 +161,7 @@ function App() { revalidateOnFocus: false, dedupingInterval: 20000, } - ); + ) const { data: stats } = useSWR( currentPage === 'trader' && selectedTraderId @@ -163,62 +173,71 @@ function App() { revalidateOnFocus: false, dedupingInterval: 20000, } - ); + ) useEffect(() => { if (account) { - const now = new Date().toLocaleTimeString(); - setLastUpdate(now); + const now = new Date().toLocaleTimeString() + setLastUpdate(now) } - }, [account]); + }, [account]) - const selectedTrader = traders?.find((t) => t.trader_id === selectedTraderId); + const selectedTrader = traders?.find((t) => t.trader_id === selectedTraderId) // Handle routing useEffect(() => { const handlePopState = () => { - setRoute(window.location.pathname); - }; - window.addEventListener('popstate', handlePopState); - return () => window.removeEventListener('popstate', handlePopState); - }, []); + setRoute(window.location.pathname) + } + window.addEventListener('popstate', handlePopState) + return () => window.removeEventListener('popstate', handlePopState) + }, []) // Set current page based on route for consistent navigation state useEffect(() => { if (route === '/competition') { - setCurrentPage('competition'); + setCurrentPage('competition') } else if (route === '/traders') { - setCurrentPage('traders'); + setCurrentPage('traders') } else if (route === '/dashboard') { - setCurrentPage('trader'); + setCurrentPage('trader') } - }, [route]); + }, [route]) // Show loading spinner while checking auth or config if (isLoading || configLoading) { return ( -

+
- NoFx Logo + NoFx Logo

{t('loading', language)}

- ); + ) } // Handle specific routes regardless of authentication if (route === '/login') { - return ; + return } if (route === '/register') { - return ; + return } if (route === '/competition') { return ( -
- + { - console.log('Competition page onPageChange called with:', page); - console.log('Current route:', route, 'Current page:', currentPage); - + console.log('Competition page onPageChange called with:', page) + console.log('Current route:', route, 'Current page:', currentPage) + if (page === 'competition') { - console.log('Navigating to competition'); - window.history.pushState({}, '', '/competition'); - setRoute('/competition'); - setCurrentPage('competition'); + console.log('Navigating to competition') + window.history.pushState({}, '', '/competition') + setRoute('/competition') + setCurrentPage('competition') } else if (page === 'traders') { - console.log('Navigating to traders'); - window.history.pushState({}, '', '/traders'); - setRoute('/traders'); - setCurrentPage('traders'); + console.log('Navigating to traders') + window.history.pushState({}, '', '/traders') + setRoute('/traders') + setCurrentPage('traders') } else if (page === 'trader') { - console.log('Navigating to trader/dashboard'); - window.history.pushState({}, '', '/dashboard'); - setRoute('/dashboard'); - setCurrentPage('trader'); + console.log('Navigating to trader/dashboard') + window.history.pushState({}, '', '/dashboard') + setRoute('/dashboard') + setCurrentPage('trader') } - - console.log('After navigation - route:', route, 'currentPage:', currentPage); + + console.log( + 'After navigation - route:', + route, + 'currentPage:', + currentPage + ) }} />
- ); + ) } - + // Show landing page for root route if (route === '/' || route === '') { - return ; + return } - + // Show main app for authenticated users on other routes if (!systemConfig?.admin_mode && (!user || !token)) { // Default to landing page when not authenticated and no specific route - return ; + return } return ( -
- + { - console.log('Main app onPageChange called with:', page); - + console.log('Main app onPageChange called with:', page) + if (page === 'competition') { - window.history.pushState({}, '', '/competition'); - setRoute('/competition'); - setCurrentPage('competition'); + window.history.pushState({}, '', '/competition') + setRoute('/competition') + setCurrentPage('competition') } else if (page === 'traders') { - window.history.pushState({}, '', '/traders'); - setRoute('/traders'); - setCurrentPage('traders'); + window.history.pushState({}, '', '/traders') + setRoute('/traders') + setCurrentPage('traders') } else if (page === 'trader') { - window.history.pushState({}, '', '/dashboard'); - setRoute('/dashboard'); - setCurrentPage('trader'); + window.history.pushState({}, '', '/dashboard') + setRoute('/dashboard') + setCurrentPage('trader') } }} /> @@ -301,12 +328,12 @@ function App() { {currentPage === 'competition' ? ( ) : currentPage === 'traders' ? ( - { - setSelectedTraderId(traderId); - window.history.pushState({}, '', '/dashboard'); - setRoute('/dashboard'); - setCurrentPage('trader'); + setSelectedTraderId(traderId) + window.history.pushState({}, '', '/dashboard') + setRoute('/dashboard') + setCurrentPage('trader') }} /> ) : ( @@ -327,8 +354,14 @@ function App() { {/* Footer */} -
- ); + ) } return (
{/* Trader Header */} -
+
-

- +

+ 🤖 {selectedTrader.trader_name}

- + {/* Trader Selector */} {traders && traders.length > 0 && (
- {t('switchTrader', language)}: + + {t('switchTrader', language)}: + setCoinPool(e.target.value)} placeholder="https://api.example.com/coinpool" className="w-full px-3 py-2 rounded" - style={{ background: '#0B0E11', border: '1px solid #2B3139', color: '#EAECEF' }} + style={{ + background: '#0B0E11', + border: '1px solid #2B3139', + color: '#EAECEF', + }} />
{t('coinPoolDescription', language)} @@ -885,7 +1220,10 @@ function SignalSourceModal({
-
-
-
+
+
ℹ️ {t('information', language)}
@@ -932,7 +1283,7 @@ function SignalSourceModal({
- ); + ) } // Model Configuration Modal Component @@ -943,58 +1294,73 @@ function ModelConfigModal({ onSave, onDelete, onClose, - language + language, }: { - allModels: AIModel[]; - configuredModels: AIModel[]; - editingModelId: string | null; - onSave: (modelId: string, apiKey: string, baseUrl?: string, modelName?: string) => void; - onDelete: (modelId: string) => void; - onClose: () => void; - language: Language; + allModels: AIModel[] + configuredModels: AIModel[] + editingModelId: string | null + onSave: ( + modelId: string, + apiKey: string, + baseUrl?: string, + modelName?: string + ) => void + onDelete: (modelId: string) => void + onClose: () => void + language: Language }) { - const [selectedModelId, setSelectedModelId] = useState(editingModelId || ''); - const [apiKey, setApiKey] = useState(''); - const [baseUrl, setBaseUrl] = useState(''); - const [modelName, setModelName] = useState(''); + const [selectedModelId, setSelectedModelId] = useState(editingModelId || '') + const [apiKey, setApiKey] = useState('') + const [baseUrl, setBaseUrl] = useState('') + const [modelName, setModelName] = useState('') // 获取当前编辑的模型信息 - 编辑时从已配置的模型中查找,新建时从所有支持的模型中查找 const selectedModel = editingModelId - ? configuredModels?.find(m => m.id === selectedModelId) - : allModels?.find(m => m.id === selectedModelId); + ? configuredModels?.find((m) => m.id === selectedModelId) + : allModels?.find((m) => m.id === selectedModelId) // 如果是编辑现有模型,初始化API Key、Base URL和Model Name useEffect(() => { if (editingModelId && selectedModel) { - setApiKey(selectedModel.apiKey || ''); - setBaseUrl(selectedModel.customApiUrl || ''); - setModelName(selectedModel.customModelName || ''); + setApiKey(selectedModel.apiKey || '') + setBaseUrl(selectedModel.customApiUrl || '') + setModelName(selectedModel.customModelName || '') } - }, [editingModelId, selectedModel]); + }, [editingModelId, selectedModel]) const handleSubmit = (e: React.FormEvent) => { - e.preventDefault(); - if (!selectedModelId || !apiKey.trim()) return; + e.preventDefault() + if (!selectedModelId || !apiKey.trim()) return - onSave(selectedModelId, apiKey.trim(), baseUrl.trim() || undefined, modelName.trim() || undefined); - }; + onSave( + selectedModelId, + apiKey.trim(), + baseUrl.trim() || undefined, + modelName.trim() || undefined + ) + } // 可选择的模型列表(所有支持的模型) - const availableModels = allModels || []; + const availableModels = allModels || [] return (
-
+

- {editingModelId ? t('editAIModel', language) : t('addAIModel', language)} + {editingModelId + ? t('editAIModel', language) + : t('addAIModel', language)}

{editingModelId && ( - )} +
+ {selectedExchange?.id === 'binance' && ( + + )} + {editingExchangeId && ( + + )} +
{!editingExchangeId && (
-