Skip to content

Latest commit

 

History

History
324 lines (227 loc) · 25.3 KB

File metadata and controls

324 lines (227 loc) · 25.3 KB

CHANGELOG

2026-04-17

  • 多项目选择列表改为面向任意数量项目:统一项目标签为“主项目、项目 2、项目 3 ...”,去除原先对前两个项目的特化命名,避免三项目及以上场景下展示不一致。
  • 项目列表接口补充 isPrimary 元信息,并同步升级前端项目选项缓存结构,确保各页面可基于统一项目元数据渲染选择器。
  • 仪表盘、调用记录、探索页、渠道页的项目选择框改为自适应宽度,提升三项目及以上时的可用性与布局稳定性。
  • 项目列表接口改为合并“当前环境变量中的项目”和“数据库中仍存在历史数据的项目”,即使旧项目已从环境变量移除,前端仍可继续切换查看其历史统计。

2026-03-21

  • 渠道统计页临时增加“删除当前范围数据”能力:
    • app/channels/page.tsx 在渠道组(provider)和子渠道(email)两级新增删除按钮,复用确认弹窗展示当前项目、当前时间范围与预计删除条数,降低误删风险。
    • app/api/channels/route.ts 扩展临时删除预估与执行动作,按当前页面筛选的 project + 日期范围 + provider/email 条件删除 usage_records,并在删除后清理渠道缓存。
    • 渠道页成功提示与失败提示同步补齐,删除完成后会自动刷新当前统计结果。

2026-03-09

  • 合并当前 cherry-pick 冲突并保留两侧能力:

    • explore 接口与页面同时保留 project 项目筛选和 filterInvalid 无效点过滤,避免缓存键与请求参数丢失。
    • overview 查询与接口同时保留 project 过滤和 lastSyncAt 返回值,维持多项目统计与最近同步时间展示。
    • records 查询与页面合并多字段排序 sortKeysproject 筛选,修复游标查询变量冲突。
    • /api/sync 合并为按 project 维度去重的分块写入逻辑,兼容大批量同步与多项目唯一索引。
    • scripts/migrate.mjs 合并本地 .env* 自动加载与 Neon/pg 双驱动迁移能力,保持本地与部署环境兼容性。
  • 合并 sync 路由与渠道统计分支冲突:

    • /api/sync 保留 provider/email 维度映射增强,同时继续使用分块写入,降低大批量同步时的单次 SQL 压力。
    • 去重键统一切换为 occurredAt + project + route + model + email,与当前 usage_records 唯一索引保持一致。
    • 鉴权 cookie 改为直接使用 cookies(),移除旧的弱类型导入方式。
  • 修复 records 查询构建失败:

  • 修复 sync-model-prices 构建失败:

  • 修复 /api/sync TypeScript 构建失败:

    • findMissingAuthIndexes()applyAuthMappingsToRows() 的查询结果补充显式类型,消除 row 隐式 any 导致的构建阻断。
  • 修复 records 查询 TypeScript 构建失败:

    • lib/queries/records.tsmodelPrices 查询结果补充显式类型,消除 priceRows.map() 中参数隐式 any 的构建错误。

2026-03-08

  • Explore 页模型图例排序方式现可在浏览器端记忆:

    • 图例排序(首字母 / Token用量 / 请求次数)改为持久化到 localStorageexploreLegendSort
    • 刷新页面或重新打开浏览器标签页后,会自动恢复上次选中的排序方式,避免每次都重新切换。
  • 修复 Explore 页时间范围与主图末尾日期不一致的问题:

    • 后端探索明细查询移除默认 limit(50000) 截断,避免在高频数据下只返回时间范围前段记录、导致主图停在较早日期。
    • 保留 maxPoints 参数能力,仅在显式传入时才限制返回条数。
    • 前端在 Explore 明细点数超过 20,000 时默认关闭散点图开关,优先保证全量时间范围可见,同时降低大数据量下的 SVG 渲染压力。

2026-03-07

  • 修复每小时负载分布堆叠图中"输入"与"缓存"重复计数的问题:

    • 原始数据中 inputTokens 包含缓存命中部分,与 cachedTokens 存在子集重叠,导致堆叠图双重计数。
    • hourlySeries useMemo 输出前对每个数据点执行 inputTokens = Math.max(0, inputTokens - cachedTokens),使两者在图中不重叠。
    • 调整普通图和全屏图的堆叠顺序为:输入 → 缓存 → 输出 → 思考,保持"输入"与"缓存"在视觉上相邻,语义更清晰。
    • 同步更新两个图的 tooltip 排序、图例排序,以及顶层圆角(radius 移至新顶层的思考柱)。
  • Tokens 卡片"缓存"改为缓存命中率显示,"输入"增加 hover 展示未命中输入:

    • "缓存"行:默认标签"缓存命中率"及百分比,hover 切换为"缓存"及实际 token 数。
    • "输入"行:默认标签"输入"及总输入 token 数,hover 切换为"未命中输入"及 totalInputTokens - totalCachedTokens
    • 两行均使用相同的 opacity 过渡动画(duration-200),absolute 覆盖层不影响布局。

2026-03-06

  • 修复首页"无法加载实时用量:"后内容为空的问题:

    • HTTP/2 协议不携带 status text,res.statusText 在现代部署中始终为空字符串。
    • 改为优先读取响应体 JSON 中的 error 字段,回退到 res.statusText,最终回退到 HTTP ${res.status}
    • catch 分支的 error.message 同样增加 || "未知错误" 兜底。
  • Explore 页模型图例排序切换:

    • 点击"模型图例"右侧的排序标签可循环切换:首字母 → Token用量 → 次数 → 首字母。
    • 排序计算在 ModelLegend 组件内部维护(legendSort state + sortedModels useMemo),不影响外部状态。
    • 新增 modelStats prop(由 ExplorePagepoints 汇总 tokens / requests),在切换时无需重复遍历。
  • Explore 页模型图例颜色优化(方案B 系统整改):

    • MODEL_COLORS 中5处色相/色调高度相似的颜色(浅蓝≈天青、浅红≈玫红、重复黄≈橙黄、浅绿≈绿、浅紫≈品红紫)影响图例区分度。
    • 替换方案:
      • 位置6 #99e6ff(浅蓝 200°)→ #c0ff30(柠绿 82°)
      • 位置8 #ffb3b3(浅红 0°)→ #40fff0(青绿 177°)
      • 位置11 #ffe66d(重复黄55°)→ #ff50a0(玫粉 340°)
      • 位置16 #b3f5b3(浅绿 120°)→ #40ffa0(春绿 152°)
      • 位置17 #d9b3ff(浅紫 280°)→ #f050e8(品红洋红 305°)
    • 新颜色相邻最小色相差从 <5° 提升至 ≥15°,视觉区分度显著改善。

2026-03-05

  • Records 页表头多列排序:

    • 点击未激活列 → 插入头部成为主排序键(desc);点击已激活列第二次 → 切换为 asc;第三次 → 从排序列表移除(occurredAt 列不允许移除,第三次循环回 desc)。
    • 存在多个排序键时,表头箭头旁显示小数字标注优先级(₁₂₃...);悬停显示操作提示。
    • URL 参数改为 sort=field:order,field:order 格式,兼容旧 sortField+sortOrder 参数。
    • 游标分页采用方案 A:以首个排序键(主键)+ id 作为游标,次级排序在每页内精确有序。
    • 改动文件:lib/queries/records.ts(添加 SortKey 类型和 getSortExpr 辅助函数,getUsageRecords 接受 sortKeys[])、app/api/records/route.ts(解析 sort 参数)、app/records/page.tsx(多键排序状态与交互)。
  • 首页饼图颜色分配方式优化:

    • 原逻辑按模型在原始数组中的位置分配颜色,导致颜色与排名无关联。
    • 改为按 tokens 降序排名为每个模型分配固定颜色索引(pieColorIndexMap useMemo),tokens最多的模型始终得到颜色表第一个颜色,依此类推;对饼图 Cell 和自定义图例均生效,普通视图和全屏视图保持一致。
  • 首页新增自动刷新功能:

    • 在"刷新数据"按钮左侧新增"自动刷新"复选框及刷新频率下拉框(预设 30秒/1分钟/5分钟/10分钟/30分钟 + 自定义秒数输入)。
    • 使用 public/auto-refresh-worker.js Web Worker 计时,后台标签页也不会被浏览器降频/休眠,计时精度不受影响。
    • 刷新频率和自定义值持久化至 localStorageautoRefreshSettings),页面刷新后自动恢复;自动刷新开关默认关闭,不自动恢复以避免意外刷新。
  • 同步超时时限从 60s 调整为 120s,支持 env 调节:

    • 前后端统一使用 NEXT_PUBLIC_SYNC_TIMEOUT_MS 环境变量覆盖(毫秒,正整数),默认 120s。
    • 后端(app/api/sync/route.tsUSAGE_TIMEOUT_MS 读取该变量;前端(app/page.tsxdoSync 默认参数读取该变量(构建时注入)。
  • formatCompactNumber 补充 B(十亿)级别支持:

    • 值 ≥ 1,000,000,000 时显示为 x.xxB(保留两位小数),避免 Tokens 等超大数值停留在 1500M 等不直观格式。
  • 首页请求数卡片成功/失败数精简显示:

    • 当成功数或失败数 ≥ 10000(超过 4 位)时,自动转为紧凑格式(如 12.3k),减少卡片文字溢出。
    • 鼠标悬停时通过 title 属性展示完整整数,方便查看精确值。
  • 自动刷新 UI 精细优化:

    • 改为扁平一体化按钮样式:开启时整体 emerald 配色,关闭时 slate 配色;频率选项区通过 max-width 过渡动画展开/收起,无条件渲染避免动画失效。
    • 选择"自定义..."时频率下拉框收缩为仅显示箭头(选项文字颜色改透明),节省横向空间。
    • 下拉选项深色模式下使用近白绿配色(#d1fae5 文字 / #022c22 背景),防止深色环境下文字不可见。
    • 悬停自动刷新按钮时展示倒计时提示(如"30s 后刷新"),使用 tickBaseTimeRef + tickIntervalMsRef 精确计算剩余秒数;每次 tick 及开启时同步更新基准时间,确保倒计时始终准确。
    • 修复倒计时 tooltip 被 overflow-hidden 容器裁切无法显示的问题:将 tooltip 移至外层 relative wrapper 内但置于 overflow-hidden div 之外。
    • 频率展开区及自定义输入区动画改为纯 opacity 淡入淡出(transition-opacity duration-200),去除宽度滑动动画;隐藏时 max-w-0 即时折叠空间,opacity 为 0 时折叠不可见,视觉效果等同纯渐变。

2026-03-03

  • Explore API 移除抽样采样逻辑:

    • 去掉 row_number() % step 分步跳过机制,改为直接按时间排序查询,最多返回 maxPoints(默认提升至 50,000)条记录,所有返回点均为连续真实数据,不再跳过任何有效点。
    • 零 tokens 过滤从前端 JS 下推至 SQL 层:始终并行统计无效点数量(zeroTokensCount)随接口返回;当 filterInvalid=true 时 points 查询加入 total_tokens != 0 条件。
    • 前端移除独立工具栏开关,改为在"渲染点数"统计行内联可点击文字:有无效点时默认显示"(过滤无效点?)",点击后过滤并改为"(已过滤 N 无效点)",再次点击取消过滤;开关状态存储在 localStorage 中(默认不过滤)。
    • step 字段保留但固定为 1,不影响现有接口契约。
  • Explore 页数据过滤优化:

    • 当接口返回总点数(total)超过 3000 时,自动过滤掉 tokens 为 0 的数据点,减少无效噪点渲染,降低大数据量下散点图的视觉干扰和渲染压力;"渲染点数"旁同步显示已过滤的零 tokens 点数量。
  • Explore 页散点图渲染性能优化:

    • 将每个数据点的双层 SVG circle(透明命中区 + 可见圆)合并为单个 circle,DOM 节点数量减少约 50%,万级点数下渲染压力显著降低。
    • 为工具栏新增"散点图"显示开关(默认开启),关闭后 <Scatter data={[]}> 跳过全部散点渲染,可在只需查看堆叠面积分布时大幅降低 SVG 节点数。
    • 引入 deferredFilteredPoints = useDeferredValue(filteredPoints),Y 轴直方图、X 轴时间分布、堆叠面积图三个重计算 memo 使用延迟版本,新数据加载完毕时不阻塞主线程渲染。
    • 为两处 tickFormatterv 参数补充 : number 类型注解,消除 TypeScript implicit any 报错。
    • 模型图例支持 Ctrl/⌘+点击独显:按住 Ctrl(Mac 为 ⌘)单击某图例,隐藏所有其他模型,仅保留该模型可见;若目标模型已处于独显状态则恢复全部;图例悬停提示更新为"点击隐藏,Ctrl/⌘+点击独显"。
  • 首页统计卡片数值优化:

    • 平均 TPM、平均 RPM 均移除尾随零小数(10.00101.501.5)。
    • 平均 RPM 同步引入万级以上压缩显示(>= 1000 时显示 1k10k 等)。
  • 完善数据库连接池配置说明:

    • README.md 中新增“数据库连接池配置 (本地开发)”表格,详细列出 DATABASE_POOL_MAXDATABASE_POOL_IDLE_TIMEOUT_MS 等环境变量的作用与默认值,便于开发者优化连接数占用。
  • 重构数据库连接层,支持通用 PostgreSQL 与 Neon 无服务器 WebSocket 双驱动:

    • lib/db/client.ts:新增条件化驱动工厂,通过 URL 模式(含 .neon.tech)或环境变量 DATABASE_DRIVER=neon|pg 自动选择 @neondatabase/serverless(WebSocket)或 pg.Pool(标准 TCP);Aiven、Supabase、RDS 等默认使用 pg
    • 新增 DATABASE_CA 环境变量支持:pg 驱动下可传入 CA 证书 PEM 内容(原始或 Base64 编码),用于 Aiven、自建 PostgreSQL 等需要 sslmode=verify-full 的场景。
    • scripts/migrate.mjs:同步更新为动态驱动加载,支持 DATABASE_CA,迁移脚本与运行时保持策略一致。
    • 新增依赖:@neondatabase/serverlessws@types/wspg@types/pg,移除对 @vercel/postgres 的直接依赖。
    • 修复根本原因:@vercel/postgres createPool 强制要求池化连接串,不兼容直连 URL;构建时模块顶层初始化导致 invalid_connection_string 错误;pg 不支持 Neon serverless WebSocket 端点(wss://host:443)。
  • 修复 pg 驱动在小规格数据库下易触发 53300(连接槽耗尽)的问题:

    • 为运行时 pg.Pool 增加可配置连接池参数:DATABASE_POOL_MAXDATABASE_POOL_IDLE_TIMEOUT_MSDATABASE_POOL_CONNECTION_TIMEOUT_MSDATABASE_POOL_MAX_USES
    • 默认将池大小收敛为 5,降低 Vercel 多实例并发下打满数据库连接槽的风险。

2026-02-18

  • 渠道统计支持主渠道重命名:新增 PATCH /api/channelsrename-provider 动作,可将指定旧渠道名批量更新为新渠道名(写回 usage_records.provider)。
  • 渠道页新增“渠道名称编辑”交互:支持在分组头部直接修改并保存渠道名称;同时为子渠道重命名请求显式携带 rename-email 动作标识。
  • 渠道页分组口径收敛:channels 页面改为严格按 usage_records.provider 分组、按 usage_records.email 作为子渠道,不再通过 provider/email 字符串切分推断,避免 qwen 等前缀误归类。
  • 修复子渠道“保存无感”问题:channels 页请求改为 skipCache=1 + no-store,并在更新条数为 0 时返回明确提示,避免误判已保存。
  • 调整子渠道重命名范围:PATCH /api/channels 取消 project 过滤,改为按 provider + oldEmail 全量覆盖 usage_records.email(覆盖该子渠道全部数据)。
  • 渠道统计新增“子渠道临时重命名”能力:在 app/channels/page.tsx 支持直接编辑子渠道名称,并通过 /api/channelsPATCH 接口写回数据库,覆盖 usage_records.email
  • 新增 /api/channels 更新接口:按 provider + oldEmail (+可选 project) 批量更新为 newEmail,更新后自动清理渠道缓存并返回变更条数。
  • 修复 db:backfill:usage-provider-email 执行失败:移除脚本对 TypeScript schema 的 ESM 直接导入,改为纯 SQL 回填;并增加冲突前去重逻辑,避免触发唯一索引 usage_records_occurred_project_route_model_email_idx 报错。
  • 新增数据修复脚本 scripts/backfill-usage-provider-email.mjs
    • usage_records.auth_index 有值时,按现有匹配规则(auth_index 优先,其次 email(api-key))回填 provider/email
    • usage_records.auth_index 为空时,将 provider/email 统一清空。
    • 新增命令 pnpm db:backfill:usage-provider-email 用于执行该修复。
  • 修复同步回填空值问题:/api/sync 在 AI Provider 匹配场景下,回填逻辑改为同时支持 auth_indexemail(api-key) 匹配 auth_file_mappings.auth_id,并避免将 usage_records.provider/email 覆盖为空字符串。
  • 同步入库补充映射回填:当 usage_records.auth_index 成功匹配 auth_file_mappings.auth_id 后,写入 usage_records.provider = auth_file_mappings.provider
  • 同步入库补充邮箱回填:当匹配成功后,写入 usage_records.email = auth_file_mappings.email;若 auth_file_mappings.email 为空,则回退写入 auth_file_mappings.nameusage_records.email
  • 查询展示口径调整:records/overview/explore 的“提供商/凭证”改为直接读取 usage_records.providerusage_records.email,不再在查询阶段回查 auth_file_mappings
  • 新增“渠道统计”页面:添加 app/channels/page.tsx 并接入侧边栏导航,支持按项目/时间范围查看渠道用量、费用、成功率与分组展开。
  • 渠道接口口径调整:/api/channels 改为以 usage_records.provider 作为渠道、usage_records.email 作为子账号聚合,返回 provider/email 组合的 channel 字段供前端分组展示。

2026-02-17

  • 调整 records 调用记录表格列宽策略:将“模型 / 密钥 / 凭证”从固定宽度改为与其他列一致的 auto 自适应分配,改善不同分辨率下的列宽一致性。
  • 数据库字段重命名:usage_records.source 更名为 usage_records.email,并将 usage_records.channel 更名为 usage_records.provider;同步更新唯一索引与查询索引命名。
  • 同步与查询链路适配新字段:/api/sync 去重键改用 emailrecords/overview/explore/channels 改为读取 email/provider 列;对外筛选参数仍兼容 source 命名。
  • 调整 /api/sync 流程:刷新时默认不再预先同步 auth_file_mappings,仅在检测到本次 auth_index 存在未命中时触发一次补救同步,减少无效映射刷新请求。
  • 增强映射补救来源:补充拉取 openai-compatibilitygemini-api-keycodex-api-keyclaude-api-key 四类管理配置,并按规则写入 auth_file_mappings,用于后续匹配兜底。
  • 新增同步可观测字段:/api/sync 返回 authFilesSyncTriggeredunmatchedAuthIndexesBeforeunmatchedAuthIndexesAfter,便于判断未命中补救是否触发及效果。
  • 统一凭证回退匹配口径:records/overview/exploreauth_index 未命中时增加 usage.source(api-key)auth_file_mappings.auth_id 的二次匹配,并将最终未命中统一显示为“未知渠道”。

2026-02-16

  • 修复构建前迁移脚本的连接串读取时机:改为在运行阶段加载 .env* 后再初始化数据库连接,避免因顶层 createPool() 提前执行导致 missing_connection_string 报错。
  • 当未配置 DATABASE_URL/POSTGRES_URL 时,迁移脚本改为输出提示并跳过迁移(不阻塞构建),提升本地与 CI 场景下的构建容错性。
  • 修复多处 usageRecords.project 字段误用(channelsoverviewsync-model-prices):统一改为按 usageRecords.route 过滤项目,消除 TypeScript 构建报错并恢复项目筛选能力。
  • 修复 lib/queries/records.ts 缺失导入:补充 estimateCostpriceMap 引用,恢复记录页费用计算的编译通过状态。
  • 修复 channels 聚合字段误用:将不存在的 usageRecords.channel 更正为 usageRecords.source,恢复渠道统计接口编译与按渠道分组能力。
  • 修复 /api/projects 对失效配置项 config.cliproxyProjects 的依赖:改为从 usage_records.route 动态聚合项目列表,保证项目下拉与后端筛选口径一致并消除构建错误。
  • 修复 explore 页残留的项目筛选状态引用:移除未定义的 setProject/setProjectOptions 相关逻辑,恢复 TypeScript 构建通过。
  • 修复首页仪表盘缺失的项目筛选状态定义:补回 projectprojectOptions 状态,消除 project/setProjectOptions 未定义编译错误并恢复价格同步请求参数。
  • 修复 records 页残留的项目筛选状态引用:移除未定义的 setProject/setProjectOptions 副作用与无用导入,恢复页面编译通过。
  • 修复 overview 查询参数类型与接口透传:补回 project 类型定义并在 /api/overview 中接收/透传该参数,同时将其纳入缓存键,避免类型报错与跨项目缓存串用。

2026-02-15

  • 调整 records 页提供商染色策略:覆盖 GeminiCLIVertexAIStudioAntigravityClaudeCodexQwenKimiiFlow(大小写不敏感),提升来源识别度与颜色区分度。

2026-02-14

  • 新增凭证映射与 source 相关能力,统一凭证展示/筛选口径,减少跨页面筛选不一致。
  • records 页面升级列管理(显隐、排序、宽度、自适应、持久化)与交互样式,提升可读性和可操作性。
  • 新增/完善提供商字段展示与相关查询,便于按来源识别调用记录。
  • explore 增加按 Key/凭证过滤与下拉候选,提升探索效率。
  • /api/sync/auth-files(15s)和 /usage(60s)增加超时控制,并区分超时/普通错误,避免上游阻塞拖垮同步请求。
  • records 同步失败/超时改为悬浮窗报错(含错误样式),让超时信息更直观可见。
  • records 同步反馈新增 warning 态:当前端收到 /api/syncauthFilesWarning 时以黄色提示展示“部分成功”,并在有入库时附带同步条数,减少用户误判。

2026-02-13

  • 修复时区配置与 SQL 分组问题,避免统计在不同时区下出现偏差。

2026-02-12

  • 仪表盘图表改进(组合图/错误指标/线条样式)并补充记录页路由显示控制,增强可视化表达。

2026-02-10

  • 升级开发依赖(@types/nodedrizzle-kit),保持工具链稳定。

2026-02-07

  • 升级 recharts,改进图表兼容性与表现。

2026-02-04

  • 概览 API 增加 skipCache 控制,便于在需要时获取最新统计。

2026-02-03

  • 升级开发依赖(eslint-config-next@types/node),提升开发体验。

2026-01-31

  • 升级 lucide-react,更新图标依赖。

2026-01-29

  • 升级 React 及类型依赖,保持框架版本一致。

2026-01-28

  • 升级 nextzod,提升框架与校验库兼容性。

2026-01-27

  • 模型价格同步链路集中优化(搜索、按钮交互、并发锁、304 处理、鉴权、免费模型/批量更新),提升同步稳定性与可用性。
  • 调整状态提示与日期选择器样式,降低界面干扰并提升可读性。

2026-01-26

  • 新增模型价格同步功能,为费用估算提供自动化数据来源。

2026-01-24

  • 修复成本计算表达式引用,确保费用统计正确。

2026-01-23

  • 完善同步与成本计费逻辑(含思考 token 计费),提高记录与费用准确性。

2026-01-22

  • 仪表盘增加成功/失败原始计数展示,并调整迁移与请求统计字段逻辑,提升数据可解释性。

2026-01-21

  • 上线调用记录页面与后端查询/API,并完善表格与日历样式,形成完整的记录管理能力。

2026-01-20

  • 升级 next 与相关开发依赖,保持版本一致性。

2026-01-13

  • 升级 @types/node,保持类型定义更新。

2026-01-11

  • 优化筛选组件交互(动画、清除、状态切换)与小时维度图表能力(72h、柱状/面积切换)。
  • 加入同步超时与状态修复,降低首屏阻塞风险。

2026-01-06

  • 增加自定义时间范围、Modal 与探索页交互优化,并推进 Next.js 版本迁移,提升整体交互流畅度。

2026-01-05

  • 调整请求数与 token 展示细节,提升数值展示直观性。

2026-01-03

  • 引入并优化 Toast 状态提示机制,增强同步过程反馈。

2026-01-02

  • 完善迁移脚本与构建流程,支持首次部署可用。
  • 引入 vercel/analytics 并优化散点图 Y 轴动画。

2026-01-01

  • 优化趋势图与探索图性能(仅渲染可视范围),并修复日志页与 tooltip 相关体验问题。

2025-12-31

  • 优化探索图与仪表盘布局,补充 Modal 能力并调整 README/构建配置,提升整体可维护性。

2025-12-30

  • 上线数据探索页与相关 API,补充缓存、同步、登录与错误处理等基础能力。
  • 增加 CI/依赖管理与项目基础文件(如许可证、Dependabot),完善工程化。

2025-12-29

  • 初始化鉴权中间件、同步接口结构与基础文档,形成项目最初可用版本。