1. 15 Jan, 2026 1 commit
  2. 10 Jan, 2026 2 commits
  3. 09 Jan, 2026 1 commit
  4. 06 Jan, 2026 1 commit
    • yangjianbo's avatar
      fix(安全): 修复依赖漏洞并强化安全扫描 · 3f0017d1
      yangjianbo authored
      主要改动:
      - 固定 Go 1.25.5 与 CI 校验并更新扫描流程
      - 升级 quic-go、x/crypto、req 等依赖并通过 govulncheck
      - 强化 JWT 校验、TLS 配置与 xlsx 动态加载
      - 新增审计豁免清单与校验脚本
      3f0017d1
  5. 05 Jan, 2026 2 commits
    • shaw's avatar
      fix(frontend): 启用 vue-i18n JIT 编译修复消息插值不工作问题 · 090c9e66
      shaw authored
      问题:使用 vue-i18n 运行时版本后,带变量的翻译(如 '{days} 天')
      无法正确显示,直接显示原始字符串。
      
      原因:运行时版本不含消息编译器,无法在运行时编译消息插值。
      
      解决:启用 JIT 编译(__INTLIFY_JIT_COMPILATION__: true)
      - JIT 编译器将消息编译为 AST 对象而非 JavaScript 代码
      - 通过解释执行 AST 实现插值,无需 eval 或 new Function
      - 符合 CSP script-src 'self' 策略,不降低安全性
      
      同时将 vite.config.js.timestamp-* 临时文件添加到 .gitignore
      090c9e66
    • shaw's avatar
      07d80f76
  6. 03 Jan, 2026 1 commit
    • ianshaw's avatar
      chore: 更新依赖、配置和代码生成 · 112a2d08
      ianshaw authored
      主要更新:
      - 更新 go.mod/go.sum 依赖
      - 重新生成 Ent ORM 代码
      - 更新 Wire 依赖注入配置
      - 添加 docker-compose.override.yml 到 .gitignore
      - 更新 README 文档(Simple Mode 说明和已知问题)
      - 清理调试日志
      - 其他代码优化和格式修复
      112a2d08
  7. 02 Jan, 2026 2 commits
    • IanShaw's avatar
      运维监控系统安全加固和功能优化 (#21) · 45bd9ac7
      IanShaw authored
      * fix(ops): 修复运维监控系统的关键安全和稳定性问题
      
      ## 修复内容
      
      ### P0 严重问题
      1. **DNS Rebinding防护** (ops_alert_service.go)
         - 实现IP钉住机制防止验证后的DNS rebinding攻击
         - 自定义Transport.DialContext强制只允许拨号到验证过的公网IP
         - 扩展IP黑名单,包括云metadata地址(169.254.169.254)
         - 添加完整的单元测试覆盖
      
      2. **OpsAlertService生命周期管理** (wire.go)
         - 在ProvideOpsMetricsCollector中添加opsAlertService.Start()调用
         - 确保stopCtx正确初始化,避免nil指针问题
         - 实现防御式启动,保证服务启动顺序
      
      3. **数据库查询排序** (ops_repo.go)
         - 在ListRecentSystemMetrics中添加显式ORDER BY updated_at DESC, id DESC
         - 在GetLatestSystemMetric中添加排序保证
         - 避免数据库返回顺序不确定导致告警误判
      
      ### P1 重要问题
      4. **并发安全** (ops_metrics_collector.go)
         - 为lastGCPauseTotal字段添加sync.Mutex保护
         - 防止数据竞争
      
      5. **Goroutine泄漏** (ops_error_logger.go)
         - 实现worker pool模式限制并发goroutine数量
         - 使用256容量缓冲队列和10个固定worker
         - 非阻塞投递,队列满时丢弃任务
      
      6. **生命周期控制** (ops_alert_service.go)
         - 添加Start/Stop方法实现优雅关闭
         - 使用context控制goroutine生命周期
         - 实现WaitGroup等待后台任务完成
      
      7. **Webhook URL验证** (ops_alert_service.go)
         - 防止SSRF攻击:验证scheme、禁止内网IP
         - DNS解析验证,拒绝解析到私有IP的域名
         - 添加8个单元测试覆盖各种攻击场景
      
      8. **资源泄漏** (ops_repo.go)
         - 修复多处defer rows.Close()问题
         - 简化冗余的defer func()包装
      
      9. **HTTP超时控制** (ops_alert_service.go)
         - 创建带10秒超时的http.Client
         - 添加buildWebhookHTTPClient辅助函数
         - 防止HTTP请求无限期挂起
      
      10. **数据库查询优化** (ops_repo.go)
          - 将GetWindowStats的4次独立查询合并为1次CTE查询
          - 减少网络往返和表扫描次数
          - 显著提升性能
      
      11. **重试机制** (ops_alert_service.go)
          - 实现邮件发送重试:最多3次,指数退避(1s/2s/4s)
          - 添加webhook备用通道
          - 实现完整的错误处理和日志记录
      
      12. **魔法数字** (ops_repo.go, ops_metrics_collector.go)
          - 提取硬编码数字为有意义的常量
          - 提高代码可读性和可维护性
      
      ## 测试验证
      -  go test ./internal/service -tags opsalert_unit 通过
      -  所有webhook验证测试通过
      -  重试机制测试通过
      
      ## 影响范围
      - 运维监控系统安全性显著提升
      - 系统稳定性和性能优化
      - 无破坏性变更,向后兼容
      
      * feat(ops): 运维监控系统V2 - 完整实现
      
      ## 核心功能
      - 运维监控仪表盘V2(实时监控、历史趋势、告警管理)
      - WebSocket实时QPS/TPS监控(30s心跳,自动重连)
      - 系统指标采集(CPU、内存、延迟、错误率等)
      - 多维度统计分析(按provider、model、user等维度)
      - 告警规则管理(阈值配置、通知渠道)
      - 错误日志追踪(详细错误信息、堆栈跟踪)
      
      ## 数据库Schema (Migration 025)
      ### 扩展现有表
      - ops_system_metrics: 新增RED指标、错误分类、延迟指标、资源指标、业务指标
      - ops_alert_rules: 新增JSONB字段(dimension_filters, notify_channels, notify_config)
      
      ### 新增表
      - ops_dimension_stats: 多维度统计数据
      - ops_data_retention_config: 数据保留策略配置
      
      ### 新增视图和函数
      - ops_latest_metrics: 最新1分钟窗口指标(已修复字段名和window过滤)
      - ops_active_alerts: 当前活跃告警(已修复字段名和状态值)
      - calculate_health_score: 健康分数计算函数
      
      ## 一致性修复(98/100分)
      ### P0级别(阻塞Migration)
      -  修复ops_latest_metrics视图字段名(latency_p99→p99_latency_ms, cpu_usage→cpu_usage_percent)
      -  修复ops_active_alerts视图字段名(metric→metric_type, triggered_at→fired_at, trigger_value→metric_value, threshold→threshold_value)
      -  统一告警历史表名(删除ops_alert_history,使用ops_alert_events)
      -  统一API参数限制(ListMetricsHistory和ListErrorLogs的limit改为5000)
      
      ### P1级别(功能完整性)
      -  修复ops_latest_metrics视图未过滤window_minutes(添加WHERE m.window_minutes = 1)
      -  修复数据回填UPDATE逻辑(QPS计算改为request_count/(window_minutes*60.0))
      -  添加ops_alert_rules JSONB字段后端支持(Go结构体+序列化)
      
      ### P2级别(优化)
      -  前端WebSocket自动重连(指数退避1s→2s→4s→8s→16s,最大5次)
      -  后端WebSocket心跳检测(30s ping,60s pong超时)
      
      ## 技术实现
      ### 后端 (Go)
      - Handler层: ops_handler.go(REST API), ops_ws_handler.go(WebSocket)
      - Service层: ops_service.go(核心逻辑), ops_cache.go(缓存), ops_alerts.go(告警)
      - Repository层: ops_repo.go(数据访问), ops.go(模型定义)
      - 路由: admin.go(新增ops相关路由)
      - 依赖注入: wire_gen.go(自动生成)
      
      ### 前端 (Vue3 + TypeScript)
      - 组件: OpsDashboardV2.vue(仪表盘主组件)
      - API: ops.ts(REST API + WebSocket封装)
      - 路由: index.ts(新增/admin/ops路由)
      - 国际化: en.ts, zh.ts(中英文支持)
      
      ## 测试验证
      -  所有Go测试通过
      -  Migration可正常执行
      -  WebSocket连接稳定
      -  前后端数据结构对齐
      
      * refactor: 代码清理和测试优化
      
      ## 测试文件优化
      - 简化integration test fixtures和断言
      - 优化test helper函数
      - 统一测试数据格式
      
      ## 代码清理
      - 移除未使用的代码和注释
      - 简化concurrency_cache实现
      - 优化middleware错误处理
      
      ## 小修复
      - 修复gateway_handler和openai_gateway_handler的小问题
      - 统一代码风格和格式
      
      变更统计: 27个文件,292行新增,322行删除(净减少30行)
      
      * fix(ops): 运维监控系统安全加固和功能优化
      
      ## 安全增强
      - feat(security): WebSocket日志脱敏机制,防止token/api_key泄露
      - feat(security): X-Forwarded-Host白名单验证,防止CSRF绕过
      - feat(security): Origin策略配置化,支持strict/permissive模式
      - feat(auth): WebSocket认证支持query参数传递token
      
      ## 配置优化
      - feat(config): 支持环境变量配置代理信任和Origin策略
        - OPS_WS_TRUST_PROXY
        - OPS_WS_TRUSTED_PROXIES
        - OPS_WS_ORIGIN_POLICY
      - fix(ops): 错误日志查询限流从5000降至500,优化内存使用
      
      ## 架构改进
      - refactor(ops): 告警服务解耦,独立运行评估定时器
      - refactor(ops): OpsDashboard统一版本,移除V2分离
      
      ## 测试和文档
      - test(ops): 添加WebSocket安全验证单元测试(8个测试用例)
      - test(ops): 添加告警服务集成测试
      - docs(api): 更新API文档,标注限流变更
      - docs: 添加CHANGELOG记录breaking changes
      
      ## 修复文件
      Backend:
      - backend/internal/server/middleware/logger.go
      - backend/internal/handler/admin/ops_handler.go
      - backend/internal/handler/admin/ops_ws_handler.go
      - backend/internal/server/middleware/admin_auth.go
      - backend/internal/service/ops_alert_service.go
      - backend/internal/service/ops_metrics_collector.go
      - backend/internal/service/wire.go
      
      Frontend:
      - frontend/src/views/admin/ops/OpsDashboard.vue
      - frontend/src/router/index.ts
      - frontend/src/api/admin/ops.ts
      
      Tests:
      - backend/internal/handler/admin/ops_ws_handler_test.go (新增)
      - backend/internal/service/ops_alert_service_integration_test.go (新增)
      
      Docs:
      - CHANGELOG.md (新增)
      - docs/API-运维监控中心2.0.md (更新)
      
      * fix(migrations): 修复calculate_health_score函数类型匹配问题
      
      在ops_latest_metrics视图中添加显式类型转换,确保参数类型与函数签名匹配
      
      * fix(lint): 修复golangci-lint检查发现的所有问题
      
      - 将Redis依赖从service层移到repository层
      - 添加错误检查(WebSocket连接和读取超时)
      - 运行gofmt格式化代码
      - 添加nil指针检查
      - 删除未使用的alertService字段
      
      修复问题:
      - depguard: 3个(service层不应直接import redis)
      - errcheck: 3个(未检查错误返回值)
      - gofmt: 2个(代码格式问题)
      - staticcheck: 4个(nil指针解引用)
      - unused: 1个(未使用字段)
      
      代码统计:
      - 修改文件:11个
      - 删除代码:490行
      - 新增代码:105行
      - 净减少:385行
      45bd9ac7
    • IanShaw's avatar
      Fix/multiple issues (#24) · 7fdc2b2d
      IanShaw authored
      * fix(gemini): 修复 google_one OAuth 配置和 scopes 问题
      
      - 修复 google_one 类型在 ExchangeCode 和 RefreshToken 中使用内置客户端
      - 添加 DefaultGoogleOneScopes,包含 generative-language 和 drive.readonly 权限
      - 在 EffectiveOAuthConfig 中为 google_one 类型使用专门的 scopes
      - 将 docker-compose.override.yml 重命名为 .example 并添加到 .gitignore
      - 完善 docker-compose.override.yml.example 示例文档
      
      解决问题:
      1. google_one OAuth 授权后 API 调用返回 403 权限不足
      2. 缺少访问 Gemini API 所需的 generative-language scope
      3. 缺少获取 Drive 存储配额所需的 drive.readonly scope
      
      * fix(antigravity): 完全跳过 Claude 模型的所有 thinking 块
      
      问题分析:
      - 当前代码尝试保留有 signature 的 thinking 块
      - 但 Vertex AI 的 signature 是完整性令牌,无法在本地验证
      - 导致 400 错误:Invalid signature in thinking block
      
      根本原因:
      1. thinking 功能已对非 Gemini 模型禁用 (isThinkingEnabled=false)
      2. Vertex AI 要求原样重放 (thinking, signature) 对或完全不发送
      3. 本地无法复制 Vertex 的加密验证逻辑
      
      修复方案:
      - 对 Claude 模型完全跳过所有 thinking 块(无论是否有 signature)
      - 保持 Gemini 模型使用 dummy signature 的行为不变
      - 更新测试用例以反映新的预期行为
      
      影响:
      - 消除 thinking 相关的 400 错误
      - 与现有的 thinking 禁用策略保持一致
      - 不影响 Gemini 模型的 thinking 功能
      
      测试:
      -  TestBuildParts_ThinkingBlockWithoutSignature 全部通过
      -  TestBuildTools_CustomTypeTools 全部通过
      
      参考:Codex review 建议
      
      * fix(gateway): 修复 count_tokens 端点 400 错误
      
      问题分析:
      - count_tokens 请求包含 thinking 块时返回 400 错误
      - 原因:thinking 块未被过滤,直接转发到上游 API
      - 上游 API 拒绝无效的 thinking signature
      
      根本原因:
      1. /v1/messages 请求通过 TransformClaudeToGemini 过滤 thinking 块
      2. count_tokens 请求绕过转换,直接转发原始请求体
      3. 导致包含无效 signature 的 thinking 块被发送到上游
      
      修复方案:
      - 创建 FilterThinkingBlocks 工具函数
      - 在 buildCountTokensRequest 中应用过滤(1 行修改)
      - 与 /v1/messages 行为保持一致
      
      实现细节:
      - FilterThinkingBlocks: 解析 JSON,过滤 thinking 块,重新序列化
      - 失败安全:解析/序列化失败时返回原始请求体
      - 性能优化:仅在发现 thinking 块时重新序列化
      
      测试:
      -  6 个单元测试全部通过
      -  覆盖正常过滤、无 thinking 块、无效 JSON 等场景
      -  现有测试不受影响
      
      影响:
      - 消除 count_tokens 的 400 错误
      - 不影响 Antigravity 账号(仍返回模拟响应)
      - 适用于所有账号类型(OAuth、API Key)
      
      文件修改:
      - backend/internal/service/gateway_request.go: +62 行(新函数)
      - backend/internal/service/gateway_service.go: +2 行(应用过滤)
      - backend/internal/service/gateway_request_test.go: +62 行(测试)
      
      * fix(gateway): 增强 thinking 块过滤逻辑
      
      基于 Codex 分析和建议的改进:
      
      问题分析:
      - 新错误:signature: Field required(signature 字段缺失)
      - 旧错误:Invalid signature(signature 存在但无效)
      - 两者都说明 thinking 块在请求中是危险的
      
      Codex 建议:
      - 保持 Option A:完全跳过所有 thinking 块
      - 原因:thinking 块应该是只输出的,除非有服务端来源证明
      - 在无状态代理中,无法安全区分上游来源 vs 客户端注入
      
      改进内容:
      
      1. 增强 FilterThinkingBlocks 函数
         - 过滤显式的 thinking 块:{"type":"thinking", ...}
         - 过滤无 type 的 thinking 对象:{"thinking": {...}}
         - 保留 tool_use 等其他类型块中的 thinking 字段
         - 修复:只在实际过滤时更新 content 数组
      
      2. 扩展过滤范围
         - 将 FilterThinkingBlocks 应用到 /v1/messages 主路径
         - 之前只应用于 count_tokens,现在两个端点都过滤
         - 防止所有端点的 thinking 相关 400 错误
      
      3. 改进测试
         - 新增:过滤无 type discriminator 的 thinking 块
         - 新增:不过滤 tool_use 中的 thinking 字段
         - 使用 containsThinkingBlock 辅助函数验证
      
      测试:
      -  8 个测试用例全部通过
      -  覆盖各种 thinking 块格式
      -  确保不误伤其他类型的块
      
      影响:
      - 消除 signature required 和 invalid signature 错误
      - 统一 /v1/messages 和 count_tokens 的行为
      - 更健壮的 thinking 块检测逻辑
      
      参考:Codex review 和代码改进
      
      * refactor: 根据 Codex 审查建议进行代码优化
      
      基于 Codex 代码审查的 P1 和 P2 改进:
      
      P1 改进(重要问题):
      
      1. 优化日志输出
         - 移除 thinking 块跳过时的 log.Printf
         - 避免高频请求下的日志噪音
         - 添加注释说明可通过指标监控
      
      2. 清理遗留代码
         - 删除未使用的 isValidThoughtSignature 函数(27行)
         - 该函数在改为完全跳过 thinking 块后不再需要
      
      P2 改进(性能优化):
      
      3. 添加快速路径检查
         - 在 FilterThinkingBlocks 中添加 bytes.Contains 预检查
         - 如果请求体不包含 "thinking" 字符串,直接返回
         - 避免不必要的 JSON 解析,提升性能
      
      技术细节:
      - request_transformer.go: -27行(删除函数),+1行(优化注释)
      - gateway_request.go: +5行(快速路径 + bytes 导入)
      
      测试:
      -  TestBuildParts_ThinkingBlockWithoutSignature 全部通过
      -  TestFilterThinkingBlocks 全部通过(8个测试用例)
      
      影响:
      - 减少日志噪音
      - 提升性能(快速路径)
      - 代码更简洁(删除未使用代码)
      
      参考:Codex 代码审查建议
      
      * fix: 修复 golangci-lint 检查问题
      
      - 格式化 gateway_request_test.go
      - 使用 switch 语句替代 if-else 链(staticcheck QF1003)
      
      * fix(antigravity): 修复 thinking signature 处理并实现 Auto 模式降级
      
      问题分析:
      1. 原先代码错误地禁用了 Claude via Vertex 的 thinkingConfig
      2. 历史 thinking 块的 signature 被完全跳过,导致验证失败
      3. 跨模型混用时 dummy signature 会导致 400 错误
      
      修复内容:
      
      **request_transformer.go**:
      - 删除第 38-43 行的错误逻辑(禁用 thinkingConfig)
      - 引入 thoughtSignatureMode(Preserve/Dummy)策略
      - Claude 模式:透传真实 signature,过滤空/dummy
      - Gemini 模式:使用 dummy signature
      - 支持 signature-only thinking 块
      - tool_use 的 signature 也透传
      
      **antigravity_gateway_service.go**:
      - 新增 isSignatureRelatedError() 检测 signature 相关错误
      - 新增 stripThinkingFromClaudeRequest() 移除 thinking 块
      - 实现 Auto 模式:检测 400 + signature 关键词时自动降级重试
      - 重试时完全移除 thinking 配置和消息中的 thinking 块
      - 最多重试一次,避免循环
      
      **测试**:
      - 更新并新增测试覆盖 Claude preserve/Gemini dummy 模式
      - 新增 tool_use signature 处理测试
      - 所有测试通过(6/6)
      
      影响:
      -  Claude via Vertex 可以正常使用 thinking 功能
      -  历史 signature 正确透传,避免验证失败
      -  跨模型混用时自动过滤无效 signature
      -  错误驱动降级,自动修复 signature 问题
      -  不影响纯 Claude API 和其他渠道
      
      参考:Codex 深度分析和实现建议
      
      * fix(lint): 修复 gofmt 格式问题
      
      * fix(antigravity): 修复 stripThinkingFromClaudeRequest 遗漏 untyped thinking blocks
      
      问题:
      - Codex 审查指出 stripThinkingFromClaudeRequest 只移除了 type="thinking" 的块
      - 没有处理没有 type 字段的 thinking 对象(如 {"thinking": "...", "signature": "..."})
      - 导致重试时仍包含无效 thinking 块,上游 400 错误持续
      
      修复:
      - 添加检查:跳过没有 type 但有 thinking 字段的块
      - 现在会移除两种格式:
        1. {"type": "thinking", "thinking": "...", "signature": "..."}
        2. {"thinking": "...", "signature": "..."}(untyped)
      
      测试:所有测试通过
      
      参考:Codex P1 审查意见
      7fdc2b2d
  8. 01 Jan, 2026 1 commit
    • IanShaw027's avatar
      refactor(frontend): 优化 Gemini 配额显示,参考 Antigravity 样式 · 81817466
      IanShaw027 authored
      - 简化标签:将 "RPD Pro/Flash" 改为 "Pro/Flash",避免文字截断
      - 添加账号类型徽章(Free/Pro/Ultra),带颜色区分
      - 添加帮助图标(?),悬停显示限流政策和官方文档链接
      - 重构显示布局:账号类型 + 两行配额(Pro/Flash)
      - 移除冗余的 AccountQuotaInfo 组件调用
      81817466
  9. 31 Dec, 2025 1 commit
    • yangjianbo's avatar
      fix(数据层): 修复数据完整性与仓储一致性问题 · 5906f9ab
      yangjianbo authored
      ## 数据完整性修复 (fix-critical-data-integrity)
      - 添加 error_translate.go 统一错误转换层
      - 修复 nil 输入和 NotFound 错误处理
      - 增强仓储层错误一致性
      
      ## 仓储一致性修复 (fix-high-repository-consistency)
      - Group schema 添加 default_validity_days 字段
      - Account schema 添加 proxy edge 关联
      - 新增 UsageLog ent schema 定义
      - 修复 UpdateBalance/UpdateConcurrency 受影响行数校验
      
      ## 数据卫生修复 (fix-medium-data-hygiene)
      - UserSubscription 添加软删除支持 (SoftDeleteMixin)
      - RedeemCode/Setting 添加硬删除策略文档
      - account_groups/user_allowed_groups 的 created_at 声明 timestamptz
      - 停止写入 legacy users.allowed_groups 列
      - 新增迁移: 011-014 (索引优化、软删除、孤立数据审计、列清理)
      
      ## 测试补充
      - 添加 UserSubscription 软删除测试
      - 添加迁移回归测试
      - 添加 NotFound 错误测试
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      5906f9ab
  10. 30 Dec, 2025 5 commits
  11. 28 Dec, 2025 1 commit
  12. 26 Dec, 2025 1 commit
  13. 24 Dec, 2025 1 commit
  14. 23 Dec, 2025 1 commit
  15. 20 Dec, 2025 1 commit
  16. 18 Dec, 2025 3 commits
    • shaw's avatar
      fix: 修复服务用户 shell 导致无法执行 sudo 重启的问题 · 4eb22d8e
      shaw authored
      问题原因:
      - 服务用户 sub2api 的 shell 被设置为 /bin/false
      - 导致无法执行 sudo systemctl restart 命令
      - 安装/升级后服务无法自动重启
      
      修复内容:
      - 新安装时使用 /bin/sh 替代 /bin/false
      - 升级时自动检测并修复旧版本用户的 shell 配置
      - 修复失败时给出警告和手动修复命令,不中断安装流程
      4eb22d8e
    • shaw's avatar
      fix: release error · 6cf60176
      shaw authored
      6cf60176
    • shaw's avatar
      First commit · 642842c2
      shaw authored
      642842c2