1. 26 Dec, 2025 26 commits
  2. 25 Dec, 2025 14 commits
    • shaw's avatar
      b31698b9
    • Forest's avatar
      refactor: 自定义业务错误 · eeaff85e
      Forest authored
      eeaff85e
    • Forest's avatar
      refactor: 删除 ports 目录 · f51ad2e1
      Forest authored
      f51ad2e1
    • hi_yueban's avatar
      fix: 修复 OpenAI 账号 5h/7d 使用限制显示错误的问题 (#30) · f57f12c6
      hi_yueban authored
      * fix: 修复 OpenAI 账号 5h/7d 使用限制显示错误的问题
      
      问题描述:
      - 账号管理页面中,OpenAI OAuth 账号的 5h 列显示 7 天的剩余时间
      - 7d 列却显示几小时的剩余时间
      - 根本原因: OpenAI 响应头中 primary/secondary 的实际含义与代码假设相反
      
      修复方案:
      1. 后端归一化 (openai_gateway_service.go):
         - 根据 window_minutes 动态判断哪个是 5h/7d 限制
         - 新增规范字段 codex_5h_* 和 codex_7d_*
         - 保留旧字段以兼容性
      
      2. 前端适配 (AccountUsageCell.vue):
         - 优先使用新的规范字段
         - Fallback 到旧字段时基于 window_minutes 动态判断
         - 更新 computed 属性命名
      
      3. 类型定义更新 (types/index.ts):
         - 添加新的规范字段定义
         - 更新注释说明实际语义由 window_minutes 决定
      
      🤖
      
       Generated with Claude Code and Codex collaboration
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      Co-Authored-By: default avatarOpenAI Codex <noreply@openai.com>
      
      * fix: 改进窗口判断逻辑,修复两个窗口都小于阈值时的bug
      
      问题:
      当两个窗口都小于360分钟时(如 primary=180分钟,secondary=300分钟),
      之前的逻辑会导致:
      - primary5h = true, secondary5h = true
      - 5h 字段会使用 primary(错误)
      - 7d 字段没有数据(bug)
      
      修复方案:
      改用比较策略:
      1. 当两个窗口都存在时:较小的分配给5h,较大的分配给7d
      2. 当只有一个窗口时:根据大小(<=360分钟)判断是5h还是7d
      3. 确保数据不会丢失,逻辑更健壮
      
      示例:
      - Primary: 180分钟, Secondary: 300分钟
        → 5h 使用 Primary(180分钟), 7d 使用 Secondary(300分钟) ✓
      
      🤖
      
       Generated with Claude Code
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      
      * fix: 修正窗口大小判断逻辑 - 不能用剩余时间判断窗口类型
      
      **严重bug修复:**
      之前的 fallback 逻辑错误地使用 reset_after_seconds 来判断窗口大小。
      
      问题示例:
      - 周限制(7d)剩余 2h → reset_after_seconds = 7200秒
      - 5h限制 剩余 4h → reset_after_seconds = 14400秒
      - 错误逻辑:7200/60 < 14400/60,把周限制当成5h 
      
      根本问题:
      - window_minutes = 窗口的总大小(300 or 10080)
      - reset_after_seconds = 距离重置的剩余时间(变化的)
      - 不能用剩余时间来判断窗口类型!
      
      修复方案:
      1. **只使用 window_minutes** 来判断窗口大小
      2. 移除错误的 reset_after_seconds fallback
      3. 如果 window_minutes 都不存在,使用传统假设
      4. 添加详细注释说明这个陷阱
      
      🤖
      
       Generated with Claude Code
      Co-Authored-By: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      
      * fix: 修复 lint 问题 - 改进 fallback 逻辑的变量赋值
      
      问题:
      第882-883行的简单布尔赋值可能触发 ineffassign 或 staticcheck 警告:
        use5hFromSecondary = snapshot.SecondaryUsedPercent != nil
        use7dFromPrimary = snapshot.PrimaryUsedPercent != nil
      
      修复:
      改用明确的 if 语句检查任意字段是否存在,更符合代码意图:
      - 如果 secondary 的任意字段存在,将其视为 5h
      - 如果 primary 的任意字段存在,将其视为 7d
      
      这样逻辑更清晰,也避免了 lint 警告。
      
      ---------
      Co-authored-by: default avatarClaude Sonnet 4.5 <noreply@anthropic.com>
      Co-authored-by: default avatarOpenAI Codex <noreply@openai.com>
      f57f12c6
    • shaw's avatar
      fix: 修复image地址 · 5fca2d10
      shaw authored
      5fca2d10
    • shaw's avatar
      chore: 调整403重试次数跟间隔 · 8fbe1ad7
      shaw authored
      8fbe1ad7
    • Forest's avatar
      test: 增加 repository 测试 · 25a304c2
      Forest authored
      25a304c2
    • 刀刀's avatar
      CC 400 返回具体错误信息 && 非 CC 请求时增加 system prompt (#26) · 9d30ceae
      刀刀 authored
      * feat: http 400 返回具体错误
      
      * 更新 workflows
      
      * 优化打包/docker 构建流程
      
      * 400 是返回 原始错误 - json 格式
      
      * feat: 非 cc请求时补充 system
      
      * go mod tidy
      9d30ceae
    • IanShaw's avatar
      feat: CRS 同步增强 - 自动刷新 OAuth token 和修复测试配置 (#27) · 60f6ed6b
      IanShaw authored
      * fix(service): 修复 OpenAI Responses API 测试负载配置
      
      - 所有账号类型统一添加 instructions 字段(不再仅限 OAuth)
      - Responses API 要求所有请求必须包含 instructions 参数
      
      * feat(crs-sync): CRS 同步时自动刷新 OAuth token 并保留完整 extra 字段
      
      **核心功能**:
      - CRSSyncService 注入 OAuth 服务依赖(Anthropic + OpenAI)
      - 账号创建/更新后自动刷新 OAuth token,确保可用性
      - 完整保留 CRS extra 字段,避免数据丢失
      
      **Extra 字段增强**:
      - 保留 CRS 所有原始 extra 字段
      - 新增同步元数据: crs_account_id, crs_kind, crs_synced_at
      - Claude 账号: 从 credentials 提取 org_uuid/account_uuid 到 extra
      - OpenAI 账号: 映射 crs_email -> email
      
      **Token 刷新逻辑**:
      - 新增 refreshOAuthToken() 方法处理 Anthropic/OpenAI 平台
      - 保留原有 credentials 字段,仅更新 token 相关字段
      - 刷新失败静默处理,不中断同步流程
      
      **依赖注入**:
      - wire_gen.go: CRSSyncService 新增 oAuthService/openaiOAuthService
      
      * style(crs-sync): 使用 switch 替代 if-else 修复 golangci-lint 警告
      
      - 将 refreshOAuthToken 中的 if-else 改为 switch 语句
      - 符合 staticcheck 规范
      - 添加 default 分支处理未知平台
      60f6ed6b
    • shaw's avatar
      chore: CRS迁移功能增加版本提示 · 4a2f7d4a
      shaw authored
      4a2f7d4a
    • shaw's avatar
      Merge PR #24: feat: 添加账户同步与批量编辑功能 · c19a393b
      shaw authored
      - 添加从 CRS 同步账户功能 (Claude OAuth/API Key, OpenAI OAuth/Responses)
      - 添加批量编辑账户功能,支持 JSONB 字段智能合并
      - 新增 CRSSyncService、BulkUpdate 仓储方法
      - 前端新增 SyncFromCrsModal 和 BulkEditAccountModal 组件
      c19a393b
    • ianshaw's avatar
      style(frontend): format code with prettier · 938ffb00
      ianshaw authored
      格式化前端业务代码,符合代码规范
      - 统一代码风格
      - 修复 ESLint 警告
      938ffb00
    • ianshaw's avatar
      fix(backend): handle defer Close() errors in crs_sync_service · 372a0129
      ianshaw authored
      修复 golangci-lint 错误检查问题
      - 使用匿名函数包装 defer Close() 并忽略错误
      - 符合 Go 最佳实践
      372a0129
    • ianshaw's avatar
      chore: trigger CI after enabling Actions · 8b163ca4
      ianshaw authored
      8b163ca4