1. 11 Jan, 2026 16 commits
    • IanShaw027's avatar
      feat(ops): 优化健康评分算法和智能诊断机制 · 8fffcd80
      IanShaw027 authored
      - 采用分层加权评分(业务70% + 基础设施30%),避免重复扣分
      - 新增延迟诊断(P99 > 2s critical, > 1s warning)
      - 新增资源诊断(CPU/内存/DB/Redis状态)
      - 调整诊断阈值(上游错误率5% critical,请求错误率3% critical)
      - 为每个诊断项添加可操作建议
      - 添加完整的单元测试覆盖(30+测试用例)
      - 完善中英文国际化文本
      8fffcd80
    • IanShaw027's avatar
    • IanShaw027's avatar
    • IanShaw027's avatar
      92eafbc2
    • IanShaw027's avatar
      feat(ui): 增强Select组件功能和样式 · 2548800c
      IanShaw027 authored
      2548800c
    • IanShaw027's avatar
      9dce8a53
    • IanShaw027's avatar
      feat(ops): 统一弹窗组件并优化分页设置 · 1b938b20
      IanShaw027 authored
      - OpsErrorDetailsModal和OpsRequestDetailsModal改用BaseDialog统一弹窗组件
      - 分页默认值从50改为20条,减少单页数据量
      - OpsAlertEventsCard表格添加sticky表头,优化滚动体验
      - 移除自定义Teleport和Transition实现,使用统一组件
      1b938b20
    • IanShaw027's avatar
      feat(ops): 添加分组和账号级别监控指标 · dd59e872
      IanShaw027 authored
      - 后端新增 GetAccountAvailability 方法获取账号可用性数据
      - 添加分组可用率和限流率计算辅助函数
      - 前端支持分组和账号级别的监控指标类型
      - 优化警报规则指标选择器,按类别分组显示
      dd59e872
    • IanShaw027's avatar
      feat(ops): 隐藏查询模式选择器 · 63dc6a68
      IanShaw027 authored
      - 在OpsDashboardHeader中隐藏queryMode选择器(使用v-if="false")
      - 保留所有后端逻辑和前端状态管理
      - auto模式逻辑:优先使用预聚合数据,不存在时回退到实时计算
      - 用户界面更简洁,后端自动选择最优查询方式
      
      相关文件:
      - frontend/src/views/admin/ops/components/OpsDashboardHeader.vue
      63dc6a68
    • IanShaw027's avatar
      feat(ops): 集成运维监控设置对话框到仪表盘 · a39316e0
      IanShaw027 authored
      - 在OpsDashboardHeader添加设置和警报规则按钮
      - 在OpsDashboard集成OpsSettingsDialog组件
      - 添加警报规则弹窗展示
      - 添加高级设置API类型定义
      - 支持从Header快速访问设置和规则管理
      
      相关文件:
      - frontend/src/api/admin/ops.ts
      - frontend/src/views/admin/ops/types.ts
      - frontend/src/views/admin/ops/OpsDashboard.vue
      - frontend/src/views/admin/ops/components/OpsDashboardHeader.vue
      a39316e0
    • IanShaw027's avatar
      feat(ops): 优化警报规则和设置的成功提示信息 · f5416368
      IanShaw027 authored
      - 添加警报规则保存成功提示:"警报规则保存成功"
      - 添加警报规则删除成功提示:"警报规则删除成功"
      - 添加运维监控设置保存成功提示:"运维监控设置保存成功"
      - 替换通用的"操作成功"提示为具体的业务提示
      - 失败时显示后端返回的详细错误信息
      
      相关文件:
      - frontend/src/i18n/locales/zh.ts
      - frontend/src/views/admin/ops/components/OpsAlertRulesCard.vue
      - frontend/src/views/admin/ops/components/OpsSettingsDialog.vue
      f5416368
    • IanShaw027's avatar
      feat(ops): 优化仪表盘Header响应式布局与指标展示 · e4bc9f6f
      IanShaw027 authored
      **响应式优化**:
      - 添加flex-wrap支持窄屏时间选择器自动换行
      - 当前QPS/TPS在窄屏时自动换行,避免溢出
      - 时间按钮在窄屏使用更小字号和间距(9px/1.5px)
      - 当前数值使用响应式字体(xl→sm:2xl)
      
      **指标展示优化**:
      1. 请求卡片:
         - 标题简化:总请求 → 请求
         - 字段调整:请求 → 请求数
         - 移除:平均延迟、平均首字延迟(避免冗余)
      
      2. 延迟和TTFT卡片:
         - 布局:grid → flex-wrap(自适应布局)
         - 指标不换行:添加whitespace-nowrap
         - 最小宽度:min-w-[60px]保证可读性
         - 单位内联:名称、数值、单位在同一行(P95: 123 ms)
         - 自动换行:整个指标项作为整体换行
      
      **效果**:
      - 窄屏:所有元素自动适配,无溢出
      - 宽屏:充分利用空间,清晰展示
      - 灵活布局:根据容器宽度自动调整指标排列
      e4bc9f6f
    • IanShaw027's avatar
      feat(ops): 增强错误详情弹窗与API支持 · e5857161
      IanShaw027 authored
      **前端改动**:
      1. OpsErrorDetailModal.vue:
         - 新增上游错误详情展示功能
         - 支持查看上游错误的请求头、响应体等调试信息
         - 改进错误信息格式化与可读性
      
      2. ops.ts API:
         - 新增getUpstreamErrors接口调用上游错误查询API
      
      **后端配置**:
      - config.go/config.yaml/deploy/config.example.yaml:
        - 更新配置支持上游错误事件记录开关
        - 添加相关配置项文档说明
      e5857161
    • IanShaw027's avatar
      feat(ops): 恢复仪表盘脉搏动画效果 · abdc4f39
      IanShaw027 authored
      - 将静态QPS历史折线图替换为动画脉搏线
      - 使用SVG animate元素实现心跳效果(2秒循环动画)
      - 增强流量可视化:通过脉冲跳动直观展示流量"活跃"状态
      - 恢复重构前的视觉效果与用户体验
      abdc4f39
    • IanShaw027's avatar
      feat(ops): 添加QPS脉搏线图并优化指标布局 · 89a725a4
      IanShaw027 authored
      - 添加实时QPS/TPS历史数据追踪(最近60个数据点)
      - 在平均QPS/TPS上方添加SVG脉搏线图(sparkline)
      - 将延迟和TTFT卡片的指标布局从2列改为3列
      - 恢复Max指标显示(P95/P90/P50/Avg/Max)
      89a725a4
    • IanShaw027's avatar
      fix: 临时保存编译错误修复 · fc4ea659
      IanShaw027 authored
      - 添加 LinuxDo 和 Update 配置(从 main 分支缺失)
      - 添加 LinuxDoConnectSyntheticEmailDomain 常量
      - 添加 IsClaudeCodeClient context key
      - 添加 GetLinuxDoConnectOAuthConfig 方法
      - 修复 BindStickySession 调用签名
      - 修复前端 i18n 重复属性
      - 重新生成 wire 依赖注入代码
      
      这个提交准备被合并替换,先保存以防丢失。
      fc4ea659
  2. 10 Jan, 2026 3 commits
    • Edric Li's avatar
      feat(settings): add iframe CSP warning for home content · 0fa5a601
      Edric Li authored
      Add a warning message to inform admins that some websites may have
      X-Frame-Options or CSP policies that prevent iframe embedding.
      0fa5a601
    • Edric Li's avatar
      feat(settings): add home content customization and config injection · 5265b12c
      Edric Li authored
      - Add home_content setting for custom homepage (HTML or iframe URL)
      - Inject public settings into index.html to eliminate page flash
      - Support ETag caching with automatic invalidation on settings update
      - Add Vite plugin for dev mode settings injection
      - Refactor HomeView to use appStore instead of local API calls
      5265b12c
    • long's avatar
      feat: 实现注册优惠码功能 · d2fc14fb
      long authored
        - 支持创建/编辑/删除优惠码,设置赠送金额和使用限制
        - 注册页面实时验证优惠码并显示赠送金额
        - 支持 URL 参数自动填充 (?promo=CODE)
        - 添加优惠码验证接口速率限制
        - 使用数据库行锁防止并发超限
        - 新增后台优惠码管理页面,支持复制注册链接
      d2fc14fb
  3. 09 Jan, 2026 17 commits
    • IanShaw027's avatar
      feat(运维监控): 重构仪表板布局和增强数据展示 · c48dc097
      IanShaw027 authored
      主要改动:
      - 重构仪表板为左右布局(5:7比例)
      - 左侧:健康评分 + 实时信息(当前/峰值/平均 QPS/TPS)
      - 右侧:6个卡片展示详细指标(3列x2行)
        - 总请求:请求数、Token数、平均QPS/TPS、平均延迟/TTFT
        - SLA:百分比、异常数、进度条
        - 延迟:P99/P95/P90/P50/Avg/Max(带颜色编码)
        - TTFT:P99/P95/P90/P50/Avg/Max(带颜色编码)
        - 请求错误:错误率、错误数、业务限制数
        - 上游错误:错误率、错误数(排除429/529)、429/529数
      - 添加延迟/TTFT颜色编码(<500ms绿色,<1s黄色,<2s橙色,≥2s红色)
      - 添加实时窗口选择器(1min/5min/30min/1h)
      - 优化时间段选择器标签("近5分钟"等)
      - 完善中英文i18n翻译
      - 数据库:添加Redis连接池字段(redis_conn_total, redis_conn_idle)
      c48dc097
    • IanShaw027's avatar
      feat(运维监控): 增强监控功能和健康评分系统 · 585257d3
      IanShaw027 authored
      后端改进:
      - 新增健康评分计算服务(ops_health_score.go)
      - 添加分布式锁支持(ops_advisory_lock.go)
      - 优化指标采集和聚合逻辑
      - 新增运维指标采集间隔配置(60-3600秒)
      - 移除未使用的WebSocket查询token认证中间件
      - 改进清理服务和告警评估逻辑
      
      前端改进:
      - 简化OpsDashboard组件结构
      - 完善国际化文本(中英文)
      - 新增运维监控相关API类型定义
      - 添加运维指标采集间隔设置界面
      - 优化错误详情模态框
      
      测试:
      - 添加健康评分单元测试
      - 更新API契约测试
      585257d3
    • Edric.Li's avatar
      feat(api-key): 添加 IP 白名单/黑名单限制功能 (#221) · 0a4641c2
      Edric.Li authored
      * feat(api-key): add IP whitelist/blacklist restriction and usage log IP tracking
      
      - Add IP restriction feature for API keys (whitelist/blacklist with CIDR support)
      - Add IP address logging to usage logs (admin-only visibility)
      - Remove billing_type column from usage logs UI (redundant)
      - Use generic "Access denied" error message for security
      
      Backend:
      - New ip package with IP/CIDR validation and matching utilities
      - Database migrations for ip_whitelist, ip_blacklist (api_keys) and ip_address (usage_logs)
      - Middleware IP restriction check after API key validation
      - Input validation for IP/CIDR patterns on create/update
      
      Frontend:
      - API key form with enable toggle for IP restriction
      - Shield icon indicator in table for keys with IP restriction
      - Removed billing_type filter and column from usage views
      
      * fix: update API contract tests for ip_whitelist/ip_blacklist fields
      
      Add ip_whitelist and ip_blacklist fields to expected JSON responses
      in API contract tests to match the new API key schema.
      0a4641c2
    • Edric Li's avatar
      feat(api-key): add IP whitelist/blacklist restriction and usage log IP tracking · 90798f14
      Edric Li authored
      - Add IP restriction feature for API keys (whitelist/blacklist with CIDR support)
      - Add IP address logging to usage logs (admin-only visibility)
      - Remove billing_type column from usage logs UI (redundant)
      - Use generic "Access denied" error message for security
      
      Backend:
      - New ip package with IP/CIDR validation and matching utilities
      - Database migrations for ip_whitelist, ip_blacklist (api_keys) and ip_address (usage_logs)
      - Middleware IP restriction check after API key validation
      - Input validation for IP/CIDR patterns on create/update
      
      Frontend:
      - API key form with enable toggle for IP restriction
      - Shield icon indicator in table for keys with IP restriction
      - Removed billing_type filter and column from usage views
      90798f14
    • IanShaw027's avatar
      feat(前端UI): 实现运维监控前端界面 · 8ae75e7f
      IanShaw027 authored
      - 新增帮助提示组件(HelpTooltip.vue)
      - 更新侧边栏添加 ops 监控菜单项
      - 扩展设置视图集成 ops 配置面板
      - 新增 ops 监控视图目录(dashboard, alerts, realtime, settings 等)
      8ae75e7f
    • IanShaw027's avatar
      feat(国际化): 添加运维监控多语言支持 · fc32b577
      IanShaw027 authored
      - 添加英文翻译(en.ts)包含 ops 监控所有文案
      - 添加中文翻译(zh.ts)包含 ops 监控所有文案
      fc32b577
    • IanShaw027's avatar
      feat(前端状态): 添加运维监控状态管理和路由 · 337a1886
      IanShaw027 authored
      - 新增 adminSettings store 管理 ops 配置状态
      - 注册 adminSettings store 到全局 store
      - 添加 ops 监控相关路由(dashboard, alerts, realtime, settings)
      337a1886
    • IanShaw027's avatar
      feat(前端API): 实现运维监控 API 客户端 · 11d063e3
      IanShaw027 authored
      - 新增 ops API 客户端(ops.ts)
      - 扩展 settings API 支持 ops 配置
      - 更新 admin API 索引导出 ops 模块
      - 扩展 API 客户端支持 WebSocket 连接
      11d063e3
    • shaw's avatar
      f060db0b
    • IanShaw027's avatar
      feat(admin): 添加账号批量调度开关功能 · 5e936fbf
      IanShaw027 authored
      - 后端:支持批量更新账号的 schedulable 字段
        - 在 BulkUpdateAccountsRequest 中添加 schedulable 参数
        - 在 AccountBulkUpdate 中添加 schedulable 字段支持
        - 更新 repository 层批量更新 SQL 逻辑
      - 前端:在账号管理页面添加批量调度控制
        - 新增"批量启用调度"和"批量停止调度"按钮
        - 添加 handleBulkToggleSchedulable 处理函数
        - 显示具体的成功提示信息(包含操作账号数量)
      - 国际化:添加批量调度相关中英文翻译
      - 优化:添加 search 参数标准化和验证(account_handler)
      5e936fbf
    • IanShaw027's avatar
      fix(admin): 修复表格批量操作和搜索功能问题 · 38202322
      IanShaw027 authored
      1. 恢复账号管理批量操作栏缺失的功能按钮
         - 添加"本页全选"按钮支持批量选择当前页所有账号
         - 添加"清除已选"按钮快速清空已选账号列表
         - 在重构拆分组件时遗漏,现已恢复
      
      2. 修复分组管理搜索功能仅搜索当前页的问题
         - 前端:移除本地过滤逻辑,改用后端搜索
         - 后端:添加 search 参数支持,搜索名称和描述字段
         - 支持不区分大小写的模糊匹配
         - 统一所有管理页面的搜索体验
      38202322
    • admin's avatar
      feat(admin): 添加 LinuxDO OAuth 回调地址快速设置按钮 · 707061ef
      admin authored
      - 在设置页面添加"使用当前站点生成并复制"按钮
      - 自动填充回调地址并复制到剪贴板
      - 添加中英文国际化支持
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      707061ef
    • admin's avatar
      refactor(auth): 将 Linux DO OAuth 配置迁移到系统设置 · d1c2a61d
      admin authored
      - 将 LinuxDo Connect 配置从环境变量迁移到数据库持久化
      - 在管理后台系统设置中添加 LinuxDo OAuth 配置项
      - 简化部署流程,无需修改 docker-compose.override.yml
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      d1c2a61d
    • admin's avatar
      feat(auth): 添加 Linux DO Connect OAuth 登录支持 · 152d0cde
      admin authored
      - 新增 Linux DO OAuth 配置项和环境变量支持
      - 实现 OAuth 授权流程和回调处理
      - 前端添加 Linux DO 登录按钮和回调页面
      - 支持通过 Linux DO 账号注册/登录
      - 添加相关国际化文本
      
      🤖 Generated with [Claude Code](https://claude.com/claude-code
      
      )
      Co-Authored-By: default avatarClaude Opus 4.5 <noreply@anthropic.com>
      152d0cde
    • IanShaw027's avatar
      fix(fe): 修复中优先级表格功能问题 · 514f5802
      IanShaw027 authored
      修复的问题:
      
      1. **搜索和筛选防抖不同步**(AccountsView.vue)
         - 问题:筛选器使用 reload(立即),搜索使用 debouncedReload(300ms延迟)
         - 修复:统一使用 debouncedReload,避免多余的API调用
      
      2. **useTableLoader 竞态条件**(useTableLoader.ts)
         - 问题:finally 块检查 signal.aborted 而不是 controller 实例
         - 修复:检查 abortController === currentController
      
      3. **改进错误处理**(UsersView.vue)
         - 添加详细错误消息:error.response?.data?.detail || error.message
         - 用户可以看到具体的错误原因而不是通用消息
      
      4. **分页边界检查**(useTableLoader.ts, UsersView.vue)
         - 添加页码有效性检查:Math.max(1, Math.min(page, pagination.pages || 1))
         - 防止分页越界导致显示空表
      
      影响范围:
      - frontend/src/composables/useTableLoader.ts
      - frontend/src/views/admin/AccountsView.vue
      - frontend/src/views/admin/UsersView.vue
      
      测试:✓ 前端构建测试通过
      514f5802
    • IanShaw027's avatar
      fix(fe): 修复表格分页和基础功能问题 · ee9b9b39
      IanShaw027 authored
      修复的主要问题:
      
      1. **分页切换失效**(AccountsView.vue)
         - 修复 useTableLoader 未解构 handlePageSizeChange 函数
         - 添加 @update:pageSize 事件绑定到 Pagination 组件
      
      2. **内存泄漏修复**(多个文件)
         - UsersView.vue: 添加 searchTimeout 清理和 abortController.abort()
         - ProxiesView.vue: 添加 onUnmounted 钩子清理定时器
         - RedeemView.vue: 添加 onUnmounted 钩子清理定时器
      
      3. **分页重置问题**(UsersView.vue)
         - toggleBuiltInFilter: 切换筛选器时重置 pagination.page = 1
         - toggleAttributeFilter: 切换属性筛选时重置 pagination.page = 1
      
      影响范围:
      - frontend/src/views/admin/AccountsView.vue
      - frontend/src/views/admin/ProxiesView.vue
      - frontend/src/views/admin/RedeemView.vue
      - frontend/src/views/admin/UsersView.vue
      
      测试:✓ 前端构建测试通过
      ee9b9b39
    • Xu Kang's avatar
      5d1badfe
  4. 08 Jan, 2026 4 commits
    • IanShaw's avatar
      fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化 (#212) · afcfbb45
      IanShaw authored
      * fix(gemini): Google One 强制使用内置 OAuth client + 自动获取 project_id + UI 优化
      
      ## 后端改动
      
      ### 1. Google One 强制使用内置 Gemini CLI OAuth Client
      **问题**:
      - Google One 之前允许使用自定义 OAuth client,导致认证流程不稳定
      - 与 Code Assist 的行为不一致
      
      **解决方案**:
      - 修改 `gemini_oauth_service.go`: Google One 现在与 Code Assist 一样强制使用内置 client (L122-135)
      - 更新 `gemini_oauth_client.go`: ExchangeCode 和 RefreshToken 方法支持强制内置 client (L31-44, L77-86)
      - 简化 `geminicli/oauth.go`: Google One scope 选择逻辑 (L187-190)
      - 标记 `geminicli/constants.go`: DefaultGoogleOneScopes 为 DEPRECATED (L30-33)
      - 更新测试用例以反映新行为
      
      **OAuth 类型对比**:
      | OAuth类型 | Client来源 | Scopes | Redirect URI |
      |-----------|-----------|--------|-----------------|
      | code_assist | 内置 Gemini CLI | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
      | google_one | 内置 Gemini CLI (新) | DefaultCodeAssistScopes | https://codeassist.google.com/authcode |
      | ai_studio | 必须自定义 | DefaultAIStudioScopes | http://localhost:1455/auth/callback |
      
      ### 2. Google One 自动获取 project_id
      **问题**:
      - Google One 个人账号测试模型时返回 403/404 错误
      - 原因:cloudaicompanion API 需要 project_id,但个人账号无需手动创建 GCP 项目
      
      **解决方案**:
      - 修改 `gemini_oauth_service.go`: OAuth 流程中自动调用 fetchProjectID
      - Google 通过 LoadCodeAssist API 自动分配 project_id
      - 与 Gemini CLI 行为保持一致
      - 后端根据 project_id 自动选择正确的 API 端点
      
      **影响**:
      - Google One 账号现在可以正常使用(需要重新授权)
      - Code Assist 和 AI Studio 账号不受影响
      
      ### 3. 修复 Gemini 测试账号无内容输出问题
      **问题**:
      - 测试 Gemini 账号时只显示"测试成功",没有显示 AI 响应内容
      - 原因:processGeminiStream 在检查到 finishReason 时立即返回,跳过了内容提取
      
      **解决方案**:
      - 修改 `account_test_service.go`: 调整逻辑顺序,先提取内容再检查是否完成
      - 确保最后一个 chunk 的内容也能被正确显示
      
      **影响**:
      - 所有 Gemini 账号类型(API Key、OAuth)的测试现在都会显示完整响应内容
      - 用户可以看到流式输出效果
      
      ## 前端改动
      
      ### 1. 修复图标宽度压缩问题
      **问题**:
      - 账户类型选择按钮中的图标在某些情况下会被压缩变形
      
      **解决方案**:
      - 修改 `CreateAccountModal.vue`: 为所有平台图标容器添加 `shrink-0` 类
      - 确保 Anthropic、OpenAI、Gemini、Antigravity 图标保持固定 8×8 尺寸 (32px × 32px)
      
      ### 2. 优化重新授权界面
      **问题**:
      - 重新授权时显示三个可点击的授权类型选择按钮,可能导致用户误切换到不兼容的授权方式
      
      **解决方案**:
      - 修改 `ReAuthAccountModal.vue` (admin 和普通用户版本):
        - 将可点击的授权类型选择按钮改为只读信息展示框
        - 根据账号的 `credentials.oauth_type` 动态显示对应图标和文本
        - 删除 `geminiAIStudioOAuthEnabled` 状态和 `handleSelectGeminiOAuthType` 方法
        - 防止用户误操作
      
      ## 测试验证
      -  所有后端单元测试通过
      -  OAuth client 选择逻辑正确
      -  Google One 和 Code Assist 行为一致
      -  测试账号显示完整响应内容
      -  UI 图标显示正常
      -  重新授权界面只读展示正确
      
      * fix(lint): 修复 golangci-lint 错误信息格式问题
      
      - 将错误信息改为小写开头以符合 Go 代码规范
      - 修复 ST1005: error strings should not be capitalized
      afcfbb45
    • Edric Li's avatar
      feat(groups): add Claude Code client restriction and session isolation · a4210588
      Edric Li authored
      - Add claude_code_only field to restrict groups to Claude Code clients only
      - Add fallback_group_id for non-Claude Code requests to use alternate group
      - Implement ClaudeCodeValidator for User-Agent detection
      - Add group-level session binding isolation (groupID in Redis key)
      - Prevent cross-group sticky session pollution
      - Update frontend with Claude Code restriction controls
      a4210588
    • Edric Li's avatar
      feat(home): redirect admin users to admin dashboard · fd1b14fd
      Edric Li authored
      When clicking "Enter Console" button on home page, admin users are now
      redirected to /admin/dashboard instead of /dashboard.
      fd1b14fd
    • Edric Li's avatar
      feat(proxies): add account count column to proxy list · eb198e59
      Edric Li authored
      Display the number of accounts bound to each proxy in the admin proxy
      management page, similar to the groups list view.
      eb198e59