Codex 本地中转 v1.10.1
Codex Provider Hub v1.10.1
本版本由已验证的功能变更说明自动生成。
2026-09-03-usage-chart-catalog
- 类型:feature
- 发布级别:patch
- 目标:按用户选择把用量趋势扩展为六种差异化图型(同一数据多种回答),视觉规范参考 Lieflat Charts(手写 SVG 复刻,不复制其 PolyForm NC 代码):
- 趋势(保留,动画画入)
- 日历(重做热力):今天/24h 保留"日×24 小时"方格;≥7 天改为 GitHub 风格"周×星期"圆点日历(L17 Calendar Heat:点面积=当日 tokens、最忙日虚线环标注、月份刻度)
- 累计(保留,冲击线+滚动大数字)
- 节律(新增,G14 Punch Card):星期×24 小时点阵,点半径=消耗量,看工作日/周末节律
- 构成(新增,G4 Dot Waffle):100 枚圆点(1 点≈1%)按供应商占比着色 + 排名榜
- 发丝线(新增,L3 Barcode):每个分桶一根发丝线+圆点,安静桶也有短线
并修复图例布局:图例移出图表卡片,独立成下方单行(色块项 nowrap、说明文字右对齐),不再与 SVG 抢空间导致换行错乱。
- 实际改动:-
local_proxy/core.py:UsageStore.weekday_hour()——按本地时区星期×24 小时聚合(SQLstrftime('%w'/'%H', recorded_at, 'unixepoch', 'localtime'),周一=0 行),字段与 timeline 一致,空库/all时start_at=null;新端点GET /control/api/usage-weekday-hour(默认30d、custom 限 90 天、provider 404/参数 422/store 503/数据库 503/no-store)。 local_proxy/server.py:_register_control_routes同步注册{prefix}/api/usage-weekday-hour(处理器与 core 层口径一致)。proxy_static/src/components/UsageTrendView.vue:图型选择器扩为 趋势/日历/累计/节律/构成/发丝线 六项(旧值映射:heat→calendar、area/line/bars→trend);日历图在 ≥7 天窗口渲染"周×星期"圆点阵(半径=√(tokens/max)、最忙日虚线环、月份/星期刻度、stagger 入场),今天/24h 保留小时方格;节律图消费 weekday-hour 端点渲染 7×24 点阵;构成图请求/api/status并经buildShareCardData(providerLimit=8)渲染 10×10 waffle 点阵;发丝线逐桶线+圆点(安静桶保留短基线,线宽随桶数压缩);图例移出图表卡片为下方单行(色块项 nowrap、说明文字右对齐,窄屏换行);指标药丸与轮播仅在趋势/累计显示;30 秒自动刷新经document.hidden门控并在节律/构成激活时同步刷新辅助数据。proxy_static/src/styles.css:.usage-legend-row(含 900px 断点换行)、.usage-cal-dot/.usage-punch-dot/.usage-waffle-dotstagger 动画、.usage-cal-peak-ring、.usage-waffle-1..4、.usage-barcode-line(.is-empty)/.usage-barcode-dot;reduced-motion 降级扩展到全部新动画。- 测试:
tests/test_proxy_core.py新增 weekday_hour 矩阵落位/provider 过滤/空库/非法窗口与 90 天上限 2 个用例;tests/test_server.py新增双服务 usage-weekday-hour 200/隔离/跨服务 404 用例;tests/local_proxy_vue_ui.test.js图型断言扩为六图型并新增图例行结构断言。 proxy_static/dist/:重建(index-D6mAsM1S.js / index-CIs_K6wk.css)。- 兼容性:- 后端纯新增端点与查询,
request_usage无 schema 变更;timeline 行为不变。dist 重建。 - 发布级别经用户确认由 minor 调整为 patch:本轮功能跨度有限,不足以提升第二位版本号。
- 风险:1. weekday_hour 聚合在超大时间范围(all)下为单查询分组聚合,量级可控;custom 限 90 天。
all窗口发丝线桶数可达数千:发丝线按桶数压缩线宽(最小 1px),超过 400 桶时抽稀绘制并保持首尾。- 两层端点注册遗漏(#78 教训):server 层注册与测试同时提交。
- 验证结果:-
python -m unittest tests.test_proxy_core.UsageTests→ 26 项通过;tests.test_server→ 19 项通过;全量python -m unittest discover -s tests -p "test_*.py"→ 558 项全部通过(2026-09-03 23:28)。 node --test tests/*.test.js全部通过(Vue UI 27/27,含六图型与图例断言)。- 组件 stub 数值抽查:30 天日历 26px 单元 178×212、punch 7×24=168 点半径合规、发丝线 30 桶 x 递增、waffle 恰 100 点按占比 70/30 分布。
- 浏览器 harness 截图:六图型全部正常渲染(日历月刻度+最忙日虚线环、节律工作日/周末纹理、waffle、发丝线、累计、趋势);
npm run build --prefix proxy_static构建成功。 - PR:#84
2026-09-04-share-card-dark-backdrop
- 类型:fix
- 发布级别:patch
- 目标:复制/下载的战报卡片粘贴到微信(含暗色模式)时不再出现白色填充角。导出图自带
#0b0d10深色底板(原设计稿的页面底色),卡片以圆角浮于底板之上,整图无任何透明像素——微信压平 alpha 也不再可能出白。 - 实际改动:-
proxy_static/src/share-card.js:terminalCardTheme()新增backdrop: '#0b0d10'、backdropMargin: 12。 proxy_static/src/components/ShareCardDialog.vue:drawCard()先整幅填充深色底板,再translate(margin, margin)于卡片原点做既有圆角裁剪/内容/描边/扫描线绘制;模板画布属性 384×664。tests/share_card.test.js、tests/local_proxy_vue_ui.test.js:主题与画布断言更新(384×664、底板填充、平移、无透明)。tests/test_proxy_core.py:修复test_timeline_today...既有时间敏感缺陷——原测试用time.time()且在 now-3h 插数据,0-3 点运行时该记录落入昨天导致断言漂移;改为固定当天 12:30。proxy_static/dist/:重建(index-5Qz3Zn17.js)。- 兼容性:- 纯前端视觉;导出文件名不变;dist 重建。
- 风险:- 底板边仅 12px,若用户期望"完全满幅无边"可能有出入:底板为原设计稿页面底色,视觉上是"深色卡片置于深色页面"的完整构图。
- 验证结果:-
node --test tests/share_card.test.js tests/local_proxy_vue_ui.test.js→ 36/36 通过(2026-09-04 00:39)。 - 浏览器实测(2026-09-04 00:41):预览环境打开分享对话框,导出画布四角/底板边/卡片内像素均为不透明
rgba(11,13,16,255),无任何透明像素——微信压平 alpha 后不可能出现白色。 - 全量
python -m unittest discover -s tests -p "test_*.py"→ 558 项全部通过(含修复后的时间敏感用例,凌晨运行验证);node --test tests/*.test.js全部通过;npm run build构建成功(2026-09-04 00:46)。 - PR:#85