1. 29 Dec, 2025 23 commits
    • song's avatar
      fix(antigravity): 修复 429 限流处理逻辑 · caa8c47b
      song authored
      - 只有 5 次重试全部失败后才标记账户限流
      - 使用 Gemini 格式解析 429 响应中的重试时间
      - Claude 模型无重试时间时默认 1 分钟,Gemini 默认 5 分钟
      - 添加生图模型映射 gemini-3-pro-image-preview
      caa8c47b
    • yangjianbo's avatar
      fix(仓储): 修复 ApiKey 更新并发语义 · 042d8235
      yangjianbo authored
      ApiKey 更新时显式设置 updated_at 并回填,避免二次查询竞态
      补充软删除范围注释以统一审计语义
      042d8235
    • yangjianbo's avatar
      fix(仓储): 修复软删除过滤与事务测试 · ae191f72
      yangjianbo authored
      修复软删除拦截器使用错误,确保默认查询过滤已删记录
      仓储层改用 ent.Tx 与扫描辅助,避免 sql.Tx 断言问题
      同步更新集成测试以覆盖事务与统计变动
      ae191f72
    • song's avatar
      fix: gofmt · 42e2c506
      song authored
      42e2c506
    • song's avatar
      style: interface{} → any (gofmt rewrite rule) · bc75edd8
      song authored
      bc75edd8
    • song's avatar
    • song's avatar
      fix: 删除未使用的代码并修复格式 · 026740b5
      song authored
      - 删除 client.go 中未使用的 proxyURL 字段
      - 删除 AntigravityGatewayService 中未使用的字段和方法
      - 修复 gofmt 格式问题
      026740b5
    • song's avatar
      fix: 修复 golangci-lint 检查错误 · 21a04332
      song authored
      - SA1029: 创建 ctxkey 包定义类型安全的 context key
      - ST1005: 错误字符串首字母改小写
      - errcheck: 显式忽略 bytes.Buffer.Write 返回值
      - 修复单元测试中 GatewayService 缺少 cfg 字段的问题
      21a04332
    • yangjianbo's avatar
      fix(用户): 修复删除用户软删除钩子 · 4dab18a9
      yangjianbo authored
      避免软删除钩子类型断言失败导致 500\n删除无记录时返回未找到错误并记录日志
      4dab18a9
    • song's avatar
      234e98f1
    • song's avatar
      feat(antigravity): 添加专用路由,支持仅使用 antigravity 账户 · b31bfd53
      song authored
      添加 /antigravity/v1/* 和 /antigravity/v1beta/* 路由:
      - 通过 ForcePlatform 中间件强制使用 antigravity 平台
      - 跳过混合调度逻辑,仅调度 antigravity 账户
      - 支持按分组优先查找,找不到时回退查询全部 antigravity 账户
      
      修复 context key 类型不匹配问题:
      - middleware 和 service 统一使用字符串常量 "ctx_force_platform"
      - 解决 Go context.Value() 类型+值匹配导致的读取失败
      
      其他改动:
      - 嵌入式前端中间件白名单添加 /antigravity/ 路径
      - e2e 测试 Gemini 端点 URL 添加 endpointPrefix 支持
      b31bfd53
    • IanShaw027's avatar
      feat(frontend): 优化弹窗组件架构和用户体验 · 23412965
      IanShaw027 authored
      - 使用 BaseDialog 替代旧版 Modal 组件
      - 添加平滑过渡动画和更好的可访问性支持
      - 新增 ExportProgressDialog 导出进度弹窗
      - 优化所有账号管理和使用记录相关弹窗
      - 更新国际化文案,改进用户交互体验
      - 精简依赖,减少 package.json 体积
      23412965
    • yangjianbo's avatar
      fix(仓储层): 修复事务 ent client 调用 Close() 导致的 panic · 5584709a
      yangjianbo authored
      问题:创建用户时发生 panic,错误信息为
      "interface conversion: sql.ExecQuerier is *sql.Tx, not *sql.DB"
      
      原因:基于事务创建的 ent client 在调用 Close() 时,ent 的 sql driver
      会尝试将 ExecQuerier 断言为 *sql.DB 来关闭连接,但实际类型是 *sql.Tx
      
      修复:移除对 txClient.Close() 的调用,事务的清理通过
      sqlTx.Rollback() 和 sqlTx.Commit() 完成即可
      
      影响范围:
      - user_repo.go: Create 和 Update 方法
      - group_repo.go: Delete 方法
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      5584709a
    • yangjianbo's avatar
      test(用户): 补齐创建用户与注册单测 · 305eaabb
      yangjianbo authored
      覆盖管理员创建用户与注册流程的关键失败分支\n完善创建成功路径的断言
      305eaabb
    • yangjianbo's avatar
      test(删除): 添加删除单测并修复中间件测试 · f6de36cb
      yangjianbo authored
      新增 AdminService 删除路径单元测试与规范场景更新\n同步调整 Google API Key 中间件测试桩与签名
      f6de36cb
    • yangjianbo's avatar
      test(服务层): 添加删除方法的单元测试 · 100d9d20
      yangjianbo authored
      - 新增 AccountService.Delete 方法的 4 个测试用例
      - 新增 ApiKeyService.Delete 方法的 4 个测试用例
      - 使用 stub 模式隔离数据库依赖,验证权限检查和缓存清理逻辑
      - 添加详细的中文注释说明测试设计和预期行为
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      100d9d20
    • yangjianbo's avatar
      perf(后端): 优化删除操作的数据库查询性能 · e9c755f4
      yangjianbo authored
      - 新增 ExistsByID 方法用于账号存在性检查,避免加载完整对象
      - 新增 GetOwnerID 方法用于 API Key 所有权验证,仅查询 user_id 字段
      - 优化 AccountService.Delete 使用轻量级存在性检查
      - 优化 ApiKeyService.Delete 使用轻量级权限验证
      - 改进前端删除错误提示,显示后端返回的具体错误消息
      - 添加详细的中文注释说明优化原因
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      e9c755f4
    • yangjianbo's avatar
      fix(构建): 删除遗留的 GORM auto_migrate.go 文件 · 8ab924ad
      yangjianbo authored
      该文件是 GORM 迁移到 Ent ORM 过程中遗留的,仍然导入了
      gorm.io/gorm,导致 Docker 构建失败。
      
      文件中的功能已被迁移到 SQL 迁移文件中:
      - fixInvalidExpiresAt → 006_fix_invalid_subscription_expires_at.sql
      - ensureDefaultGroups → 001_init.sql
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      8ab924ad
    • yangjianbo's avatar
      fix(数据库): 修复默认分组缺失与迁移锁阻塞 · 3a7d3387
      yangjianbo authored
      通过迁移补种默认 groups 记录,避免新装空分组
      迁移锁改为 try lock + 重试并加入超时
      写入 usage_logs 时保留 rate_multiplier=0 语义
      测试: go test ./...
      3a7d3387
    • yangjianbo's avatar
      refactor(数据库): 迁移持久层到 Ent 并清理 GORM · 3d617de5
      yangjianbo authored
      将仓储层/基础设施改为 Ent + 原生 SQL 执行路径,并移除 AutoMigrate 与 GORM 依赖。
      重构内容包括:
      - 仓储层改用 Ent/SQL(含 usage_log/account 等复杂查询),统一错误映射
      - 基础设施与 setup 初始化切换为 Ent + SQL migrations
      - 集成测试与 fixtures 迁移到 Ent 事务模型
      - 清理遗留 GORM 模型/依赖,补充迁移与文档说明
      - 增加根目录 Makefile 便于前后端编译
      
      测试:
      - go test -tags unit ./...
      - go test -tags integration ./...
      3d617de5
    • song's avatar
      feat(antigravity): 添加混合调度可选功能 · 1ad29032
      song authored
      - 后端:账户模型添加 IsMixedSchedulingEnabled() 方法,读取 extra.mixed_scheduling
      - 后端:gateway_service 和 gemini_messages_compat_service 支持混合调度逻辑
      - 后端:分组创建支持指定 platform 参数
      - 前端:账户创建/编辑弹窗添加混合调度开关(仅 antigravity 账户显示)
      - 前端:混合调度开关添加问号图标和 tooltip 说明
      - 前端:GroupSelector 支持根据 mixedScheduling 属性过滤分组
      - 前端:分组创建支持选择 platform
      - 测试:e2e 测试添加 ENDPOINT_PREFIX 环境变量支持混合/隔离模式测试
      - 测试:删除过时的 Claude signature 测试用例
      1ad29032
    • shaw's avatar
      fix: 修复因移除 SimpleMode 导致的测试编译错误 · 32b4b139
      shaw authored
      - 移除 api_contract_test.go 中的 SettingKeySimpleMode 引用
      - 移除期望响应中的 simple_mode 字段
      - 修复 NewSettingHandler 调用参数数量
      32b4b139
    • shaw's avatar
      refactor: 移除旧版数据库配置的简易模式实现 · 31fef105
      shaw authored
      移除与 PR #66 冲突的旧版简易模式实现(commit 7d4b7dee)。
      新版简易模式通过 run_mode 配置文件/环境变量控制,无需数据库设置。
      
      后端变更:
      - 移除 SettingKeySimpleMode 常量
      - 移除 SystemSettings/PublicSettings 中的 SimpleMode 字段
      - 移除 setting_handler 中的简易模式切换逻辑
      - 移除 userService 依赖(不再需要自动设置管理员并发数)
      
      前端变更:
      - 移除 appStore.simpleMode 状态
      - 移除设置页面的"使用模式"设置区块
      - 移除 GroupsView 中的简易模式相关逻辑
      - 移除相关国际化文案
      31fef105
  2. 28 Dec, 2025 17 commits
    • IanShaw027's avatar
      test: 修复分组测试以适配默认分组 · 9e9811cb
      IanShaw027 authored
      由于简易模式会自动创建3个默认分组(anthropic-default, openai-default, gemini-default),
      需要更新测试用例的预期数量:
      - TestList: 期望5个分组(3个默认 + 2个测试)
      - TestListActive: 期望4个活跃分组(3个默认 + 1个测试)
      - TestListActiveByPlatform: 期望2个Anthropic分组(1个默认 + 1个测试)
      - TestListWithFilters_Platform: 期望2个OpenAI分组(1个默认 + 1个测试)
      9e9811cb
    • IanShaw027's avatar
      feat(全栈): 实现简易模式核心功能 · ecfad788
      IanShaw027 authored
      **功能概述**:
      实现简易模式(Simple Mode),为个人用户和小团队提供简化的使用体验,隐藏复杂的分组、订阅、配额等概念。
      
      **后端改动**:
      1. 配置系统
         - 新增 run_mode 配置项(standard/simple)
         - 支持环境变量 RUN_MODE
         - 默认值为 standard
      
      2. 数据库初始化
         - 自动创建3个默认分组:anthropic-default、openai-default、gemini-default
         - 默认分组配置:无并发限制、active状态、非独占
         - 幂等性保证:重复启动不会重复创建
      
      3. 账号管理
         - 创建账号时自动绑定对应平台的默认分组
         - 如果未指定分组,自动查找并绑定默认分组
      
      **前端改动**:
      1. 状态管理
         - authStore 新增 isSimpleMode 计算属性
         - 从后端API获取并同步运行模式
      
      2. UI隐藏
         - 侧边栏:隐藏分组管理、订阅管理、兑换码菜单
         - 账号管理页面:隐藏分组列
         - 创建/编辑账号对话框:隐藏分组选择器
      
      3. 路由守卫
         - 限制访问分组、订阅、兑换码相关页面
         - 访问受限页面时自动重定向到仪表板
      
      **配置示例**:
      ```yaml
      run_mode: simple
      
      run_mode: standard
      ```
      
      **影响范围**:
      - 后端:配置、数据库迁移、账号服务
      - 前端:认证状态、路由、UI组件
      - 部署:配置文件示例
      
      **兼容性**:
      - 简易模式和标准模式可无缝切换
      - 不需要数据迁移
      - 现有数据不受影响
      ecfad788
    • song's avatar
      cf1d0f23
    • song's avatar
      test: 添加 Claude signature 场景 e2e 测试 · 995adaee
      song authored
      - 新增 TestClaudeMessagesWithClaudeSignature 测试
      - 验证历史 thinking block 带有 Claude signature 时的处理
      - 修复配额刷新服务的次要问题
      995adaee
    • shaw's avatar
      fix(usage): 分离 API 响应和窗口统计缓存,修复 5h 窗口未激活时的显示 bug · 30b95cf5
      shaw authored
      问题:
      1. WindowStats 与 API 响应一起缓存 10 分钟,导致费用数据更新延迟
      2. 当 5h 窗口未激活(ResetsAt 为空)时,FiveHour 为 nil,导致所有窗口的 WindowStats 都无法显示
      
      修复:
      - 分离缓存:API 响应缓存 10 分钟,窗口统计独立缓存 1 分钟
      - RemainingSeconds 每次请求时实时计算
      - FiveHour 对象始终创建(即使 ResetsAt 为空)
      - addWindowStats 增强防护,支持 FiveHour 为 nil 时仍处理其他窗口
      30b95cf5
    • shaw's avatar
      fix(test): 测试用例添加 simple_mode 字段 · 25b8a226
      shaw authored
      API 响应新增 simple_mode 字段,同步更新测试期望值
      25b8a226
    • shaw's avatar
      fix: 修复 NewSettingHandler 参数不足导致的编译错误 · 0084da9c
      shaw authored
      - 测试文件添加第三个参数 userService(nil)
      - Handler 添加 userService 空指针检查,防止测试环境 panic
      0084da9c
    • song's avatar
      feat(antigravity): 添加配额窗口显示功能 · 08ce6de4
      song authored
      后端:
      - 新增 AntigravityQuotaRefresher 定时刷新配额
      - Client 添加 FetchAvailableModels 方法获取模型配额
      - 配额数据存入 account.extra.quota 字段
      
      前端:
      - AccountUsageCell 支持显示 Antigravity 账户配额
      - UsageProgressBar 新增 amber 颜色
      - 显示 G3P/G3F/G3I/C4.5 四个配额进度条
      08ce6de4
    • shaw's avatar
      feat: 添加简单模式功能 · 7d4b7dee
      shaw authored
      新增简单模式设置,适合个人使用场景:
      - 隐藏多用户管理相关菜单(用户管理、兑换码等)
      - 自动关闭用户注册功能
      - 管理员并发数自动设为无限制(99999)
      - 侧边栏根据模式动态调整菜单项
      
      同时优化分组页面的"专属分组"功能,添加帮助提示说明使用场景
      7d4b7dee
    • song's avatar
      build: e2e 测试添加 build tag 避免 CI 运行 · b6b73943
      song authored
      - 添加 //go:build e2e tag,CI 不会自动运行这些测试
      - Makefile 添加 test-e2e 目标用于本地手动运行
      b6b73943
    • song's avatar
      fix(gateway): Antigravity 账户 count_tokens 返回估算值 · ad15d997
      song authored
      Antigravity 不支持 count_tokens 转发,直接返回估算值,
      与 Antigravity-Manager 和 proxycast 实现保持一致。
      
      修复 count_tokens 请求选择到 Antigravity 账户时导致 401 的问题。
      ad15d997
    • song's avatar
      test: 更新 thinking signature 测试用例 · ff57c860
      song authored
      将测试从无效signature改为无signature场景:
      - 无效 signature 应该被上游拒绝(预期行为)
      - Gemini 模型接受没有 signature 的 thinking block
      ff57c860
    • song's avatar
      fix(antigravity): 只有 Gemini 模型支持 dummy thought signature · 635d7e77
      song authored
      参考 Antigravity-Manager 的实现:
      - 添加 allowDummyThought 参数,只有 gemini-* 模型才启用
      - Claude 模型通过 Vertex API 需要有效的 thought signatures
      - thinking block 保留原有 signature
      - tool_use 只在 Gemini 模型时才使用 dummy signature
      635d7e77
    • song's avatar
      fix(antigravity): 与 proxycast 保持一致的 thought_signature 处理 · ba9eb684
      song authored
      - function_call 无条件添加 dummy thought_signature(与 proxycast 一致)
      - thinking block 在 thinking 模式下统一使用 dummy signature 替换历史无效 signature
      - 添加测试用例:TestClaudeMessagesWithInvalidThinkingSignature
      ba9eb684
    • song's avatar
      fix(antigravity): 修复 Gemini 3 thought_signature 和 schema 验证问题 · 9594c9c8
      song authored
      - 添加 dummyThoughtSignature 常量,在 thinking 模式下为无 signature 的 tool_use 自动添加
      - 增强 cleanJSONSchema:过滤 required 中不存在的属性,确保 type/properties 字段存在
      - 扩展 excludedSchemaKeys:增加 $id, $ref, strict, const, examples 等不支持的字段
      - 修复 429 重试逻辑:仅在所有重试失败后才标记账户为 rate_limited
      - 添加 e2e 集成测试:TestClaudeMessagesWithThinkingAndTools
      9594c9c8
    • song's avatar
    • song's avatar